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:
@@ -85,13 +85,75 @@ Save Korean-language report to SEO Audit Log database.
|
||||
| Found Date | Date | Analysis date (YYYY-MM-DD) |
|
||||
| Audit ID | Rich Text | Format: CRAWL-YYYYMMDD-NNN |
|
||||
|
||||
## Data Sources
|
||||
## Data Source Selection
|
||||
|
||||
| Source | Purpose |
|
||||
|--------|---------|
|
||||
| `our-seo-agent` CLI | Future primary data source; use `--input` for pre-fetched JSON |
|
||||
| Notion MCP | Save audit report to database |
|
||||
| WebSearch | Current bot documentation and best practices |
|
||||
Crawl-budget analysis is **primarily log-based** — the authoritative signal lives in server access logs that this skill's local Python scripts parse. API backends supplement that with crawled URL inventories, index status, and third-party site-audit views. Pick per data class.
|
||||
|
||||
| Backend | Best for | Notes |
|
||||
|---|---|---|
|
||||
| **Server access logs** (via `scripts/log_parser.py` + `crawl_budget_analyzer.py`) | **Primary** — bot identification, request volume, status code distribution, waste detection, orphan pages | Requires actual server logs from the user (Nginx / Apache / CloudFront). No MCP substitute. |
|
||||
| **OurSEO** (CLI + MCP) | **Default** for crawl-derived URL inventory, index status, redirect chains | CLI: `our collect crawl`, `our research google index`, `our audit tech`. MCP: `mcp__ourseo__crawl_website`, `mcp__ourseo__check_index`. Distributed crawl for large sites: `our collect distributed --workers N`. |
|
||||
| **Ahrefs MCP** (`mcp__ahrefs__*`) | Orphan detection, redirect chain analysis via Ahrefs site audit | `site-audit-issues`, `site-audit-page-explorer`, `site-audit-page-content`. Useful when an Ahrefs project already exists for the domain. |
|
||||
| **Semrush MCP** (`mcp__semrush__*`) | Alternative site audit when Ahrefs project doesn't exist | `siteaudit_research` → `get_report_schema` → `execute_report`. |
|
||||
| **GSC** (via `our research search-console`) | First-party Googlebot crawl stats (Coverage / Crawl Stats reports) | Required for ground-truth Googlebot behaviour — server logs show what hit the origin, GSC shows what Google considers crawled. |
|
||||
|
||||
### 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. **Server access logs are available** → ALWAYS process them first (`log_parser.py` + `crawl_budget_analyzer.py`). They are the only source for actual bot behaviour at the origin.
|
||||
4. **Sitemap vs. crawl comparison needed** → OurSEO `crawl_website` for URL inventory; cross-reference with logs.
|
||||
5. **No logs available** → fall back to OurSEO crawl + GSC Coverage + Ahrefs/Semrush site audit. State this limitation explicitly in the report.
|
||||
6. **Default**: server logs (when present) + **OurSEO crawl + index check** for URL inventory.
|
||||
7. **Still ambiguous + non-trivial** → ask once via `AskUserQuestion`.
|
||||
|
||||
### Backend call patterns
|
||||
|
||||
**Local log analysis (primary):**
|
||||
```bash
|
||||
python scripts/log_parser.py --log-file access.log --json
|
||||
python scripts/log_parser.py --log-file access.log.gz --streaming --json
|
||||
python scripts/log_parser.py --log-file access.log --bot googlebot --json
|
||||
|
||||
python scripts/crawl_budget_analyzer.py --log-file access.log --sitemap https://<site>/sitemap.xml --json
|
||||
python scripts/crawl_budget_analyzer.py --log-file access.log --scope waste --json
|
||||
python scripts/crawl_budget_analyzer.py --log-file access.log --scope orphans --json
|
||||
python scripts/crawl_budget_analyzer.py --log-file access.log --scope bots --json
|
||||
```
|
||||
|
||||
**OurSEO CLI (URL inventory + index check):**
|
||||
```bash
|
||||
our collect crawl https://<site> --max-pages 5000
|
||||
our collect distributed https://<site> --workers 8 --max-pages 50000
|
||||
our research google index --domain <site>
|
||||
our audit tech https://<site>
|
||||
```
|
||||
|
||||
**OurSEO MCP (Claude Desktop):**
|
||||
```
|
||||
mcp__ourseo__crawl_website(url="<site>", max_pages=5000)
|
||||
mcp__ourseo__check_index(domain="<site>")
|
||||
```
|
||||
|
||||
**GSC (first-party crawl stats):**
|
||||
```bash
|
||||
our research search-console queries --site sc-domain:<site> --days 28
|
||||
# See also: GSC Coverage / Crawl Stats reports (UI-only for some sections).
|
||||
```
|
||||
|
||||
**Ahrefs MCP (third-party site audit):**
|
||||
```
|
||||
mcp__ahrefs__site-audit-projects()
|
||||
mcp__ahrefs__site-audit-issues(project_id="<id>")
|
||||
mcp__ahrefs__site-audit-page-explorer(project_id="<id>")
|
||||
```
|
||||
|
||||
**Semrush MCP (alternative site audit):**
|
||||
```
|
||||
mcp__semrush__siteaudit_research(query="<site>", database="us")
|
||||
```
|
||||
|
||||
Always record the chosen data source(s) in the report **Overview** so future audits can compare like-for-like — and explicitly state whether server logs were available.
|
||||
|
||||
## Output Format
|
||||
|
||||
|
||||
Reference in New Issue
Block a user