SEO
Optimize for search engine visibility and ranking.
Audit and generate hreflang annotations for multilingual sites — check reciprocity, BCP-47 validity, self-reference, x-default, hreflang/canonical conflicts, and <html lang> agreement, and emit reciprocal hreflang link sets.
Listed ·Updated
Install data from skills.sh
$ npx skills add https://github.com/hainrixz/claude-seo-ai --skill seo-internationalThis skill is one module of the author's Claude Code plugin and runs the plugin's shared scripts, which a single-skill install does not copy. For the full audit, install the plugin: run "/plugin marketplace add Hainrixz/claude-seo-ai", then "/plugin install claude-seo-ai@claude-seo-ai". That works in Claude Code only.
SEO International is a Technical SEO skill for AI agents, published in the seoskills.sh catalog. Reach for it when your work involves crawlability, indexing, site architecture, Core Web Vitals, and log-file analysis. Install it with one command and it runs inside your own agent, so the work happens in your workflow, not a separate SEO tool.
hreflang tells search engines which language/region URL to serve. This module is conditional: it only runs when seo-vertical-detect flags a multilingual site (multiple lang/locale URLs, language switcher, or existing hreflang). On monolingual sites every finding is not_applicable at severity 0. Schema-type concerns defer to references/schema-tier1.md; this module owns link-level localization only.
Work from the PageSnapshot named in your dispatch envelope: read parsed from <run_dir>/pages/<slug>.json (hreflang[], canonicals[], <html lang> in parsed) plus headers.link and the sibling pages under <run_dir>/pages/ for reciprocity; Grep pages/<slug>.html for verbatim evidence; site artifacts live in <run_dir>/site/{robots.json,sitemaps.json,discovery.json}. Deterministic findings already emitted by audit.mjs are listed in <run_dir>/findings.deterministic.json — do not re-emit those ids; add model-judged findings only. If invoked directly with a URL/path and no snapshot exists, first run node "${CLAUDE_PLUGIN_ROOT}/scripts/snapshot.mjs" <target> --out "${CLAUDE_PLUGIN_DATA}/runs" and use the printed snapshot path.
Working from the PageSnapshot (parsed_rendered when render.used is not none, else parsed). Read hreflang from <link rel="alternate" hreflang="..."> in <head> (also accept HTTP Link: headers / sitemap xhtml:link when present):
hreflang value is a valid language (en) or language-region (en-GB, pt-BR) tag; region is ISO-3166-1 alpha-2, not a country-of-language guess (en-UK is invalid; use en-GB).hreflang="x-default" for the language-selector / fallback URL.rel=canonical is a different page neutralizes the cluster (cross-check M2/seo-indexability).<html lang> agreement — the document lang attribute matches the locale this URL targets in its own hreflang entry.fixable: auto): when the locale→URL map is known (supplied by the user, a sitemap, or discovered alternates), generate a complete reciprocal hreflang link set — every locale + a single x-default — as a <head> diff for fix. Additive and deterministic.fixable: proposed): a partial set inferred from discovered alternates that needs the user to confirm the locale map before write.fixable: advisory): "this looks multilingual but no locale map exists" — never written by the tool.TODO(locale) placeholder and ask the user.node "${CLAUDE_PLUGIN_ROOT}/scripts/hreflang-check.mjs" --snapshot <pages/<slug>.json> (or --url <u> / --file <path>) — parses the alternate set from the <link> tags and the HTTP Link header (entries, header_entries), validates BCP-47 tags (invalid_bcp47), and reports has_x_default, self_referenced, duplicate_langs and the canonical-vs-hreflang conflict. Reciprocity is not in this mode: it needs --url <u> --deep [--budget 25] [--ua <preset>], which fetches each declared alternate.needs_api, never a false pass.Findings conform to schema/finding.schema.json; axis search. On a monolingual site every id is not_applicable at severity 0. Severity policy: 5 is reserved for catastrophic, eligibility-killing facts at site/template scope; 4 major · 3 moderate · 2 minor · 1 cosmetic · 0 informational — and only an established severity-5 fail in an active category can cap a score (references/scoring-model.md).
M20.hreflang.missing_reciprocal — the page declares hreflang="de-DE" for a URL that does not point back; Google ignores one-way annotations, so the cluster does not form (fail, severity 4, fixable: proposed, confidence established). evidence.observed quotes the one-way <link>.M20.hreflang.invalid_bcp47 — e.g. hreflang="en-UK" (fail, severity 3, fixable: auto, confidence established; recommend en-GB). One bad value invalidates that entry, not the whole set.M20.hreflang.missing_self — the page is absent from its own alternate set (fail, severity 3, fixable: auto, confidence established).M20.hreflang.canonical_conflict — an hreflang URL whose rel=canonical points at a different page, which neutralizes the cluster (fail, severity 4, fixable: proposed, confidence established; cross-check M2).M20.hreflang.missing_xdefault — the cluster has no x-default fallback (warn, severity 2, fixable: auto, confidence directional — x-default is recommended, not required, and its absence degrades selector routing rather than breaking the cluster).M20.lang.mismatch — <html lang> disagrees with the locale this URL claims in its own hreflang entry (warn, severity 2, fixable: auto, confidence directional).M20.hreflang.not_applicable — monolingual site (not_applicable, severity 0).
Platform-conditional ids. This module also emits 1 id that fires only when profile.json names the platform (shopify). It is indexed in references/routing.md § Platform-conditional finding ids and specified in references/platforms/<id>.md §10.Each finding: verification.reproduce runs the hreflang-check command above; expected_impact is banded + confidence-tagged (no naked %).
rel=canonical — the two work together.needs_api — a one-sided view is not evidence of a one-way link.Not using the CLI? Copy the SKILL.md and paste it straight into ChatGPT, Claude, or any agent.
$ npx skills add https://github.com/hainrixz/claude-seo-ai --skill seo-international -a claude-codeOptimize for search engine visibility and ranking.
Optimize Core Web Vitals (LCP, INP, CLS) for better page experience using field and lab evidence.
Analyze existing XML sitemaps or generate new ones with industry templates.
Audit and generate robots.txt and general crawl access for a page — verify robots.txt reachability and syntax, detect Disallow rules that block CSS/JS or important content, sanity-check crawl-delay, confirm a Sitemap directive, and assert overall crawl access for Googlebot/Bingbot.
Audit and generate sitemaps and discovery files — validate XML sitemap presence/size/extensions/lastmod, check robots.txt referencing and sitemap-to-canonical consistency, reconcile orphans against the link graph, and produce repaired sitemap entries plus a robots.txt Sitemap line.
Detects URL spaces that grow without limit, such as faceted navigation, calendar loops and session IDs, and recommends robots or canonical containment.