seo-ahrefs
Ahrefs API analyst (extension). Reads referring domains, backlinks, organic keywords, and content explorer data via the tested @ahrefs/mcp@0.0.11 server. Pairs…
SEO drift monitoring: capture baselines of SEO-critical elements, detect changes, and track regressions over time. Git for SEO: baseline, diff, and track changes to your on-page SEO. Use when user says "SEO drift", "baseline", "track changes", "did anything break", "SEO
$ npx -y skills add AgriciDaniel/claude-seo --skill seo-drift --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/seo-driftContext preview
The summary Claude sees to decide when to auto-load this skill.
SEO drift monitoring: capture baselines of SEO-critical elements, detect changes, and track regressions over time. Git for SEO: baseline, diff, and track changes to your on-page SEO. Use when user says "SEO drift", "baseline", "track changes", "did anything break", "SEO
name: seo-drift description: > SEO drift monitoring: capture baselines of SEO-critical elements, detect changes, and track regressions over time. Git for SEO: baseline, diff, and track changes to your on-page SEO. Use when user says "SEO drift", "baseline", "track changes", "did anything break", "SEO regression", "compare SEO", "before and after", "monitor SEO changes", or "deployment check". user-invocable: true argument-hint: "baseline|compare|history <url>" license: MIT metadata: author: AgriciDaniel original_author: "Dan Colta (Pro Hub Challenge)" version: "2.3.1" category: seo
Git for your SEO. Capture baselines, detect regressions, track changes over time.
---
| Command | Purpose | |---------|---------| | `/seo drift baseline <url>` | Capture current SEO state as a "known good" snapshot | | `/seo drift compare <url>` | Compare current page state to stored baseline | | `/seo drift history <url>` | Show change history and past comparisons |
---
Every baseline records these SEO-critical elements:
| Element | Field | Source | |---------|-------|--------| | Title tag | `title` | `parse_html.py` | | Meta description | `meta_description` | `parse_html.py` | | Canonical URL | `canonical` | `parse_html.py` | | Robots directives | `meta_robots` | `parse_html.py` | | H1 headings | `h1` (array) | `parse_html.py` | | H2 headings | `h2` (array) | `parse_html.py` | | H3 headings | `h3` (array) | `parse_html.py` | | JSON-LD schema | `schema` (array) | `parse_html.py` | | Open Graph tags | `open_graph` (dict) | `parse_html.py` | | Core Web Vitals | `cwv` (dict) | `pagespeed_check.py` | | HTTP status code | `status_code` | `fetch_page.py` | | HTML content hash | `html_hash` (SHA-256) | Computed | | Schema content hash | `schema_hash` (SHA-256) | Computed |
---
The comparison engine applies **17 rules across 3 severity levels**. Load `references/comparison-rules.md` for the full rule set with thresholds, recommended actions, and cross-skill references.
| Level | Meaning | Response Time | |-------|---------|---------------| | **CRITICAL** | SEO-breaking change, likely traffic loss | Immediate | | **WARNING** | Potential impact, needs investigation | Within 1 week | | **INFO** | Awareness only, may be intentional | Review at convenience |
---
All data is stored locally in SQLite:
~/.cache/claude-seo/drift/baselines.db
URL normalization ensures consistent matching: lowercase scheme/host, strip default ports (80/443), sort query parameters, remove UTM parameters, strip trailing slashes.
---
Captures the current state of a page and stores it.
**Steps:** 1. Validate URL (SSRF protection via `google_auth.validate_url()`) 2. Fetch page via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run fetch_page.py <URL>` 3. Parse HTML via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run parse_html.py <URL>` 4. Optionally fetch CWV via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run pagespeed_check.py <URL>` (use `--skip-cwv` to skip) 5. Hash HTML body and schema content (SHA-256) 6. Store snapshot in SQLite
**Execution:**
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_baseline.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_baseline.py <url> --skip-cwv**Output:** JSON with baseline ID, timestamp, URL, and summary of captured elements.
---
Fetches the current page state and diffs it against the most recent baseline.
**Steps:** 1. Validate URL 2. Load most recent baseline from SQLite (or specific `--baseline-id`) 3. Fetch and parse current page state 4. Run all 17 comparison rules 5. Classify findings by severity 6. Store comparison result 7. Output JSON diff report
**Execution:**
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url> --baseline-id 5
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url> --skip-cwv**Output:** JSON with all triggered rules, old/new values, severity, and actions.
After comparison, offer to generate an HTML report:
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_report.py <comparison_json_file> --output drift-report.html---
Shows all baselines and comparisons for a URL.
**Execution:**
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_history.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_history.py <url> --limit 10**Output:** JSON array of baselines (newest first) with timestamps and comparison summaries.
---
When drift is detected, recommend the appropriate specialized skill:
| Finding | Recommendation | |---------|----------------| | Schema removed or modified | Run `/seo schema <url>` for full validation | | CWV regression | Run `/seo technical <url>` for performance audit | | Title or meta description changed | Run `/seo page <url>` for content analysis | | Canonical changed or removed | Run `/seo technical <url>` for indexability check | | Noindex added | Run `/seo technical <url>` for crawlability audit | | H1/heading structure changed | Run `/seo content <url>` for E-E-A-T review | | OG tags removed | Run `/seo page <url>` for social sharing analysis | | Status code changed to error | Run `/seo technical <url>` for full diagnostics |
---
| Scenario | Action | |----------|--------| | URL unreachable | Report error from `fetch_page.py`. Do not guess state. Suggest user verify URL. | | No baseline exists for URL | Inform user and suggest running `baseline` first. | | SSRF blocked (private IP) | Report `validate_url()` rejection. Never bypass. | | SQLite datab
Claude SEO is an open-source SEO analysis plugin for Claude Code. It runs 25 sub-skills and 18 specialist agents in parallel across technical SEO, content quality (E-E-A-T), Schema.org markup, AI search optimization (GEO), local SEO, e-commerce, and
Repo: AgriciDaniel/claude-seo
Ahrefs API analyst (extension). Reads referring domains, backlinks, organic keywords, and content explorer data via the tested @ahrefs/mcp@0.0.11 server. Pairs…
AI image generation for SEO assets: OG/social preview images, blog hero images, schema images, product photography, infographics. Powered by Gemini via…
Bing Webmaster Tools + IndexNow extension. Microsoft Copilot citations are fed by the Bing index; this skill makes Bing visibility, link data, and IndexNow URL…
Live SEO data via DataForSEO MCP server: SERP analysis, keyword research (volume, difficulty, intent, trends), backlink profiles, on-page analysis, competitor…
Full-site crawling, scraping, and site mapping via Firecrawl MCP. Use when user says "crawl site", "map site", "full crawl", "find all pages", "broken links",…
Profound LLM citation tracker (extension). Time-series brand citation rates across ChatGPT, Perplexity, and other LLMs. Pairs with seo-seranking for…