Generative Engine Optimization toolkit — make websites visible to AI search engines
Project description
Make websites visible to AI search engines
Audit, fix, and optimize any website to be cited by ChatGPT, Perplexity, Claude, and Gemini.
Why this exists
AI search engines give direct answers and cite their sources. If your site isn't optimized, you're invisible — even if you rank #1 on Google.
User: "What's the best mortgage calculator?"
Perplexity: "According to [Competitor.com], the formula is..."
↑ They appear. You don't.
GEO Optimizer audits your site against 47 research-backed methods (Princeton KDD 2024, AutoGEO ICLR 2026) and generates the fixes.
Quick Start
pip install geo-optimizer-skill
# Audit any site — get a score 0-100 with actionable recommendations
geo audit --url https://yoursite.com
# Auto-generate all missing files (robots.txt, llms.txt, schema, meta)
geo fix --url https://yoursite.com --apply
# Generate llms.txt from sitemap
geo llms --base-url https://yoursite.com --output ./public/llms.txt
# Generate JSON-LD schema
geo schema --type faq --url https://yoursite.com
What it checks
| Area | Points | What GEO Optimizer looks for |
|---|---|---|
| Robots.txt | /18 | 27 AI bots across 3 tiers (training, search, user). Citation bots explicitly allowed? |
| llms.txt | /18 | Present, has H1 + blockquote, sections, links, depth. Companion llms-full.txt? |
| Schema JSON-LD | /16 | WebSite, Organization, FAQPage, Article. Schema richness (5+ attributes)? |
| Meta Tags | /14 | Title, description, canonical, Open Graph complete? |
| Content | /12 | H1, statistics, external citations, heading hierarchy, lists/tables, front-loading? |
| Brand & Entity | /10 | Brand name coherence, Knowledge Graph links (Wikipedia/Wikidata/LinkedIn/Crunchbase), about page, geo signals, topic authority |
| Signals | /6 | <html lang>, RSS/Atom feed, dateModified freshness? |
| AI Discovery | /6 | .well-known/ai.txt, /ai/summary.json, /ai/faq.json, /ai/service.json? |
Score bands: 86-100 Excellent · 68-85 Good · 36-67 Foundation · 0-35 Critical
Bonus checks (informational, do not affect score):
| Check | What it detects |
|---|---|
| CDN Crawler Access | Does Cloudflare/Akamai/Vercel block GPTBot, ClaudeBot, PerplexityBot? |
| JS Rendering | Is content accessible without JavaScript? SPA framework detection |
| WebMCP Readiness | Chrome WebMCP support: registerTool(), toolname attributes, potentialAction schema |
| Negative Signals | 8 anti-citation signals: CTA overload, popups, thin content, keyword stuffing, missing author, boilerplate ratio |
| Prompt Injection Detection | 8 manipulation patterns: hidden text, invisible Unicode, LLM instructions, HTML comment injection, monochrome text, micro-font, data-attr injection, aria-hidden abuse |
| Trust Stack Score | 5-layer trust aggregation (Technical, Identity, Social, Academic, Consistency) — composite grade A-F |
Plus a separate Citability Score (0-100) measuring content quality across 47 methods: Quotation +41% · Statistics +33% · Fluency +29% · Cite Sources +27% · and 43 more.
Output formats
geo audit --url https://example.com --format text # Human-readable (default)
geo audit --url https://example.com --format json # Machine-readable
geo audit --url https://example.com --format rich # Colored terminal
geo audit --url https://example.com --format html # Self-contained report
geo audit --url https://example.com --format sarif # GitHub Code Scanning
geo audit --url https://example.com --format junit # Jenkins, GitLab CI
geo audit --url https://example.com --format github # GitHub Actions annotations
CI/CD Integration
# .github/workflows/geo.yml
- uses: Auriti-Labs/geo-optimizer-skill@v1
with:
url: https://yoursite.com
min-score: 70 # Fail if score drops below 70
format: sarif # Upload to GitHub Security tab
Works with GitHub Actions, GitLab CI, Jenkins, CircleCI, and any CI that runs Python.
MCP Server
Use GEO Optimizer from Claude, Cursor, Windsurf, or any MCP client:
pip install geo-optimizer-skill[mcp]
claude mcp add geo-optimizer -- geo-mcp
Then ask: "audit my site and fix what's missing"
| Tool | Purpose |
|---|---|
geo_audit |
Full audit with score + recommendations |
geo_fix |
Generate fix files |
geo_llms_generate |
Generate llms.txt |
geo_citability |
Content citability analysis (47 methods) |
geo_schema_validate |
Validate JSON-LD |
geo_compare |
Compare multiple sites |
geo_ai_discovery |
Check AI discovery endpoints |
geo_check_bots |
Check bot access via robots.txt |
geo_trust_score |
5-layer trust signal aggregation |
geo_negative_signals |
8 anti-citation signal detection |
Use as AI Context
Load the right file into your AI assistant for GEO expertise:
| Platform | File |
|---|---|
| Claude Projects | ai-context/claude-project.md |
| ChatGPT Custom GPT | ai-context/chatgpt-custom-gpt.md |
| Cursor | ai-context/cursor.mdc |
| Windsurf | ai-context/windsurf.md |
| Kiro | ai-context/kiro-steering.md |
Internal Skill System
The repository now includes a structured internal skill catalog for maintainers at src/geo_optimizer/skills/catalog/ plus validation rules and examples. See docs/skill-system.md for the v1 architecture.
Python API
from geo_optimizer import audit
result = audit("https://example.com")
print(result.score) # 85
print(result.band) # "good"
print(result.citability.total_score) # 72
print(result.score_breakdown) # {"robots": 18, "llms": 14, ...}
print(result.recommendations) # ["Add FAQPage schema..."]
Async variant:
from geo_optimizer import audit_async
result = await audit_async("https://example.com")
Dynamic Badge
Show your GEO score in your README:

Colors: 86-100 green · 68-85 cyan · 36-67 yellow · 0-35 red. Cached 1h.
Plugin System
Extend the audit with custom checks via entry points:
[project.entry-points."geo_optimizer.checks"]
my_check = "mypackage:MyCheck"
See examples/example_plugin.py for a working example.
Research Foundation
| Paper | Venue | Key Finding |
|---|---|---|
| GEO: Generative Engine Optimization | KDD 2024 | 9 methods tested on 10k queries. Cite Sources: +115%, Statistics: +40% |
| AutoGEO | ICLR 2026 | Automatic rule extraction. +50.99% over Princeton baseline |
| C-SEO Bench | 2025 | Most content manipulation is ineffective. Infrastructure matters most |
We focus on technical infrastructure (robots.txt, llms.txt, schema, meta) over content rewriting. The research confirms: if crawlers can't find and parse your content, prose optimization doesn't matter.
Security
All URL inputs are validated against private IP ranges (RFC 1918, loopback, link-local, cloud metadata) with DNS pinning before any request. See SECURITY.md for reporting vulnerabilities.
Contributing
git clone https://github.com/YOUR_USERNAME/geo-optimizer-skill.git
cd geo-optimizer-skill && pip install -e ".[dev]"
pytest tests/ -v # 1120+ tests, all mocked
Bug reports · Feature requests · CONTRIBUTING.md
Star History
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file geo_optimizer_skill-4.2.0.tar.gz.
File metadata
- Download URL: geo_optimizer_skill-4.2.0.tar.gz
- Upload date:
- Size: 352.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c49518932cc5f3d8b21c90b4a9d5c8496b2e4f5b1d6c6551a73e475ba651170e
|
|
| MD5 |
9bdc46cec5fccb930e5e7c1d69159ad2
|
|
| BLAKE2b-256 |
aa5d79305267b8b243477b55b20291e4f008ee89437bf847392e48710f8d2816
|
Provenance
The following attestation bundles were made for geo_optimizer_skill-4.2.0.tar.gz:
Publisher:
publish.yml on Auriti-Labs/geo-optimizer-skill
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geo_optimizer_skill-4.2.0.tar.gz -
Subject digest:
c49518932cc5f3d8b21c90b4a9d5c8496b2e4f5b1d6c6551a73e475ba651170e - Sigstore transparency entry: 1283125265
- Sigstore integration time:
-
Permalink:
Auriti-Labs/geo-optimizer-skill@22d1c4f68d1e6a32a373da87096d80edbee232c9 -
Branch / Tag:
refs/tags/v4.2.0 - Owner: https://github.com/Auriti-Labs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@22d1c4f68d1e6a32a373da87096d80edbee232c9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file geo_optimizer_skill-4.2.0-py3-none-any.whl.
File metadata
- Download URL: geo_optimizer_skill-4.2.0-py3-none-any.whl
- Upload date:
- Size: 283.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c74ecf2001c70e1d5fa24f1eda0a2fb55ac00d53ede041f35cda6a528ef169dd
|
|
| MD5 |
a4b3f20967a3f34a96eb3dfdbb9b9976
|
|
| BLAKE2b-256 |
b63070386d114b6c2e054012a8c13c0fde5f6d4fcfc087ac08d0a8375de50bf9
|
Provenance
The following attestation bundles were made for geo_optimizer_skill-4.2.0-py3-none-any.whl:
Publisher:
publish.yml on Auriti-Labs/geo-optimizer-skill
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geo_optimizer_skill-4.2.0-py3-none-any.whl -
Subject digest:
c74ecf2001c70e1d5fa24f1eda0a2fb55ac00d53ede041f35cda6a528ef169dd - Sigstore transparency entry: 1283125274
- Sigstore integration time:
-
Permalink:
Auriti-Labs/geo-optimizer-skill@22d1c4f68d1e6a32a373da87096d80edbee232c9 -
Branch / Tag:
refs/tags/v4.2.0 - Owner: https://github.com/Auriti-Labs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@22d1c4f68d1e6a32a373da87096d80edbee232c9 -
Trigger Event:
push
-
Statement type: