AI Citation Toolkit - audit, score, and rewrite web pages for AI-citation eligibility. AEO/GEO/LLM visibility for any MCP client.
Strong foundation with 20 well-named tools following verb_noun convention (audit_*, check_*, score_*, etc.). All tools have detailed descriptions (100-300+ chars) explaining WHAT, WHEN, and prerequisites. Input schemas are present and typed with Zod validation. However, several tools lack explicit output schema documentation in the visible code, and some parameter descriptions could be more prescriptive about constraints. Error handling is present but recovery guidance is minimal. Tool composition is excellent, tools chain naturally (audit_page composes check_technical + audit_schema + check_robots + check_sitemap + score_ai_overview_eligibility). Security is strong: all tools are read-only except save_audit_report (write), with clear risk annotations.
Audit a page's canonical link integrity: presence, self-reference, cross-domain mismatches, trailing-slash hygiene, and og:url consistency. Read-only. One HTTP GET to fetch the HEAD section. Deterministic, rule-based; no LLM. When to use: a focused canonical-only audit (e.g. debugging a duplicate-content issue). For a full HEAD audit including OpenGraph, hreflang, noindex, title, use `check_technical`. For everything-on-a-page, use `audit_page`.
Full AI-SEO audit of a single URL: returns categorized findings (info/warning/error) with severity, fix instructions, and a 0-100 composite score plus per-dimension subscores. Read-only. Fetches the URL once and runs every sub-audit (schema, robots, technical, sitemap, AI-Overview eligibility) against the response. No writes, no third-party APIs, no auth required, no rate limits beyond polite per-host throttling. Deterministic, rule-based scoring; no LLM calls. Same URL + same input flags returns the same score. Supports `render: "static" | "headless"`. Default `static` (fast, raw HTML only). Use `headless` for React/Vue/Angular SPAs — adds 3-10s and requires the optional `playwright-core` peer dep plus a one-time `npx playwright install chromium`. When to use: the default entry point for `audit any page`. Use this instead of calling check_technical / audit_schema / check_robots / check_sitemap / score_ai_overview_eligibility individually unless you specifically need only one dimension - this tool composes all of them.
Validate JSON-LD structured data against Schema.org rules and AI-citation best practices. Accepts either a URL (fetched) or a raw JSON string (parsed directly). Read-only when given `url` (one HTTP GET). Zero network when given `schema_json`. No writes. Deterministic, rule-based; no LLM. Validates required/recommended properties, @context correctness, sameAs links, and AI-search-friendly patterns. When to use: focused JSON-LD audits, or to validate a schema block you're about to ship. For a full page audit that includes schema + everything else, use `audit_page` instead. Either `url` or `schema_json` must be provided (not both). If both are provided, `schema_json` wins and no fetch happens.
Output schemas not explicitly documented in visible code. While input schemas are defined via Zod (auditPageInputSchema, etc.), corresponding output shapes (auditPageOutputShape, etc.) are imported but their structure is not visible in the provided source. LLMs cannot infer return field names and types without explicit documentation.
rewrite_for_aeo and rewrite_for_geo delegate to MCP sampling (client LLM), but descriptions do not explicitly state this requires client support for createMessage. LLMs may attempt to call these tools on clients that do not support sampling, causing silent failures.
Parameter 'render' in audit_page accepts 'static' or 'headless' but description does not specify that 'headless' requires optional peer dependency playwright-core and one-time setup (npx playwright install chromium). This is mentioned in the tool description but not in the parameter description, risking LLM confusion.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2025-06-18+ | v2 |
Full AI-SEO audit of an entire site: crawls the domain (via sitemap or robots.txt discovery), audits each URL, and returns aggregated findings with per-page scores and site-wide recommendations. Read-only. Multiple HTTP GETs (one per discovered URL, plus robots.txt and sitemap.xml). No writes, no third-party APIs, no auth required. Deterministic, rule-based scoring; no LLM calls. Same domain + same input flags returns the same scores. When to use: comprehensive site-wide SEO audit. For a single-page audit, use `audit_page` instead.
Audit a domain's sitemap.xml: report URL count, last-modified dates, AI-crawler directives, and per-URL audit findings. Read-only. One HTTP GET to /sitemap.xml, plus one HTTP GET per URL in the sitemap (up to a limit). Deterministic, rule-based; no LLM. Returns structured findings with per-URL status. When to use: auditing sitemap coverage, freshness, and per-URL SEO signals. For a full site audit, use `audit_site` instead.
Fetch and parse a domain's robots.txt; report per-crawler allow/disallow posture for every known AI training crawler (GPTBot, CCBot, Anthropic-AI, Google-Extended, etc.), AI search crawlers (ChatGPT-User, PerplexityBot, OAI-SearchBot), and user-triggered fetchers. Read-only. One HTTP GET to /robots.txt. No auth, no rate limits applied. Deterministic, rule-based; no LLM. Returns structured findings with per-crawler status. When to use: figuring out which AI crawlers a site blocks vs allows. Combine with `check_sitemap` for a full pre-crawl audit. Distinct from `audit_page` which evaluates the page content itself.
Fetch and parse a domain's sitemap.xml (or sitemap index); report URL count, last-modified dates, and AI-crawler directives (noindex, nofollow, robots meta tags on each URL). Read-only. One HTTP GET to /sitemap.xml (or the URL you specify). No auth, no rate limits applied. Deterministic, rule-based; no LLM. Returns structured findings with per-URL status. When to use: auditing sitemap coverage and freshness. Combine with `check_robots` for a full pre-crawl audit.
Audit a page's technical SEO: HEAD metadata (title, meta description, canonical, OpenGraph, hreflang, noindex, viewport, charset), body structure (headings, word count, images, links), and accessibility signals. Read-only. One HTTP GET to fetch the page. Deterministic, rule-based; no LLM. When to use: a focused technical audit (title/description/canonical/hreflang/noindex/viewport/charset/structure). For a full page audit including schema + robots + sitemap + AI-Overview eligibility, use `audit_page` instead.
Compare two pages (before/after) and report structural and content differences. Useful for validating rewrites or tracking changes. Read-only. Two HTTP GETs to fetch both pages. Deterministic, rule-based; no LLM. Returns a structured diff with categorized changes. When to use: validating that a rewrite (via `rewrite_for_aeo` or `rewrite_for_geo`) produced the intended changes.
Extract entities (people, organizations, products, concepts) from a page. Combines JSON-LD schema extraction with heuristic text-based entity recognition. Read-only. One HTTP GET to fetch the page. Deterministic, rule-based; no LLM. Returns a list of entities with types, sameAs links, mention counts, and definition status. When to use: understanding the key entities on a page for knowledge-graph enrichment or citation analysis.
Generate a spec-compliant llms.txt file for a domain. Accepts a list of URLs (or a domain to crawl) and produces a structured llms.txt with metadata, allowed/disallowed paths, and optional custom sections. Read-only when given a URL list. May crawl the domain if you request auto-discovery. Deterministic, rule-based; no LLM. When to use: creating or validating an llms.txt file for your site. Pair with `validate_llms_txt` to check the output.
Generate a pricing.md file for a domain. Extracts pricing information from the page and formats it as a structured markdown file. Read-only. One HTTP GET to fetch the page. Deterministic, rule-based; no LLM. When to use: creating a pricing.md file for your site to improve AI-search visibility.
Rewrite a page's content for AI-Engine Optimization (AEO): improve E-E-A-T signals, citation-friendly structure, and AI-search visibility. Delegates to the client's LLM via MCP sampling. Read-only input (fetches the URL once). Writes are delegated to the client (LLM sampling request). Non-deterministic (LLM-driven). Returns a rewritten version of the page content with explanations of changes. When to use: optimizing a page for AI search and citation. Requires the client to support MCP sampling (createMessage).
Rewrite a page's content for Geographic Engine Optimization (GEO): improve local relevance, location-specific signals, and geo-targeted visibility. Delegates to the client's LLM via MCP sampling. Read-only input (fetches the URL once). Writes are delegated to the client (LLM sampling request). Non-deterministic (LLM-driven). Returns a rewritten version of the page content with explanations of changes. When to use: optimizing a page for local/geographic search. Requires the client to support MCP sampling (createMessage).
Save an audit result (from `audit_page`, `audit_site`, or `audit_sitemap`) to a markdown file. Formats the audit findings as a human-readable report. Write operation: creates or overwrites a file on the local filesystem. Deterministic, rule-based; no LLM. Returns the file path and byte count written. When to use: exporting audit results for sharing, archiving, or CI/CD integration (e.g., GitHub Actions).
Score a page's agentic browsing readiness: presence of llms.txt, WebMCP integration, accessibility tree integrity, and layout stability. Mirrors Lighthouse's Agentic Browsing category (May 2026). Read-only. One HTTP GET to fetch the page. Deterministic, rule-based; no LLM. Returns a 0-100 score plus per-factor subscores and findings. When to use: assessing whether a page is ready for agent interaction. For a full page audit, use `audit_page` instead.
Score a page's eligibility for inclusion in Google AI Overviews (AIO). Evaluates: E-E-A-T signals (author/publication date/expertise), citation-friendly structure (clear topic, well-sourced claims, linked references), and content freshness. Read-only. One HTTP GET to fetch the page. Deterministic, rule-based; no LLM. Returns a 0-100 score plus per-dimension subscores and actionable findings. When to use: assessing whether a page is likely to be cited in AI Overviews. For a full page audit, use `audit_page` instead.
Score a page's citation worthiness: likelihood that an LLM or AI search engine will cite it as a source. Evaluates: topical authority, content depth, freshness, source credibility, and claim-backing evidence. Read-only. One HTTP GET to fetch the page. Deterministic, rule-based; no LLM. Returns a 0-100 score plus per-dimension subscores and actionable findings. When to use: assessing whether a page is likely to be cited by LLMs. For a full page audit, use `audit_page` instead.
Test whether a page is likely to be cited by a specific LLM or AI search engine. Simulates citation likelihood based on content quality, topical authority, and freshness. Read-only. One HTTP GET to fetch the page. Deterministic, rule-based; no LLM. Returns a citation likelihood score and explanations. When to use: assessing citation potential for a specific AI system or use case.
Validate an llms.txt file against the spec. Accepts either a URL (fetched) or raw llms.txt content (parsed directly). Read-only when given `url` (one HTTP GET). Zero network when given `llms_txt_content`. No writes. Deterministic, rule-based; no LLM. Returns structured findings with severity levels. When to use: checking whether your llms.txt is spec-compliant before publishing.
Error handling descriptions are minimal. Tools return ToolError objects but descriptions do not explain error categories (retryable vs fatal) or recovery guidance. E.g., 'fetch_error' could mean network timeout (retry) or robots.txt block (skip), LLM cannot distinguish.
generate_llms_txt and generate_pricing_md accept optional 'urls' array but do not specify max length, format validation, or what happens if URLs are invalid. LLMs may pass malformed URLs or thousands of URLs without guidance.