geo-optimizer
Make websites visible and citable by AI search engines (ChatGPT Search, Perplexity, Claude, Google AI Overviews).
Make websites visible and citable by AI search engines (ChatGPT Search, Perplexity, Claude, Google AI Overviews). Implements the GEO audit framework plus a citability engine of 47 content checks, 9 of them taken directly from the methods tested in Princeton KDD 2024 research.
چه چیزی میگیرید
- The GEO audit framework plus a citability engine of 47 content checks
- 9 of them taken directly from the methods tested in Princeton KDD 2024 research
دربارهٔ این اسکیل
Make websites visible and citable by AI search engines (ChatGPT Search, Perplexity, Claude, Google AI Overviews). Implements the GEO audit framework plus a citability engine of 47 content checks, 9 of them taken directly from the methods tested in Princeton KDD 2024 research.
Workflow
Step 1 — Audit the site
Run geo audit first. It scores the site 0–100 across 9 categories and generates a prioritized action list.
geo audit --url https://yoursite.com
geo audit --url https://yoursite.com --format json
geo audit --sitemap https://yoursite.com/sitemap.xml --max-urls 25
Score bands: 0–35 critical · 36–67 foundation · 68–85 good · 86–100 excellent.
Step 2 — Fix AI crawler access (robots.txt)
AI crawlers fall into three tiers: training, search, and user-triggered fetch. To stay eligible to appear in AI search answers, do not block the search-tier bots (this makes the site eligible; it does not guarantee placement or citation):
OAI-SearchBot— ChatGPT searchPerplexityBot— Perplexity search indexClaude-SearchBot— Claude searchGooglebot— Google Search, which also feeds AI Overviews and AI Mode. These are governed by Googlebot access and snippet controls (nosnippet,max-snippet), not byGoogle-Extended
Google-Extended is a robots.txt token, not a separate crawler. It controls whether Google may use content for Gemini/Vertex training and grounding. It does not affect Search or AI Overviews.
To opt out of training while staying open to AI search: Disallow: / for the training bots (GPTBot, ClaudeBot, Google-Extended), and keep Allow: / for OAI-SearchBot, Claude-SearchBot, PerplexityBot, and Googlebot. Whether to block training is a policy choice; vendors treat these settings as independent.
Step 3 — Generate llms.txt
/llms.txt is a proposed convention that gives AI agents a short, machine-readable map of the site. Support varies by system and it does not guarantee AI visibility or citation.
geo llms --base-url https://yoursite.com --site-name "Site Name" --description "One-sentence description." --output ./public/llms.txt
Required structure: H1 (site name) → blockquote (description) → H2 sections with descriptive links. Keep under 200 lines. Full spec: https://llmstxt.org
Step 4 — Inject JSON-LD schema
Add structured data so AI engines understand page types:
geo schema --type website --url https://yoursite.com
geo schema --type faq --url https://yoursite.com/faq
geo schema --type webapp --url https://yoursite.com/tool
Types: website, webapp, faq, article, organization, breadcrumb, howto, review, product.
Structured data helps machines parse the page; it does not guarantee citation.
Step 5 — Optimize content (Princeton GEO methods)
Apply content improvements ordered by the effect reported in the paper's benchmark:
| Priority | Method | Impact | Action |
|---|---|---|---|
| 🔴 1 | Cite Sources | +30–115% | Add authoritative external links |
| 🔴 2 | Add Statistics | +40% | Include concrete numbers, percentages, dates |
| 🟠 3 | Quotation Addition | +30–40% | Expert quotes: "Text" — Name, Role, Org, Year |
| 🟠 4 | Authoritative Tone | +6–12% | Confident, expert framing |
| 🟡 5 | Fluency Optimization | +15–30% | Clear, direct language |
| 🟡 6 | Easy-to-Understand | +8–15% | Define terms, use analogies |
| 🟢 7 | Technical Terms | +5–10% | Correct industry terminology |
| 🟢 8 | Unique Words | +5–8% | Vary vocabulary deliberately |
| ❌ 9 | Keyword Stuffing | ~0% ⚠️ | Do NOT apply — neutral to negative |
Step 6 — Auto-fix all gaps
Generate all missing files at once:
geo fix --url https://yoursite.com --apply
geo fix --url https://yoursite.com --only robots,llms,schema
Creates robots.txt entries, llms.txt, JSON-LD schema, meta tags, and AI discovery endpoints based on audit results.
Scoring
9 categories, 100 points total in rubric v2:
| Category | What it measures | Points (v2) |
|---|---|---|
google_ai | Google AI readiness checks | 20 |
robots | Robots.txt availability and citation-bot access | 14 |
schema | JSON-LD validity, richness, types, and visible-name match | 14 |
content | Headings, evidence, links, structure, and image alt coverage | 14 |
brand_entity | Brand coherence, Knowledge Graph, about/contact, identity, authority | 12 |
meta | Title, description, and Open Graph | 11 |
llms | llms.txt presence, sections, links, and llms-full.txt | 6 |
signals | Language, RSS, and freshness | 6 |
ai_discovery | ai.txt, summary.json, and markdown negotiation | 3 |
Google AI readiness checks
Each check includes its Google source URL in audit JSON and recommendations:
llms.txt is useful to other AI agents but is ignored by Google Search. The score is versioned: JSON exposes score_version and per-category score_max; use geo audit --score-version 1 for legacy v1 comparisons. History deltas and regressions compare snapshots only when their score_version matches.
CLI Commands
Main commands covering audit, remediation, analysis, and monitoring (run geo --help for all 16, including access, authority, citations, drift, and perception):
# ── Primary ──
geo audit --url URL [--format text|json|rich|html|pdf|github|sarif|junit] [--sitemap URL]
geo fix --url URL [--apply] [--only robots,llms,schema,meta,ai_discovery,content]
geo llms --base-url URL --site-name NAME --description DESC --output FILE
geo schema --type TYPE --url URL [--file FILE --inject]
# ── Analysis ──
geo diff --before URL --after URL
geo history --url URL
geo coherence --sitemap URL
# ── Monitoring ──
geo monitor --domain DOMAIN
geo track --url URL [--report | --history] [--output FILE]
# ── Utility ──
geo logs --file LOGFILE
geo snapshots [--query TEXT --answer-file FILE] [--quality --snapshot-id ID]
Output Formats
8 formats for different workflows:
| Format | Flag | Use case |
|---|---|---|
| text | --format text | Terminal (default) |
| json | --format json | Programmatic consumption, CI pipelines |
| rich | --format rich | Colored terminal with ASCII dashboard |
| html | --format html | Self-contained HTML report |
| github | --format github | GitHub Actions annotations |
| sarif | --format sarif | Code-scanning tools (SARIF) |
| junit | --format junit | CI test reports (JUnit XML) |
--format pdf | Client-facing reports |
Informational Checks
10 non-scoring checks that provide deeper analysis beyond the 0–100 score:
| Check | What it detects |
|---|---|
| WebMCP Readiness | SearchAction, labeled forms, tool attributes for AI agents |
| Negative Signals | CTA overload, thin content, keyword stuffing, boilerplate |
| Prompt Injection | LLM instructions in content, HTML comment injection, hidden text |
| Trust Stack | 5-layer trust score (technical, identity, social, academic, consistency) |
| RAG Chunk Readiness | Content structure optimized for retrieval-augmented generation |
| Embedding Proximity | Semantic alignment between title, headings, and body content |
| Content Decay | Temporal signals indicating stale or outdated content |
| Platform Citation | Per-platform citation profile (ChatGPT vs Perplexity vs Gemini) |
| Context Window | Content length optimization for LLM context windows |
| Instruction Readiness | Content structure that helps LLMs follow extraction patterns |
MCP Integration
12 tools and 5 resources for Claude Code, Cursor, Windsurf, and any MCP client:
Tools:
| Tool | Description |
|---|---|
geo_audit | Full GEO audit (score 0–100) |
geo_fix | Generate automatic fixes |
geo_llms_generate | Generate llms.txt from sitemap |
geo_citability | Citability score (47 content checks) |
geo_schema_validate | Validate JSON-LD schema |
geo_compare | Compare GEO scores across sites (max 5) |
geo_gap_analysis | Competitive gap analysis with priorities |
geo_ai_discovery | Check AI discovery endpoints |
geo_check_bots | Check AI bot access via robots.txt |
geo_trust_score | Trust Stack Score (5-layer, grade A–F) |
geo_negative_signals | Negative signals detection |
geo_factual_accuracy | Factual claims and sourcing audit |
Resources: geo://ai-bots · geo://score-bands · geo://methods · geo://changelog · geo://ai-discovery-spec
Plugin System
Extend the audit with custom checks via entry points:
# pyproject.toml
[project.entry-points."geo_optimizer.checks"]
my_check = "my_package:MyCheck"
Plugins implement the AuditCheck protocol (name, description, max_score, run()). Plugin results appear in the audit output but do not affect the base score.
Platform Context Files
Platform-optimized versions of this skill for different AI tools:
| Platform | File | Size | Limit | How to use |
|---|---|---|---|---|
| Claude Projects | ai-context/claude-project.md | ~11,700 chars | No limit | Project → Add as Knowledge |
| ChatGPT Custom GPT | ai-context/chatgpt-custom-gpt.md | ~4,500 chars | 8,000 chars | GPT Builder → System prompt |
| ChatGPT Instructions | ai-context/chatgpt-instructions.md | ~800 chars | 1,500 chars/field | Settings → Custom Instructions |
| Cursor | ai-context/cursor.mdc | ~4,200 chars | No limit | Copy to .cursor/rules/geo-optimizer.mdc |
| Windsurf | ai-context/windsurf.md | ~4,500 chars | 12,000 chars | Copy to .windsurf/rules/geo-optimizer.md |
| Kiro | ai-context/kiro-steering.md | ~3,300 chars | No limit | Copy to .kiro/steering/geo-optimizer.md |
# Quick copy commands
mkdir -p .cursor/rules && cp ai-context/cursor.mdc .cursor/rules/geo-optimizer.mdc
mkdir -p .windsurf/rules && cp ai-context/windsurf.md .windsurf/rules/geo-optimizer.md
mkdir -p .kiro/steering && cp ai-context/kiro-steering.md .kiro/steering/geo-optimizer.md