SEO SKILL
seo-audit
A full-site SEO audit that crawls, delegates to specialists and returns a 0 to 100 health score.
by Daniel AgriciAgriciDaniel/claude-seoMIT licencev2.3.1upstream 2026-09-10read by us 11 September 2026
Give it a URL. It renders the homepage, works out what kind of business the site is, crawls up to 500 pages, and hands the findings to up to fifteen specialist sub-agents: technical, content, schema, sitemap, performance, visual, GEO, and the conditional ones (local, maps, Google data, backlinks, clustering, drift, ecommerce).
What comes back is a folder: a full report, a prioritised action plan, a JSON envelope, per-category findings, screenshots if Playwright is present, and an offer to render an A4 PDF.
It is the orchestrator of the claude-seo plugin, so it is only as complete as the sub-skills and scripts installed beside it.
When to use it
The phrases that trigger it
From the skill’s own description: say any of these and an agent that has it installed will load it.
- audit
- full SEO check
- analyze my site
- website health check
What’s inside
The playbook, section by section
A seven-step process
Render the homepage, detect the business type, crawl, delegate, score, persist the artefacts under `{domain}-audit/`, report.
Fifteen specialists, seven or eight always on
Technical, content, schema, sitemap, performance, visual and GEO run every time; local, maps, Google APIs, backlinks, clustering, drift, ecommerce and search-experience are conditional. The frontmatter says 8 always and 7 conditional, the listing says 7 and 8; the skill disagrees with itself by one.
Weighted scoring
Technical 22%, content 23%, on-page 20%, schema 10%, performance 10%, AI readiness 10%, images 5%. The weights are the skill author’s; the page says so.
A JSON envelope the PDF reads
Summary, categories with severity-tagged findings, a four-phase action plan, and artefact paths, so `google_report.py` can render a report even with no Google data.
Error handling as a table
Unreachable URL, robots.txt blocks, 429s, timeouts on big sites, and a sub-agent running out of turns each have a written response. Partial findings are merged, not lost.
Reference files: none, the whole skill is SKILL.md.
See it in action
One real run, cropped
We installed the skill folder, gave it the request below, and kept what it returned. Nothing was edited; the excerpt is the first 1,351 of 16,396 characters. The full output is in our repository as research/skills/runs/seo-audit.md.
Audit https://addition-labs.com. Cap the crawl at 10 pages. No subagents are available; run the specialist checks inline. Give the health score and the action plan.
SEO Audit: addition-labs.com
Audit date: 2026-09-11 · Crawl: 10 pages (user cap) of 168 in the sitemap · Method: render_page.py, fetch_page.py, parse_html.py, sitemap_discovery.py, content_quality.py, analyze_visual.py, capture_screenshot.py via the claude-seo launcher; specialist checks run inline (no subagents available).
Executive Summary
SEO Health Score: 70 / 100
| Category | Weight | Score |
|---|---|---|
| Technical SEO | 22% | 72 |
| Content Quality | 23% | 70 |
| On-Page SEO | 20% | 72 |
| Schema / Structured Data | 10% | 78 |
| Performance (CWV) | 10% | 55 (resource-weight estimate, no LCP/INP/CLS measured) |
| AI Search Readiness | 10% | 82 |
| Images | 5% | 50 |
Business type detected: Agency. Signals: /case-studies (5 named clients), /industries (12 pages), client logos and "our partners" on the homepage, /services with four channels. A /pricing page is a secondary SaaS-like signal but the homepage copy ("the new-gen marketing agency for ecommerce and B2B brands") settles it. No local-service signals (the Sheridan, WY address in schema is a registered-agent address, no service area or map), so seo-local was not run. No e-commerce or drift baseline. Google API, Moz/Bing backlink and DataForSEO credentials are not configured, so those enrichments were skipped.
Top 5 issues
Cropped here. The rest continues in the same register.
What it could not do in this run
Core Web Vitals lab/field numbers (pagespeed_check.py returned "PSI rate limit exceeded" with no API key; no CrUX key), GSC/GA4 data, backlink metrics (no Moz/Bing/DataForSEO; Common Crawl cache empty), drift baseline (none stored), the 158 sitemap pages beyond the 10-page cap (about, pricing, case studies, guides, glossary, compare, tools), and the seo-sxo / seo-cluster / seo-local / seo-backlinks specialist passes (no subagents; sxo and cluster have no bundled script to run inline, so they are not represented in the score).
Method behind it
Where we would differ, and why
Our own audit guide walks the same categories by hand and shows which of them move rankings and which are hygiene. Read it beside the skill’s score: the score tells you where you stand, the guide tells you what to fix first for a store.
- Note 1
- The health score is a heuristic the plugin invented; Google publishes no such number. Treat 62 versus 68 as a direction, not a measurement.
- Note 2
- The crawl cap of 500 pages is generous for a brochure site and small for a catalogue. On a large store, audit a section, not the domain.
- Note 3
- Out of the box the Performance category cannot be measured: pagespeed_check.py calls PageSpeed Insights without a key and hits the shared quota at once. The 10% weight is scored from a lab proxy or left unscored until you add a Google API key.
SKILL.md
The upstream file, as we read it
Copyright Daniel Agrici, MIT licence, commit 55c7914 of AgriciDaniel/claude-seo. Reproduced here under that licence so you can read what the agent will read; the folder’s reference files are in the repository.
Open SKILL.md (1,146 words)
---
name: seo-audit
description: "Full website SEO audit with parallel subagent delegation. Crawls up to 500 pages, detects business type, delegates to up to 15 specialists (8 always + 7 conditional), generates health score. Use when user says audit, full SEO check, analyze my site, or website health check."
user-invocable: true
argument-hint: "[url]"
license: MIT
metadata:
author: AgriciDaniel
version: "2.3.1"
category: seo
---
# Full Website SEO Audit
## Process
1. **Render homepage**: use `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run render_page.py <url> --mode auto --json` to capture raw HTML, rendered HTML, extracted text, SPA status, and accessibility data when needed
2. **Detect business type**: analyze homepage signals per seo orchestrator
3. **Crawl site**: follow internal links up to 500 pages, respect robots.txt
4. **Delegate to subagents** (if available, otherwise run inline sequentially):
- `seo-technical` -- robots.txt, sitemaps, canonicals, Core Web Vitals, security headers
- `seo-content` -- E-E-A-T, readability, thin content, AI citation readiness
- `seo-schema` -- detection, validation, generation recommendations
- `seo-sitemap` -- structure analysis, quality gates, missing pages
- `seo-performance` -- LCP, INP, CLS measurements
- `seo-visual` -- screenshots, mobile testing, above-fold analysis
- `seo-geo` -- AI crawler access, llms.txt, citability, brand mention signals
- `seo-local` -- GBP signals, NAP consistency, reviews, local schema, industry-specific local factors (spawn when Local Service industry detected: brick-and-mortar, SAB, or hybrid business type)
- `seo-maps` -- Geo-grid rank tracking, GBP audit, review intelligence, competitor radius mapping (spawn when Local Service detected AND DataForSEO MCP available)
- `seo-google` -- CWV field data (CrUX), URL indexation (GSC), organic traffic (GA4) (spawn when Google API credentials detected via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run google_auth.py --check`)
- `seo-backlinks` -- Backlink profile data: DA/PA, referring domains, anchor text, toxic links (spawn when Moz or Bing API credentials detected via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check`, or always include Common Crawl domain-level metrics)
- `seo-cluster` -- Semantic clustering analysis (spawn when content strategy signals detected: blog, pillar pages, topic clusters)
- `seo-sxo` -- Search experience analysis: page-type mismatch, user stories, persona scoring (always include in full audits)
- `seo-drift` -- Drift analysis: compare against stored baseline (spawn when drift baseline exists for the URL via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_history.py <url>`)
- `seo-ecommerce` -- Product schema, marketplace intelligence (spawn when E-commerce industry detected)
5. **Score** -- aggregate into SEO Health Score (0-100)
6. **Persist audit artifacts** -- write all outputs under `{domain}-audit/`
7. **Report** -- generate prioritized action plan and optional PDF/HTML report
## Crawl Configuration
```
Max pages: 500
Respect robots.txt: Yes
Follow redirects: Yes (max 3 hops)
Timeout per page: 30 seconds
Concurrent requests: 5
Delay between requests: 1 second
```
## Output Files
- `{domain}-audit/FULL-AUDIT-REPORT.md`: Comprehensive findings
- `{domain}-audit/ACTION-PLAN.md`: Prioritized recommendations (Critical > High > Medium > Low)
- `{domain}-audit/audit-data.json`: Structured audit envelope for report generation
- `{domain}-audit/findings/*.md`: Per-category specialist findings (`technical.md`, `content.md`, `schema.md`, `performance.md`, `visual.md`, etc.)
- `{domain}-audit/screenshots/`: Desktop + mobile captures (if Playwright available)
- **PDF Report** (recommended): Generate a professional A4 PDF using `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run google_report.py --type full --data {domain}-audit/audit-data.json --domain <domain> --output-dir {domain}-audit/`. This produces a white-cover enterprise report with TOC, executive summary, charts (Lighthouse gauges, query bars, index donut), metric cards, threshold tables, prioritized recommendations with effort estimates, and implementation roadmap. Always offer PDF generation after completing an audit.
## Structured Audit Data Envelope
Write `{domain}-audit/audit-data.json` with this shape so `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run google_report.py --type full --data {domain}-audit/audit-data.json --domain <domain> --output-dir {domain}-audit/` can generate a report even when Google API data is unavailable:
```json
{
"summary": {
"health_score": 0,
"business_type": "detected type",
"top_findings": [],
"quick_wins": []
},
"categories": [
{
"name": "Technical SEO",
"score": 0,
"what_works": [],
"findings": [
{
"title": "Finding title",
"severity": "Critical|High|Medium|Low|Info",
"description": "Evidence-backed detail",
"recommendation": "Specific fix"
}
]
}
],
"action_plan": {
"phases": [
{"name": "Phase 1: Critical Fixes", "timeframe": "Week 1", "items": []},
{"name": "Phase 2: High-Impact Improvements", "timeframe": "Weeks 2-3", "items": []},
{"name": "Phase 3: Content & Authority", "timeframe": "Month 2", "items": []},
{"name": "Phase 4: Monitoring & Iteration", "timeframe": "Ongoing", "items": []}
]
},
"artifacts": {
"findings_dir": "findings/",
"screenshots_dir": "screenshots/"
}
}
```
## Scoring Weights
| Category | Weight |
|----------|--------|
| Technical SEO | 22% |
| Content Quality | 23% |
| On-Page SEO | 20% |
| Schema / Structured Data | 10% |
| Performance (CWV) | 10% |
| AI Search Readiness | 10% |
| Images | 5% |
## Report Structure
### Executive Summary
- Overall SEO Health Score (0-100)
- Business type detected
- Top 5 critical issues
- Top 5 quick wins
### Technical SEO
- Crawlability issues
- Indexability problems
- Security concerns
- Core Web Vitals status
### Content Quality
- E-E-A-T assessment
- Thin content pages
- Duplicate content issues
- Readability scores
### On-Page SEO
- Title tag issues
- Meta description problems
- Heading structure
- Internal linking gaps
### Schema & Structured Data
- Current implementation
- Validation errors
- Missing opportunities
### Performance
- LCP, INP, CLS scores
- Resource optimization needs
- Third-party script impact
### Images
- Missing alt text
- Oversized images
- Format recommendations
### AI Search Readiness
- Citability score
- Structural improvements
- Authority signals
## Priority Definitions
- **Critical**: Blocks indexing or causes penalties (fix immediately)
- **High**: Significantly impacts rankings (fix within 1 week)
- **Medium**: Optimization opportunity (fix within 1 month)
- **Low**: Nice to have (backlog)
## DataForSEO Integration (Optional)
If DataForSEO MCP tools are available, spawn the `seo-dataforseo` agent alongside existing subagents to enrich the audit with live data: real SERP positions, backlink profiles with spam scores, on-page analysis (Lighthouse), business listings, and AI visibility checks (ChatGPT scraper, LLM mentions).
## Google API Integration (Optional)
If Google API credentials are configured (`"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run google_auth.py --check`), spawn the `seo-google` agent to enrich the audit with real Google field data: CrUX Core Web Vitals (replaces lab-only estimates), GSC URL indexation status, search performance (clicks, impressions, CTR), and GA4 organic traffic trends. The Performance (CWV) category score benefits most from field data.
## Error Handling
| Scenario | Action |
|----------|--------|
| URL unreachable (DNS failure, connection refused) | Report the error clearly. Do not guess site content. Suggest the user verify the URL and try again. |
| robots.txt blocks crawling | Report which paths are blocked. Analyze only accessible pages and note the limitation in the report. |
| Rate limiting (429 responses) | Back off and reduce concurrent requests. Report partial results with a note on which sections could not be completed. |
| Timeout on large sites (500+ pages) | Cap the crawl at the timeout limit. Report findings for pages crawled and estimate total site scope. |
| Subagent hits its `maxTurns` budget on a large site | Findings are not lost: every audit subagent writes a partial `output_dir/findings/*.md` after its first analysis pass and overwrites it with the complete findings before finishing. Read whatever findings file exists and merge it into the report, noting it may be partial. |
Questions
Questions people ask before installing
Does it need DataForSEO or Google API keys?
No. Without them it runs the crawl-based checks and lab estimates. With Google credentials it replaces lab Core Web Vitals with CrUX field data and adds Search Console indexation; with DataForSEO it adds live SERP positions and backlink data.
Can I run just this skill without the whole plugin?
Not usefully. It calls the plugin launcher and delegates to sibling sub-skills. Install claude-seo as a plugin, then say "audit" with a URL.
What if the sub-agents are not available?
The skill says to run the specialists inline. Four of them (search-experience, clustering, local, backlinks) exist only as agents with no bundled script, so inline they have nothing to run and are absent from the score. The remaining checks run through the launcher scripts.