SKILL.md
Single Page Analysis
One URL, every on-page factor, scored and prioritized. Analyze what the HTML actually contains, flag what you cannot measure from HTML alone, and never pad the report with unverifiable claims.
Checks by area
On-page
- Title: 50-60 chars, primary keyword present, unique.
- Meta description: 130-160 chars, compelling, keyword present.
- H1: exactly one, matches intent, carries the keyword.
- H2-H6: logical hierarchy, no skipped levels, descriptive.
- URL: short, hyphenated, no parameters.
- Internal links: sufficient count, relevant anchors. External links: authoritative targets, sane count.
Content quality
- Word count vs page-type expectation, readability (Flesch score and grade level), keyword density in the 1-3% natural range with semantic variations, E-E-A-T signals (author bio, credentials, first-hand markers), publication and updated dates.
Technical meta
- Canonical present and self-referencing or correctly pointed.
- Meta robots index/follow unless intentionally blocked.
- Open Graph: og:title, og:description, og:image, og:url. Twitter Card set.
- Hreflang correct if multi-language.
Schema
- Detect all types, JSON-LD preferred. Validate required properties. List missing opportunities.
- Never recommend HowTo (deprecated) or FAQ markup for rich results (retired). Keep existing FAQPage as an AI-citation signal, use QAPage only for genuine Q&A pages.
Images
- Alt text present and descriptive. Flag files over 200KB (warning) and 500KB (critical). Recommend WebP/AVIF. Width/height attributes set (CLS). Lazy loading: identify the method (native, JS plugin, none). Do not flag "not lazy-loaded" when a JS lazy-loader (lazysizes, Perfmatters-style
data-srcplaceholders) is detected, those intentionally strip the native attribute.
CWV risk flags (HTML-only, label as potential)
- LCP: huge hero images, render-blocking resources. INP: heavy JS, missing async/defer. CLS: missing image dimensions, injected content. For real field data, route to claude-seo-google.
Workflow
- Fetch the URL. On 4xx/5xx or auth walls, report it and ask for rendered HTML or a public URL. Do not guess content.
- If the body is near-empty, the page is client-rendered: analyze what exists, flag the results as incomplete, request a rendered snapshot.
- Run every check above.
- If DataForSEO MCP tools are available, add live context:
serp_organic_live_advancedfor current positions,backlinks_summaryfor link profile (route via claude-seo-dataforseo). - Output the score card:
Overall Score: XX/100
On-Page SEO: XX/100
Content Quality: XX/100
Technical: XX/100
Schema: XX/100
Images: XX/100Then issues ordered Critical > High > Medium > Low, each with a specific fix and expected impact, plus ready-to-paste JSON-LD for schema opportunities.
Verification
Run curl -s <url> | grep -c "<h1". Expect exactly 1. If 0, either the page is client-rendered (flag it, request rendered HTML) or the H1 is genuinely missing (Critical finding). If 2+, multiple H1s is a High finding. This one command validates both your fetch and the most common on-page defect.
Good vs bad
Good: "Title is 71 chars, truncates in SERPs. Rewrite to 58: '<primary keyword> | <brand>'. Meta description missing, here is a 142-char draft." Bad: "Title could be more optimized and content should be higher quality." No measurements, no rewrites, nothing actionable.
Footguns
- Scoring a client-rendered shell. An empty-body page scores terribly on every dimension, but the real page might be fine. Detect thin HTML first and label the whole report incomplete.
- CWV verdicts from HTML. You cannot measure LCP/INP/CLS from markup. Flag risks as "potential" and point at claude-seo-google for field data.
- Recommending retired rich-result markup. FAQ and HowTo rich results are gone. Recommending them wastes client dev time.
- False lazy-loading flags. JS lazy-loaders strip
loading="lazy"on purpose. Check fordata-srcpatterns before flagging.
Completion checklist
- [ ] Page fetched successfully or failure reported honestly
- [ ] All six check areas covered
- [ ] Every issue has a measurement and a concrete fix
- [ ] CWV items labeled as potential, not measured
- [ ] Schema suggestions are valid ready-to-paste JSON-LD
- [ ] Score card totals consistent with the issue list
Any box unchecked: not done. Fix or say so.