Skip to main content
Glama
README.md
# geo-check-mcp

An MCP server that checks whether a website is technically ready to be read and cited by AI search
(ChatGPT search, Perplexity, Copilot, Gemini, Claude). It runs over stdio and has no API keys.

**AI answers change over time; this tool does not and cannot guarantee that a site will be recommended.**
It checks the technical factors a site owner controls.

## Tools

| Tool | Network | What it does |
|---|---|---|
| `list_ai_crawlers` | no | Lists the 16 crawler user-agents checked (GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, ClaudeBot, Claude-SearchBot, Claude-User, Google-Extended, Googlebot, Bingbot, Applebot-Extended, Amazonbot, Meta-ExternalAgent, CCBot, Bytespider) with operator and purpose. |
| `check_robots` | no | Evaluates pasted robots.txt text for each crawler and path. Follows RFC 9309: user-agent group merging, a specific group beating `*`, longest match, Allow winning ties, and `*` / `$` wildcards. |
| `check_site` | yes | Full check of a public site: AI-crawler access, homepage JSON-LD types, `/llms.txt` (with soft-404 detection), sitemap, title, meta description, canonical, H1, lang, noindex and Open Graph. Returns JSON, and Markdown with `format="markdown"`. |

`check_site` is polite. It makes about 4 GET requests 1 second apart, sends a declared User-Agent
(`GeoCheckBot/0.1 (+mailto:...)`, which you can change in `geo_check.py`), obeys robots.txt for its own
user-agent, and fetches only the homepage. It does not spoof crawler user-agents, so CDN or firewall bot
blocking (for example Cloudflare "Block AI bots") is reported as "not checked".

## Install and run

```bash
pip install -e .            # needs Python 3.10+, mcp>=1.2 (works with SDK 1.x FastMCP and 2.x MCPServer)
geo-check-mcp               # stdio server
# or: python -m geo_check_mcp
```

Claude Desktop / Cursor config:

```json
{
  "mcpServers": {
    "geo-check": { "command": "geo-check-mcp" }
  }
}
```

Try it with MCP Inspector:

```bash
npx @modelcontextprotocol/inspector --cli geo-check-mcp --method tools/list
npx @modelcontextprotocol/inspector --cli geo-check-mcp --method tools/call --tool-name check_site --tool-arg url=https://example.com
```

The checker also works without MCP: `python src/geo_check_mcp/geo_check.py https://example.com --md out.md --json out.json`.

## Tests

```bash
pip install -e '.[test]'
pytest -q                                            # offline: robots parser + stdio protocol self-test
GEO_LIVE_URL=https://example.com pytest -q           # also runs one live check_site call
```

## Use this as a template for your own MCP server

The layout keeps business logic and the MCP layer apart:

```
src/geo_check_mcp/
  geo_check.py   # plain Python, no MCP imports; unit-testable
  server.py      # ~60 lines: one decorated function per tool
tests/
  test_robots.py         # logic tests
  test_server_stdio.py   # starts the server, sends raw JSON-RPC: initialize, tools/list, tools/call
```

To wrap a REST API, a CSV or Airtable base, or an internal service instead:

1. Replace `geo_check.py` with a client module (read secrets from environment variables, never hard-code them).
2. In `server.py`, write one small `@mcp.tool()` function per action, with type hints and a docstring. The SDK builds the JSON schema from them.
3. Run slow or blocking I/O in a thread (`anyio.to_thread.run_sync`) so the stdio loop stays responsive.
4. Update `test_server_stdio.py` with the new tool names and one offline call each.

## License

MIT, see [LICENSE](LICENSE).

TDQS

A3.9/5.0

Scored across 3 tools

Disambiguation4/5

list_ai_crawlers (reference data), check_robots (offline robots.txt evaluation) and check_site (network-based full GEO audit) each have a clearly stated purpose. The only mild overlap is that check_site also covers robots.txt AI-crawler access, so an agent could conceivably pick check_site when it only wanted the robots check, but the offline/online distinction in the descriptions resolves this.

Naming Consistency5/5

All three names follow a consistent verb_noun snake_case pattern: list_ai_crawlers, check_robots, check_site. The check_ prefix groups the two evaluation tools logically and list_ signals the reference-data tool.

Tool Count4/5

Three tools is on the small side, but the server's scope (GEO/technical crawlability checks) is narrow and each tool earns its place: one reference list, one offline evaluator, one full site audit. Slightly thin but well scoped rather than padded.

Completeness4/5

The surface covers the core GEO workflow: discovering which crawlers matter, testing robots.txt offline, and running a combined audit of robots.txt, JSON-LD, /llms.txt, sitemap and head tags. Minor gaps exist — no standalone llms.txt or JSON-LD/sitemap check, and no offline HTML inspection — but these are reachable through check_site.

Maintenance

ActivityMaintained
ResponsivenessNo issues