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:
Andrew Yim
2026-05-14 03:15:32 +09:00
committed by GitHub
parent 1ca84f67ed
commit e527fb4b0f
71 changed files with 2647 additions and 258 deletions

View File

@@ -21,11 +21,41 @@ Expand seed keywords, classify search intent, cluster topics, and identify compe
4. **Topic Clustering** - Group keywords into semantic clusters
5. **Gap Analysis** - Find competitor keywords missing from target site
## MCP Tool Usage
## Data Source Selection
### SEO Data (DataForSEO)
This skill can pull keyword data from multiple backends. **Pick one per task** — don't fan out to every backend by default (cost + rate limits).
**Primary — our-seo-agent CLI:**
| Backend | Best for | Notes |
|---|---|---|
| **Semrush MCP** (`mcp__semrush__*`) | Default for keyword volume, related/matching terms, organic competitor pulls | Call pattern: `keyword_research``get_report_schema``execute_report`. `database="us"` default; `"kr"` for Korean market. |
| **Ahrefs MCP** (`mcp__ahrefs__*`) | Ahrefs DR/UR weighting; first-party `gsc-keywords` (only Ahrefs integrates GSC inside its MCP) | `keywords-explorer-overview`, `-matching-terms`, `-related-terms`, `-search-suggestions`, `-volume-by-country`, `gsc-keywords`. |
| **OurSEO Agent CLI** (`our keywords *`) | DataForSEO under the hood — cheapest per call, batch-friendly, Korean-aware via `--location 2410` | Claude Code only (needs Bash). Wrap calls: `our keywords volume`, `ideas`, `for-site`, `intent`, `difficulty`. |
| **OurSEO Agent MCP** (`mcp__ourseo__*`) | Claude Desktop equivalent for crawl-derived keywords + Knowledge Graph entity expansion | `search_knowledge_graph` for entity seeding; `crawl_website` to extract on-page keyword inventory from the target site itself. |
| **DataForSEO MCP** (`mcp__dfs-mcp__*`) | Direct fallback when `our` CLI isn't available | Same data as `our keywords *`. |
| **GSC** (via `our research search-console` or Ahrefs `gsc-*`) | First-party queries the site actually ranks for — ground truth, not estimates | Use to validate/prune Semrush or Ahrefs lists with real impressions/CTR. |
### How to pick
Apply these in order; stop at the first match:
1. **User named a backend explicitly** in the prompt → use it.
2. **User preference memory** — read `feedback_seo_tool_preferences.md`; honor the task-type default there.
3. **Task needs a capability only one backend has** (e.g., `gsc-keywords` first-party data, or `mcp__ourseo__search_knowledge_graph` entity expansion) → use that backend.
4. **Default by market**:
- English-market or unspecified → **Semrush MCP** with `database="us"`.
- Korean market → **OurSEO CLI** `our keywords <subcmd> --location 2410 --language ko` (Claude Code), or **Semrush MCP** with `database="kr"` (Claude Desktop).
5. **Still ambiguous on a non-trivial task** → ask once via `AskUserQuestion` listing the top 23 candidates.
### Backend call patterns
**Semrush MCP (default):**
```
mcp__semrush__keyword_research(query="<seed>", database="us")
mcp__semrush__get_report_schema(report_id="...")
mcp__semrush__execute_report(report_id="...", params={...})
```
**OurSEO CLI (Korean default, Claude Code):**
```bash
our keywords volume "<keyword>" --location 2410 --language ko
our keywords ideas "<keyword>" --location 2410 --limit 50
@@ -34,48 +64,50 @@ our keywords intent "<kw1>" "<kw2>" "<kw3>"
our keywords difficulty "<kw1>" "<kw2>"
```
**Interactive fallback — DataForSEO MCP:**
**Ahrefs MCP (when user requests, or for GSC first-party):**
```
mcp__dfs-mcp__dataforseo_labs_google_keyword_overview
mcp__dfs-mcp__dataforseo_labs_google_keyword_ideas
mcp__dfs-mcp__dataforseo_labs_google_keyword_suggestions
mcp__dfs-mcp__dataforseo_labs_search_intent
mcp__dfs-mcp__dataforseo_labs_bulk_keyword_difficulty
mcp__dfs-mcp__kw_data_google_ads_search_volume
mcp__dfs-mcp__dataforseo_labs_google_keywords_for_site
mcp__ahrefs__keywords-explorer-overview(keyword="<seed>", country="us")
mcp__ahrefs__keywords-explorer-matching-terms(keyword="<seed>", country="us")
mcp__ahrefs__keywords-explorer-volume-by-country(keyword="<seed>")
mcp__ahrefs__gsc-keywords(...)
```
### Common Parameters
- **location_code**: 2410 (Korea), 2840 (US), 2392 (Japan)
- **language_code**: ko, en, ja
**OurSEO Agent MCP (Claude Desktop, KG/entity expansion):**
```
mcp__ourseo__search_knowledge_graph(query="<brand or entity>")
mcp__ourseo__crawl_website(url="<target>", max_pages=50)
```
### Web Search for Naver Discovery
```
WebSearch: Naver autocomplete and trend discovery
```
### Common parameters across backends
| 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` |
| Language | (database-bound) | (country-bound) | `--language ko`/`en`/`ja` |
## Workflow
### 1. Seed Keyword Expansion
1. Input seed keyword (Korean or English)
2. Fetch search volume via `our keywords volume "<seed>" --location 2410 --language ko`
3. Expand with `our keywords ideas "<seed>" --location 2410 --limit 50`
4. Get autocomplete suggestions via MCP: `mcp__dfs-mcp__dataforseo_labs_google_keyword_suggestions`
5. Apply Korean suffix expansion if Korean market
6. Deduplicate and merge results
1. Determine backend via **Data Source Selection** above.
2. Fetch search volume for the seed.
3. Expand via the chosen backend's "related" / "ideas" / "matching-terms" endpoint.
4. Apply Korean suffix expansion if Korean market (regardless of backend).
5. Deduplicate and merge.
### 2. Intent Classification & Clustering
1. Classify each keyword by search intent
2. Group keywords into topic clusters
3. Identify pillar topics and supporting terms
4. Calculate cluster-level metrics (total volume, avg KD)
1. Classify each keyword by search intent (informational / navigational / commercial / transactional).
2. Group keywords into topic clusters.
3. Identify pillar topics and supporting terms.
4. Calculate cluster-level metrics (total volume, avg KD).
### 3. Gap Analysis
1. Pull organic keywords for target: `our keywords for-site <target.com> --location 2410 --limit 100`
2. Pull organic keywords for competitors: `our keywords for-site <competitor.com> --location 2410 --limit 100`
3. Identify keywords present in competitors but missing from target
4. Score opportunities by volume/difficulty ratio
5. Prioritize by intent alignment with business goals
1. Pull organic keywords for target via chosen backend.
2. Pull organic keywords for competitors (parallel).
3. Identify keywords present in competitors but missing from target.
4. Score opportunities by volume/difficulty ratio.
5. Prioritize by intent alignment with business goals.
## Output Format
@@ -83,26 +115,30 @@ WebSearch: Naver autocomplete and trend discovery
## Keyword Strategy Report: [seed keyword]
### Overview
- Data source: [Semrush | Ahrefs | OurSEO CLI | OurSEO MCP | GSC]
- Market: [database/location code]
- Total keywords discovered: [count]
- Topic clusters: [count]
- Total search volume: [sum]
### Top Clusters
| Cluster | Keywords | Total Volume | Avg KD |
|---------|----------|-------------|--------|
|---|---|---|---|
| ... | ... | ... | ... |
### Top Opportunities
| Keyword | Volume | KD | Intent | Cluster |
|---------|--------|-----|--------|---------|
|---|---|---|---|---|
| ... | ... | ... | ... | ... |
### Keyword Gaps (vs competitors)
| Keyword | Volume | Competitor Position | Opportunity Score |
|---------|--------|-------------------|-------------------|
|---|---|---|---|
| ... | ... | ... | ... |
```
Always record the chosen data source in the **Overview** so future audits can compare apples to apples.
## Notion Output (Required)
All audit reports MUST be saved to OurDigital SEO Audit Log: