New: Earn 20% as an AgentAlley affiliate. Share your link and earn on every sale you refer. Join now New: Earn 20% as an affiliate. Join now

Research backlink opportunities, record contact evidence

SEO link strategy

by kennyzir · MIT license · ★ 318 on GitHub

SEO link strategy cover

Research backlink opportunities, record contact evidence, and generate personalized local outreach drafts from user-provided product and contact data. Use for backlink planning and draft preparation; never send messages or submit forms…

---
name: seo-link-strategy
description: Research backlink opportunities, record contact evidence, and generate personalized local outreach drafts from user-provided product and contact data. Use for backlink planning and draft preparation; never send messages or submit forms without explicit authorization for the exact target and payload.
---

# SEO Link Strategy

Build an evidence-backed backlink opportunity list and prepare local outreach drafts. Discovery, evidence capture, draft generation, and external execution are separate states.

This Skill does not ship a current directory of platforms or verified contacts. Candidates come from the user or from research performed at runtime. Never treat a guessed address, old list, search snippet, or role-based email pattern as an observed contact.

## Operating boundary

Default work is research and local draft preparation. Do not send Gmail or other messages, submit forms, purchase placements, call paid/mutating services, or change remote systems by default.

Before any external side effect:

1. show the exact target, payload, account, and expected effect;

Overview

Build an evidence-backed backlink opportunity list and prepare local outreach drafts. Discovery, evidence capture, draft generation, and external execution are separate states.

Manual install (npx, ZIP)
Claude Codenpx skills add kennyzir/7deer_skills --skill seo-link-strategy -g -a claude-code
Claude Code (degit)npx degit kennyzir/7deer_skills/seo-link-strategy#main ~/.claude/skills/seo-link-strategy
Claude.ai / desktopZip the folder and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md5.3 KB
Read SKILL.md here
kennyzir/main1 file shown
SKILL.md
Show the full text118 lines

Build an evidence-backed backlink opportunity list and prepare local outreach drafts. Discovery, evidence capture, draft generation, and external execution are separate states.

This Skill does not ship a current directory of platforms or verified contacts. Candidates come from the user or from research performed at runtime. Never treat a guessed address, old list, search snippet, or role-based email pattern as an observed contact.

Operating boundary

Default work is research and local draft preparation. Do not send Gmail or other messages, submit forms, purchase placements, call paid/mutating services, or change remote systems by default.

Before any external side effect:

  1. show the exact target, payload, account, and expected effect;
  2. obtain explicit user authorization for that specific action;
  3. execute only the authorized action; and
  4. record the actual result and UTC time, including failures or uncertainty.

A draft is not-sent. An opportunity is not a backlink. An attempted submission is not completed unless a real result supports that state.

Evidence contract

Each opportunity or contact record must support these fields:

Field Requirement
name User-provided or runtime-discovered platform/contact label.
source_url Exact page where the opportunity or contact evidence was observed.
observed_at Past UTC timestamp for the actual observation, or null. Future times are rejected.
status observed only with captured evidence and time; otherwise unknown.
email One value present in captured evidence, or null; never constructed from hints.
context User-supplied limits, conflicts, access failures, or relevance notes.

Keep sources and observation times when data is handed from research to drafting. If a page cannot be checked, preserve the candidate with status: unknown rather than filling likely values.

1. Normalize captured contact evidence

Use scripts/contact_discoverer.py after the user or an available research tool supplies candidate URLs and captured page text. The script is offline: it extracts addresses only from the supplied capture and makes no network request.

Input JSON:

{
  "opportunities": [
    {
      "name": "Example Directory",
      "source_url": "https://directory.example/contact",
      "observed_at": "2020-01-15T09:45:00Z",
      "captured_text": "Contact: [email protected]",
      "notes": "Captured from the public contact page."
    },
    {
      "name": "Unreviewed Candidate",
      "source_url": "https://candidate.example/contact"
    }
  ]
}

Run:

python3 scripts/contact_discoverer.py --input candidates.json
python3 scripts/contact_discoverer.py --input candidates.json --output contacts.json

Without --output, JSON goes to stdout. An existing output path is never overwritten. The first record can become observed; the second remains unknown with no invented email. If supplied evidence contains multiple distinct addresses, the normalizer emits one contact record per address so every record keeps a single unambiguous recipient.

2. Generate local drafts

Use scripts/email_generator.py with user-provided product, sender, and contact data. It performs no browsing and contains no sending implementation.

The normalizer's contacts array is already the exact contact schema accepted here. Copy that array unchanged into a new object with product and sender; omit only the normalizer's top-level generated_at. No field renaming or implicit conversion is required.

{
  "product": {
    "name": "Example Product",
    "url": "https://product.example",
    "tagline": "User-provided product description",
    "selling_points": ["User-provided differentiator"]
  },
  "sender": {
    "name": "Your Name",
    "email": "[email protected]"
  },
  "contacts": [
    {
      "name": "Example Directory",
      "email": "[email protected]",
      "source_url": "https://directory.example/contact",
      "observed_at": "2020-01-15T09:45:00Z",
      "status": "observed",
      "context": "User-provided reason this audience is relevant."
    }
  ]
}

Run:

python3 scripts/email_generator.py --input outreach-input.json
python3 scripts/email_generator.py --input outreach-input.json --output drafts.json

The output marks every draft delivery_status: not-sent. Invalid inputs fail before output creation, and existing output files are not replaced.

3. Review and optional execution

Review source freshness, recipient relevance, claims, product links, sender identity, and applicable platform rules. Remove unsupported personalization instead of presenting inference as observation.

If the user later authorizes sending or submitting, use an appropriate external tool only for the approved target and payload. Store a separate result record with fields such as attempted_at, status, result_id, and error. Do not rewrite the draft-generation output to imply delivery.

1---
2name: seo-link-strategy
3description: Research backlink opportunities, record contact evidence, and generate personalized local outreach drafts from user-provided product and contact data. Use for backlink planning and draft preparation; never send messages or submit forms without explicit authorization for the exact target and payload.
4---
5 
6# SEO Link Strategy
7 
8Build an evidence-backed backlink opportunity list and prepare local outreach drafts. Discovery, evidence capture, draft generation, and external execution are separate states.
9 
10This Skill does not ship a current directory of platforms or verified contacts. Candidates come from the user or from research performed at runtime. Never treat a guessed address, old list, search snippet, or role-based email pattern as an observed contact.
11 
12## Operating boundary
13 
14Default work is research and local draft preparation. Do not send Gmail or other messages, submit forms, purchase placements, call paid/mutating services, or change remote systems by default.
15 
16Before any external side effect:
17 
181. show the exact target, payload, account, and expected effect;
192. obtain explicit user authorization for that specific action;
203. execute only the authorized action; and
214. record the actual result and UTC time, including failures or uncertainty.
22 
23A draft is `not-sent`. An opportunity is not a backlink. An attempted submission is not completed unless a real result supports that state.
24 
25## Evidence contract
26 
27Each opportunity or contact record must support these fields:
28 
29| Field | Requirement |
30|---|---|
31| `name` | User-provided or runtime-discovered platform/contact label. |
32| `source_url` | Exact page where the opportunity or contact evidence was observed. |
33| `observed_at` | Past UTC timestamp for the actual observation, or `null`. Future times are rejected. |
34| `status` | `observed` only with captured evidence and time; otherwise `unknown`. |
35| `email` | One value present in captured evidence, or `null`; never constructed from hints. |
36| `context` | User-supplied limits, conflicts, access failures, or relevance notes. |
37 
38Keep sources and observation times when data is handed from research to drafting. If a page cannot be checked, preserve the candidate with `status: unknown` rather than filling likely values.
39 
40## 1. Normalize captured contact evidence
41 
42Use [scripts/contact_discoverer.py](scripts/contact_discoverer.py) after the user or an available research tool supplies candidate URLs and captured page text. The script is offline: it extracts addresses only from the supplied capture and makes no network request.
43 
44Input JSON:
45 
46```json
47{
48 "opportunities": [
49 {
50 "name": "Example Directory",
51 "source_url": "https://directory.example/contact",
52 "observed_at": "2020-01-15T09:45:00Z",
53 "captured_text": "Contact: [email protected]",
54 "notes": "Captured from the public contact page."
55 },
56 {
57 "name": "Unreviewed Candidate",
58 "source_url": "https://candidate.example/contact"
59 }
60 ]
61}
62```
63 
64Run:
65 
66```bash
67python3 scripts/contact_discoverer.py --input candidates.json
68python3 scripts/contact_discoverer.py --input candidates.json --output contacts.json
69```
70 
71Without `--output`, JSON goes to stdout. An existing output path is never overwritten. The first record can become `observed`; the second remains `unknown` with no invented email. If supplied evidence contains multiple distinct addresses, the normalizer emits one contact record per address so every record keeps a single unambiguous recipient.
72 
73## 2. Generate local drafts
74 
75Use [scripts/email_generator.py](scripts/email_generator.py) with user-provided product, sender, and contact data. It performs no browsing and contains no sending implementation.
76 
77The normalizer's `contacts` array is already the exact contact schema accepted here. Copy that array unchanged into a new object with `product` and `sender`; omit only the normalizer's top-level `generated_at`. No field renaming or implicit conversion is required.
78 
79```json
80{
81 "product": {
82 "name": "Example Product",
83 "url": "https://product.example",
84 "tagline": "User-provided product description",
85 "selling_points": ["User-provided differentiator"]
86 },
87 "sender": {
88 "name": "Your Name",
89 "email": "[email protected]"
90 },
91 "contacts": [
92 {
93 "name": "Example Directory",
94 "email": "[email protected]",
95 "source_url": "https://directory.example/contact",
96 "observed_at": "2020-01-15T09:45:00Z",
97 "status": "observed",
98 "context": "User-provided reason this audience is relevant."
99 }
100 ]
101}
102```
103 
104Run:
105 
106```bash
107python3 scripts/email_generator.py --input outreach-input.json
108python3 scripts/email_generator.py --input outreach-input.json --output drafts.json
109```
110 
111The output marks every draft `delivery_status: not-sent`. Invalid inputs fail before output creation, and existing output files are not replaced.
112 
113## 3. Review and optional execution
114 
115Review source freshness, recipient relevance, claims, product links, sender identity, and applicable platform rules. Remove unsupported personalization instead of presenting inference as observation.
116 
117If the user later authorizes sending or submitting, use an appropriate external tool only for the approved target and payload. Store a separate result record with fields such as `attempted_at`, `status`, `result_id`, and `error`. Do not rewrite the draft-generation output to imply delivery.
118 
View all files on GitHub →

Details

License
MIT
Stars on the repo
★ 318
Checked
Source
kennyzir/7deer_skills ↗
Creator
kennyzir · 1 listing
View creator

Similar skills

See all →
SkillThe Lighthouse Agentic Browsing fractionAgentic Browsing ReadinessAgriciDaniel/claude-seo · by AgriciDanielAudit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).★ 17.4k GitHub starsSkillReferring domains, anchor text distributionBacklink Profile AnalysisAgriciDaniel/claude-seo · by AgriciDanielBacklink profile analysis: referring domains, anchor text distribution, toxic link detection, competitor gap analysis. Works with free APIs (Moz, Bing Webmaster, Common Crawl) and DataForSEO extension. Use when user says backlinks, link profile, referring domains, anchor text, toxic links, link gap, link building, disavow, or backlink audit.★ 17.4k GitHub starsSkillConnect a CMS to notfair SEO tools/setup-cmsnowork-studio/notfair-plugin · by nowork-studioConnect a CMS to notfair SEO tools. Guides users through configuring WordPress, Strapi, Contentful, or Ghost — tests the connection, and writes credentials to .env.local. Once set up, seo-analysis automatically cross- references CMS content against Google Search Console data. Use whenever the user says "connect my CMS", "set up WordPress", "configure Strapi", "add Contentful", "connect Ghost", or "CMS setup". Also trigger if the user asks why no CMS data appears in a seo-analysis report.★ 3.9k GitHub starsSkillBacklink profile for any domainBacklink checkRyze-AI-Adgent/open-seo-mcp-skills · by Ryze-AI-AdgentBacklink profile for any domain — referring domains, authority, anchors, new/lost links, and a side-by-side vs a competitor. Use when asked "check my backlinks", "backlink profile of X", "who links to them", or "link gap vs competitor".★ 3.1k GitHub starsSkillOptimize Core Web Vitals for better page experienceCore Web Vitals optimizationaddyosmani/web-quality-skills · by addyosmaniOptimize Core Web Vitals (LCP, INP, CLS) for better page experience using field and lab evidence. Use when asked to "improve Core Web Vitals", "fix LCP", "reduce CLS", "optimize INP", "page experience optimization", or "fix layout shifts".★ 2.8k GitHub starsSkillRun an SEO page observation-action-review loopRun the SEO page looptsingyuai/growth-lab · by tsingyuaiRun an SEO page observation-action-review loop with persistent Memory by coordinating demand research, page creation, adversarial review, image generation, IndexNow submission, and performance review. Use when taking an SEO page from opportunity discovery through publication, measurement, iteration, or continuing a previous SEO loop from Memory.★ 2k GitHub stars