# GEO / AI Search Audit

> Audit one client's website for AI search readiness (GEO) - AI crawler access in robots.txt, passage citability, schema.org structured data, llms.txt and on-page rendering - optionally benchmark it against the competitors in the client…

GEO / AI Search Audit is an AI skill that you can use in Claude Code, Codex, or type.com.

- Skill page: https://typestaging.com/library/skills/geo-ai-search-audit
- Raw SKILL.md: https://typestaging.com/library/skills/geo-ai-search-audit/SKILL.md
- Created by Zubair Trabzada · adapted by type.com
- Updated: September 24, 2026
- Package: 35 files

## How to use GEO / AI Search Audit

1. **type.com:** Choose Use Skill to add GEO / AI Search Audit to your type.com workspace.
2. **Claude Code:** Download the skill and extract it into ~/.claude/skills/geo-ai-search-audit/ (or .claude/skills/geo-ai-search-audit/ in a project). Then ask Claude to use GEO / AI Search Audit.
3. **Codex:** Download the skill and extract it into ~/.agents/skills/geo-ai-search-audit/ (or .agents/skills/geo-ai-search-audit/ in a repository). Then ask Codex to use GEO / AI Search Audit.

## Frequently asked questions

### What is GEO / AI Search Audit?

GEO / AI Search Audit is an AI skill that you can use in Claude Code, Codex, or type.com.

### What does GEO / AI Search Audit do?

Audit one client's website for AI search readiness (GEO) - AI crawler access in robots.txt, passage citability, schema.org structured data, llms.txt and on-page rendering - optionally benchmark it against the competitors in the client…

### Can I use GEO / AI Search Audit in Claude Code or Codex?

Yes. GEO / AI Search Audit is a standard Agent Skills folder with a SKILL.md file. Download it and extract it into ~/.claude/skills/ for Claude Code or ~/.agents/skills/ for Codex.

### Who created GEO / AI Search Audit?

Zubair Trabzada created GEO / AI Search Audit, and the type.com team adapted it for the Skills Library. The type.com team reviews every skill before it is published in the Skills Library.

## Example output

Example output from a sample run. Company names and figures are sample data.

```markdown
## AI search readiness (GEO) audit: Harbor & Vine, 2026-01-15

**GEO readiness score: 59/100 (Poor).** AI crawler access (90/100) and on-page basics (85/100) are solid, but llms.txt (0/100), structured data (40/100) and content citability (53/100) pull the score down. Issues found: 0 critical, 3 high, 2 medium, 4 low.

| Area | Weight | Harbor & Vine | tidewater-goods.example | saltmarsh-co.example |
| --- | ---: | ---: | ---: | ---: |
| **Overall** | | **59/100** | **88/100** | **31/100** |
| Content citability | 30% | 53/100 | 74/100 | 0/100 |
| AI crawler access | 25% | 90/100 | 100/100 | 100/100 |
| Structured data | 20% | 40/100 | 80/100 | 0/100 |
| Technical / on-page | 15% | 85/100 | 100/100 | 40/100 |
| llms.txt | 10% | 0/100 | 95/100 | 0/100 |

| Priority | Area | Finding | Recommended fix | Effort |
| --- | --- | --- | --- | --- |
| High | AI crawler access | PerplexityBot blocked site-wide | Allow it in robots.txt unless the client has opted out of AI answers | S |
| High | Structured data | 1 JSON-LD block fails to parse | Fix the JSON syntax; invalid blocks are ignored | S |
| High | Structured data | No Organization entity | Add Organization with name, url, logo and sameAs | S |
| Medium | Structured data | Product missing brand on /collections/linen | Fill in the missing properties | S |
| Medium | Technical / on-page | /contact returns HTTP 404 | Fix or remove the broken link | S |

…plus 4 low-priority fixes in the full report (canonical link, alt text on 50% of 2 images, Open Graph tags, llms.txt).

**Next actions**
- **Rewrite the weakest passages first.** The homepage intro under "Linen bedding that gets softer every wash" scores 30/100 (F) and "Our story" 40/100 (D). The best, "Why linen?", scores 76/100 (B); none of the 6 passages lands in the 134-167 word range.
- **Publish the drafted llms.txt.** It maps Linen bedding, Our story and FAQ from homepage links, leaves out the 404 contact page, and needs its TODO descriptions filled in first.
- **Add the drafted Organization JSON-LD** site-wide, with sameAs prefilled from the site's Instagram link and a TODO logo URL.
- GPTBot and CCBot are also blocked. Training crawlers are a policy choice for the client and are not scored.

**Inputs:** Harbor & Vine client profile, 4 of 5 requested pages plus robots.txt, and two competitors benchmarked on the same checks the same day.

_Produced by running `bash examples/run.sh` on the sample data bundled with this skill._
```

## Package files

- CLIENTS.md
- DATA_CONTRACT.md
- LICENSE.txt
- NOTICE.md
- SKILL.md
- examples/clients/harbor-and-vine/client.json
- examples/clients/no-website-co/client.json
- examples/expected_output.txt
- examples/run.sh
- examples/sites/harborandvine.example/about.html
- examples/sites/harborandvine.example/collections/linen.html
- examples/sites/harborandvine.example/faq.html
- examples/sites/harborandvine.example/index.html
- examples/sites/harborandvine.example/robots.txt
- examples/sites/saltmarsh-co.example/index.html
- examples/sites/tidewater-goods.example/index.html
- examples/sites/tidewater-goods.example/llms.txt
- examples/sites/tidewater-goods.example/robots.txt
- scripts/geo_audit.py
- scripts/geo_lib/__init__.py
- scripts/geo_lib/audit.py
- scripts/geo_lib/citability.py
- scripts/geo_lib/crawlers.py
- scripts/geo_lib/fetcher.py
- scripts/geo_lib/html_extract.py
- scripts/geo_lib/llmstxt.py
- scripts/geo_lib/report.py
- scripts/geo_lib/schema_check.py
- scripts/geo_lib/technical.py
- templates/schema/article-author.json
- templates/schema/local-business.json
- templates/schema/organization.json
- templates/schema/product-ecommerce.json
- templates/schema/software-saas.json
- templates/schema/website-searchaction.json

## SKILL.md

````markdown
---
name: geo-ai-search-audit
description: Audit one client's website for AI search readiness (GEO) - AI crawler access in robots.txt, passage citability, schema.org structured data, llms.txt and on-page rendering - optionally benchmark it against the competitors in the client profile, and produce a DRAFT client report with a prioritized fix list, draft llms.txt and draft Organization JSON-LD.
---

# GEO / AI search readiness audit

Checks whether AI answer engines (ChatGPT search, Perplexity, Claude, Google AI
Overviews, Copilot) can reach, read and quote a client's website, and turns the
findings into a prioritized fix list the account lead can review and send.

## Before you run

This skill ships scripts and sample data alongside this SKILL.md. Before running any command:

1. **Get the files.** Make sure the skill's other files (`scripts/`, `examples/` and anything else listed with this skill) are in your working folder at the same relative paths. Some environments load only SKILL.md; if yours did, fetch each file from this skill's published files and write it to the matching path. In Type, read them with the skill-file tools. Anywhere else, the Type Skills Library API lists every file with its path, content and `sha256`: GET `https://api.type.com/api/public/library/skills` and take the entry with slug `geo-ai-search-audit`.
2. **Check the copies are exact.** Compare each file's size in bytes, not characters (and its hash, where your tools report one), with the published version before running. A copy written out from the published file is fine once its byte size and hash match; never run a script you summarised or reconstructed from memory.
3. **Run from the skill's folder**, calling interpreters explicitly: `python3 scripts/…` and `bash examples/run.sh`.
4. **Try the sample first.** If the skill ships `examples/run.sh` and `examples/expected_output.txt`, run `bash examples/run.sh`; its output should match the expected file exactly. If it doesn't, stop and report the first differing line rather than running on real data.

## When to use

- "Run a GEO / AI search / AI visibility audit for <client>."
- "Why aren't we showing up in ChatGPT or Perplexity answers?" (as the technical first pass)
- "How does <client> compare with its competitors for AI search readiness?"
- Before a content or technical SEO sprint, to find the blockers worth fixing first.

Not for: measuring actual AI citations, rankings or traffic (this skill does not
query any AI engine), brand-mention or PR research, or writing pitch decks.

## Inputs: the client profile

Read the client from `clients/<slug>/client.json` as described in `CLIENTS.md`
(resolve by slug or by the `name` field). Fields used:

- `name` (required) - used in the report title.
- `website` (required for this skill) - the site to audit.
- `competitors` (optional) - list of competitor URLs; only needed for `--competitors`.
- `industry` (optional, informational) - use it when judging which schema types matter
  (e.g. Product for DTC, SoftwareApplication/Service for B2B).

If the profile or a needed field is missing, the script stops and prints exactly
what to add and where. Relay that message; do not guess a URL. Audit one client
per run - never mix clients' data in one report.

## Run it

From the skill directory (Python 3.9+, standard library only, no install step).

`--client` needs a clients folder containing `<slug>/client.json` (see
`CLIENTS.md`). The script looks for `./clients` in the directory you run it
from, which is usually not where the agency keeps profiles, so pass
`--clients-dir` explicitly in every `--client` run; without it the script stops
with "No clients directory at clients". `--url` runs need no clients folder.

```bash
# Try it first on the bundled sample client (offline, no network)
python3 scripts/geo_audit.py --client harbor-and-vine --clients-dir examples/clients --offline-root examples/sites

# One client, live
python3 scripts/geo_audit.py --client harbor-and-vine --clients-dir /path/to/clients

# Same, benchmarked against the competitors in client.json (max 3 by default)
python3 scripts/geo_audit.py --client harbor-and-vine --clients-dir /path/to/clients --competitors

# Ad-hoc URL without a profile
python3 scripts/geo_audit.py --url https://example.com

# Offline: a saved page (plus optional saved robots.txt / llms.txt)
python3 scripts/geo_audit.py --url https://example.com --html-file page.html --robots-file robots.txt

# Machine-readable output / write to a file
python3 scripts/geo_audit.py --client harbor-and-vine --clients-dir /path/to/clients --json --out audit.json
```

Other flags: `--max-pages N` (pages per site, homepage first, default 5),
`--max-competitors N`, `--timeout S`, `--date YYYY-MM-DD`, `--offline-root DIR`
(serve `DIR/<host>/...` files instead of the network; see `examples/`).

`bash examples/run.sh` runs a complete offline demo for a synthetic client; its
output is in `examples/expected_output.txt`.

## What it checks

| Area | Weight | What is scored |
|---|---|---|
| Content citability | 30% | Heading-delimited passages scored 0-100 for answer-first phrasing, self-containment, readability, specific numbers/sources and original-data signals |
| AI crawler access | 25% | robots.txt rules (RFC 9309 matching) for Googlebot, Bingbot and the AI search/answer agents of OpenAI, Anthropic and Perplexity; training crawlers are reported but not scored |
| Structured data | 20% | JSON-LD (incl. `@graph`), microdata/RDFa, Organization + sameAs, WebSite, offering/FAQ/Article types, required properties, parse errors |
| Technical / on-page | 15% | Server-rendered text vs empty JS app shell, noindex/nosnippet, title, meta description, single H1, canonical, lang, Open Graph, image alt text |
| llms.txt | 10% | Presence and format of /llms.txt (llmstxt.org); /llms-full.txt presence |

Sampling: homepage plus the most relevant internal links (about, pricing,
product, service, FAQ, blog...), skipping paths robots.txt disallows and
cart/login pages. Areas that could not be checked are marked "n/a" and dropped
from the overall score rather than counted as zero.

## Output

A Markdown report headed **DRAFT for account-lead review**. It contains:

1. Summary: overall heuristic score and rating, per-area scores.
2. Prioritized fix list: Critical / High / Medium / Low, with finding, recommended fix and effort (S/M/L).
3. Competitor benchmark (with `--competitors`): scores side by side and where competitors lead.
4. Details: crawler access table, strongest and weakest passages, schema types found, llms.txt, on-page checks.
5. Appendix A: draft llms.txt from homepage links (when missing or malformed). Linked pages that failed to load during the audit are left out and listed above the draft.
6. Appendix B: draft Organization JSON-LD with sameAs prefilled from profile links on the site (when missing).
7. Method and limits.

After running, read the report yourself before handing it over: sanity-check the
top fixes against the site, remove anything that is intentional for this client
(for example a deliberate opt-out of AI training crawlers), and adapt wording to
the client's `notes` and brand voice. Fuller schema templates are in
`templates/schema/`.

## Rules

- The report is a draft for the account lead. Never send it to the client or
  post it anywhere automatically.
- This skill only reads public pages. It never edits a client's site, robots.txt,
  CMS or tag manager. Any such change needs explicit approval in the conversation,
  naming the client and the change (CLIENTS.md rule 3).
- Do not present scores as rankings or as proof of AI visibility.

## Limits

- Scores are heuristics about readiness, not measurements. The skill does not query
  ChatGPT, Perplexity, Gemini, Claude or Google, and cannot say whether a site is
  actually cited or ranked.
- Crawler access is inferred from robots.txt only. CDN/WAF bot blocking, rate
  limits, IP allowlists and whether a crawler honours robots.txt are not tested.
  The crawler list and each agent's purpose reflect vendor documentation at the
  time of adaptation and change over time.
- Only raw HTML is analysed; JavaScript-rendered content is not seen. Sites that
  block non-browser requests may return errors or challenge pages in live mode.
- Up to `--max-pages` pages per site are sampled, not the whole site.
- The citability rubric (including the 134-167 word "optimal passage" band) is the
  upstream author's heuristic and is not a validated model of any engine.
- Brand authority, third-party mentions, reviews, E-E-A-T and platform presence
  (Reddit, YouTube, Wikipedia) are not measured.
- llms.txt is a community proposal; support by major AI engines is not confirmed,
  so it carries low weight and fixes are rated Low.
````
