Seo local
The SEO + AI-search (GEO/AEO) optimization toolkit for Claude Code — two-score audit + opt-in fixer. Built for 2026-2027.
npx -y skills add Hainrixz/claude-seo-ai --skill seo-localAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Audit and generate Local SEO signals for local-business pages — verify LocalBusiness JSON-LD, NAP consistency, geo coordinates, openingHoursSpecification, and service-area, advise on Google Business Profile alignment, and produce ready-to-inject LocalBusiness JSON-LD. Module M19 (conditional). Feeds both the Search SEO and AI Visibility scores.
SKILL.md
4.2 KB, as published. Nobody here has run it
seo-local (M19)
Local pages live and die on consistent, machine-readable place data. Conditional module: only runs when the page is classified local-business (storefront, service-area, multi-location, contact/location page). Reference: references/schema-tier1.md (LocalBusiness row).
Audits
Working from the PageSnapshot (rendered_dom if present, else raw_html), only for local-business pages:
- LocalBusiness schema: a
LocalBusiness(or correct subtype, e.g.Restaurant,Dentist) JSON-LD block with required props —name,address(PostalAddress),telephone. - NAP consistency: visible Name / Address / Phone match across the page (header, footer, contact block) and match the schema values — no formatting drift, no stale numbers.
- Geo coordinates:
geo(GeoCoordinateswithlatitude/longitude) present and plausible for the stated address. - Opening hours:
openingHoursSpecificationpresent, structured (dayOfWeek,opens,closes), and agreeing with any visible hours. - Service-area: for service-area businesses,
areaServeddeclared rather than (or alongside) aPostalAddressstorefront. - GBP alignment (advisory): NAP, categories, and hours should match the Google Business Profile — the tool cannot read GBP, so this is advisory only.
Fixes
- AUTO: generate a complete, valid
LocalBusinessJSON-LD block from user-confirmed NAP, hours, geo, and service-area, with a stable@id. The block is a diff forfix. - NAP / hours drift: PROPOSED — surface the mismatch and a draft correction for per-item accept (the tool cannot know which value is canonical).
- GBP alignment: ADVISORY — never written by the tool.
Never fabricate an address, phone, coordinates, or hours — ask the user or leave a clearly-marked
TODOplaceholder they fill before injection.
Verification
- Offline:
node ${CLAUDE_SKILL_DIR}/../../scripts/validate-jsonld.mjs --url <u>(schema_validator) — JSON validity + required LocalBusiness props;dom_assertconfirms visible NAP matches schema. - Tier 1: confirm rich-result eligibility with Google Rich Results Test / schema.org validator. When the data tier (or GBP) is unavailable, status is
needs_api— never a falsepass.
Findings
Emit findings per schema/finding.schema.json. On a non-local page these are not_applicable (severity 0); on local pages severity is 4, axis both. Examples:
M19.localbusiness.missing— local page with no LocalBusiness schema (statusfail, severity 4,fixable: auto, axisboth, confidenceestablished).evidence.observedquotes the visible address/phone with no matchingld+json;verification.reproduceruns the validator above.M19.nap.inconsistent— footer phone differs from schematelephone(statuswarn, severity 4,fixable: proposed, axisboth, confidencedirectional).evidence.observedquotes both strings; verified bydom_assert.M19.hours.missing— noopeningHoursSpecificationdespite visible hours (statuswarn, severity 4,fixable: auto, axisboth, confidenceestablished). Each finding:evidence.observedquotes the page;expected_impactis banded + confidence-tagged (no naked %).
Honesty
- Consistent NAP + structured place data are established signals for local pack/maps and AI place answers; raw on-page proximity/ranking gains are not promised here — the dominant local-pack factors (proximity, GBP signals, reviews) sit outside the page DOM and are advisory.
- Adding
geo/openingHoursSpecificationwill not by itself move local rankings without an accurate, verified GBP; never ship that as a guaranteed win. - Do not invent coordinates from an address via an unverified geocode and present them as fact — mark unconfirmed values
TODO.