Google SEO Audit - multi-agent page audit
Audits a page across every Google-discoverability dimension and returns a
scored report with prioritized, cited recommendations. Every recommendation
must be grounded in the local corpus via the google-search-ads-analytics-docs skill
(.claude/skills/google-search-ads-analytics-docs/search.py) and cite a Google source_url.
Fast path - the Workflow
For a thorough, adversarially-verified audit, run the bundled seo-audit
workflow (Workflow tool), saved at .claude/workflows/seo-audit.js. It implements
the four phases below and scales agents to the work - no fixed cap:
Snapshot -> Verify (one agent per dimension) -> Refute (adversarial
verifiers per finding, false positives dropped) -> Synthesize (AUDIT-<page>.md).
Pass the target as args (URL or local path); optional { refuters: N } raises the
adversarial panel size. If the Workflow tool isn't available, do the same steps
manually with the Task tool, below.
Step 1 - Pick the target(s)
- A live page: pass the URL.
- This repo (default when the user says "my page/repo"): find local pages
with
Glob "**/*.html" (ignore .venv/, node_modules/). The repo's page is
app/index.html. Audit each found page.
Step 2 - Snapshot (deterministic, run once per target)
Use a per-target output file so multiple pages don't clobber each other:
.venv/bin/python3 .claude/skills/google-seo-audit/fetch_page.py <url-or-path> --out /tmp/snap-<page-slug>.json
Produces a JSON of: status/headers/HTTPS, title, meta description, meta robots,
canonical, viewport (mobile), lang + hreflang, H1/heading outline, word count,
images+missing-alt, JSON-LD structured data (types + a parse-OK flag - not
schema validation; the structured-data agent must still verify required props),
Open Graph, analytics/ads tags (GA4/GTM/Ads), and robots.txt (remote only).
Step 3 - Fan out the audit (one subagent per dimension)
Spawn the dimensions in parallel (Task tool, or the Workflow). Give each agent
the snapshot JSON and tell it to consult google-search-ads-analytics-docs first - run
.venv/bin/python3 .claude/skills/google-search-ads-analytics-docs/search.py "<topic>" (and
--doc <doc_id> to resolve a citation), then read the matched files - and cite
source_url on every finding. Dimensions:
- Crawlability & Indexing - HTTP status, redirects,
meta robots /
X-Robots-Tag, canonical, robots.txt, sitemap. KB: crawling-indexing/*.
- On-page SEO & Content - title (len/uniqueness), meta description,
exactly one H1, heading hierarchy, content depth, helpful-content signals.
KB:
fundamentals/seo-starter-guide, creating-helpful-content,
appearance/snippet, appearance/title-link.
- Structured Data & Rich Results - JSON-LD presence, valid types, required
props, rich-result eligibility. KB:
appearance/structured-data/*.
- Page Experience & Core Web Vitals - HTTPS, HSTS, mobile viewport,
intrusive-interstitial risk, CWV considerations. KB:
appearance/page-experience,
appearance/core-web-vitals, crawling-indexing/mobile/*.
- International (hreflang) -
lang, hreflang alternates, locale handling
(only if the page is multilingual). KB: specialty/international/*.
- Measurement & Tagging - GA4/gtag, GTM, Google Ads conversion, GA4
events/Measurement Protocol readiness. KB:
google-analytics/*,
google-ads-help/*.
Each finding: {check, verdict: pass|warn|fail, evidence, recommendation, severity: high|medium|low, citation_url}.
Step 4 - Synthesize the report
Aggregate into AUDIT-<page>.md:
- Score: each dimension 0-100; overall = average (call out fails).
- Executive summary (3-5 lines).
- Prioritized fixes: a table sorted by severity -> effort, each with the
concrete change and a
source_url citation.
- Per-dimension findings (pass/warn/fail with evidence).
- Be honest: don't invent issues; mark "N/A" where a dimension doesn't apply
(e.g. hreflang on a single-language page).
Notes
- Requires the project venv (
.venv/bin/python3) with Scrapling, and the
google-search-ads-analytics-docs skill present for grounding.
- Local files can't show HTTP-level signals (status/headers/HTTPS/robots.txt) -
flag those as "deployment-dependent, verify on the live URL".
Safety
- Authorization: only audit pages you own or are explicitly authorized to
test.
fetch_page.py issues a normal browser-like GET to the target and its
/robots.txt; do not point it at internal/private hosts you don't control
(it has no SSRF allow-list - it fetches whatever URL you pass).
- No credentials, no writes to the target. The snapshot is read-only and is
written only to the local
--out JSON (or stdout). Nothing is sent anywhere
except the HTTP GET to the page being audited.
1---2name: google-seo-audit3description: This skill should be used when the user asks to "audit my page/site/repo", "scan for SEO", "check structured data / rich results", "is my page Google-ready", "SEO audit", "Google scanner", or wants prioritized, cited recommendations to improve a page in Google Search. It runs a full multi-agent SEO / discoverability audit of a web page - a live URL OR a local .html file in the current repo - grounded in the local Google documentation knowledge base (the google-search-ads-analytics-docs skill): it spawns one subagent per audit dimension and produces a scored report with fixes that cite the official Google docs (source_url).4---56# Google SEO Audit - multi-agent page audit78Audits a page across every Google-discoverability dimension and returns a9**scored report with prioritized, cited recommendations**. Every recommendation10must be grounded in the local corpus via the **`google-search-ads-analytics-docs`** skill11(`.claude/skills/google-search-ads-analytics-docs/search.py`) and cite a Google `source_url`.1213## Fast path - the Workflow1415For a thorough, adversarially-verified audit, run the bundled **`seo-audit`**16workflow (Workflow tool), saved at `.claude/workflows/seo-audit.js`. It implements17the four phases below and **scales agents to the work - no fixed cap**:18**Snapshot -> Verify** (one agent per dimension) **-> Refute** (adversarial19verifiers per finding, false positives dropped) **-> Synthesize** (`AUDIT-<page>.md`).20Pass the target as args (URL or local path); optional `{ refuters: N }` raises the21adversarial panel size. If the Workflow tool isn't available, do the same steps22manually with the Task tool, below.2324## Step 1 - Pick the target(s)25- A live page: pass the URL.26- **This repo (default when the user says "my page/repo"):** find local pages27 with `Glob "**/*.html"` (ignore `.venv/`, `node_modules/`). The repo's page is28 `app/index.html`. Audit each found page.2930## Step 2 - Snapshot (deterministic, run once per target)31Use a per-target output file so multiple pages don't clobber each other:32```bash33.venv/bin/python3 .claude/skills/google-seo-audit/fetch_page.py <url-or-path> --out /tmp/snap-<page-slug>.json34```35Produces a JSON of: status/headers/HTTPS, title, meta description, meta robots,36canonical, viewport (mobile), lang + hreflang, H1/heading outline, word count,37images+missing-alt, JSON-LD structured data (types + a parse-OK flag - **not**38schema validation; the structured-data agent must still verify required props),39Open Graph, analytics/ads tags (GA4/GTM/Ads), and robots.txt (remote only).4041## Step 3 - Fan out the audit (one subagent per dimension)42Spawn the dimensions **in parallel** (Task tool, or the Workflow). Give each agent43the snapshot JSON and tell it to **consult `google-search-ads-analytics-docs` first** - run44`.venv/bin/python3 .claude/skills/google-search-ads-analytics-docs/search.py "<topic>"` (and45`--doc <doc_id>` to resolve a citation), then read the matched files - and cite46`source_url` on every finding. Dimensions:47481. **Crawlability & Indexing** - HTTP status, redirects, `meta robots` /49 `X-Robots-Tag`, canonical, robots.txt, sitemap. KB: `crawling-indexing/*`.502. **On-page SEO & Content** - title (len/uniqueness), meta description,51 exactly one H1, heading hierarchy, content depth, helpful-content signals.52 KB: `fundamentals/seo-starter-guide`, `creating-helpful-content`,53 `appearance/snippet`, `appearance/title-link`.543. **Structured Data & Rich Results** - JSON-LD presence, valid types, required55 props, rich-result eligibility. KB: `appearance/structured-data/*`.564. **Page Experience & Core Web Vitals** - HTTPS, HSTS, mobile viewport,57 intrusive-interstitial risk, CWV considerations. KB: `appearance/page-experience`,58 `appearance/core-web-vitals`, `crawling-indexing/mobile/*`.595. **International (hreflang)** - `lang`, hreflang alternates, locale handling60 (only if the page is multilingual). KB: `specialty/international/*`.616. **Measurement & Tagging** - GA4/gtag, GTM, Google Ads conversion, GA462 events/Measurement Protocol readiness. KB: `google-analytics/*`,63 `google-ads-help/*`.6465Each finding: `{check, verdict: pass|warn|fail, evidence, recommendation,66severity: high|medium|low, citation_url}`.6768## Step 4 - Synthesize the report69Aggregate into `AUDIT-<page>.md`:70- **Score**: each dimension 0-100; overall = average (call out fails).71- **Executive summary** (3-5 lines).72- **Prioritized fixes**: a table sorted by severity -> effort, each with the73 concrete change and a `source_url` citation.74- **Per-dimension findings** (pass/warn/fail with evidence).75- Be honest: don't invent issues; mark "N/A" where a dimension doesn't apply76 (e.g. hreflang on a single-language page).7778## Notes79- Requires the project venv (`.venv/bin/python3`) with Scrapling, and the80 `google-search-ads-analytics-docs` skill present for grounding.81- Local files can't show HTTP-level signals (status/headers/HTTPS/robots.txt) -82 flag those as "deployment-dependent, verify on the live URL".8384## Safety85- **Authorization:** only audit pages you own or are explicitly authorized to86 test. `fetch_page.py` issues a normal browser-like GET to the target and its87 `/robots.txt`; do not point it at internal/private hosts you don't control88 (it has no SSRF allow-list - it fetches whatever URL you pass).89- **No credentials, no writes to the target.** The snapshot is read-only and is90 written only to the local `--out` JSON (or stdout). Nothing is sent anywhere91 except the HTTP GET to the page being audited.