feat(seo-skills): multi-backend Data Source Selection (#7)
Replaces single-vendor (Ahrefs-only) tool defaults with a per-task backend menu across all 14 SEO skills. Each skill now lists every capable MCP in allowed-tools and documents how to pick between Semrush, Ahrefs, OurSEO Agent (CLI + MCP), DataForSEO, and GSC in its SKILL.md Data Source Selection section. Tool stubs (~40 new files) populated per skill with capability deltas, call patterns, and explicit "not for this skill when" callouts so the menu is self-correcting. Skills affected: 19-keyword-strategy, 20-serp-analysis, 21-position-tracking, 22-link-building, 23-content-strategy, 24-ecommerce, 25-kpi-framework, 26-international, 27-ai-visibility, 28-knowledge-graph, 31-competitor-intel, 32-crawl-budget, 33-migration-planner, 34-reporting-dashboard. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,25 +18,74 @@ Audit existing content performance, identify topic gaps vs competitors, map topi
|
||||
4. **Editorial Calendar** - Prioritized content creation schedule
|
||||
5. **Korean Content Patterns** - Naver Blog style, 후기, 추천 format analysis
|
||||
|
||||
## MCP Tool Usage
|
||||
## Data Source Selection
|
||||
|
||||
### SEO Data
|
||||
This skill can pull content + keyword + traffic data from multiple backends. **Pick one backend per data type per task** — content strategy spans multiple data classes, so you'll often combine 2 backends (e.g., one for keyword discovery + one for on-page inventory).
|
||||
|
||||
| Backend | Best for | Notes |
|
||||
|---|---|---|
|
||||
| **Semrush MCP** (`mcp__semrush__*`) | **Default** for organic content discovery, keyword expansion, top pages by traffic | `organic_research`, `keyword_research`, `overview_research` → `get_report_schema` → `execute_report`. |
|
||||
| **Ahrefs MCP** (`mcp__ahrefs__*`) | Top-pages-by-traffic for competitor sites, content-decay candidates, Korean platform refdomains | `site-explorer-top-pages`, `site-explorer-pages-history`, `keywords-explorer-*`, `gsc-pages` (first-party). |
|
||||
| **OurSEO MCP** (`mcp__ourseo__*`) | **On-page content inventory** — what the target site itself publishes | `crawl_website` for content URLs + titles + H1s; `find_similar_pages` for topic clustering. Pair with a keyword backend for performance data. |
|
||||
| **OurSEO CLI** (`our keywords *`, `our serp *`) | DataForSEO under the hood for Korean batch keyword + competitor pulls | Claude Code only (Bash). Best for `--location 2410` Korean content gap work. |
|
||||
| **GSC** (via `our research search-console` or Ahrefs `gsc-*`) | **Cannibalization detection** — query × page where multiple URLs split impressions; first-party content performance | Only first-party source — required for accurate decay detection on the target site. |
|
||||
| **DataForSEO MCP** (`mcp__dfs-mcp__*`) | Fallback when `our` CLI isn't running | Same data as `our keywords *` / `our serp *`. |
|
||||
|
||||
### How to pick
|
||||
|
||||
1. **User named a backend explicitly** → use it.
|
||||
2. **User preference memory** — read `feedback_seo_tool_preferences.md`; honor the task-type default.
|
||||
3. **Task is content decay / cannibalization on the target site** → use **GSC** (first-party impression data is required).
|
||||
4. **Task is on-page content inventory** → use **OurSEO crawl_website**.
|
||||
5. **Default for keyword + competitor pulls**: Semrush MCP (English markets); OurSEO CLI (`--location 2410`) for Korean markets.
|
||||
6. **Still ambiguous + non-trivial** → ask once via `AskUserQuestion`.
|
||||
|
||||
### Backend call patterns
|
||||
|
||||
**Semrush MCP (default keyword/content discovery):**
|
||||
```
|
||||
our-seo-agent CLI: Primary content/traffic data source (future); use --input for pre-fetched JSON
|
||||
WebSearch / WebFetch: Supplementary content data
|
||||
mcp__semrush__organic_research(query="<domain>", database="us")
|
||||
mcp__semrush__keyword_research(query="<seed>", database="us")
|
||||
mcp__semrush__get_report_schema(report_id="...")
|
||||
mcp__semrush__execute_report(report_id="...", params={...})
|
||||
```
|
||||
|
||||
### WebSearch for Content Research
|
||||
**Ahrefs MCP (top pages by traffic, decay candidates):**
|
||||
```
|
||||
WebSearch: Research content topics and competitor strategies
|
||||
WebFetch: Analyze competitor page content and structure
|
||||
mcp__ahrefs__site-explorer-top-pages(target="<domain>", country="us", limit=100)
|
||||
mcp__ahrefs__site-explorer-pages-history(target="<domain>", history="monthly")
|
||||
mcp__ahrefs__keywords-explorer-overview(keyword="<seed>", country="us")
|
||||
```
|
||||
|
||||
### Notion for Report Storage
|
||||
**OurSEO MCP (on-page content inventory):**
|
||||
```
|
||||
notion-create-pages: Save audit reports to SEO Audit Log
|
||||
mcp__ourseo__crawl_website(url="<target>", max_pages=200)
|
||||
mcp__ourseo__find_similar_pages(crawl_path="<path/to/crawl.json>", query="<topic>")
|
||||
```
|
||||
|
||||
**OurSEO CLI (Korean batch):**
|
||||
```bash
|
||||
our keywords ideas "<seed>" --location 2410 --limit 50
|
||||
our keywords for-site <competitor.com> --location 2410 --limit 100
|
||||
our serp ranked-keywords <domain> --location 2410 --limit 100
|
||||
```
|
||||
|
||||
**GSC (cannibalization + decay):**
|
||||
```bash
|
||||
our research search-console combined --site sc-domain:<domain> --days 90
|
||||
# Group by query; flag queries where multiple pages share impressions.
|
||||
```
|
||||
|
||||
### Common parameters
|
||||
|
||||
| Concept | Semrush | Ahrefs | DataForSEO / `our` CLI |
|
||||
|---|---|---|---|
|
||||
| Korean market | `database="kr"` | `country="kr"` | `--location 2410` |
|
||||
| US market | `database="us"` | `country="us"` | `--location 2840` |
|
||||
| Japan | `database="jp"` | `country="jp"` | `--location 2392` |
|
||||
|
||||
Always record the chosen data source(s) in the report **Overview** so future audits can compare like-for-like.
|
||||
|
||||
## Workflow
|
||||
|
||||
### 1. Content Audit
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
name: seo-content-strategy
|
||||
description: |
|
||||
Content strategy and planning for SEO. Triggers: content audit, content strategy, content gap, topic clusters, content brief, editorial calendar, content decay.
|
||||
|
||||
# Allowed tools list every backend the skill can pull content/keyword data from.
|
||||
# Per-task selection happens in SKILL.md > Data Source Selection — NOT here.
|
||||
allowed-tools:
|
||||
- mcp__ahrefs__*
|
||||
- mcp__semrush__* # default for organic content + keyword discovery
|
||||
- mcp__ahrefs__* # site-explorer-top-pages, keywords-explorer
|
||||
- mcp__claude_ai_Ahrefs__* # Ahrefs (Claude.ai namespace)
|
||||
- mcp__ourseo__* # crawl_website for on-page content inventory
|
||||
- mcp__dfs-mcp__* # DataForSEO MCP fallback
|
||||
- Bash # `our keywords *`, `our serp *` CLI (Claude Code only)
|
||||
- mcp__notion__*
|
||||
- WebSearch
|
||||
- WebFetch
|
||||
|
||||
@@ -1,15 +1,32 @@
|
||||
# Ahrefs
|
||||
# Ahrefs MCP
|
||||
|
||||
> TODO: Document tool usage for this skill
|
||||
Use for **top-pages-by-traffic** views on competitor sites, **content decay** candidates on the target, and Korean platform refdomains. Namespace: `mcp__ahrefs__*` / `mcp__claude_ai_Ahrefs__*`.
|
||||
|
||||
## Available Commands
|
||||
## Key endpoints
|
||||
|
||||
- [ ] List commands
|
||||
- `site-explorer-top-pages` — pages ranked by traffic for any domain (target or competitor)
|
||||
- `site-explorer-pages-history` — trend in indexed pages over time (decay signal)
|
||||
- `site-explorer-pages-by-traffic` — sorted by current traffic
|
||||
- `site-explorer-pages-by-internal-links` — informs internal-linking opportunities
|
||||
- `keywords-explorer-overview` / `-related-terms` / `-matching-terms` — topic expansion
|
||||
- `gsc-pages` — first-party top pages when GSC is connected to the project
|
||||
|
||||
## Configuration
|
||||
## Example
|
||||
|
||||
- [ ] Add configuration details
|
||||
```
|
||||
mcp__ahrefs__site-explorer-top-pages(target="<competitor>", country="us", limit=100)
|
||||
mcp__ahrefs__site-explorer-pages-history(target="<target>", history="monthly")
|
||||
mcp__ahrefs__keywords-explorer-related-terms(keyword="<topic>", country="us", limit=50)
|
||||
```
|
||||
|
||||
## Examples
|
||||
## Strengths for this skill
|
||||
|
||||
- [ ] Add usage examples
|
||||
- Best ranked-by-traffic view of competitor content inventory.
|
||||
- Historical pages-history surfaces decaying content quickly.
|
||||
- Pairs well with OurSEO crawl (which gives the on-page side).
|
||||
|
||||
## Not for this skill when
|
||||
|
||||
- **On-page content inventory of the target** — OurSEO `crawl_website` is the ground-truth source.
|
||||
- **Cannibalization detection** on the target — GSC first-party data is required.
|
||||
- **Korean Naver content** — Ahrefs underrepresents Naver Blog/Cafe; use `our research naver *` and WebSearch.
|
||||
|
||||
42
custom-skills/23-seo-content-strategy/desktop/tools/gsc.md
Normal file
42
custom-skills/23-seo-content-strategy/desktop/tools/gsc.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# Google Search Console
|
||||
|
||||
**Required** for two content-strategy tasks that no other backend can do honestly:
|
||||
|
||||
1. **Cannibalization detection** — query × page combos where multiple URLs share impressions.
|
||||
2. **Decay detection** — period-over-period impression decline on the target's existing pages.
|
||||
|
||||
## CLI commands
|
||||
|
||||
```bash
|
||||
# Top queries — what the site already ranks for
|
||||
our research search-console queries --site sc-domain:<domain> --days 28
|
||||
|
||||
# Top pages by clicks/impressions
|
||||
our research search-console pages --site sc-domain:<domain> --days 28
|
||||
|
||||
# Combined query × page — REQUIRED for cannibalization
|
||||
our research search-console combined --site sc-domain:<domain> --days 90
|
||||
```
|
||||
|
||||
`sc-domain:` prefix for Domain-verified properties; URL-prefix properties use the plain URL.
|
||||
|
||||
## Decay workflow
|
||||
|
||||
1. Pull `pages` for the last 90 days.
|
||||
2. Pull `pages` for the same 90-day window from 90 days prior (or use cached prior runs).
|
||||
3. Diff impression / click counts per URL.
|
||||
4. Flag URLs with >30% impression decline as decay candidates.
|
||||
5. Cross-reference with `our collect crawl` output to check freshness signals (last-modified, content age).
|
||||
|
||||
## Cannibalization workflow
|
||||
|
||||
1. Pull `combined` over 90 days.
|
||||
2. Group by query; count distinct URLs per query.
|
||||
3. Flag queries where 2+ URLs each have >100 impressions — the site is competing with itself.
|
||||
|
||||
## Not for this skill when
|
||||
|
||||
- **Net-new content discovery** — GSC only knows what already ranks. Use Semrush/Ahrefs for gap discovery.
|
||||
- **Competitor performance** — single-site only.
|
||||
|
||||
Gotcha: `our-claude-skills/custom-skills/15-seo-search-console/code/gotcha/gsc-cli-integration.md`.
|
||||
@@ -0,0 +1,39 @@
|
||||
# OurSEO Agent (CLI + MCP)
|
||||
|
||||
The **on-page** half of content strategy work — what the target site itself publishes, in what shape, with what schema. Pair with a keyword backend (Semrush/Ahrefs) for performance data.
|
||||
|
||||
## CLI commands (Claude Code)
|
||||
|
||||
```bash
|
||||
# Crawl the target for content inventory (titles, H1s, meta, last-modified)
|
||||
our collect crawl https://<site> --max-pages 500
|
||||
|
||||
# Korean batch keyword research for content gaps
|
||||
our keywords ideas "<seed>" --location 2410 --limit 50
|
||||
our keywords for-site <competitor.com> --location 2410 --limit 100
|
||||
our serp ranked-keywords <domain> --location 2410 --limit 100
|
||||
|
||||
# Naver-specific content discovery
|
||||
our research naver keywords ideas "<seed>" --limit 30
|
||||
our research naver serp "<keyword>"
|
||||
```
|
||||
|
||||
## MCP tools (Claude Desktop)
|
||||
|
||||
```
|
||||
mcp__ourseo__crawl_website(url="<target>", max_pages=200)
|
||||
mcp__ourseo__find_similar_pages(crawl_path="<path/to/crawl.json>", query="<topic>")
|
||||
mcp__ourseo__search_knowledge_graph(query="<entity>")
|
||||
```
|
||||
|
||||
## Strengths for this skill
|
||||
|
||||
- **`crawl_website` is the ground-truth on-page content inventory.** No vendor estimates — just what the site publishes.
|
||||
- **`find_similar_pages`** does semantic clustering on a prior crawl (Vertex AI embeddings) — useful for topic-cluster building and cannibalization candidates.
|
||||
- Korean Naver content discovery via `our research naver *` covers a market Semrush/Ahrefs don't reach.
|
||||
|
||||
## Not for this skill when
|
||||
|
||||
- **Search volume / KD per keyword** — Semrush MCP is the cleanest source.
|
||||
- **Top pages by traffic on competitor sites** — Ahrefs `site-explorer-top-pages`.
|
||||
- **First-party content performance** — GSC `pages` / `combined` reports.
|
||||
@@ -0,0 +1,34 @@
|
||||
# Semrush MCP
|
||||
|
||||
**Default** for organic content discovery and keyword expansion in content strategy work.
|
||||
|
||||
Call pattern: discovery → `get_report_schema` → `execute_report`.
|
||||
|
||||
## Key reports
|
||||
|
||||
- `organic_research` — organic keywords + top pages for a domain
|
||||
- `keyword_research` — expansion, volume, KD, intent
|
||||
- `overview_research` — domain-level traffic/visibility
|
||||
|
||||
## Example
|
||||
|
||||
```
|
||||
mcp__semrush__organic_research(query="<competitor.com>", database="us")
|
||||
mcp__semrush__keyword_research(query="<seed topic>", database="us")
|
||||
mcp__semrush__get_report_schema(report_id="<id>")
|
||||
mcp__semrush__execute_report(report_id="<id>", params={...})
|
||||
```
|
||||
|
||||
Korean market: `database="kr"`.
|
||||
|
||||
## Strengths for this skill
|
||||
|
||||
- Best overall keyword + organic competitor view.
|
||||
- Cleanest discovery → schema → execute pattern for batch content brief generation.
|
||||
- Pairs with OurSEO crawl (on-page) and GSC (first-party performance).
|
||||
|
||||
## Not for this skill when
|
||||
|
||||
- **On-page inventory of target site** — OurSEO `crawl_website`.
|
||||
- **Cannibalization detection** — GSC first-party `combined` report.
|
||||
- **Korean Naver content** — `our research naver *` covers Naver-specific patterns Semrush doesn't.
|
||||
Reference in New Issue
Block a user