AI-SEO / AEO / GEO Audit
Server Details
AI-SEO / AEO / GEO audit MCP for any public URL. Scores schema.org coverage, robots.txt and llms.txt health, canonical and OpenGraph setup, and AI-citation likelihood.
- Status
- Healthy
- Uptime
- 24.0% over 66 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 20 tools
The descriptions are unusually disciplined, explicitly cross-referencing sibling tools ('Distinct from X', 'use Y instead') so an agent can route correctly. However, real overlap exists in the set: four score_* tools (agentic_browsing, ai_overview_eligibility, citation_worthiness, test_citation), three site-level tools (audit_site, audit_sitemap, check_sitemap), and audit_page composes check_technical/audit_schema/check_robots/check_sitemap/score_ai_overview_eligibility as exposed standalone tools. The guidance mitigates this well, but boundaries are not perfectly clean.
Every tool follows a predictable snake_case verb_noun pattern (audit_*, check_*, score_*, rewrite_*, llms_txt_*, diff_pages, extract_entities, report_save). No camelCase/PascalCase mixing and no vague verbs — the prefix reliably signals tool family.
20 tools is on the heavy side of the 3-15 sweet spot, but the broad AI-SEO/AEO/GEO domain spans distinct families (audits, scoring, rewriting, file generation, reporting) and each tool has a defensible, non-trivial job. Some redundancy comes from exposing both composite tools (audit_page, audit_site) and their constituent sub-tools, which inflates the count.
Coverage is strong end-to-end: single-URL and site-wide audits, per-dimension checks, four scoring lenses, entity extraction, two rewrite modes, llms.txt/pricing file generation, and report persistence. Minor gaps include comparison being capped at two URLs (no multi-competitor diff) and no standalone way to re-aggregate multiple saved reports, but these are workable.
Available Tools
20 toolsaudit_canonicalAudit canonical link integrityARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL whose canonical link tag and og:url consistency you want to audit. Must be a fully-qualified http(s) URL. The tool fetches the URL (following redirects) and inspects only the <head> section; the body is not parsed. | |
| respect_robots | No | If true (default), respect robots.txt before fetching. Set false only for auditing your own site where you've intentionally blocked crawlers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| findings | Yes | |
| final_url | Yes | |
| canonical_value | Yes | |
| is_cross_domain | Yes | |
| is_self_referential | Yes | |
| canonical_og_url_match | Yes | |
| trailing_slash_consistent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered structurally. The description still adds real behavioral context beyond that: a single HTTP GET, HEAD-only parsing, and deterministic rule-based evaluation with no LLM. It stops short of describing failure modes (unreachable URL, redirect chains) or any rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short paragraphs, zero padding: scope first, then execution model, then routing guidance. Every sentence carries information an agent would otherwise have to infer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is correctly omitted. For a 2-param read-only audit tool, the description covers scope, cost (one GET), execution model (deterministic, HEAD-only), and sibling routing — nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (url, respect_robots) are already fully documented in the schema, including redirect-following, HEAD-only inspection, and the robots.txt override case. The description adds no parameter-level detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Audit a page's canonical link integrity') followed by an enumerated scope (presence, self-reference, cross-domain mismatches, trailing-slash hygiene, og:url consistency). It explicitly distinguishes itself from the nearest siblings (check_technical, audit_page), so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause with a concrete scenario (debugging duplicate-content), plus named alternatives for adjacent needs: check_technical for a full HEAD audit and audit_page for everything-on-a-page. Both the when and the when-not are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_pageAudit page (full)ARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL to audit. Must be a fully-qualified http(s) URL that returns HTTP 200 (redirects are followed). The tool fetches this URL once and runs every sub-audit (schema, robots, technical, sitemap, AI-Overview eligibility) against the response. | |
| render | No | Rendering mode. `static` (default) fetches raw HTML via HTTP — fast (<1s) but misses JS-rendered content typical of SPAs (React/Vue/Angular landing pages). `headless` spins up Playwright Chromium, waits for networkidle, and audits the rendered DOM — adds 3-10s per audit and requires `playwright-core` installed plus a one-time `npx playwright install chromium`. Use `headless` when the static audit shows `content_quality: "spa_empty"` or you know the target is JS-rendered. | static |
| respect_robots | No | If true (default), the tool checks robots.txt before fetching and skips disallowed paths, returning a robots_blocked finding instead. Set to false ONLY for auditing your own site where you've intentionally blocked crawlers and need the audit to bypass that block. | |
| generate_report | No | If true, return a standalone HTML scorecard in the `report_html` field. The HTML is self-contained (no external dependencies) and can be saved as a .html file or pasted to Gist/CodePen. Default false to keep audits cheap. | |
| include_raw_html | No | If true, return the full raw HTML in the response under `raw_html`. Default false. Set true only when you need to inspect markup that wasn't captured by the structured findings; the payload can be large. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The URL that was audited. |
| grade | Yes | Letter grade derived from the numeric score. |
| score | Yes | Composite 0-100 AI-citation score. |
| findings | Yes | All findings emitted by the sub-audits, deduplicated. |
| raw_html | No | Full raw HTML response. Present only when include_raw_html=true. |
| fetched_at | Yes | UTC ISO-8601 timestamp of the fetch. |
| score_caps | Yes | Hard blockers that capped the composite score (e.g. noindex, AI bots blocked). Empty when none fired. |
| report_html | No | Self-contained HTML scorecard. Present only when generate_report=true. |
| content_quality | Yes | Classification of the fetched HTML's readiness. spa_empty means audit results are degraded. |
| citation_verdict | Yes | Prepended block summarizing whether AI assistants will cite this page and why. |
| dimension_scores | Yes | Per-dimension 0-100 subscores. The composite score is a weighted blend of these. |
| platform_readiness | Yes | Per-engine readiness derived from the dimensions; engines reward different signals. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses read-only nature, no auth, no rate limits, deterministic rule-based scoring, and headless mode dependencies. These details go beyond annotations (readOnlyHint, idempotentHint, etc.) and add significant behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections and front-loaded information. Slightly verbose but every sentence earns its place. Minor improvement could be achieved by condensing some parameter explanations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, behavior, parameters, usage guidelines, dependencies, and edge cases (robots blocking). Output schema exists, so return values need not be explained. Complete for a complex tool with 5 parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds rich context: explains render modes with performance trade-offs, when to set respect_robots false, and the purpose of generate_report and include_raw_html. This exceeds the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Full AI-SEO audit of a single URL' and lists outputs. It distinguishes from sibling tools by naming them explicitly and positioning this tool as the composite entry point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'When to use: the default entry point for audit any page' and advises against using individual sub-audit tools unless needed. Provides clear context for when to use headless rendering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_schemaAudit JSON-LD schemaARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL to fetch and audit. Either this OR `schema_json` is required. Read-only HTTP GET. | |
| schema_json | No | Raw JSON-LD as a string (the contents of a `<script type="application/ld+json">` block). Use this to validate a schema block offline without fetching a URL. Either this OR `url` is required. | |
| respect_robots | No | If true (default), respect robots.txt before fetching `url`. Ignored when `schema_json` is used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| findings | Yes | |
| found_types | Yes | |
| missing_priority_types | Yes | |
| ai_citation_readiness_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, but the description goes well beyond them: it discloses the exact network behavior per mode (one HTTP GET for url, zero network for schema_json), that it is deterministic/rule-based with no LLM, and what it validates. This is genuinely additive context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then behavior, then usage routing in short scannable sentences. Every sentence carries new information with no restatement of the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Inputs, mode-specific behavior, precedence rules, and sibling routing are all covered; an output schema exists so return values need not be described. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning the schema does not: mutual exclusivity of url/schema_json and, critically, the precedence rule that schema_json wins and no fetch occurs when both are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (JSON-LD structured data) with scope (Schema.org rules, AI-citation best practices). It explicitly distinguishes itself from the sibling audit_page, so an agent can choose correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'When to use' line, names the alternative (audit_page) and the condition that selects it (full page audit), and explains the url-vs-schema_json input selection. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_siteAudit site (homepage + robots + sitemap + schema)ARead-onlyIdempotentInspect
Single-call site sweep: runs audit_page (homepage), check_robots, check_sitemap, and audit_schema in parallel and returns an overall grade (A–F) plus top-5 highest-impact fixes.
Read-only. Issues several HTTP GETs against the domain (homepage fetch, robots.txt, sitemap.xml, and up to 50 sitemap URL HEAD checks); no writes, no auth required, no rate limits beyond polite per-host throttling. The homepage GET is deduplicated across audit_page and audit_schema (~2 network fetches for 4 logical checks). Deterministic, rule-based scoring; no LLM calls. Same domain returns the same grade on repeated runs given unchanged content.
Output: domain, homepage_url, fetched_at, overall_score (0–100), overall_grade, top_5_fixes (Finding[]), and a parts breakdown with individual audit_page, check_robots, check_sitemap, and audit_schema results — each may be a full result or { error: string } when that sub-audit fails.
When to use: quick 'how does this site look overall?' — use when you want a single consolidated score and actionable fix list without calling 4 tools individually. Distinct from audit_sitemap (samples N pages from the sitemap, not just the homepage) and audit_page (single-URL deep dive with all findings, not just top-5).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Hostname or origin to audit. Examples: `example.com`, `https://example.com`. The tool resolves the homepage and runs audit_page + check_robots + check_sitemap + audit_schema in parallel against it, then returns an overall grade plus top-5 fixes. Issues several HTTP GETs against the domain. | |
| respect_robots | No | If true (default), respect robots.txt before fetching the homepage. Set false ONLY to audit a site you own that has temporarily blocked crawlers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| parts | Yes | Raw sub-audit results, for callers who want to drill in. |
| domain | Yes | |
| fetched_at | Yes | |
| top_5_fixes | Yes | Up to five highest-impact findings across all sub-audits. |
| homepage_url | Yes | |
| overall_grade | Yes | Letter grade derived from the numeric score. |
| overall_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint, openWorldHint. The description adds significant context: 'read-only', 'HTTP GETs', 'no writes, no auth required, no rate limits', 'deduplicated', 'deterministic, rule-based scoring; no LLM calls', and 'same domain returns same grade'. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but well-structured, with key information front-loaded (purpose, behavior, output). Every sentence adds value, though it could be slightly trimmed without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple sub-audits, deterministic scoring, output structure), the description covers input, behavior, output components, and use cases thoroughly. It mentions the output fields (domain, homepage_url, etc.) and sub-audit results, making it complete even without the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. The description for the 'domain' parameter includes examples, explains the sub-audits run in parallel, and notes that it issues several HTTP GETs. The 'respect_robots' parameter is also well described. This adds meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool as a 'Single-call site sweep' that runs multiple audits in parallel and returns an overall grade and top-5 fixes. It differentiates itself from siblings like audit_sitemap (samples pages from sitemap) and audit_page (single-URL deep dive) with specific verbs and resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides a 'When to use' section: 'quick how does this site look overall?' and distinguishes from alternative tools (audit_sitemap, audit_page). It also states it is read-only and issues HTTP GETs, but could more explicitly mention when not to use it (e.g., when deep multi-page analysis is needed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_sitemapAudit a site's content by sampling its sitemapARead-onlyIdempotentInspect
Site-wide content audit: discovers the sitemap, samples N URLs by deterministic uniform stride, runs audit_page on each, and returns score distribution + worst pages + most-common findings.
Read-only. One HTTP GET for sitemap discovery, optionally a few more for sitemap-index children, then sample_size × audit_page calls (each one HTTP GET + parsing). Polite throttling is enforced per host.
Deterministic — same domain + same sample_size returns the same set of URLs (uniform-stride sampling). Per-page scoring is rule-based; no LLM.
When to use: portfolio-level health check across a site ("how does our content score on average?"). Distinct from audit_site (homepage-only composite) and check_sitemap (validates sitemap.xml structure, not page content).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Hostname or origin to audit. Examples: `example.com`, `https://example.com`. The tool discovers the sitemap, samples N URLs by uniform stride, and runs audit_page on each. | |
| concurrency | No | Parallel audit_page calls. Default 2 (gentle). Max 5. The shared politeFetch host-delay is still enforced, so this is per-batch dispatch concurrency, not bypass. | |
| sample_size | No | Number of URLs to sample from the sitemap. Default 10. Max 50 (sampling caps to avoid runaway audits — each sample is one full audit_page call, ~1-3s with polite throttling). Sampling is deterministic uniform-stride: if the sitemap has 1000 URLs and sample_size=10, every 100th URL is picked. | |
| respect_robots | No | If true (default), respect robots.txt for each sampled URL. Set false only for self-audits where you've intentionally blocked crawlers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | The domain audited. |
| failed | Yes | URLs whose audit failed, with the error message. |
| audited | Yes | Per-page audit results that completed successfully. |
| sampling | Yes | Sampling strategy. Deterministic uniform stride: every Nth URL is picked. |
| fetched_at | Yes | UTC ISO-8601 timestamp of the audit. |
| sitemap_url | Yes | Resolved sitemap URL (null when discovery failed). |
| worst_pages | Yes | Lowest-scoring pages from the sample, worst first. |
| top_findings | Yes | Most-common findings across all sampled pages, sorted by occurrence count desc. |
| urls_sampled | Yes | Number of URLs picked via uniform-stride sampling. |
| grade_distribution | Yes | Count of pages per letter grade. |
| score_distribution | Yes | Summary statistics across the audited sample. |
| total_urls_in_sitemap | Yes | Total URLs declared across the sitemap and any indexed children. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint), it details read-only nature, HTTP calls, polite throttling, deterministic sampling, and rule-based scoring. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and front-loaded. Each sentence adds value without redundancy. Summary paragraph, then behavioral details, determinism, and usage guidance in a logical flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensive coverage of what, how, when, behavioral traits, determinism, safety, and alternatives. Satisfies all needs given complexity and existing annotations/schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 4 parameters. Description adds further context for each, e.g., explaining domain discovery, concurrency throttling, deterministic sampling behavior, and respect_robots purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: discovers sitemap, samples URLs by uniform stride, runs audit_page on each, and returns findings. It uses specific verbs and resources, and distinguishes itself from siblings like audit_site and check_sitemap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (portfolio-level health check) and contrasts with audit_site (homepage-only) and check_sitemap (structure validation), providing clear guidance for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_robotsCheck robots.txt crawler postureARead-onlyIdempotentInspect
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 a single URL; this evaluates a whole-domain policy.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Hostname or origin to inspect. Examples: `example.com`, `https://example.com`, `https://example.com/`. The tool fetches `https://<domain>/robots.txt` and reports per-crawler allow/disallow posture for all known AI training crawlers (GPTBot, CCBot, etc.), AI search crawlers (ChatGPT-User, PerplexityBot), and user-triggered fetchers. Read-only HTTP GET to /robots.txt only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| findings | Yes | Per-crawler findings explaining why the posture matters. |
| fetched_at | Yes | UTC ISO-8601 timestamp of the fetch. |
| robots_url | Yes | The robots.txt URL that was fetched. |
| user_triggered | Yes | Allow/disallow posture per user-triggered fetcher (ChatGPT-User, Claude-User, etc.). |
| search_crawlers | Yes | Allow/disallow posture per known AI search crawler (OAI-SearchBot, PerplexityBot, etc.). |
| training_crawlers | Yes | Allow/disallow posture per known AI training crawler (GPTBot, ClaudeBot, CCBot, etc.). |
| recommended_posture | Yes | Suggested posture given the current rules. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint), description adds 'One HTTP GET to /robots.txt. No auth, no rate limits applied. Deterministic, rule-based; no LLM.' No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three paragraphs, each focused. First paragraph defines action and scope, second adds behavioral details, third provides usage guidance. No fluff, but could be slightly more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given single parameter, annotations, output schema (not shown but indicated), and sibling context, description covers all needed: behavior, use cases, limitations, and contrast.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description adds value by listing example domains and known crawlers, and clarifying the fetch URL. Slightly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Fetch and parse a domain's robots.txt; report per-crawler allow/disallow posture.' Distinct from siblings like check_sitemap and audit_page, as explicitly stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('figuring out which AI crawlers a site blocks vs allows'), suggests combining with check_sitemap, and distinguishes from audit_page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_sitemapCheck XML sitemap healthARead-onlyIdempotentInspect
Validate a domain's XML sitemap: presence, accessibility, URL count, lastmod freshness, sitemap-index handling, and image/video sitemap extensions.
Read-only. Issues N+1 HTTP GETs: one for robots.txt + sitemap, then up to max_urls_to_check HEADs against sampled URLs.
Deterministic, rule-based; no LLM.
When to use: site-wide indexing audits. Pair with check_robots for a full pre-crawl picture. For per-page checks, use audit_page or check_technical instead.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Hostname or origin to inspect. Examples: `example.com`, `https://example.com`. The tool tries `/sitemap.xml` then the sitemap URL declared in robots.txt; follows sitemap index files one level deep. Read-only HTTP GETs against the domain only. | |
| max_urls_to_check | No | Cap on how many URLs from the sitemap to sample for lastmod, image/video extension, and structural checks. Default 100. Increase up to 500 for large sites where you want a more representative sample; each extra URL is one HTTP HEAD. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| findings | Yes | |
| stale_urls | Yes | |
| total_urls | Yes | |
| sitemap_url | Yes | |
| sitemap_index | Yes | |
| has_image_sitemap | Yes | |
| has_video_sitemap | Yes | |
| urls_with_lastmod | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, and non-destructive behavior, but the description adds substantive context beyond them: the N+1 HTTP GET pattern, HEAD sampling against up to max_urls_to_check URLs, one-level sitemap-index traversal, and that the logic is deterministic/rule-based with no LLM. It stops short of stating rate limits, timeout, or failure semantics for an unreachable sitemap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight blocks with zero filler: what it checks, how it behaves on the network, and when to use it. The routing information is front-loaded and no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers behavior, request pattern, and usage routing adequately for a two-parameter read-only tool. The one real hole is the unresolved overlap with the sibling `audit_sitemap`, which an agent cannot resolve from this text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are fully documented in the schema, including examples for `domain` and the default/max semantics of `max_urls_to_check`. The description adds no parameter meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (XML sitemap) and enumerates exactly what is checked: presence, accessibility, URL count, lastmod freshness, sitemap-index handling, and image/video extensions. It distinguishes itself from check_robots, audit_page, and check_technical, but never addresses the near-identical sibling `audit_sitemap`, which is the one an agent is most likely to confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use: site-wide indexing audits' plus a named companion tool (check_robots) and named alternatives for per-page checks (audit_page, check_technical). No exclusions are given relative to audit_sitemap, so the agent is left to guess between two sitemap tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_technicalCheck technical HEAD signalsARead-onlyIdempotentInspect
Audit a page's HEAD section for technical signals relevant to AI crawlers: HTTPS, canonical, OpenGraph, Twitter Card, hreflang, noindex, and title-vs-H1 hygiene.
Read-only. One HTTP GET, inspects HEAD only (body is not parsed).
Deterministic, rule-based; no LLM.
When to use: when you specifically need HEAD-tag audit findings. For the full page including schema and AI-Overview scoring, use audit_page. For canonical-only, use audit_canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL to audit. The tool fetches the URL once and inspects HEAD-section signals: HTTPS, canonical, OpenGraph, Twitter Card, hreflang, noindex, title length and overlap with H1. Body content is not parsed. Read-only HTTP GET. | |
| respect_robots | No | If true (default), respect robots.txt before fetching. Set false only for auditing your own site where you've intentionally blocked crawlers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| https | Yes | |
| noindex | Yes | |
| og_tags | Yes | |
| findings | Yes | |
| hreflang | Yes | |
| canonical | Yes | |
| twitter_card | Yes | |
| mixed_content | Yes | |
| noindex_header | Yes | |
| title_og_match | Yes | |
| meta_description | Yes | |
| response_headers | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so safety is covered. The description adds real context beyond that: it performs exactly one HTTP GET, inspects HEAD only and does not parse the body, and is deterministic rule-based with no LLM involvement. It does not mention rate limits or timeouts, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what gets audited, followed by short scoping lines for behavior and routing. Every sentence carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. Behavior, scope, method, and sibling routing are all present; nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (url, respect_robots) are already documented in the schema, including the robots.txt default semantics. The description adds no syntax or format detail beyond that, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific audit verb on a specific resource (a page's HEAD section) and enumerates the exact signals inspected: HTTPS, canonical, OpenGraph, Twitter Card, hreflang, noindex, title-vs-H1. This is clearly distinguishable from siblings like audit_page and audit_canonical.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use clause plus two named alternatives with their selecting conditions ('For the full page including schema and AI-Overview scoring, use `audit_page`. For canonical-only, use `audit_canonical`'). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_pagesDiff two pages for citation-worthinessARead-onlyIdempotentInspect
Compare two URLs for AI citation-worthiness and return a structured breakdown of which page is more likely to be cited and why. Typical use: your page (url_a) vs a competitor's page (url_b).
Read-only. Runs audit_page on both URLs in parallel (2 HTTP fetches per URL), then diffs dimension_scores and findings. No new fetch logic beyond what audit_page already does.
Deterministic, rule-based; no LLM calls. Same two URLs return the same comparison on repeated runs.
When to use: competitive gap analysis - understand exactly which dimensions (schema, structure, robots, entity density, freshness, technical, authority, sitemap) put a competitor ahead, and get prioritized fix_recommendations_for_a to close the gap. For a single-URL audit, use audit_page. For overall scoring of one page, use score_citation_worthiness.
Capped at 2 URLs per call. Heuristic verdict - does not claim to know what AI assistants actually cite; verdict matches audit_page's existing rubric.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional target search query both pages are competing for (e.g. 'how to connect Zapier to Notion'). When provided, it is surfaced in fix_recommendations_for_a as context. Does not alter the scoring algorithm - scoring is based on audit_page's existing rubric. | |
| url_a | Yes | First URL to compare - typically your own page. Must be a fully-qualified http(s) URL that returns HTTP 200 (redirects are followed). | |
| url_b | Yes | Second URL to compare - typically a competitor's page. Must be a fully-qualified http(s) URL that returns HTTP 200 (redirects are followed). | |
| respect_robots | No | If true (default), respect robots.txt before fetching each URL. Set false only when auditing your own sites where you have intentionally blocked crawlers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| delta | Yes | |
| query | Yes | |
| url_a | Yes | |
| url_b | Yes | |
| scores | Yes | |
| missing_in_a | Yes | |
| missing_in_b | Yes | |
| better_for_citation | Yes | |
| fix_recommendations_for_a | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond annotations: describes parallel execution, deterministic rule-based logic, no LLM calls, 2 URL cap, heuristic verdict. Consistent with readOnlyHint and idempotentHint. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-organized into sections (purpose, behavior, deterministic, when to use, limitations). Slightly verbose but all sentences add value. Front-loaded with key purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present, return values are covered. Description explains process, limitations, and use cases comprehensively. Annotations provide additional safety context. Complete for a comparison tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters, but description adds useful details: query is optional, url_a/b must be fully-qualified and return 200, respect_robots default and when to override. Adds meaningful value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compares two URLs for AI citation-worthiness, returning a structured breakdown. It distinguishes from siblings like audit_page (single-URL audit) and score_citation_worthiness (overall scoring), providing a specific verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends use for competitive gap analysis and tells when not to use: for single-URL audits use audit_page, for overall scoring use score_citation_worthiness. Also gives typical use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_entitiesExtract named entities and sameAs linksARead-onlyInspect
Extract named entities, linked concepts, and sameAs graph nodes from a page's content and structured data. Combines body-text NER with JSON-LD @type / sameAs walking.
Read-only when given url (one HTTP GET). Zero network when given text.
Primary path: MCP sampling - the host LLM does the NER and returns typed entities with sameAs URIs. Fallback path: deterministic regex-based extractor when sampling is unavailable. The result includes mode: "sampling" | "regex_fallback" so callers can tell which path ran.
When to use: building an entity map for schema generation, or auditing whether a page's entities match its target topic. To validate the JSON-LD itself, use audit_schema.
Either url or text must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL to fetch and analyze. Either this OR `text` is required. | |
| text | No | Raw text/HTML to analyze directly. Either this OR `url` is required. | |
| render | No | Rendering mode for `url`. `static` (default) reads raw HTML. `headless` runs Playwright Chromium to capture JS-rendered content (adds 3-10s; requires `playwright-core` + `npx playwright install chromium`). Ignored when `text` is used. | static |
| respect_robots | No | If true (default), respect robots.txt when fetching `url`. Ignored when `text` is used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| entities | Yes | |
| findings | Yes | |
| entity_count | Yes | |
| citation_density_score | Yes | |
| connected_entity_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses traits beyond annotations: read-only vs zero-network depending on input mode, the sampling-primary/regex-fallback dual execution path, and the mode field in the result so callers know which path ran. Annotations cover safety hints but not the sampling/fallback behavior or network semantics per input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and mechanism, then structured into behavioral, when-to-use, and constraint paragraphs. Slightly dense with parenthetical asides but every sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, it needn't explain return values, yet it still flags the mode field callers rely on. Network behavior, sampling vs fallback, alternatives, and the input constraint are all covered, making it complete for a 4-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, text, render, and respect_robots fully including defaults, enum values, and headless timing. The description reinforces the url-or-text rule but adds no parameter detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (extract) and resources (named entities, linked concepts, sameAs graph nodes) plus the two input sources. Explicitly distinguishes itself from sibling audit_schema by naming it and describing the different scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete when-to-use cases (building entity maps for schema generation, auditing entity-topic match) and names the alternative tool for a related-but-different job (audit_schema). Also states the url-vs-text selection rule and the input requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
llms_txt_generateGenerate llms.txtARead-onlyIdempotentInspect
Generate a spec-compliant llms.txt (and optionally llms-full.txt) for a domain by reading its sitemap, sampling up to max_pages pages, and synthesizing a grouped, sectioned summary.
Read-only. Issues one HTTP GET for the sitemap then one per sampled page.
Deterministic; no LLM. Output is the file content as a string - this tool does NOT write to disk or upload anywhere. The caller is responsible for hosting the resulting file at https://<domain>/llms.txt.
When to use: bootstrapping llms.txt for a site you own. To check an existing llms.txt, use llms_txt_validate instead.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Hostname or origin to generate llms.txt for. Examples: `example.com`, `https://example.com`. The tool reads the domain's sitemap, fetches up to `max_pages` of them, and synthesizes a spec-compliant llms.txt grouped by section. Issues N+1 HTTP GETs: one for the sitemap, then one per sampled page. Read-only. | |
| max_pages | No | How many pages to sample from the sitemap when building section groupings. Default 30. Each page is fetched (one HTTP GET per page) - keep this low for large sites or rate-limited hosts. | |
| site_name | No | Override the site name used in the generated llms.txt header. If omitted, inferred from the homepage's <title> tag. | |
| include_full | No | If true, also generate llms-full.txt (the expanded variant containing full page text, not just URLs and titles). Default false. The llms-full.txt output can be large; only enable when you actually plan to host both files. | |
| site_description | No | Override the site description used in the generated llms.txt header. If omitted, inferred from the homepage's meta description. |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| llms_txt | Yes | The generated llms.txt file content. Caller is responsible for hosting it. |
| llms_full_txt | No | The generated llms-full.txt content. Null unless include_full=true. |
| pages_indexed | Yes | Number of pages successfully sampled from the sitemap. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds behavioral details beyond annotations: 'Read-only', 'Issues one HTTP GET for the sitemap then one per sampled page', 'Deterministic; no LLM', 'does NOT write to disk or upload anywhere'. No contradiction with annotations (readOnlyHint=true, idempotentHint=true).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise, well-structured, and front-loaded with the main action. Every sentence adds value; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given complexity and presence of output schema, the description fully explains the tool's operation, output format, and caller responsibilities. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds meaningful context beyond the schema, e.g., explaining the number of HTTP GETs per page and recommending low max_pages for large sites.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates a spec-compliant llms.txt for a domain by reading its sitemap, sampling pages, and synthesizing a summary. It distinguishes itself from the sibling tool llms_txt_validate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('bootstrapping llms.txt for a site you own') and when not ('to check an existing llms.txt, use llms_txt_validate instead').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
llms_txt_validateValidate llms.txtARead-onlyIdempotentInspect
Validate an existing llms.txt or llms-full.txt against the spec: structure, section ordering, link format, and (optionally) broken-link detection.
Read-only. One HTTP GET when given url; zero network when given content. Optional link-check issues HEAD requests against each link if check_links is true.
Deterministic; no LLM.
When to use: auditing an llms.txt you already have. To generate one from scratch, use llms_txt_generate.
Either url or content must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL of an existing llms.txt or llms-full.txt to validate (e.g. `https://example.com/llms.txt`). Either this OR `content` is required. | |
| content | No | Raw llms.txt content as a string. Use this to validate a file offline without fetching. Either this OR `url` is required. | |
| check_links | No | If true (default), HEAD each linked URL to detect broken links. Set false to skip link checks for faster, network-light validation of just the structural rules. |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes | |
| findings | Yes | |
| links_total | Yes | |
| links_broken | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/idempotent/openWorld, but the description adds the actual cost model: one HTTP GET when given url, zero network when given content, HEAD requests per link when check_links is true, and explicitly 'no LLM'. This is exactly the kind of context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, each front-loaded with its topic (what it validates, network behavior, when to use). No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers validation scope, network/auth implications, determinism, sibling routing, and the parameter constraint. With an output schema present, return values need not be explained. Nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description adds the mutual-exclusivity rule ('Either url or content must be provided') and confirms the network-side effect of check_links beyond what the schema's own description states. Marginal value, but real.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (llms.txt or llms-full.txt), and enumerates exactly what dimensions are checked: structure, section ordering, link format, broken links. It also explicitly distinguishes itself from the sibling llms_txt_generate by naming that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use: auditing an llms.txt you already have' plus a routing rule to the alternative ('To generate one from scratch, use llms_txt_generate'). No inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pricing_generateGenerate pricing.mdARead-onlyIdempotentInspect
Generate a machine-readable /pricing.md for AI shopping/agent flows. Finds the site's pricing page (or uses pricing_url), extracts named tiers and price lines, and returns the file content as a string.
Read-only. Issues a few HTTP GETs probing common pricing paths. Deterministic; no LLM. Does NOT write or upload — the caller hosts the file at https://<domain>/pricing.md.
When to use: a SaaS/e-commerce site that wants agents to read pricing without parsing a JS-rendered table. Falls back to a fill-in template when no prices are detectable.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Hostname or origin to generate pricing.md for, e.g. `example.com`. The tool finds the pricing page (or uses `pricing_url`), extracts tiers and prices, and returns a machine-readable pricing.md string. Read-only. | |
| pricing_url | No | Explicit pricing page URL. If omitted, the tool probes common paths (/pricing, /plans, /pricing/). |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| pricing_md | Yes | The generated pricing.md content. Caller hosts it at /pricing.md. |
| source_url | Yes | The pricing page the content was derived from (null when none was found). |
| suggested_path | Yes | |
| tiers_detected | Yes | Number of pricing tiers extracted. |
| validation_issues | Yes | Issues encountered while deriving the file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. Description adds behavioral details: read-only, HTTP GETs, deterministic, no LLM, no write/upload. This is valuable context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each purposeful: purpose, behavior details, usage context. No wasted words, well-structured, and front-loaded with primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two parameters and clear annotations, description is complete. Covers what, how, when, and fallback. Output schema exists but not shown; description clarifies return format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. Description adds meaning by explaining automatic detection of pricing page, return type (string), and fallback template. Provides significant added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool generates a machine-readable /pricing.md file for AI shopping/agent flows. It specifies the verb 'generate', resource 'pricing.md', and distinguishes from sibling audit/score tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: SaaS/e-commerce sites needing agent-readable pricing. Mentions fallback behavior when no prices are detectable. Could improve by naming alternative tools, but overall clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_saveSave audit report to diskADestructiveIdempotentInspect
Render an audit_page or audit_site result as a Markdown report and write it to a file under MCP_WORKSPACE_ROOT (defaults to cwd).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Target file path. May be relative to MCP_WORKSPACE_ROOT (or cwd if unset). Paths that escape the workspace root are rejected. | |
| overwrite | No | If true (default), overwrite an existing file. If false, the write fails when the target already exists. | |
| audit_result | No | The return value of `audit_page` or `audit_site`. Pass the structured result verbatim - the tool detects which shape it is and renders the matching Markdown report. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | Yes | Which input shape the report was rendered for. |
| saved_to | Yes | Absolute path of the file that was written. |
| bytes_written | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true. The description adds context about file path restrictions (escapes rejected) and automatic detection of audit result shape. This is useful but not extensive; the core behavioral insight (writes to disk) is already conveyed by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the action and outcome. Every word is necessary; no fluff. Perfectly concise for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the three parameters, high schema coverage, and presence of an output schema, the description covers all key aspects: what it does, input requirements (audit_result shape), file path constraints, and overwrite behavior. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining that audit_result should be passed verbatim and that the tool auto-detects its shape. For path, it reiterates the relative-to-root and rejection behavior. This raises the score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it renders an audit_page or audit_site result as Markdown and writes to a file under MCP_WORKSPACE_ROOT. The verb 'Save' and resource 'audit report to disk' are specific and unambiguous. Among siblings, only this tool performs file I/O, so it's well-distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates the tool is used after running audit_page or audit_site, providing clear context. It does not explicitly state when not to use it or mention alternatives, but the sibling tools are all read-only or analysis-focused, making this the sole write operation. A slight nudge toward exclusivity would push this to 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rewrite_aeoRewrite for Answer Engine OptimizationARead-onlyInspect
Rewrite a content block for Answer Engine Optimization. Adds a BLUF opening, FAQ structure, schema additions, and concise question-shaped headings tuned for ChatGPT / Perplexity / Google AI Overviews.
Read-only when given url (one HTTP GET). Zero network when given text. The tool does NOT write back to the URL - it only returns the rewritten content as a string. No side effects on the source.
This tool delegates the actual rewrite to the calling LLM via MCP sampling - it does not call any external API itself. The MCP host's model produces the rewrite. Same input may produce different output across runs (model-dependent).
When to use: optimizing content for direct-answer surfaces (definitions, how-tos, FAQs). For Generative Engine Optimization (entity-rich, comparison-ready synthesis), use rewrite_geo instead.
Either url or text must be provided. target_query is required.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL whose content should be fetched and rewritten. Either this OR `text` is required. | |
| text | No | Raw content (markdown or HTML) to rewrite directly. Either this OR `url` is required. | |
| format | No | Output shape. `article` for prose-with-headings. `faq` for Q&A list. `howto` for numbered-step procedural content with HowTo schema hints. `comparison` for X-vs-Y tables. Default `article`. | article |
| max_words | No | Soft word budget for the rewrite. Default 1500. Range 100-5000. The rewrite tries to stay under this; very small budgets may force truncation. | |
| target_query | Yes | The user query the rewrite should answer (e.g. `what is RAG`, `how to deploy Ghost to Docker`). Required - drives heading shape and BLUF wording. | |
| respect_robots | No | If true (default), respect robots.txt when fetching `url`. Ignored when `text` is used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| after_score | Yes | |
| before_score | Yes | |
| changes_made | Yes | |
| rewritten_text | Yes | |
| schema_additions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that the url path performs exactly one HTTP GET, that the text path makes zero network calls, that nothing is written back to the source, and that the rewrite is delegated to the calling LLM via MCP sampling so output is non-deterministic across runs. The idempotentHint=false annotation is now explained rather than merely asserted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and mechanism are front-loaded, then network behavior, then routing guidance, then input constraints - a sensible order. Every sentence carries information, though the network/side-effect paragraph is slightly repetitive ('does NOT write back', 'No side effects on the source').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, open-world rewrite tool with an output schema present, the description covers what an agent needs: transformation scope, network/side-effect profile, non-determinism, input requirements, and sibling routing. Return-value explanation is correctly omitted since the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a genuine cross-parameter constraint the schema does not encode: 'Either `url` or `text` must be provided' (required is only `target_query`). It also confirms target_query drives heading shape and BLUF wording, which explains why it is required rather than just restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Rewrite a content block for Answer Engine Optimization') and immediately enumerates the concrete transformations (BLUF opening, FAQ structure, schema additions, question-shaped headings). It also names the sibling it is not (`rewrite_geo`), so an agent can separate the two rewrite tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit when-to-use clause ('optimizing content for direct-answer surfaces (definitions, how-tos, FAQs)') plus an explicit alternative with its own selection condition ('For Generative Engine Optimization ... use `rewrite_geo` instead'). Input prerequisites are also stated ('Either `url` or `text` must be provided. `target_query` is required').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rewrite_geoRewrite for Generative Engine OptimizationARead-onlyInspect
Rewrite a content block for Generative Engine Optimization: entity-rich, comparison-ready, synthesis-friendly. Tuned for surfaces that summarize across sources (Perplexity, Google AI Mode, Claude search).
Read-only on input. Does NOT write back to the source URL - returns the rewritten content as a string.
This tool delegates the actual rewrite to the calling LLM via MCP sampling - it does not call any external API itself. The MCP host's model produces the rewrite. Output may vary across runs (model-dependent).
When to use: optimizing for synthesis-style answers across multiple sources. For direct-answer (BLUF + FAQ) optimization on a single page, use rewrite_aeo instead.
Either url or text must be provided. target_query is required.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL whose content should be fetched and rewritten. Either this OR `text` is required. | |
| text | No | Raw content to rewrite directly. Either this OR `url` is required. | |
| max_words | No | Soft word budget. Default 1500. Range 100-5000. | |
| target_query | Yes | The user query the rewrite should answer. Required - drives entity selection and comparison framing. | |
| respect_robots | No | If true (default), respect robots.txt when fetching `url`. Ignored when `text` is used. | |
| add_comparison_table | No | If true, inject an explicit X-vs-Y comparison table into the rewrite (useful for `X vs Y` queries). Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| after_score | Yes | |
| before_score | Yes | |
| changes_made | Yes | |
| rewritten_text | Yes | |
| schema_additions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=false and openWorldHint=true; the description goes further by disclosing that no write-back occurs, that the rewrite is delegated to the host LLM via MCP sampling rather than an external API, and that output varies across runs. These are behavioral facts the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does, then the read-only/no-write-back guarantee, then the non-obvious sampling behavior, then usage guidance. Mostly tight, though the sampling/determinism paragraph could be compressed into fewer words without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return-value explanation is unnecessary; the description instead covers the non-obvious execution model (host LLM sampling), determinism caveat, read-only semantics, and sibling routing. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (url, text, max_words, target_query, respect_robots, add_comparison_table) are already documented in the schema. The description only restates the either/or url-vs-text rule and target_query requirement, adding no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (rewrite) and resource (content block) plus the optimization target (GEO), and explicitly names the sibling it is not (`rewrite_aeo`). An agent can distinguish it from the AEO variant without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'When to use' clause tied to synthesis-style optimization and routes the agent to `rewrite_aeo` for direct-answer/BLUF+FAQ optimization. The alternative and the condition selecting it are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_agentic_browsingScore Agentic Browsing readinessARead-onlyIdempotentInspect
Score a page against the four signals Google added to the Lighthouse "Agentic Browsing" category in May 2026: presence of an llms.txt, WebMCP integration, accessibility-tree integrity, and layout stability. Returns an overall 0-100 score, a letter grade, and a per-factor breakdown.
Read-only. One HTTP GET for the page plus one for /llms.txt (skip with check_llms_txt=false). Pass html instead of url to score markup offline (llms.txt is then treated as absent).
Deterministic, rule-based heuristics over the fetched HTML; no LLM and no headless render required. This approximates Lighthouse's runtime signals from static markup - it does not execute Lighthouse.
When to use: checking whether a site is ready for AI agents / agentic browsers, or tracking the new Lighthouse Agentic Browsing category. For citation-eligibility of content, use score_citation_worthiness; for a full page audit, use audit_page.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL to fetch and score. Either this OR `html` is required. | |
| html | No | Raw HTML to score offline without fetching. Either this OR `url` is required. llms.txt is treated as absent in this mode. | |
| render | No | Rendering mode for `url`. `static` (default) reads raw HTML; `headless` runs Playwright Chromium (adds 3-10s; requires `playwright-core`). Ignored when `html` is used. | static |
| check_llms_txt | No | If true (default), probe /llms.txt for the host to score the llms.txt factor. Set false to skip that extra HTTP GET. | |
| respect_robots | No | If true (default), respect robots.txt when fetching `url`. Ignored when `html` is used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The URL scored (null when scoring raw html). |
| grade | Yes | Letter grade derived from the numeric score. |
| score | Yes | Weighted 0-100 Agentic Browsing score (accessibility 40%, layout 35%, webmcp 15%, llms.txt 10%). |
| factors | Yes | The four Lighthouse Agentic Browsing signals, scored 0-100 each. |
| findings | Yes | |
| fetched_at | Yes | UTC ISO-8601 timestamp. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and no destruction. The description adds significant behavioral context: 'Read-only. One HTTP GET for the page plus one for /llms.txt... Deterministic, rule-based heuristics... no LLM and no headless render required.' It also clarifies limitations (approximates Lighthouse, does not execute it). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It opens with a clear purpose statement, then provides detailed behavior, parameter guidance, and usage context. Every sentence adds value with no redundancy. The final paragraph succinctly covers when to use and alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, output schema exists), the description covers all necessary aspects: purpose, behavioral details, parameter semantics, usage guidelines, and sibling differentiation. The existence of an output schema means return values need not be detailed. The description is fully satisfactory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value beyond schema by explaining parameter interactions, e.g., 'Pass html instead of url to score markup offline (llms.txt is then treated as absent)' and 'Set false to skip that extra HTTP GET' for check_llms_txt. This contextual guidance elevates it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Score a page against the four signals Google added to the Lighthouse Agentic Browsing category.' It specifies the verb (score), resource (page), and the specific signals. It distinguishes from siblings by directly naming alternatives like score_citation_worthiness and audit_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides usage guidance: 'When to use: checking whether a site is ready for AI agents / agentic browsers, or tracking the new Lighthouse Agentic Browsing category.' It also lists alternative tools for different tasks, clearly defining when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_ai_overview_eligibilityScore AI Overview eligibilityARead-onlyIdempotentInspect
Score a page's probability of appearing in Google AI Overviews. Returns an overall 0-100 score plus six factor subscores: semantic completeness, structured data, E-E-A-T signals, entity density, freshness, and technical hygiene.
Read-only. One HTTP GET.
Deterministic, rule-based scoring derived from published 2025-2026 AI-Overview correlation studies. No LLM calls. Same URL returns the same score on repeated runs.
When to use: AI-Overview-specific prioritization. For a multi-dimensional audit that includes this scoring plus everything else, use audit_page. For citation-worthiness of a specific text passage (rather than a URL ranking probability), use score_citation_worthiness.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL to score. The tool fetches the URL once and runs deterministic, rule-based scoring across six factors (semantic completeness, structured data, E-E-A-T signals, entity density, freshness, technical hygiene) using published 2025-2026 correlation studies. No LLM calls. Read-only HTTP GET. | |
| respect_robots | No | If true (default), respect robots.txt before fetching. Set false only for auditing your own site where you've intentionally blocked crawlers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| factors | Yes | |
| findings | Yes | |
| top_improvements | Yes | |
| overall_eligibility_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, open-world, idempotent, non-destructive behavior. The description adds meaningful context beyond annotations: one HTTP GET, deterministic rule-based scoring from published 2025-2026 studies, no LLM calls, and identical results for the same URL on repeated runs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and return format, then concisely states read-only behavior and deterministic scoring. It closes with explicit usage routing, with no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, full parameter coverage, annotations, and presence of an output schema, the description provides everything an agent needs to select and invoke it correctly. The return-value summary is extra but not harmful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well documented in the input schema. The description does not add parameter-specific meaning beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: score a page's probability of appearing in Google AI Overviews. It also distinguishes itself from siblings by naming `audit_page` and `score_citation_worthiness` with the conditions that select them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: AI-Overview-specific prioritization. It also routes to two alternatives with clear conditions: `audit_page` for a broader audit including this scoring, and `score_citation_worthiness` for text passage citation-worthiness rather than URL ranking probability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_citation_worthinessScore AI citation worthinessARead-onlyIdempotentInspect
Score how citable a page or text block is for AI engines (ChatGPT, Claude, Perplexity, Google AI Overviews). Evaluates BLUF (bottom-line-up-front) opening, FAQ patterns, statistic density, entity clarity, and answer-shape fit for the optional target_query.
Also returns extractability_score plus per-section chunk_analysis: how cleanly an LLM can lift a self-contained answer from each heading-delimited section (length band, lead-sentence directness, anaphora, concrete anchors). This is the GEO mechanic - it pinpoints the exact sections to tighten, with most_extractable / least_extractable called out.
Read-only when given url (one HTTP GET). Zero network when given text. No writes.
Deterministic, rule-based; no LLM calls. Returns reproducible scores.
When to use: pre-publish content QA, or to triage which existing pages are worth optimizing for AI citation first. Distinct from score_ai_overview_eligibility which scores Google-AI-Overview ranking probability for a URL; this scores the inherent citability of a text passage regardless of host.
Either url or text must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL to fetch and score. Either this OR `text` is required. | |
| text | No | Raw text/markdown/HTML to score directly without fetching. Either this OR `url` is required. | |
| target_query | No | Optional target search query the content is supposed to answer (e.g. `how to fix CORS errors in Next.js`). When provided, scoring weights answer-shape fit and query-term coverage. Omit if you want a query-agnostic citability score. | |
| respect_robots | No | If true (default), respect robots.txt when fetching `url`. Ignored when `text` is used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| findings | Yes | |
| sub_scores | Yes | |
| improvements | Yes | |
| engine_scores | Yes | |
| overall_score | Yes | |
| chunk_analysis | Yes | |
| most_extractable | Yes | |
| least_extractable | Yes | |
| extractability_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive and open-world, so the safety bar is covered. The description still adds genuine value beyond them: the network profile is parameter-contingent ('one HTTP GET' with url, 'zero network' with text) and it states the engine is deterministic and rule-based with no LLM calls, yielding reproducible scores.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then progressively details the mechanic (chunk_analysis), runtime behavior, and routing. Every sentence carries information, though the section list and the extractability paragraph are dense enough to nudge past ideal brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still orients the agent by naming the returned fields (extractability_score, per-section chunk_analysis, most_extractable/least_extractable). With the url/text requirement, usage scenarios, and sibling differentiation all present, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description nonetheless sharpens parameter meaning: `text` is characterized as the zero-network path, `url` as the one-GET path, and `target_query` is the query that reweights answer-shape fit. Only `respect_robots` goes unmentioned in prose, keeping this just short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Score how citable a page or text block is for AI engines') and enumerates the exact dimensions scored (BLUF, FAQ patterns, statistic density, entity clarity, answer-shape fit). It explicitly names the sibling it is not, `score_ai_overview_eligibility`, and differentiates on host-independence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use scenarios ('pre-publish content QA, or to triage which existing pages are worth optimizing for AI citation first') and an explicit alternative with the selecting condition ('this scores the inherent citability of a text passage regardless of host').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_test_citationTest whether an AI engine would cite this pageARead-onlyInspect
Simulate would an AI engine cite this page for this query?. The host LLM role-plays the chosen engine (chatgpt / claude / perplexity / google_ai_overviews / any), reads the page content, and returns a cite/no-cite verdict with the verbatim excerpt it would surface plus ranked improvements.
Read-only when given url (one HTTP GET). Zero network when given text.
Primary path uses MCP sampling. If the host doesn't support sampling, falls back to a deterministic heuristic derived from score_citation_worthiness (overall_score + per-engine subscore must both clear thresholds). The result includes mode: "sampling" | "static_heuristic" so callers can tell which path ran.
When to use: pre-publish gut-check for a specific query, or auditing whether existing content earns citation surface. Distinct from score_citation_worthiness (deterministic 0-100 score) and audit_page (whole-page rubric); this returns a binary cite/no-cite verdict tied to one query.
Either url or text must be provided. target_query is required.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL to fetch and test. Either this OR `text` is required. | |
| text | No | Raw text/HTML to test directly. Either this OR `url` is required. | |
| engine | No | Which engine to simulate. `any` (default) uses a generic AI-search persona. Specific engines tune the cite criteria (e.g. perplexity favors statistic-dense excerpts; google_ai_overviews favors schema + freshness). | any |
| target_query | Yes | The user query the engine is answering. Required. Example: `how to add JSON-LD to a Next.js app`. | |
| respect_robots | No | If true (default), respect robots.txt when fetching `url`. Ignored when `text` is used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | Which code path produced the result: MCP sampling (host LLM) or deterministic heuristic fallback. |
| engine | Yes | Which engine persona produced the verdict. |
| reasoning | Yes | Plain-language explanation of the verdict. |
| confidence | Yes | How likely a real engine is to surface this page (0-100). |
| would_cite | Yes | Binary verdict: would the simulated engine cite this page for the query? |
| improvements | Yes | Ranked, specific edits to improve citation probability. |
| target_query | Yes | The query the engine simulation answered. |
| blocking_issues | Yes | Concrete reasons the page is (or is not) citable. Empty if would_cite=true and excerpt is clearly attributable. |
| citation_excerpt | Yes | If would_cite=true, the 20-60 word verbatim excerpt the engine would surface; otherwise null. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses read-only nature (one HTTP GET for url, zero network for text), the fallback to heuristic if sampling is unsupported, and the mode indicator in results. Adds significant value beyond annotations by explaining the dual execution paths.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with front-loaded main purpose. Every sentence adds value, covering fallback, usage, and parameters. Could be slightly shorter, but not wasteful. Good balance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the simulation logic, fallback mechanism, engine simulation, and output contents (verdict, excerpt, improvements, mode). With an existing output schema, this is fully complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning by explaining engine-specific tuning (e.g., perplexity favors statistic-dense excerpts), the mutual exclusivity of url and text, and the effect of respect_robots. This justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it simulates whether an AI engine would cite a page, returning a cite/no-cite verdict with an excerpt and improvements. It distinguishes from sibling tools like score_citation_worthiness and audit_page by specifying the binary verdict tied to a single query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: pre-publish gut-check for a specific query or auditing citation surface. Also implies when not to use by contrasting with deterministic scoring and whole-page rubric. Provides clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
- Changed
audit_canonical27 fields changed- removed
Output schema / properties / canonicalRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / canonical_og_url_matchAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / canonical_valueAdded value: +{ + "type": [ + "null", + "string" + ] +} - removed
Output schema / properties / cross_domainRemoved value: -{ - "description": "Whether the canonical points to a different domain.", - "type": "boolean" -} - removed
Output schema / properties / fetched_atRemoved value: -{ - "type": "string" -} - added
Output schema / properties / final_urlAdded value: +{ + "type": "string" +} - removed
Output schema / properties / findings / items / properties / category / descriptionRemoved value: -"Finding category - which AI-SEO dimension it relates to." - added
Output schema / properties / findings / items / properties / estimated_impact / anyOfAdded value: +[ + { + "not": {} + }, + { + "const": "high", + "type": "string" + }, + { + "const": "medium", + "type": "string" + }, + { + "const": "low", + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / estimated_impact / descriptionRemoved value: -"Estimated impact on AI citation probability when resolved." - removed
Output schema / properties / findings / items / properties / estimated_impact / enumRemoved value: -[ - "high", - "medium", - "low" -] - removed
Output schema / properties / findings / items / properties / estimated_impact / typeRemoved value: -"string" - added
Output schema / properties / findings / items / properties / failure_signal / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / failure_signal / descriptionRemoved value: -"Falsifiability: the observable signal that would prove the fix did NOT work." - removed
Output schema / properties / findings / items / properties / failure_signal / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / fix / descriptionRemoved value: -"Concrete, copy-pasteable fix." - added
Output schema / properties / findings / items / properties / leading_indicator / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / leading_indicator / descriptionRemoved value: -"Falsifiability: the leading indicator to monitor to confirm the fix is landing." - removed
Output schema / properties / findings / items / properties / leading_indicator / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / message / descriptionRemoved value: -"Human-readable description of the issue." - removed
Output schema / properties / findings / items / properties / severity / descriptionRemoved value: -"Triage priority: critical blocks AI citation, warning hurts probability, info is nice-to-have." - removed
Output schema / properties / findings / items / properties / where / descriptionRemoved value: -"Location of the issue (CSS selector, JSON-LD path, robots.txt line, or 'page-level')." - added
Output schema / properties / is_cross_domainAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / is_self_referentialAdded value: +{ + "type": "boolean" +} - removed
Output schema / properties / og_urlRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / self_referencingRemoved value: -{ - "description": "Whether the canonical points to the audited URL.", - "type": "boolean" -} - added
Output schema / properties / trailing_slash_consistentAdded value: +{ + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "url", - "fetched_at", - "canonical", - "og_url", - "self_referencing", - "cross_domain", - "findings" -]New value: +[ + "url", + "final_url", + "canonical_value", + "is_self_referential", + "is_cross_domain", + "trailing_slash_consistent", + "canonical_og_url_match", + "findings" +]
- Changed
audit_schema22 fields changed- removed
Output schema / properties / ai_citation_readiness_score / descriptionRemoved value: -"0-100 score for the JSON-LD's AI-citation readiness." - removed
Output schema / properties / fetched_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / findings / items / properties / category / descriptionRemoved value: -"Finding category - which AI-SEO dimension it relates to." - added
Output schema / properties / findings / items / properties / estimated_impact / anyOfAdded value: +[ + { + "not": {} + }, + { + "const": "high", + "type": "string" + }, + { + "const": "medium", + "type": "string" + }, + { + "const": "low", + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / estimated_impact / descriptionRemoved value: -"Estimated impact on AI citation probability when resolved." - removed
Output schema / properties / findings / items / properties / estimated_impact / enumRemoved value: -[ - "high", - "medium", - "low" -] - removed
Output schema / properties / findings / items / properties / estimated_impact / typeRemoved value: -"string" - added
Output schema / properties / findings / items / properties / failure_signal / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / failure_signal / descriptionRemoved value: -"Falsifiability: the observable signal that would prove the fix did NOT work." - removed
Output schema / properties / findings / items / properties / failure_signal / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / fix / descriptionRemoved value: -"Concrete, copy-pasteable fix." - added
Output schema / properties / findings / items / properties / leading_indicator / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / leading_indicator / descriptionRemoved value: -"Falsifiability: the leading indicator to monitor to confirm the fix is landing." - removed
Output schema / properties / findings / items / properties / leading_indicator / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / message / descriptionRemoved value: -"Human-readable description of the issue." - removed
Output schema / properties / findings / items / properties / severity / descriptionRemoved value: -"Triage priority: critical blocks AI citation, warning hurts probability, info is nice-to-have." - removed
Output schema / properties / findings / items / properties / where / descriptionRemoved value: -"Location of the issue (CSS selector, JSON-LD path, robots.txt line, or 'page-level')." - removed
Output schema / properties / found_types / descriptionRemoved value: -"Schema.org @type values discovered across all JSON-LD blocks." - added
Output schema / properties / missing_priority_typesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Output schema / properties / source / descriptionRemoved value: -"Where the JSON-LD came from." - removed
Output schema / properties / urlRemoved value: -{ - "description": "Source URL (null when source=inline).", - "type": [ - "string", - "null" - ] -} - changed
Output schema / requiredPrevious value: -[ - "source", - "url", - "fetched_at", - "found_types", - "ai_citation_readiness_score", - "findings" -]New value: +[ + "source", + "found_types", + "missing_priority_types", + "findings", + "ai_citation_readiness_score" +]
- Changed
check_sitemap27 fields changed- removed
Output schema / properties / domainRemoved value: -{ - "description": "The hostname the sitemap was checked for.", - "type": "string" -} - removed
Output schema / properties / fetched_atRemoved value: -{ - "description": "UTC ISO-8601 timestamp of the check.", - "type": "string" -} - removed
Output schema / properties / findings / items / properties / category / descriptionRemoved value: -"Finding category - which AI-SEO dimension it relates to." - added
Output schema / properties / findings / items / properties / estimated_impact / anyOfAdded value: +[ + { + "not": {} + }, + { + "const": "high", + "type": "string" + }, + { + "const": "medium", + "type": "string" + }, + { + "const": "low", + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / estimated_impact / descriptionRemoved value: -"Estimated impact on AI citation probability when resolved." - removed
Output schema / properties / findings / items / properties / estimated_impact / enumRemoved value: -[ - "high", - "medium", - "low" -] - removed
Output schema / properties / findings / items / properties / estimated_impact / typeRemoved value: -"string" - added
Output schema / properties / findings / items / properties / failure_signal / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / failure_signal / descriptionRemoved value: -"Falsifiability: the observable signal that would prove the fix did NOT work." - removed
Output schema / properties / findings / items / properties / failure_signal / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / fix / descriptionRemoved value: -"Concrete, copy-pasteable fix." - added
Output schema / properties / findings / items / properties / leading_indicator / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / leading_indicator / descriptionRemoved value: -"Falsifiability: the leading indicator to monitor to confirm the fix is landing." - removed
Output schema / properties / findings / items / properties / leading_indicator / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / message / descriptionRemoved value: -"Human-readable description of the issue." - removed
Output schema / properties / findings / items / properties / severity / descriptionRemoved value: -"Triage priority: critical blocks AI citation, warning hurts probability, info is nice-to-have." - removed
Output schema / properties / findings / items / properties / where / descriptionRemoved value: -"Location of the issue (CSS selector, JSON-LD path, robots.txt line, or 'page-level')." - added
Output schema / properties / has_image_sitemapAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / has_video_sitemapAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / sitemap_indexAdded value: +{ + "type": "boolean" +} - removed
Output schema / properties / sitemap_url / descriptionRemoved value: -"Resolved sitemap URL (null when status != found)." - changed
Output schema / properties / sitemap_url / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - added
Output schema / properties / stale_urlsAdded value: +{ + "type": "number" +} - removed
Output schema / properties / status / descriptionRemoved value: -"Outcome of the sitemap lookup." - removed
Output schema / properties / total_urls / descriptionRemoved value: -"Total URLs declared across the sitemap (and indexed children)." - removed
Output schema / properties / urls_with_lastmod / descriptionRemoved value: -"Count of URLs that carry a lastmod attribute." - changed
Output schema / requiredPrevious value: -[ - "domain", - "fetched_at", - "status", - "sitemap_url", - "total_urls", - "urls_with_lastmod", - "findings" -]New value: +[ + "sitemap_url", + "status", + "total_urls", + "urls_with_lastmod", + "stale_urls", + "has_image_sitemap", + "has_video_sitemap", + "sitemap_index", + "findings" +]
- Changed
check_technical35 fields changed- added
Output schema / properties / canonical / additionalPropertiesAdded value: +false - removed
Output schema / properties / canonical / descriptionRemoved value: -"Canonical link href, if present." - added
Output schema / properties / canonical / propertiesAdded value: +{ + "cross_domain": { + "type": "boolean" + }, + "present": { + "type": "boolean" + }, + "self_referential": { + "type": "boolean" + }, + "value": { + "type": [ + "null", + "string" + ] + } +} - added
Output schema / properties / canonical / requiredAdded value: +[ + "present", + "value", + "self_referential", + "cross_domain" +] - changed
Output schema / properties / canonical / typePrevious value: -[ - "string", - "null" -]New value: +"object" - removed
Output schema / properties / fetched_atRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / findings / items / properties / category / descriptionRemoved value: -"Finding category - which AI-SEO dimension it relates to." - added
Output schema / properties / findings / items / properties / estimated_impact / anyOfAdded value: +[ + { + "not": {} + }, + { + "const": "high", + "type": "string" + }, + { + "const": "medium", + "type": "string" + }, + { + "const": "low", + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / estimated_impact / descriptionRemoved value: -"Estimated impact on AI citation probability when resolved." - removed
Output schema / properties / findings / items / properties / estimated_impact / enumRemoved value: -[ - "high", - "medium", - "low" -] - removed
Output schema / properties / findings / items / properties / estimated_impact / typeRemoved value: -"string" - added
Output schema / properties / findings / items / properties / failure_signal / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / failure_signal / descriptionRemoved value: -"Falsifiability: the observable signal that would prove the fix did NOT work." - removed
Output schema / properties / findings / items / properties / failure_signal / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / fix / descriptionRemoved value: -"Concrete, copy-pasteable fix." - added
Output schema / properties / findings / items / properties / leading_indicator / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / leading_indicator / descriptionRemoved value: -"Falsifiability: the leading indicator to monitor to confirm the fix is landing." - removed
Output schema / properties / findings / items / properties / leading_indicator / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / message / descriptionRemoved value: -"Human-readable description of the issue." - removed
Output schema / properties / findings / items / properties / severity / descriptionRemoved value: -"Triage priority: critical blocks AI citation, warning hurts probability, info is nice-to-have." - removed
Output schema / properties / findings / items / properties / where / descriptionRemoved value: -"Location of the issue (CSS selector, JSON-LD path, robots.txt line, or 'page-level')." - removed
Output schema / properties / h1Removed value: -{ - "description": "First H1 text.", - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / hreflangAdded value: +{ + "additionalProperties": false, + "properties": { + "count": { + "type": "number" + }, + "present": { + "type": "boolean" + }, + "x_default": { + "type": "boolean" + } + }, + "required": [ + "present", + "count", + "x_default" + ], + "type": "object" +} - removed
Output schema / properties / https / descriptionRemoved value: -"Whether the URL is served over HTTPS after redirects." - added
Output schema / properties / meta_descriptionAdded value: +{ + "additionalProperties": false, + "properties": { + "length": { + "type": "number" + }, + "present": { + "type": "boolean" + } + }, + "required": [ + "present", + "length" + ], + "type": "object" +} - added
Output schema / properties / mixed_contentAdded value: +{ + "additionalProperties": false, + "properties": { + "count": { + "type": "number" + }, + "samples": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "count", + "samples" + ], + "type": "object" +} - removed
Output schema / properties / noindex / descriptionRemoved value: -"Whether meta robots includes noindex." - added
Output schema / properties / noindex_headerAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / og_tagsAdded value: +{ + "additionalProperties": false, + "properties": { + "description": { + "type": "boolean" + }, + "image": { + "type": "boolean" + }, + "title": { + "type": "boolean" + }, + "type": { + "type": "boolean" + }, + "url": { + "type": "boolean" + } + }, + "required": [ + "title", + "description", + "image", + "url", + "type" + ], + "type": "object" +} - removed
Output schema / properties / og_urlRemoved value: -{ - "description": "OpenGraph og:url, if present.", - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / response_headersAdded value: +{ + "additionalProperties": false, + "properties": { + "cache_control": { + "type": [ + "null", + "string" + ] + }, + "content_security_policy": { + "type": [ + "null", + "string" + ] + }, + "hsts": { + "type": [ + "null", + "string" + ] + }, + "referrer_policy": { + "type": [ + "null", + "string" + ] + }, + "x_content_type_options": { + "type": [ + "null", + "string" + ] + } + }, + "required": [ + "hsts", + "x_content_type_options", + "referrer_policy", + "content_security_policy", + "cache_control" + ], + "type": "object" +} - removed
Output schema / properties / titleRemoved value: -{ - "description": "Page title text.", - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / title_og_matchAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / twitter_cardAdded value: +{ + "additionalProperties": false, + "properties": { + "card_type": { + "type": [ + "null", + "string" + ] + }, + "present": { + "type": "boolean" + } + }, + "required": [ + "present", + "card_type" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "url", - "fetched_at", - "https", - "canonical", - "og_url", - "noindex", - "title", - "h1", - "findings" -]New value: +[ + "url", + "https", + "canonical", + "noindex", + "noindex_header", + "og_tags", + "twitter_card", + "hreflang", + "title_og_match", + "meta_description", + "response_headers", + "mixed_content", + "findings" +]
- Changed
extract_entities13 fields changed- removed
Output schema / properties / citation_density_score / maximumRemoved value: -100 - removed
Output schema / properties / citation_density_score / minimumRemoved value: -0 - added
Output schema / properties / connected_entity_countAdded value: +{ + "type": "number" +} - removed
Output schema / properties / entities / items / properties / confidenceRemoved value: -{ - "type": "number" -} - added
Output schema / properties / entities / items / properties / is_definedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / entities / items / properties / mention_countAdded value: +{ + "type": "number" +} - changed
Output schema / properties / entities / items / properties / type / typePrevious value: -"string"New value: +[ + "null", + "string" +] - changed
Output schema / properties / entities / items / requiredPrevious value: -[ - "name" -]New value: +[ + "name", + "type", + "same_as", + "mention_count", + "is_defined" +] - added
Output schema / properties / findingsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "category": { + "enum": [ + "schema", + "robots", + "technical", + "freshness", + "structure", + "authority", + "presence", + "sitemap", + "llms_txt", + "citation", + "evidence", + "trust", + "entity", + "content" + ], + "type": "string" + }, + "estimated_impact": { + "anyOf": [ + { + "not": {} + }, + { + "const": "high", + "type": "string" + }, + { + "const": "medium", + "type": "string" + }, + { + "const": "low", + "type": "string" + } + ] + }, + "failure_signal": { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + "fix": { + "type": "string" + }, + "leading_indicator": { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "warning", + "info" + ], + "type": "string" + }, + "where": { + "type": "string" + } + }, + "required": [ + "severity", + "category", + "where", + "message", + "fix" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / modeAdded value: +{ + "enum": [ + "sampling", + "regex_fallback" + ], + "type": "string" +} - removed
Output schema / properties / sourceRemoved value: -{ - "enum": [ - "url", - "text" - ], - "type": "string" -} - removed
Output schema / properties / urlRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / requiredPrevious value: -[ - "source", - "url", - "entity_count", - "entities", - "citation_density_score" -]New value: +[ + "entities", + "entity_count", + "connected_entity_count", + "citation_density_score", + "findings", + "mode" +]
- Changed
llms_txt_validate21 fields changed- removed
Output schema / properties / findings / items / properties / category / descriptionRemoved value: -"Finding category - which AI-SEO dimension it relates to." - added
Output schema / properties / findings / items / properties / estimated_impact / anyOfAdded value: +[ + { + "not": {} + }, + { + "const": "high", + "type": "string" + }, + { + "const": "medium", + "type": "string" + }, + { + "const": "low", + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / estimated_impact / descriptionRemoved value: -"Estimated impact on AI citation probability when resolved." - removed
Output schema / properties / findings / items / properties / estimated_impact / enumRemoved value: -[ - "high", - "medium", - "low" -] - removed
Output schema / properties / findings / items / properties / estimated_impact / typeRemoved value: -"string" - added
Output schema / properties / findings / items / properties / failure_signal / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / failure_signal / descriptionRemoved value: -"Falsifiability: the observable signal that would prove the fix did NOT work." - removed
Output schema / properties / findings / items / properties / failure_signal / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / fix / descriptionRemoved value: -"Concrete, copy-pasteable fix." - added
Output schema / properties / findings / items / properties / leading_indicator / anyOfAdded value: +[ + { + "not": {} + }, + { + "type": "string" + } +] - removed
Output schema / properties / findings / items / properties / leading_indicator / descriptionRemoved value: -"Falsifiability: the leading indicator to monitor to confirm the fix is landing." - removed
Output schema / properties / findings / items / properties / leading_indicator / typeRemoved value: -"string" - removed
Output schema / properties / findings / items / properties / message / descriptionRemoved value: -"Human-readable description of the issue." - removed
Output schema / properties / findings / items / properties / severity / descriptionRemoved value: -"Triage priority: critical blocks AI citation, warning hurts probability, info is nice-to-have." - removed
Output schema / properties / findings / items / properties / where / descriptionRemoved value: -"Location of the issue (CSS selector, JSON-LD path, robots.txt line, or 'page-level')." - added
Output schema / properties / links_brokenAdded value: +{ + "type": "number" +} - added
Output schema / properties / links_totalAdded value: +{ + "type": "number" +} - removed
Output schema / properties / sourceRemoved value: -{ - "enum": [ - "url", - "content" - ], - "type": "string" -} - removed
Output schema / properties / urlRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / valid / descriptionRemoved value: -"Whether the file passes structural and link rules." - changed
Output schema / requiredPrevious value: -[ - "source", - "url", - "valid", - "findings" -]New value: +[ + "valid", + "links_total", + "links_broken", + "findings" +]
- Changed
rewrite_aeo13 fields changed- added
Output schema / properties / after_scoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / before_scoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / changes_madeAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Output schema / properties / formatRemoved value: -{ - "description": "Output format (article, faq, howto, comparison).", - "type": "string" -} - added
Output schema / properties / modeAdded value: +{ + "enum": [ + "sampling", + "prompt_template" + ], + "type": "string" +} - removed
Output schema / properties / notesRemoved value: -{ - "description": "Notes from the rewrite (e.g. truncations, format adjustments).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Output schema / properties / rewrittenRemoved value: -{ - "description": "The rewritten content. The caller decides where to publish it.", - "type": "string" -} - added
Output schema / properties / rewritten_textAdded value: +{ + "type": "string" +} - added
Output schema / properties / schema_additionsAdded value: +{ + "type": "string" +} - removed
Output schema / properties / sourceRemoved value: -{ - "enum": [ - "url", - "text" - ], - "type": "string" -} - removed
Output schema / properties / target_queryRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / urlRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / requiredPrevious value: -[ - "source", - "url", - "target_query", - "rewritten", - "notes" -]New value: +[ + "rewritten_text", + "schema_additions", + "changes_made", + "before_score", + "after_score", + "mode" +]
- Changed
rewrite_geo13 fields changed- added
Output schema / properties / after_scoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / before_scoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / changes_madeAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Output schema / properties / formatRemoved value: -{ - "description": "Output format (article, faq, howto, comparison).", - "type": "string" -} - added
Output schema / properties / modeAdded value: +{ + "enum": [ + "sampling", + "prompt_template" + ], + "type": "string" +} - removed
Output schema / properties / notesRemoved value: -{ - "description": "Notes from the rewrite (e.g. truncations, format adjustments).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Output schema / properties / rewrittenRemoved value: -{ - "description": "The rewritten content. The caller decides where to publish it.", - "type": "string" -} - added
Output schema / properties / rewritten_textAdded value: +{ + "type": "string" +} - added
Output schema / properties / schema_additionsAdded value: +{ + "type": "string" +} - removed
Output schema / properties / sourceRemoved value: -{ - "enum": [ - "url", - "text" - ], - "type": "string" -} - removed
Output schema / properties / target_queryRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / urlRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / requiredPrevious value: -[ - "source", - "url", - "target_query", - "rewritten", - "notes" -]New value: +[ + "rewritten_text", + "schema_additions", + "changes_made", + "before_score", + "after_score", + "mode" +]
- Changed
score_ai_overview_eligibility17 fields changed- removed
Output schema / properties / factors / descriptionRemoved value: -"Per-factor 0-100 subscores." - added
Output schema / properties / factors / properties / content_freshnessAdded value: +{ + "type": "number" +} - removed
Output schema / properties / factors / properties / freshnessRemoved value: -{ - "type": "number" -} - added
Output schema / properties / factors / properties / multimodal_contentAdded value: +{ + "type": "number" +} - added
Output schema / properties / factors / properties / passage_structureAdded value: +{ + "type": "number" +} - removed
Output schema / properties / factors / properties / technical_hygieneRemoved value: -{ - "type": "number" -} - changed
Output schema / properties / factors / requiredPrevious value: -[ - "semantic_completeness", - "structured_data", - "eeat_signals", - "entity_density", - "freshness", - "technical_hygiene" -]New value: +[ + "semantic_completeness", + "structured_data", + "eeat_signals", + "entity_density", + "content_freshness", + "passage_structure", + "multimodal_content" +] - removed
Output schema / properties / fetched_atRemoved value: -{ - "type": "string" -} - added
Output schema / properties / findingsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "category": { + "enum": [ + "schema", + "robots", + "technical", + "freshness", + "structure", + "authority", + "presence", + "sitemap", + "llms_txt", + "citation", + "evidence", + "trust", + "entity", + "content" + ], + "type": "string" + }, + "estimated_impact": { + "anyOf": [ + { + "not": {} + }, + { + "const": "high", + "type": "string" + }, + { + "const": "medium", + "type": "string" + }, + { + "const": "low", + "type": "string" + } + ] + }, + "failure_signal": { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + "fix": { + "type": "string" + }, + "leading_indicator": { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "warning", + "info" + ], + "type": "string" + }, + "where": { + "type": "string" + } + }, + "required": [ + "severity", + "category", + "where", + "message", + "fix" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / overall_eligibility_score / maximumRemoved value: -100 - removed
Output schema / properties / overall_eligibility_score / minimumRemoved value: -0 - added
Output schema / properties / top_improvements / items / properties / actionAdded value: +{ + "type": "string" +} - added
Output schema / properties / top_improvements / items / properties / estimated_score_gainAdded value: +{ + "type": "number" +} - removed
Output schema / properties / top_improvements / items / properties / factorRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / top_improvements / items / properties / suggestionRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / top_improvements / items / requiredPrevious value: -[ - "factor", - "suggestion" -]New value: +[ + "action", + "estimated_score_gain" +] - changed
Output schema / requiredPrevious value: -[ - "url", - "fetched_at", - "overall_eligibility_score", - "factors", - "top_improvements" -]New value: +[ + "url", + "overall_eligibility_score", + "factors", + "top_improvements", + "findings" +]
- Changed
score_citation_worthiness19 fields changed- removed
Output schema / properties / chunk_analysis / descriptionRemoved value: -"Per-section extractability: how cleanly an LLM can lift a standalone answer from each chunk." - removed
Output schema / properties / chunk_analysis / items / properties / score / maximumRemoved value: -100 - removed
Output schema / properties / chunk_analysis / items / properties / score / minimumRemoved value: -0 - removed
Output schema / properties / extractability_score / descriptionRemoved value: -"Length-weighted mean of per-section extractability scores." - removed
Output schema / properties / extractability_score / maximumRemoved value: -100 - removed
Output schema / properties / extractability_score / minimumRemoved value: -0 - added
Output schema / properties / findingsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "category": { + "enum": [ + "schema", + "robots", + "technical", + "freshness", + "structure", + "authority", + "presence", + "sitemap", + "llms_txt", + "citation", + "evidence", + "trust", + "entity", + "content" + ], + "type": "string" + }, + "estimated_impact": { + "anyOf": [ + { + "not": {} + }, + { + "const": "high", + "type": "string" + }, + { + "const": "medium", + "type": "string" + }, + { + "const": "low", + "type": "string" + } + ] + }, + "failure_signal": { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + "fix": { + "type": "string" + }, + "leading_indicator": { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + "message": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "warning", + "info" + ], + "type": "string" + }, + "where": { + "type": "string" + } + }, + "required": [ + "severity", + "category", + "where", + "message", + "fix" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / improvementsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / least_extractable / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "heading": { - "type": "string" - }, - "score": { - "type": "number" - } - }, - "required": [ - "heading", - "score" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "null" + }, + { + "additionalProperties": false, + "properties": { + "heading": { + "type": "string" + }, + "score": { + "type": "number" + } + }, + "required": [ + "heading", + "score" + ], + "type": "object" + } +] - changed
Output schema / properties / most_extractable / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "heading": { - "type": "string" - }, - "score": { - "type": "number" - } - }, - "required": [ - "heading", - "score" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "null" + }, + { + "additionalProperties": false, + "properties": { + "heading": { + "type": "string" + }, + "score": { + "type": "number" + } + }, + "required": [ + "heading", + "score" + ], + "type": "object" + } +] - removed
Output schema / properties / overall_score / maximumRemoved value: -100 - removed
Output schema / properties / overall_score / minimumRemoved value: -0 - removed
Output schema / properties / signalsRemoved value: -{ - "additionalProperties": { - "type": "number" - }, - "description": "Per-signal subscores (bluf, faq, stats, entities, etc.).", - "type": "object" -} - removed
Output schema / properties / sourceRemoved value: -{ - "enum": [ - "url", - "text" - ], - "type": "string" -} - added
Output schema / properties / sub_scoresAdded value: +{ + "additionalProperties": false, + "properties": { + "answer_completeness": { + "type": "number" + }, + "bluf_present": { + "type": "boolean" + }, + "entity_clarity": { + "type": "number" + }, + "faq_blocks": { + "type": "number" + }, + "heading_question_ratio": { + "type": "number" + }, + "statistic_density": { + "type": "number" + } + }, + "required": [ + "bluf_present", + "faq_blocks", + "statistic_density", + "entity_clarity", + "heading_question_ratio", + "answer_completeness" + ], + "type": "object" +} - removed
Output schema / properties / suggestionsRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -} - removed
Output schema / properties / target_queryRemoved value: -{ - "type": [ - "string", - "null" - ] -} - removed
Output schema / properties / urlRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / requiredPrevious value: -[ - "source", - "url", - "target_query", - "overall_score", - "engine_scores", - "signals", - "suggestions" -]New value: +[ + "overall_score", + "engine_scores", + "sub_scores", + "extractability_score", + "chunk_analysis", + "most_extractable", + "least_extractable", + "improvements", + "findings" +]
20 tool updates
- First observed
audit_canonical - First observed
audit_page - First observed
audit_schema - First observed
audit_site - First observed
audit_sitemap - First observed
check_robots - First observed
check_sitemap - First observed
check_technical - First observed
diff_pages - First observed
extract_entities - First observed
llms_txt_generate - First observed
llms_txt_validate - First observed
pricing_generate - First observed
report_save - First observed
rewrite_aeo - First observed
rewrite_geo - First observed
score_agentic_browsing - First observed
score_ai_overview_eligibility - First observed
score_citation_worthiness - First observed
score_test_citation
Publisher details
- Operator
- AutomateLab · Publisher source
- Operator website
- https://automatelab.tech/ · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://automatelab.tech/products/mcp/ai-seo/ · Publisher source
- Trust center
- Not available
- Restrictions
- No API keys or registration are required for audits. Some rewriting tools use capabilities supplied by your MCP client. · Publisher source
Related MCP Servers
- AlicenseNot gradedqualityBmaintenancePerplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.2Apache 2.0
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs119 npmMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.164 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.