# atomno-mcp-seo-audit [![PyPI](https://img.shields.io/pypi/v/atomno-mcp-seo-audit)](https://pypi.org/project/atomno-mcp-seo-audit/) [![Python](https://img.shields.io/pypi/pyversions/atomno-mcp-seo-audit)](https://pypi.org/project/atomno-mcp-seo-audit/) [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE) [![MCP](https://img.shields.io/badge/MCP-server-blue)](https://modelcontextprotocol.io) MCP (Model Context Protocol) server for **technical SEO & GEO audits**, powered by the [detail.web](https://audit.detailweb.ru) engine — **real measurements, not LLM guesses**. Run it from Cursor, Claude Desktop or any MCP client. **8 tools:** `audit_site` (deterministic `0–100` health score + letter grade, 78 checks across 8 categories, plus a **GEO** sub-score — visibility in ChatGPT / Perplexity / Google AI Overviews), `audit_diff` (compare vs the previous snapshot), `robots.txt` & `sitemap.xml` validators, JSON-LD & meta/OpenGraph builders, and per-check fix explainers. Probes TLS, redirects, TTFB, AI-crawler access (GPTBot) and `llms.txt`. Free tier + **PRO+** (deep-crawl, GEO, 40+ deeper checks) — API keys unlock the deeper engine on the **PRO+** plan and up (see [Free vs PRO+](#free-vs-pro)). ## Why pair it with an LLM? A language model on its own infers a site from training data and, at best, one rendered page — it can't directly read your TLS certificate's expiry, measure response time, parse `sitemap.xml`, or check whether `GPTBot` is blocked in `robots.txt`. This server runs those checks for real: actual HTTP requests, security headers, redirect chains, structured-data validation — and returns a **deterministic** score (same site → same number), reproducible enough to put in a client report. Think of it as the instrument and the LLM as the analyst that interprets the readout — the two work best together. ## What you get - **`audit_site(url, depth=1, lang="ru")`** — one call returns: - health score `0–100` (higher is better) and a letter grade `A–F`; - issues grouped by category (security, SEO & indexing, performance, GEO, …), each with status `pass / warn / fail`; - a short human-readable summary. - **`audit_diff(url, lang="ru")`** — re-audits a site and compares it to the previous run: health/score delta and which checks got worse or better. The first call stores a baseline. This is something a one-off LLM question can't do — track a site over time. Stateful feature — needs a key on the **PRO+** plan or higher. - **`list_checks(lang="ru")`** — the full catalogue of engine checks grouped by category, with a `free` / `PRO` badge on each — so you (and the agent) can see exactly what the free tier covers and what PRO unlocks. - **`explain_issue(check_id, lang="ru")`** — a deep-dive on a single check: why it matters and how to fix it. Pass a `check_id` from `audit_site` or `list_checks`. Title and category are localized; detailed advice is currently in Russian (the `advice_lang` field reports this). - **`validate_robots(content, lang="ru")`** — paste a `robots.txt` and get back syntax issues, whether a `Sitemap:` directive is present, whether CSS/JS is blocked from render bots, and which AI crawlers (GPTBot, ClaudeBot, …) are explicitly blocked. No fetch — validates the text you provide. - **`check_sitemap(url, lang="ru")`** — fetches a sitemap by URL and reports its format (`urlset` / `sitemapindex`), URL count and common problems (404, non-XML content type, `http://` links, missing ``, the 50k-per-file limit). The fetch is SSRF-guarded on the server. - **`build_jsonld(type, fields, lang="ru")`** — generates a ready-to-paste schema.org JSON-LD `