Seo meta onpage
Audit and generate the document head — title (50-60 chars), meta description (150-160 chars), viewport, charset, <html lang>, and robots-meta sanity — flagging missing/duplicate/over-long values and producing length-bounded, keyword-aware replacements. Module M7. Feeds the Search SEO score.From its SKILL.md
npx -y skills add Hainrixz/claude-seo-ai --skill seo-meta-onpageAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- runs commandsInstructs the agent to run 1 command, including `node ${CLAUDE_SKILL_DIR}/../../scripts/parse-html.mjs --url <u>`.
SKILL.md
4.1 KB, 964 tokens by cl100k_base, as published. Nobody here has run it
seo-meta-onpage (M7)
Head hygiene is cheap, deterministic, and the first thing every crawler reads. Reference: references/schema-tier1.md for the structured-data layer that sits alongside the head (owned by M5).
Audits
Working from the PageSnapshot (rendered_dom if present, else raw_html):
- Title — exactly one
<title>; length 50-60 chars (warn outside the band, fail if missing or empty, fail if duplicated site-wide across distinct URLs). Not all caps; not pure keyword list. - Meta description — present, 150-160 chars (warn outside, not fail — Google may rewrite it); not duplicated site-wide; describes the page, not boilerplate.
- Viewport —
<meta name="viewport" content="width=device-width, initial-scale=1">present (fail if missing — mobile rendering/indexing depends on it). - Charset —
<meta charset="utf-8">present and in the first 1024 bytes of<head>. - Language —
<html lang="…">present and a valid BCP-47 tag. - Robots meta — sanity-check
<meta name="robots">: flag an accidentalnoindex/nofollowon a page meant to rank. Full indexability/canonical logic (including the canonical tag) is owned by seo-indexability (M2) — here only note presence of<link rel="canonical">, do not adjudicate it.
Fixes
- AUTO — add missing
viewport,charset(utf-8), and<html lang>(inferred fromContent-Languageheader or page text; leave a TODO if ambiguous). These are deterministic, additive, verifiable writes → diff forfix. - PROPOSED — generate/trim a
<title>andmeta descriptionfrom<h1>, lead paragraph, and primary topic: length-bounded, keyword-aware but not stuffed, brand suffix only if the site uses one. Each is a draft requiring per-item accept (humans own messaging). - ADVISORY — removing an intentional
noindexis never auto-written; surface it and let the user decide. - Never fabricate a title, description, or
lang— when content is too thin to derive a value, leave a clearly-markedTODO:placeholder for the user to fill.
Verification
- Method
dom_assert:node ${CLAUDE_SKILL_DIR}/../../scripts/parse-html.mjs --url <u>(or--file <path>) — returnstitle(value/length/ok),meta_description(value/length/ok),robots_meta,canonical, andhead_hygiene(viewport/charset/lang) so each head element's presence and length is asserted directly against the snapshot. - Duplicate-title/description checks need the full crawl set; when only a single page is available the cross-URL assertion is reported
needs_api, never a falsepass.
Findings
Findings conform to schema/finding.schema.json. Examples:
M7.title.missing— no<title>(fail, severity 3,fixable: proposed, axissearch, confidenceestablished).M7.title.length_out_of_band— title 78 chars, truncates in SERP (warn, severity 3,fixable: proposed, axissearch, confidencedirectional).M7.viewport.missing— no responsive viewport (fail, severity 3,fixable: auto, axissearch, confidenceestablished). Each finding:evidence.observedquotes the head verbatim (e.g. the exact title string + its length);verification.reproduceis the runnableparse-html.mjscommand above;expected_impactis banded + confidence-tagged (no naked %).
Honesty
- The "meta keywords" tag is dead — Google ignores it; do not add or recommend it.
- Title/description length bands are SERP-display heuristics (pixel-width truncation), not ranking factors — over-band values are
warn, notfail, and impact isdirectionalat most. - Google frequently rewrites the displayed title/description from on-page content; a perfect tag is not guaranteed to appear, so never promise a SERP snippet as a ranking gain.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most marketing audience skills give in 964 tokens
Counted across 690 of the 894 authors here whose files we hold, read 2026-08-07
- Apply Poppins font to headingsin 41 of 690, across 6 files
- Apply Lora font to body textin 41 of 690, across 6 files
- Use Arial fallback for headingsin 39 of 690, across 4 files
- Use Georgia fallback for body textin 39 of 690, across 4 files
- Maintain text hierarchy and formattingin 39 of 690, across 4 files
- Use accent colors for non-text shapesin 38 of 690, across 3 files
- Use RGB values for precise color matchingin 38 of 690, across 3 files
- Use brand colors for primary text and backgroundsin 36 of 690, across 1 file
- Read product marketing context file before asking questions, starting, or auditingin 35 of 690, across 23 files
- Use active voice instead of passive voicein 26 of 690, across 10 files
- Implement or generate appropriate JSON-LD structured datain 24 of 690, across 17 files
- Prioritize clarity over clevernessin 22 of 690, across 8 files
Said here and by no other author read
- inject a viewport meta tag when absent
- assert title length is between 50 and 60 characters
- add missing utf-8 charset meta tag automatically
- add missing html lang attribute automatically
- generate draft title and meta description from h1 and lead paragraph
- mark ambiguous language values with a TODO placeholder
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.