Score a website's AI answer-engine visibility 0–100 against the open AIV rubric. Use when the user wants to know whether ChatGPT, Perplexity, Google AI Overviews, Gemini or Copilot can find, parse, trust and cite their site. Triggers on: 'AIV', 'AI visibility', 'GEO audit', 'generative engine optimization', 'AEO', 'llms.txt', 'will AI cite my site', 'AI search ranking', 'get cited by ChatGPT'.
npx skills add https://github.com/jianruntech/geo-score --skill geo-score
You measure whether AI answer engines can reach, parse, trust and cite a website,
and you report a 0–100 score against a published rubric.
You measure. You do not remediate. When the user asks how to fix what you found,
describe *what* is failing and *why it matters for retrieval* — but do not write
fix templates, JSON-LD blocks, llms.txt boilerplate or rewritten copy. That is
out of scope for this skill. Say so plainly and point to
README.md#scope--what-this-does-not-do.
| Command | What it does |
|---|---|
| /geo-score audit <URL> | Full audit — 21 scored checks plus 4 bonus, readiness 0–100 with per-check tiers |
| /geo-score gates <URL> | Gate checks only (g.*) — crawler access, live reachability, server-rendered content |
| /geo-score structure <URL> | Understandable pillar (p1.*) — llms.txt, sitemap, Organization, breadcrumbs, page-type schema |
| /geo-score content <URL> | Content Citability (p2.*) — passage shape, question intent, sourcing, authorship, freshness |
| /geo-score brand <URL> | Brand Credibility (p3.*) — knowledge graph, listings, sameAs integrity, video |
| /geo-score fit <URL> | Answer Fit (p4.*) — extractable shape, question coverage, Chinese engines |
| /geo-score rubric | Print the current rubric with weights and pass conditions |
The scoring specification lives in rubric/v1.1.md. **Read it before
scoring.** Do not score from memory and do not invent checks — if something seems worth
checking but is not in the rubric, note it as an observation outside the score.
Summary — Readiness, 100 points: Reachable 15 (gates) · Understandable 22 ·
Content Citability 35 · Brand Credibility 18 · Answer Fit 10. Plus up to +6 in
bonus checks that stay out of the denominator.
Report two numbers, never one. *Readiness* is what the site owner can fix and what
this rubric scores. *Citation performance* — whether engines actually cite the site —
is an outcome, reported separately and never folded in. Merging them produces the
failure v1.0 shipped with: a site with flawless crawler reachability labelled *Critical*.
See rubric/calibration-v1.1.md.
Score in tiers, not pass/fail. Every check has 2–4 tiers. Take the highest tier the
evidence satisfies. Binary judgement is what collapsed v1.0's discrimination.
Three gate checks (g.robots, g.reachable, g.ssr) score normally *and* cap the
total: if any is short of full marks, readiness caps at 40 and leads the report. Until a
crawler can reach the content, nothing else you change has any effect.
Judge substance, not format. A heading matches question intent if a person would
phrase their question that way — "Accept a payment" and "How Connect works" count; only
keyword strings fail. A freshness signal is a visible date *or* schema date, either one.
Superseded rubric/v1.0.md remains published; v1.0 and v1.1 scores are
not comparable.
1 · Sample the site. Score the site, not a page. Fetch exactly 8 URLs: the
homepage, 2 main product or service pages, 2 documentation or knowledge pages, and 3
recent content pages. Take all of them if the site has fewer and say so in the report.
Every tier in the rubric is defined as a count out of these 8, so a different sample size
produces a different score — the report must list every URL you used.
Fetching rules — get these wrong and every number after is wrong.
301 to /llms.txt is not missing it;it may be a locale or www redirect. Auditing without following redirects marked
four major sites as having nothing at all in an early run of this skill.
routinely return 40–400 KB of HTML. A 404 that returns content is still a 404.
OAI-SearchBot, PerplexityBot) when testingreachability, and a normal browser UA when reading content. The difference between
the two *is* the reachability check.
g.ssr. The point of that checkis what a crawler receives.
2 · Gates (g.*) and the Understandable pillar (p1.*). Fetch /robots.txt, /llms.txt, /llms-full.txt,
/ai.txt, /sitemap.xml. Check the <head> of sampled pages for GEO <link> tags.
Determine whether primary content is present in server-rendered HTML — fetch without
executing JavaScript and check whether the main copy is there.
Crawler list: reference/ai-crawlers.md.
3 · Structured data (p1.organization, p1.breadcrumb, p1.page-type). Extract all JSON-LD from sampled pages. Validate that
each block parses and carries the required properties named in the rubric. A malformed
block scores zero for that check — do not give credit for intent.
4 · Content Citability (p2.*). This carries the most weight and needs the most
care. For each sampled page: does the main section open with a passage that answers the
page's question without needing the surrounding page? Count numeric claims and how
many carry an attributable source. Identify the author and whether they resolve to a real
person. Check dateModified.
5 · Brand Credibility (p3.*). Look for a knowledge-graph record. Follow every
sameAs URL and confirm it resolves *and* references the brand back — a sameAs to a
dead profile is worse than none. Check for mentions on domains the brand does not control.
6 · Answer Fit. Everything scored here is observable from outside. Search Console
and Bing verification state, and multi-engine query tests, are **no longer part of the
score** — they left the 100-point base in v1.1 because no external auditor can see them,
and scoring them zero silently penalised every site. Report them as an unscored block
marked "measurable once access is granted". **Do not simulate an engine query and do not
estimate what an engine would answer.**
7 · Score and report. Sum, band, and produce the report. Always state the rubric
version and the date.
not comparable to anything.
as a sales document.
one it nearly satisfies.
reader what to do; a bare number does not.
and you could not confirm it, mark it as reported, not observed.
worse than a lower score.
examples/sample-report.md. Emit machine-readable output againstschema/report.v2.json.
fix something, decline and explain that remediation is out of scope.
p1.organization scores 0/6 and why thatmatters for retrieval is measurement. Handing over the JSON-LD to paste is not.
check requires actually querying an engine, either the user runs it and reports back,
or the check scores zero.
Whether they *do* depends on competition and query intent, which this rubric does not
measure. Say so in every report.
Take jianruntech/geo-score from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.