---
name: linkdr-keyword-fanout
description: >-
  Discover ranking YouTubers, listicles, and outreach targets from a brand or
  keyword using LinkDR's admin data MCP. Use when the user wants influencer
  discovery, keyword fan-out, or SERP targets for a product like genppt.com.
  Fetch https://linkdr.com/skills/keyword-fanout/SKILL.md. Connect
  https://linkdr.com/mcp and complete LinkDR OAuth as an admin.
version: 0.1.0
homepage: https://linkdr.com/skills/keyword-fanout/SKILL.md
---

# LinkDR: keyword fan-out

**Start here:** You are reading `https://linkdr.com/skills/keyword-fanout/SKILL.md`. The file is complete only if the last line is `END SKILL v0.1.0`.

This skill uses the **LinkDR data MCP** (cached research). It does **not** buy backlinks. For managed placements, fetch `https://linkdr.com/SKILL.md` instead.

## Connect

Add the MCP URL only. The client must use MCP OAuth (401 + Protected Resource Metadata). Do not ask the user to paste a token in chat.

```json
{
  "mcpServers": {
    "linkdr": {
      "url": "https://linkdr.com/mcp"
    }
  }
}
```

Sign-in is the user's LinkDR account. Research tools require an admin user. Non-admins receive 403.

Tools you may call: `get_domain`, `search_keywords`, `get_keyword_serp`, `search_creators`, `get_contacts`, `search_domains`.

Never call paid refresh. `no_snapshot` / `miss` means the cache is empty — say so, do not invent rows.

## Decision tree

User gives a **brand/domain** (e.g. genppt.com) or a **keyword** (e.g. best AI presentation maker)?

1. Domain → `get_domain({ domain })`.
   - `found` → seed keywords from `keywords`, `industry`, `description`.
   - `miss` → ask for 1–3 seed keywords. Do not enqueue a fill.
2. `search_keywords({ query })` for each seed (and obvious modifiers: `best {product}`, `{product} vs`, `{category} software`).
3. For each cached keyword (max 5): `get_keyword_serp({ keyword })`.
4. If `status` is `no_snapshot`, skip. Do not fetch Google.
5. From organic + videos, keep rows whose `resultType` is `listicle`, `youtube_video`, `instagram_reel`, `tiktok`, `reddit_thread`, or a competitor `competitor_page` you want to pitch.
6. Use each row's `recommendedActions` (id + label). Do **not** call `getActionsForResult`.
7. If `creator.hasEmail` is true, or you need a structured contact record: `get_contacts({ url })` or `get_contacts({ domain })` or `search_creators({ q, platform })`. Cached SERP text may also contain an address, but the contact tools return the canonical records.
8. Rank 5–8 targets. Draft outreach in the **user's** composer (Gmail MCP, etc.). LinkDR does not send mail.

## Example: genppt.com

1. `get_domain({ domain: "genppt.com" })`
2. `search_keywords({ query: "ai presentation" })`
3. `get_keyword_serp({ keyword: "best ai presentation maker" })`
4. YouTube rows → `recommendedActions` includes `youtube_outreach`. Call `get_contacts({ url })` when `hasEmail` is true.
5. Listicle rows → `listicle_insertion_email`. `get_contacts({ domain })` for the publisher.

## Do not

- Quote backlink prices from this file
- Send users to `/onboarding`
- Ask the user to paste an access token in chat
- Treat `hasEmail` as enough. Fetch the canonical record with `get_contacts` or `search_creators`.

END SKILL v0.1.0
