---
name: content-coverage
description: >-
  Plan and write blog posts that cover missing AI search prompts from live MCP
  data. Use when the user wants content for ChatGPT gaps, citation listicles,
  competitor sources, or a content campaign from AI SEO Tracker. Trigger on
  "write posts for missing prompts", "content coverage", "what should we
  publish", or fetch https://aiseotracker.com/content-coverage/SKILL.md.
version: 1.0.0
homepage: https://aiseotracker.com/content-coverage/SKILL.md
metadata:
  site: https://aiseotracker.com
  docs: https://aiseotracker.com/docs/content-coverage
  mcp: https://aiseotracker.com/api/agent/mcp
  setup: https://aiseotracker.com/SKILL.md
  report: https://aiseotracker.com/ai-seo-report/SKILL.md
---

# AI SEO content coverage

**Start here:** You are reading `https://aiseotracker.com/content-coverage/SKILL.md`. The file is complete only if the **last line** is page end `END SKILL v1.0.0`. If missing, re-fetch.

Cover **approved prompt clusters** with evidence-backed pages in the user's content repository. Then recheck MCP after those pages are live. Do not promise full coverage or rankings.

## If MCP is not connected

Fetch `https://aiseotracker.com/SKILL.md` and connect MCP first (OAuth, no API keys). Then come back to this file.

MCP URL: `https://aiseotracker.com/api/agent/mcp`

Prerequisites:

- Connected AI SEO Tracker MCP
- A writable content repository (blog MDX/markdown)
- Optional: a project image skill or tool the user already has

Do not call `aiseo_add_prompts` from this skill unless the user explicitly asks to track more queries.

## Call order (do not skip)

1. `aiseo_list_projects` — pick the project the user named (domain or slug). Never invent a slug.
2. `aiseo_get_scan` — if `dataStatus` is `no_data`, stop. Say the project needs a scan. If `state` is `running`, write the plan from what exists and mark ranks as incomplete.
3. `aiseo_list_prompts` — all prompts (no status filter). Keep `summary` and `prompts[].href`. Missing prompts are the coverage queue.
4. `aiseo_list_sources` — citation URLs and domains. Use `sources[].href` and `sources[].url`.
5. `aiseo_list_competitors` — prefer `status=TRACKED`. Use `competitors[].href`.
6. `aiseo_list_snippets` — own brand. Optional: one tracked competitor if that rival leads the cited answers.

Use `href` fields. Prefix with `https://aiseotracker.com`. Do not invent paths, ranks, or competitor names.

## Phase 1 — Snapshot

Fill this block from tool JSON only:

```
CONTENT PLAN:
Brand: "<project.name>"
Domain: <project.domain or null>
Project: <project.slug>
Snapshot: <get_scan.lastCheckedAt or omit>
Scan: <running|done> | Prompts scanned: <scannedPromptCount>/<promptCount>
Tracked: <summary.total> | Missing: <summary.missing> | Winning: <summary.winning> | Opportunities: <summary.opportunities>
Missing prompts:
- [<query>](<absolute prompt href>)
Top sources (independent editorial first):
#1 [<title>](<source.url>) · <domain> · <mentionCount> mentions · prompts: <list>
Tracked competitors:
- [<brandName>](<absolute competitor href>) (<domain or none>)
```

Separate **independent editorial listicles** (third-party roundups) from **competitor-owned pages** (vendor blogs and homepages). Pitch only independent lists later.

## Phase 2 — Cluster and canonicalize

Group missing and opportunity prompts that share one search intent. One cluster = one page unless the user asked otherwise.

For every target, decide **one** of:

- `new` — no existing page covers this intent
- `rewrite` — same slug, update in place (`updateDate` if the repo uses it)
- `consolidate` — merge into an existing URL; do not spawn a competing slug

Audit the target repo first: existing blog filenames, titles, descriptions, and redirects. Prefer rewrite or consolidate over near-duplicates.

Cap a batch at **5 posts**. If more clusters remain, queue them for the next approved batch.

## Phase 3 — Research (bounded)

For each approved or proposed slug:

1. Start from MCP `sources[].url` for that prompt cluster.
2. Fetch 3–5 verified URLs. Prefer the cited listicles, then current web results for the primary keyword.
3. Record titles, intent, and whether AI SEO Tracker (or the user's brand) is named.
4. If a URL does not resolve, write `unverified` and skip it. Never invent a listicle URL.
5. Do not scrape live ChatGPT, Perplexity, Gemini, Copilot, or AI Overview answers.

Title and slug:

- Put the primary keyword near the start of the title. Keep most titles under 60 characters.
- Slug: lowercase, hyphens, 2–5 words, no year unless the query requires freshness.
- Match listicle vs how-to vs definition intent from the live SERP, not from memory.

## Phase 4 — Stop for approval

Present the campaign and **wait**. Do not write files yet.

Include:

- The CONTENT PLAN snapshot
- A table: `prompt cluster | intent | slug | action (new/rewrite/consolidate) | title | sources`
- Estimated post count (max 5 this batch)
- Cannibalization risks
- Independent listicles to pitch after publish (drafts only)

Write files only after the user approves the table.

## CONTENT BATCH MANIFEST

Keep this manifest in the chat (or a file the user named). Update it as you go. Resume from it. Do not repeat finished research. Do not overwrite another worker's slug.

```
CONTENT BATCH MANIFEST v1
Project: <slug>
Planned at: <ISO date>
MCP snapshot: <lastCheckedAt>
Phase: <snapshot|plan|research|draft|validate|report>

| slug | action | prompt cluster | phase | notes |
| --- | --- | --- | --- | --- |
| example-slug | new | missing prompt text | planned | |

phase values: planned | research | draft | validate | done | blocked
```

On resume: re-run Phase 1 if `lastCheckedAt` changed or the user says data changed. Skip rows at `done`. Read existing files before merging a `blocked` or partial slug.

## Phase 5 — Write (after approval)

Use available parallel subagents if the host supports them. Grok CLI is optional. Never required.

If you split work:

- One slug per worker. No overlapping files.
- Give each worker the approved row, the 3–5 source URLs, product facts the user confirmed, and local MDX conventions.
- Parent agent owns the manifest.

Write native repository markdown/MDX. Follow files already in that repo (frontmatter, CTA components, internal link style). Short sentences. No invented stats, prices, rankings, or first-hand tests. If a competitor price is unverified, omit it or say to check their site.

Images:

1. Write image alt (under 125 characters) and a scene prompt.
2. Generate an image only if the user has a project image skill/tool **and** asks to run it.
3. Never print API keys. Never tell the user to paste keys. Never call a private operator script from this skill.

Do not deploy, commit, push, email, post publicly, purchase, or add MCP prompts unless the user explicitly asks.

## Phase 6 — Validate

Before you hand off a batch:

- Frontmatter complete and consistent with sibling posts
- Slug unique (or rewrite of the intended file)
- Internal links point at real paths
- Image paths exist, or alt+prompt is listed as pending
- No unresolved placeholders
- Repo format/lint on touched files when a formatter is available

## Phase 7 — After publication

When the user says the posts are live:

1. Call `aiseo_get_scan`, then `aiseo_list_prompts` and `aiseo_list_sources` again.
2. Report which approved prompts changed status, which are still missing, and which independent listicles still omit the brand.
3. Leave outreach as copy-paste drafts. Do not send.

Optional: fetch `https://aiseotracker.com/ai-seo-report/SKILL.md` for the visibility brief after the rescan.

## Do not

- Invent ranks, URLs, competitor names, listicle domains, DR, traffic, or trend deltas
- Treat `dataStatus: no_data` as an auth failure
- Scrape live AI answers or the marketing site when MCP is empty
- Write files before the approval checkpoint
- Promise rankings or "full coverage"
- Send email, post publicly, or charge a card
- Call `aiseo_add_prompts` unless the user asked to track those queries

END SKILL v1.0.0
