Openseo link prospecting skill
Find realistic link prospects with SERP and backlink evidence, discover contact paths via web tools, and draft personalized outreach — with targets saved to .seo/backlink-targets.json for off-page-seo campaigns.
by MoizIbnYousaf·MIT license·GitHub ↗
★ 31 Stars on the repo·Checked
npx degit MoizIbnYousaf/marketing-cli/skills/openseo-link-prospecting#main ~/.claude/skills/openseo-link-prospectingFiles of Openseo link prospecting
Files 1 file
Show the full text103 lines
OpenSEO Link Prospecting
Find pages, sites, and authors that might realistically reference the user's linkable asset — then hand off-page-seo a qualified target list at .seo/backlink-targets.json instead of a cold start.
On Activation
- Readiness + binding:
mktg seo status --json --fields readiness,catalog.endpointError,project.not_configured→ prospect with Exa search only (queries below still apply) and label authority dataunknown. For a ready state, verify live access with the freewhoamiMCP tool before paid calls. - Clarify the asset: what page/study/tool/template is being promoted and WHY someone would reference it. No clear asset + reason → fix that first; outreach without a reason is spam.
- Read
brand/positioning.mdfor angle/audience fit (tolerate missing).
OpenSEO MCP Tools
get_serp_results: find ranking articles, listicles, resource pages, comparisons, statistics pages (≤10 queries per call).get_backlinks_overview: competitor backlink/referring-domain patterns — where do THEY get links (may be unavailable; continue without).get_backlinks_profile: page-level source/target/anchor/dofollow/lost/broken evidence. Preserve target scope, pagination, filters, and one-per-domain mode in.seo/backlink-targets.jsonprovenance.get_domain_overview: qualify strong prospect domains.get_ranked_keywords: topical-fit checks on prospects/competitors.research_keywords: expand prospecting queries.
Contact Discovery (NOT OpenSEO)
Contact paths come from web/search/browser tools (Firecrawl fetch, Exa search, browser automation) — never attribute these to OpenSEO:
- Author byline pages, contact pages, editorial guidelines, about/team pages
- LinkedIn/X/Bluesky profiles, newsletter mastheads
- Public emails in HTML or visible text;
Person/Organization/sameAs/emailstructured data
Record only contact details actually found, each with its source URL.
Prospecting Query Patterns
<topic> resources · best <category> tools · <competitor> alternatives · <topic> statistics · <topic> guide · <topic> examples · <topic> templates · <topic> software · <topic> for <audience>
Workflow
- Build 5–10 prospecting queries from the asset;
get_serp_resultsin batches. - Competitors supplied?
get_backlinks_overviewtheir strongest domains first. - Filter: keep editorial pages, resource lists, comparisons, statistics, templates, curated directories. Drop homepages, login walls, thin affiliate, spam, and direct competitors (unless a comparison angle is valid).
- Per prospect, define the angle: broken/missing resource, better current data, useful tool/template, comparison inclusion, expert quote.
- Contact discovery on the strongest prospects via web tools (source URLs recorded).
- Write targets to
.seo/backlink-targets.json:
{ "version": 1, "updatedAt": "<iso>", "asset": "<url>", "targets": [{ "url": "", "domain": "", "source": "", "relevance": "", "angle": "", "contactPath": "", "contactSource": "", "priority": "high|med|low", "status": "new" }] }
- Draft 2–3 reusable outreach messages (resource inclusion, article update, comparison angle). Hand the list to
off-page-seofor the campaign cadence.
Output Format
| Prospect URL | Domain | Source | Relevance | Suggested angle | Contact path | Priority |
|---|
Anti-Patterns
- Inventing emails, handles, or contact names — because a single fabricated contact burns the user's credibility with a real human. Only record what was found, with the source URL; otherwise name the next discovery step.
- Attributing contact discovery to OpenSEO — because OpenSEO finds PROSPECTS; web/browser tools find CONTACTS. The misattribution teaches a wrong tool model and hides the real source when details need re-verification.
- Mass-template outreach — because editors can smell a blast, and one spam report damages the domain's future deliverability. Personalize by page and reason, or don't send.
- Prospecting without a linkable asset and reason — because "please link to my homepage" converts at ~0%. No asset + reason, no outreach.
- Skipping competitor/paid-placement flags — because pitching a direct competitor or a pay-to-play listicle wastes the user's outreach capital and can backfire publicly. Flag both in the target list.
Close the loop
After writing files, log completion so mktg plan / mktg status count the work (bare mktg run only logs loaded):
mktg run openseo-link-prospecting --complete --writes <paths written> --result success --json
Adapted from every-app/open-seo .agents/skills/link-prospecting (MIT). Workflow upstream; mktg artifact paths, off-page-seo handoff, and contact-attribution discipline added here.
| 1 | |
| 2 | name openseo-link-prospecting |
| 3 | description >- |
| 4 | Find realistic link prospects with SERP and backlink evidence, discover |
| 5 | contact paths via web tools, and draft personalized outreach — with targets |
| 6 | saved to .seo/backlink-targets.json for off-page-seo campaigns. Use this |
| 7 | skill when the user has a linkable asset (study, tool, guide, template, |
| 8 | product page) and wants backlinks, resource-page inclusions, or comparison |
| 9 | mentions. Triggers: "link prospecting", "find backlink opportunities", |
| 10 | "resource page outreach", "get backlinks for", "link building outreach". |
| 11 | category seo |
| 12 | tier nice-to-have |
| 13 | layer distribution |
| 14 | reads |
| 15 | - brand/positioning.md |
| 16 | env_vars |
| 17 | - OPENSEO_API_KEY |
| 18 | - OPENSEO_MCP_URL |
| 19 | triggers |
| 20 | - link prospecting |
| 21 | - find backlink opportunities |
| 22 | - resource page outreach |
| 23 | - get backlinks for |
| 24 | - link building outreach |
| 25 | allowed-tools |
| 26 | - Bash(mktg catalog *) |
| 27 | - Bash(mktg run *) |
| 28 | |
| 29 | |
| 30 | # OpenSEO Link Prospecting |
| 31 | |
| 32 | Find pages, sites, and authors that might realistically reference the user's linkable asset — then hand `off-page-seo` a qualified target list at `.seo/backlink-targets.json` instead of a cold start. |
| 33 | |
| 34 | ## On Activation |
| 35 | |
| 36 | **Readiness + binding**: `mktg seo status --json --fields readiness,catalog.endpointError,project`. `not_configured` → prospect with Exa search only (queries below still apply) and label authority data `unknown`. For a ready state, verify live access with the free `whoami` MCP tool before paid calls. |
| 37 | **Clarify the asset**: what page/study/tool/template is being promoted and WHY someone would reference it. No clear asset + reason → fix that first; outreach without a reason is spam. |
| 38 | Read `brand/positioning.md` for angle/audience fit (tolerate missing). |
| 39 | |
| 40 | ## OpenSEO MCP Tools |
| 41 | |
| 42 | `get_serp_results`: find ranking articles, listicles, resource pages, comparisons, statistics pages (≤10 queries per call). |
| 43 | `get_backlinks_overview`: competitor backlink/referring-domain patterns — where do THEY get links (may be unavailable; continue without). |
| 44 | `get_backlinks_profile`: page-level source/target/anchor/dofollow/lost/broken evidence. Preserve target scope, pagination, filters, and one-per-domain mode in `.seo/backlink-targets.json` provenance. |
| 45 | `get_domain_overview`: qualify strong prospect domains. |
| 46 | `get_ranked_keywords`: topical-fit checks on prospects/competitors. |
| 47 | `research_keywords`: expand prospecting queries. |
| 48 | |
| 49 | ## Contact Discovery (NOT OpenSEO) |
| 50 | |
| 51 | Contact paths come from web/search/browser tools (Firecrawl fetch, Exa search, browser automation) — never attribute these to OpenSEO: |
| 52 | |
| 53 | Author byline pages, contact pages, editorial guidelines, about/team pages |
| 54 | LinkedIn/X/Bluesky profiles, newsletter mastheads |
| 55 | Public emails in HTML or visible text; `Person`/`Organization`/`sameAs`/`email` structured data |
| 56 | |
| 57 | Record only contact details actually found, each with its source URL. |
| 58 | |
| 59 | ## Prospecting Query Patterns |
| 60 | |
| 61 | `<topic> resources` · `best <category> tools` · `<competitor> alternatives` · `<topic> statistics` · `<topic> guide` · `<topic> examples` · `<topic> templates` · `<topic> software` · `<topic> for <audience>` |
| 62 | |
| 63 | ## Workflow |
| 64 | |
| 65 | Build 5–10 prospecting queries from the asset; `get_serp_results` in batches. |
| 66 | Competitors supplied? `get_backlinks_overview` their strongest domains first. |
| 67 | Filter: keep editorial pages, resource lists, comparisons, statistics, templates, curated directories. Drop homepages, login walls, thin affiliate, spam, and direct competitors (unless a comparison angle is valid). |
| 68 | Per prospect, define the angle: broken/missing resource, better current data, useful tool/template, comparison inclusion, expert quote. |
| 69 | Contact discovery on the strongest prospects via web tools (source URLs recorded). |
| 70 | Write targets to `.seo/backlink-targets.json`: |
| 71 | |
| 72 | |
| 73 | { "version": 1, "updatedAt": "<iso>", "asset": "<url>", "targets": [{ "url": "", "domain": "", "source": "", "relevance": "", "angle": "", "contactPath": "", "contactSource": "", "priority": "high|med|low", "status": "new" }] } |
| 74 | |
| 75 | |
| 76 | Draft 2–3 reusable outreach messages (resource inclusion, article update, comparison angle). Hand the list to `off-page-seo` for the campaign cadence. |
| 77 | |
| 78 | ## Output Format |
| 79 | |
| 80 | | Prospect URL | Domain | Source | Relevance | Suggested angle | Contact path | Priority | |
| 81 | | ------------ | ------ | ------ | --------- | --------------- | ------------ | -------- | |
| 82 | |
| 83 | ## Anti-Patterns |
| 84 | |
| 85 | **Inventing emails, handles, or contact names** — because a single fabricated contact burns the user's credibility with a real human. Only record what was found, with the source URL; otherwise name the next discovery step. |
| 86 | **Attributing contact discovery to OpenSEO** — because OpenSEO finds PROSPECTS; web/browser tools find CONTACTS. The misattribution teaches a wrong tool model and hides the real source when details need re-verification. |
| 87 | **Mass-template outreach** — because editors can smell a blast, and one spam report damages the domain's future deliverability. Personalize by page and reason, or don't send. |
| 88 | **Prospecting without a linkable asset and reason** — because "please link to my homepage" converts at ~0%. No asset + reason, no outreach. |
| 89 | **Skipping competitor/paid-placement flags** — because pitching a direct competitor or a pay-to-play listicle wastes the user's outreach capital and can backfire publicly. Flag both in the target list. |
| 90 | |
| 91 | ## Close the loop |
| 92 | |
| 93 | After writing files, log completion so `mktg plan` / `mktg status` count the work (bare `mktg run` only logs `loaded`): |
| 94 | |
| 95 | |
| 96 | mktg run openseo-link-prospecting --complete --writes <paths written> --result success --json |
| 97 | |
| 98 | |
| 99 | |
| 100 | |
| 101 | |
| 102 | *Adapted from [every-app/open-seo] `.agents/skills/link-prospecting` (MIT). Workflow upstream; mktg artifact paths, off-page-seo handoff, and contact-attribution discipline added here.* |
| 103 |
Discussion
Browse more free Claude skills or everything in Marketing.