/geo-score
Score a website's AI answer-engine visibility 0–100 against the open AIV rubric, and, with the user's own API keys, check and track through the OpenAI, Perplexity, Gemini and Anthropic APIs whether AI engines actually cite it. Use when the user wants to know whether AI engines
$ npx -y skills add jianruntech/geo-score --skill geo-score --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/geo-score
Context preview
The summary Claude sees to decide when to auto-load this skill.
Score a website's AI answer-engine visibility 0–100 against the open AIV rubric, and, with the user's own API keys, check and track through the OpenAI, Perplexity, Gemini and Anthropic APIs whether AI engines actually cite it. Use when the user wants to know whether AI engines
SKILL.md
geo-score.SKILL.mdname: geo-score
description: "Score a website's AI answer-engine visibility 0–100 against the open AIV rubric, and, with the user's own API keys, check and track through the OpenAI, Perplexity, Gemini and Anthropic APIs whether AI engines actually cite it. Use when the user wants to know whether AI engines can find, parse, trust and cite their site, or whether they do. Triggers on: 'does ChatGPT cite us', 'AI citation rate', 'share of voice in AI answers', 'track AI visibility weekly', 'AIV', 'AI visibility', 'GEO audit', 'generative engine optimization', 'AEO', 'llms.txt', 'will AI cite my site', 'AI search ranking', 'get cited by ChatGPT'."
metadata:
version: 1.8.3
rubric: "v1.1"
license: "MIT"
homepage: "https://github.com/jianruntech/geo-score"
AIV 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`. The one exception is public knowledge the repository already publishes: for a robots.txt that lets retrieval crawlers in, or an Organization JSON-LD object, point to `guide/public-examples.md` and write nothing beyond it.
Commands
| 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 | | `/geo-score ask <URL> "<question>"` | Level 2: readiness plus a live citation check, one ask per engine that has a key (`--ask`). **Spends the user's API credits** | | `/geo-score watch plan` | Level 3: `watch run --dry-run` — questions × engines × runs, the caps, engines that will not run and why (works without keys, and says nothing would be measured) | | `/geo-score watch run` | Level 3: ask the tracked question set and save the run. **Spends the user's API credits:** show the plan first and get a yes | | `/geo-score watch report` / `diff` | A saved run as Markdown; the latest two runs compared per engine with p-values |
Levels 2 and 3 run through `python3 cli/geo_score.py <URL> --ask "<question>"` and `python3 cli/geo_score.py watch …` (both need `cli/geo_watch.py` beside `cli/geo_score.py`). Keys come from the environment: `OPENAI_API_KEY`, `PERPLEXITY_API_KEY`, `GEMINI_API_KEY` (or `GOOGLE_API_KEY`), `ANTHROPIC_API_KEY`, `OPENROUTER_API_KEY`. Never ask the user to paste a key into the chat, and never write one into a file. Set up level 3 with `watch init`, then help the user write `queries.csv`: questions phrased the way a buyer asks an AI assistant. Do not invent the user's market; ask what they sell and who buys it.
The rubric
The scoring specification lives in [`rubric/v1.1.md`](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`](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 scores zero, the normalised score caps at 40 and leads the report. A middle tier is a deduction, not a cap. 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`](rubric/v1.0.md) remains published; v1.0 and v1.1 scores are **not comparable**.
How to run an audit
**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.**
- **Always follow redirects.** A site answering `301` to `/llms.txt` is not missing it;
it may be a locale or `www` redirect. Auditing without following redirects marked fou
Read more
name: geo-score description: "Score a website's AI answer-engine visibility 0–100 against the open AIV rubric, and, with the user's own API keys, check and track through the OpenAI, Perplexity, Gemini and Anthropic APIs whether AI engines actually cite it. Use when the user wants to know whether AI engines can find, parse, trust and cite their site, or whether they do. Triggers on: 'does ChatGPT cite us', 'AI citation rate', 'share of voice in AI answers', 'track AI visibility weekly', 'AIV', 'AI visibility', 'GEO audit', 'generative engine optimization', 'AEO', 'llms.txt', 'will AI cite my site', 'AI search ranking', 'get cited by ChatGPT'." metadata: version: 1.8.3 rubric: "v1.1" license: "MIT" homepage: "https://github.com/jianruntech/geo-score"
AIV 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`. The one exception is public knowledge the repository already publishes: for a robots.txt that lets retrieval crawlers in, or an Organization JSON-LD object, point to `guide/public-examples.md` and write nothing beyond it.
Commands
| 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 | | `/geo-score ask <URL> "<question>"` | Level 2: readiness plus a live citation check, one ask per engine that has a key (`--ask`). **Spends the user's API credits** | | `/geo-score watch plan` | Level 3: `watch run --dry-run` — questions × engines × runs, the caps, engines that will not run and why (works without keys, and says nothing would be measured) | | `/geo-score watch run` | Level 3: ask the tracked question set and save the run. **Spends the user's API credits:** show the plan first and get a yes | | `/geo-score watch report` / `diff` | A saved run as Markdown; the latest two runs compared per engine with p-values |
Levels 2 and 3 run through `python3 cli/geo_score.py <URL> --ask "<question>"` and `python3 cli/geo_score.py watch …` (both need `cli/geo_watch.py` beside `cli/geo_score.py`). Keys come from the environment: `OPENAI_API_KEY`, `PERPLEXITY_API_KEY`, `GEMINI_API_KEY` (or `GOOGLE_API_KEY`), `ANTHROPIC_API_KEY`, `OPENROUTER_API_KEY`. Never ask the user to paste a key into the chat, and never write one into a file. Set up level 3 with `watch init`, then help the user write `queries.csv`: questions phrased the way a buyer asks an AI assistant. Do not invent the user's market; ask what they sell and who buys it.
The rubric
The scoring specification lives in [`rubric/v1.1.md`](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`](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 scores zero, the normalised score caps at 40 and leads the report. A middle tier is a deduction, not a cap. 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`](rubric/v1.0.md) remains published; v1.0 and v1.1 scores are **not comparable**.
How to run an audit
**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.**
- **Always follow redirects.** A site answering `301` to `/llms.txt` is not missing it;
it may be a locale or `www` redirect. Auditing without following redirects marked fou
Can AI engines cite your site? A free 0–100 score from one command. Do they? Check through their APIs with your own keys. Score (free, no key) → Ask one question (your API keys) → Watch a question set every week (your API keys).
Repo: jianruntech/geo-score

