From seo-superpower
Use when running a technical SEO audit, debugging Core Web Vitals regressions, checking indexability, validating schema and sitemaps, diagnosing why a site isn't ranking, or preparing a site for AI-search visibility (GPTBot, ClaudeBot, PerplexityBot). Covers crawlability, indexability, rendering, Core Web Vitals, schema, AI-search readiness, mobile, security, and meta basics. Lifecycle-aware — pre-launch, growth, mature. Produces a prioritized SEO_AUDIT.md and a low-risk fix PR.
How this skill is triggered — by the user, by Claude, or both
Slash command
/seo-superpower:auditing-technical-seoThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Technical SEO is the foundation. Content strategy, keyword work, and link building all assume that Google, Bing, and AI-search crawlers can actually fetch, render, and trust your pages. If any of those fail, nothing else compounds. In 2026 that surface is wider than it used to be: Core Web Vitals are still the user-experience signal Google measures at the **75th percentile** with thresholds **L...
Technical SEO is the foundation. Content strategy, keyword work, and link building all assume that Google, Bing, and AI-search crawlers can actually fetch, render, and trust your pages. If any of those fail, nothing else compounds. In 2026 that surface is wider than it used to be: Core Web Vitals are still the user-experience signal Google measures at the 75th percentile with thresholds LCP < 2.5s, INP < 200ms, CLS < 0.1 [1], and a new tier of AI crawlers — GPTBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended — now decides whether your content shows up in ChatGPT, Claude, and Perplexity answers [2][3].
robots.txt parses cleanly, no accidental site-wide Disallow: /, sitemap referenced as absolute URL, sitemap reachable and valid, file under 500 KiB (Google's hard cap) [6][7].gsc-mcp, canonical tags consistent and self-referential where appropriate, hreflang correct on i18n sites, no duplicate content via tracking parameters, no noindex on pages that should rank [5].lighthouse-mcp (PageSpeed Insights / CrUX field data) [1].<head> or root layout, types valid against schema.org (Article, BlogPosting, Organization, FAQPage, BreadcrumbList, Product as appropriate), validates via validator.schema.org [4].robots.txt makes a deliberate choice on GPTBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended (allow or block — both are valid; absence is the bug) [2][3]. llms.txt presence noted but not required: adoption is ~10% of domains and effect on AI citations is unproven [8].<title> (50–60 chars) and meta description (150–160 chars) per page; Lighthouse SEO category flags these explicitly [5].1. Gather. Read repo files: package.json (framework detection), app/robots.ts or public/robots.txt, app/sitemap.ts or public/sitemap.xml, app/layout.tsx (or Astro Layout.astro / SvelteKit +layout.svelte) for <head> schema, next.config.js / astro.config.mjs / svelte.config.js for redirect/rewrite rules. Then fetch the live site's /robots.txt, /sitemap.xml, /llms.txt. Call lighthouse-mcp for PSI on the homepage and 2–3 representative inner pages (mobile + desktop). Call gsc-mcp if connected for index coverage and submitted-sitemap status.
2. Cross-reference. Does the deployed sitemap match what GSC has on file? Are CSR-only routes leaking into the sitemap? Does robots.txt block any URL that's also in the sitemap (the classic conflict) [7]? Are GSC-reported "Discovered – currently not indexed" URLs concentrated in one route group?
3. Write SEO_AUDIT.md to repo root. Findings ranked by traffic-impact × fix-effort in a quadrant — high-impact / low-effort first.
4. Open ONE PR with the highest-confidence, low-risk fixes only: adding viewport meta, adding missing meta descriptions, adding Sitemap: line to robots.txt, adding explicit GPTBot/ClaudeBot allow-or-block stanza, adding root Organization JSON-LD. Leave architectural calls (CSR → SSR migration, image pipeline rework) for human decision in the audit doc.
When lighthouse-mcp and gsc-mcp aren't configured (user hasn't run /seo-setup, or invoked via /seo audit <url>), run the no-OAuth quick path. This finishes in <60s and produces a partial audit that's still useful — Lighthouse/GSC sections are flagged as missing rather than fabricated.
What to do:
Fetch static resources via curl / HTTP GET (no auth):
GET /robots.txt — check 200, non-empty, Sitemap: line present, AI-bot stanza (GPTBot / ClaudeBot / Claude-SearchBot / PerplexityBot / Google-Extended named — allow or disallow, just named).GET /sitemap.xml — check 200, parses as XML, >0 URLs, file <500 KiB.GET / (homepage) plus 2 inner pages discovered from the sitemap (a content page + a category/listing page if present).Parse head tags on each fetched page:
<title> present, length 50–60 chars ideal.<meta name="description"> present, length 150–160 chars ideal.<link rel="canonical"> present, self-referential or sensible.<meta name="viewport"> present.<script type="application/ld+json"> count ≥ 1, JSON parses without error.<h1> per page.<meta name="robots"> not noindex on pages that should rank.AI-bot readiness check — robots.txt mentions at least three of: GPTBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended. Absence is the bug, not the directive — both Allow: and Disallow: are valid choices. If missing, reference templates/robots-ai-bots.txt as a paste-ready starting point.
Core Web Vitals — if PSI_API_KEY is set in env (or ~/.config/seo-superpower/.env), call scripts/psi-quick.py <url> (CrUX field data preferred, lab fallback flagged). If no key, skip CWV and note it in the output rather than guessing.
Emit a partial SEO_AUDIT.md with this banner at the top:
> **Partial audit — Lighthouse/GSC data missing.** Run `/seo-setup` to unlock CWV + GSC analysis. Static checks below were run without OAuth.
Everything else in SEO_AUDIT.md follows the normal output schema below. Findings that depended on Lighthouse or GSC become explicit gaps ("CWV not measured — gated on /seo-setup") rather than fake data.
SEO_AUDIT_OUTPUT env varBy default, SEO_AUDIT.md is written to the repo root (./SEO_AUDIT.md). When auditing a foreign repo (e.g., dogfooding against a user's site without committing the audit to their tree), set SEO_AUDIT_OUTPUT to redirect:
SEO_AUDIT_OUTPUT=~/audits/example-2026-05-12.md /seo audit https://example.com
Common patterns:
./SEO_AUDIT.md (default) — commit alongside the fix PR.~/audits/<domain>-<date>.md — keep audits in a personal archive, don't pollute the target repo./tmp/SEO_AUDIT.md — throwaway / demo runs.Add SEO_AUDIT.md to the target repo's .gitignore if the audit is meant to be ephemeral.
SEO_AUDIT.md shape# SEO Audit — example.com — 2026-04-26
## Quadrant
LOW EFFORT HIGH EFFORT
HIGH IMPACT | Add meta descriptions | Migrate /blog to SSR
LOW IMPACT | Tidy llms.txt | Refactor schema graph
## Findings
### [P0] Sitemap not referenced in robots.txt
Severity: high · Effort: 5 min · Confidence: 100%
Fix: Add `Sitemap: https://example.com/sitemap.xml` to `app/robots.ts`.
### [P0] LCP 4.1s on /pricing (p75 mobile)
Severity: high · Effort: medium · Confidence: 90%
Cause: hero image not preloaded, no priority hint.
Fix: <Image priority fetchPriority="high" /> on hero.
### [P1] No GPTBot/ClaudeBot stanza in robots.txt
Severity: medium · Effort: 2 min · Confidence: 100%
Decision required: allow or block? Both are valid choices.
Mirroring the lifecycle pattern in finding-underserved-keywords:
Disallow: / against User-agent: * blocks ClaudeBot too [3].llms.txt missing — flag as suggestion only; no measurable AI-citation effect yet [8].Citations and verification tags in SOURCES.md.
npx claudepluginhub benskamps/seo-superpower --plugin seo-superpowerGuides reception of code review feedback: verify before implementing, avoid performative agreement, push back with technical reasoning when needed.
Design banners for social media, ads, website heroes, and print with multiple art direction options and AI-generated visuals.