---
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/docs/admin/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/docs/admin/skills/keyword-fanout/SKILL.md
---

# LinkDR: keyword fan-out

**Start here:** You are reading `https://linkdr.com/docs/admin/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**. 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_domains`, `search_keywords`, `get_keyword_serp`, `search_creators`, `get_contacts`, `search_domains`.

Do not invent rows. `no_snapshot` / `miss` after a tool call means LinkDR could not return that entity. Say so. Cap SERP calls at about five keywords per turn.

## Decision tree

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

1. Call `get_domains({ domains })` with one to 100 hosts. Pass a one-item array for one domain.
   - `found` / `cached` / `refreshed` → seed keywords from `keywords`, `industry`, `description`.
   - `miss` → ask for 1–3 seed keywords. Do not enqueue fill-domain or Hunter.
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, limit: 100 })`.
   This returns the stored top 100 organic results in one call. Pass `domain`
   (ranking host or snippet mention) when you already know the slice you want.
   Do not invent a second search tool. Do not call again for ranks beyond 100.
4. If `status` is `no_snapshot`, skip that keyword. Do not scrape Google yourself.
5. From `items`, keep listicles, YouTube/Instagram/TikTok creators, Reddit threads, and publisher pages that fit the brief. Filter by `domain` when you can.
6. Use each row's `email` when present. Call `get_contacts({ url })`, `get_contacts({ domain })`, or `search_creators({ q, platform })` when you need the full record.
7. Rank 5–8 targets. Draft outreach in the **user's** composer (Gmail MCP, etc.). LinkDR does not send mail.

## Example: genppt.com

1. `get_domains({ domains: ["genppt.com"] })`
2. `search_keywords({ query: "ai presentation" })`
3. `get_keyword_serp({ keyword: "best ai presentation maker", limit: 100 })`
4. YouTube rows with `email` → draft creator outreach. Rows with `email: null` → `get_contacts({ url })` or skip.
5. Listicle rows → use `email` or `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 a null `email` as proof we have no contact. Try `get_contacts` once before skipping.

END SKILL v0.1.0
