Install any skill in seconds. Free to start, no credit card required.
Get Started Free →When the user wants to audit, review, or diagnose SEO issues on their site. Also use when the user mentions "SEO audit," "technical SEO," "why am I not ranking," "SEO issues," "on-page SEO," "meta tags review," "SEO health check," "my traffic dropped," "lost rankings," "not showing up in Google," "site isn't ranking," "Google update hit me," "page speed," "core web vitals," "crawl errors," or "indexing issues." Use this even if the user just says something vague like "my SEO is bad" or "help wit
.claude/skills/mkurman-seo-audit/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 168% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 129% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 221% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 125% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 223% | 0% |
Robots.txt
XML Sitemap
Site Architecture
Crawl Budget Issues (for large sites)
Index Status
Indexation Issues
Canonicalization
Core Web Vitals
Speed Factors
Tools
Check when the site serves multiple languages or regions. Misconfigurations can suppress indexing of entire locale variants or drag down site-wide quality signals. See International SEO reference for evidence and source URLs.
Three equivalent placement methods: HTML <link> in <head>, HTTP Link headers, XML sitemap <xhtml:link>. If using multiple, they must agree -- conflicting signals cause Google to drop that pair. For 10+ locales, prefer sitemap-based (no page weight, no per-request cost).
Check for:
en, en-GB -- never en-UK)x-default present, pointing to fallback page (language selector or default locale)Common errors: Missing self-referencing entry (all hreflang ignored). No return tag / one-directional (pair dropped). Invalid codes like en-UK (use en-GB). Hreflang target is non-canonical, 404, or blocked (cluster discarded). HTML and sitemap annotations disagree (conflicting pair dropped).
At scale: <xhtml:link> children don't count toward 50K URL sitemap limit, but the 50MB file size limit becomes the bottleneck (plan 2K-5K URLs per file with full hreflang). Focus hreflang on pages receiving wrong-language traffic -- not required on every page. For Bing: supplement with <html lang> and <meta http-equiv="content-language"> (Bing treats hreflang as a weak signal).
/ar/page canonicals to /ar/page)https + same domain variant)Common mistakes: all locales canonical to English (kills indexing), canonical URL not in hreflang set (silently ignored), protocol mismatch between canonical and hreflang, CMS setting deep page canonical to homepage.
Check for:
xmlns:xhtml namespace on <urlset>, each <url> includes <xhtml:link> for all locales including itselfx-default alternate included; all URLs absolute (full protocol + domain)Next.js caveat: alternates.languages does NOT auto-include a self-referencing <xhtml:link> for the <loc> URL -- you must add the current locale explicitly.
Recommended: Subdirectories (/en/, /ar/). Acceptable: Subdomains or ccTLDs. Not recommended: URL parameters (?lang=en).
Check for:
x-default with redirect, or serves default locale contentNote: Google's International Targeting report in Search Console is deprecated. Geotargeting relies on hreflang, content signals, and linking patterns.
Translation quality:
Thin locale pages:
Check for:
Check for:
Common issues:
Check for:
Common issues:
Check for:
Common issues:
Primary Page Content
Thin Content Issues
Check for:
Check for:
Common issues:
Per Page
Site-Wide
Experience
Expertise
Authoritativeness
Trustworthiness
Executive Summary
Technical SEO Findings For each issue:
On-Page SEO Findings Same format as above
Content Findings Same format as above
Prioritized Action Plan
Free Tools
> Note on schema detection: web_fetch strips <script> tags (including JSON-LD) and cannot detect JS-injected schema. Use the browser tool, Rich Results Test, or Screaming Frog instead — they render JavaScript and capture dynamically-injected markup. See the Schema Markup Detection Limitation section above.
Paid Tools (if available)
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 33,603 | 24,393 | -27% | 1 | 1 | 0% | 5,695 | 7,398 | +30% | 0 | 0 | — |
case-02 | fail→fail | 49,424 | 70,202 | +42% | 1 | 1 | 0% | 6,245 | 7,798 | +25% | 0 | 0 | — |
case-03 | pass→pass | 8,345 | 8,274 | -1% | 1 | 1 | 0% | 1,421 | 4,565 | +221% | 0 | 0 | — |
case-04 | pass→pass | 16,675 | 14,055 | -16% | 1 | 1 | 0% | 2,438 | 5,497 | +125% | 0 | 0 | — |
case-05 | pass→pass | 8,622 | 8,693 | +1% | 1 | 1 | 0% | 1,443 | 4,666 | +223% | 0 | 0 | — |
case-06 | pass→pass | 9,558 | 16,431 | +72% | 1 | 1 | 0% | 1,417 | 4,689 | +231% | 0 | 0 | — |
case-07 | pass→pass | 10,272 | 10,080 | -2% | 1 | 1 | 0% | 1,610 | 4,747 | +195% | 0 | 0 | — |
case-08 | pass→pass | 15,288 | 19,764 | +29% | 1 | 1 | 0% | 2,504 | 6,274 | +151% | 0 | 0 | — |
case-09 | pass→pass | 10,680 | 9,444 | -12% | 1 | 1 | 0% | 2,021 | 5,179 | +156% | 0 | 0 | — |
case-10 | pass→pass | 17,305 | 8,086 | -53% | 1 | 1 | 0% | 1,525 | 4,491 | +194% | 0 | 0 | — |
case-11 | fail→pass | 11,237 | 9,327 | -17% | 1 | 1 | 0% | 1,752 | 4,702 | +168% | 0 | 0 | — |
case-12 | pass→pass | 11,695 | 12,339 | +6% | 1 | 1 | 0% | 1,977 | 5,227 | +164% | 0 | 0 | — |
case-13 | pass→pass | 9,658 | 10,259 | +6% | 1 | 1 | 0% | 1,517 | 4,884 | +222% | 0 | 0 | — |
case-14 | pass→pass | 13,702 | 16,101 | +18% | 1 | 1 | 0% | 2,164 | 5,915 | +173% | 0 | 0 | — |
case-15 | pass→pass | 17,303 | 20,217 | +17% | 1 | 1 | 0% | 2,717 | 6,410 | +136% | 0 | 0 | — |
case-16 | pass→pass | 9,502 | 11,328 | +19% | 1 | 1 | 0% | 1,738 | 5,157 | +197% | 0 | 0 | — |
case-17 | fail→pass | 15,835 | 13,830 | -13% | 1 | 1 | 0% | 2,464 | 5,651 | +129% | 0 | 0 | — |
case-18 | pass→pass | 17,629 | 10,375 | -41% | 1 | 1 | 0% | 2,382 | 5,251 | +120% | 0 | 0 | — |
case-19 | pass→pass | 13,028 | 7,800 | -40% | 1 | 1 | 0% | 1,978 | 4,439 | +124% | 0 | 0 | — |
case-20 | fail→fail | 18,592 | 21,172 | +14% | 1 | 1 | 0% | 1,427 | 5,166 | +262% | 0 | 0 | — |
case-21 | fail→fail | 19,646 | 28,801 | +47% | 1 | 1 | 0% | 3,823 | 9,068 | +137% | 0 | 0 | — |
case-22 | fail→fail | 7,473 | 8,103 | +8% | 1 | 1 | 0% | 1,563 | 4,915 | +214% | 0 | 0 | — |
case-23 | fail→fail | 20,164 | 19,079 | -5% | 1 | 1 | 0% | 2,562 | 6,050 | +136% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.