seo-geo-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@seo-geo-mcp-serverCheck if ChatGPT can cite example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
seo-geo-mcp-server
An MCP server that lets an AI agent audit a page for SEO and GEO (Generative Engine Optimization) — on-page tags, structured data, robots.txt, sitemaps, hreflang, and whether ChatGPT, Claude, Perplexity and Gemini can actually crawl and cite you. No API keys required.
Ask Claude "how is this page doing, and will AI assistants cite it?" and it runs a full audit and hands you a graded report with prioritised fixes — instead of you pasting a URL into six different web tools.
> Audit https://example.com/guide and tell me if ChatGPT can cite it
seo_audit(url="https://example.com/guide", include_geo=true)
Overall: A (92/100) · indexable: yes
Meta tags & social preview 95 (A)
Heading structure 100 (A)
Structured data 75 (C)
GEO readiness: B (85/100)
✅ AI crawler access 25/25
✅ Server-rendered content 20/20
❌ Authorship & entity 2/10
1. Add author and Organization markup with `sameAs` links to official profiles.Why this exists
Two gaps, one server.
The SEO gap: the on-page checkers are all web UIs. None of them let an agent run the audit, read the result and fix the code in the same loop.
The GEO gap: "generative engine optimization" tooling is mostly rank-tracking dashboards behind a subscription. The mechanics that actually decide whether an AI assistant can cite you are cheap to check and almost never checked:
Can the AI search crawlers reach you? Blocking
GPTBotstops training. BlockingOAI-SearchBotstops you being cited. Most sites that meant to do the first have accidentally done the second. This server separates them.Does your content exist without JavaScript? Googlebot renders JS.
GPTBot,ClaudeBot,PerplexityBotandCCBotlargely do not. A client-rendered page can rank fine in Google and be invisible to every AI assistant.
It is the agent-facing companion to the tools at ortamarco.me,
and shares its core (SSRF-guarded fetching, public-resolver DNS, host validation)
with domain-security-mcp-server.
Related MCP server: librecrawl-technical-seo-audit-mcp
Tools
Audits
Tool | What it does |
| One fetch → seven weighted sections (meta, headings, content, schema, images, links, crawlability) → 0–100 score, A–F grade, prioritised fixes. |
| AI answer-engine readiness: crawler access (25), server-rendered content (20), structured data (15), extractable structure (15), authorship (10), freshness (8), depth (7) |
GEO
Tool | What it does |
| Resolves ~35 AI crawler tokens against robots.txt. Separates training from citation bots, flags blocks that vendors document as unenforceable, handles the Applebot→Googlebot fallback |
| Whether content survives without JavaScript — detects unhydrated SPA shells that AI crawlers cannot read |
| Detects and validates |
On-page
Tool | What it does |
| Title, description, canonical, robots (meta and |
| Open Graph + Twitter Card, and verifies the |
| Full h1–h6 outline, multiple h1s, skipped levels, question-shaped headings |
| JSON-LD/microdata/RDFa extraction, parse errors, and Google rich-result requirements for 17 schema types |
| Word count, Flesch reading ease, thin-content detection, text-to-HTML ratio, term density (EN + ES stopwords) |
| Missing alt text, missing dimensions (layout shift), lazy loading, WebP/AVIF adoption |
Technical
Tool | What it does |
| RFC 9309 parse; flags wildcard |
| Discovery via robots.txt → conventional paths; index following, gzip, 50k/50MiB limits, |
| All four http/https × apex/www variants — do they converge on one canonical URL, and via 301 or 302? |
| Hop-by-hop chain with loop and temporary-redirect detection |
| Internal/external split, rel attributes, generic anchor text, optional broken-link sampling |
| BCP-47 validity, self-reference, x-default, duplicates — plus optional reciprocity verification |
Every tool is read-only, declares an outputSchema and returns
structuredContent (validated by the SDK) alongside human-readable Markdown
(default) or JSON (response_format="json"), plus actionable error messages.
Honesty notes
This server deliberately refuses to overstate two things that most GEO content gets wrong. Both are surfaced in tool output, not buried here:
llms.txtis not an adopted standard. It is a community proposal from September 2024. No major AI vendor has documented that its crawlers read it from third-party sites, and Google has publicly said it does not. The tool reports presence and validates shape — andgeo_auditdeliberately does not score it. (llms-full.txtis a docs-tooling convention, not part of the proposal.)Some robots.txt blocks are advisory.
Perplexity-User,ChatGPT-Userandmeta-externalfetcherare documented by their own vendors as ignoring or possibly ignoring robots.txt. Reporting those as cleanly "blocked" would be misleading, so they are listed separately as unenforceable.
Crawler tokens carry a provenance field distinguishing first-party vendor
documentation from community aggregators, and vendors that publish no token at
all (xAI/Grok, Microsoft Copilot) are named explicitly — because a missing rule
cannot be read as either allowed or blocked.
Install
git clone https://github.com/OrtaMarco/seo-geo-mcp-server.git
cd seo-geo-mcp-server
npm install
npm run buildUse it with Claude Code
claude mcp add seo-geo -- node /absolute/path/to/seo-geo-mcp-server/dist/index.jsUse it with Claude Desktop
Add to claude_desktop_config.json (see examples/):
{
"mcpServers": {
"seo-geo": {
"command": "node",
"args": ["/absolute/path/to/seo-geo-mcp-server/dist/index.js"]
}
}
}Restart Claude Desktop, then ask: "Audit the SEO and GEO of example.com."
Self-host (HTTP transport)
The same server speaks stateless Streamable HTTP for remote/multi-client use — handy behind a reverse proxy such as Coolify or Traefik.
TRANSPORT=http PORT=3000 npm start
# POST JSON-RPC to http://localhost:3000/mcp · health at /healthzOr with Docker:
docker build -t seo-geo-mcp .
docker run -p 3000:3000 -e TRANSPORT=http seo-geo-mcpSet ALLOWED_ORIGINS=https://your.app to enable Origin-based DNS-rebinding
protection (leave empty when a trusted proxy already restricts access).
Develop
npm run dev # tsx watch (stdio)
npm test # 32 deterministic unit tests (robots matcher, SPA detection, JSON-LD…)
npm run smoke # call all 17 tools over MCP and validate structuredContent vs outputSchema
npm run inspect # open the MCP Inspector against the built server
npm run build # type-check + emit dist/evals/ holds a 10-question LLM evaluation set (stable, verifiable)
and instructions for running it — see evals/README.md.
How it works
src/
├── index.ts # transport selection (stdio | http)
├── server.ts # registers every tool on one McpServer
├── schemas.ts # Zod outputSchema for each tool
├── core/ # pure logic, no MCP coupling — reusable & testable
│ ├── fetch.ts # SSRF-safe fetch: per-hop guard, byte caps, manual redirects
│ ├── page.ts # HTML loading + the shared parsed-document model
│ ├── meta.ts # title/description/canonical/robots, Open Graph, hreflang
│ ├── content.ts # headings, readability, word counts, image SEO
│ ├── structured-data.ts # JSON-LD/microdata + Google rich-result requirements
│ ├── robots.ts # RFC 9309 parser and rule matcher
│ ├── ai-crawlers.ts # the AI crawler registry (token, purpose, compliance, provenance)
│ ├── sitemap.ts # discovery, index following, gzip, protocol limits
│ ├── links.ts # link classification + broken-link sampling
│ ├── redirects.ts # chain tracing + host canonicalisation
│ ├── geo.ts # llms.txt, JS-rendering detection, GEO scoring
│ └── seo-audit.ts # the composite audits (one fetch, every analyser)
└── tools/ # thin MCP wrappers (Zod schemas, descriptions, formatting)The core/ layer is deliberately free of any MCP types, so the same logic can
power both this server and a web UI.
Security: every user-supplied URL is validated and re-checked on each redirect hop against loopback, private, link-local and cloud-metadata ranges, so the server cannot be used to probe internal networks. Response bodies are read through a byte cap.
License
MIT © Marco Orta
Available Tools
17 toolsai_crawler_accessAI Crawler Access CheckARead-onlyIdempotent
Resolve every known AI/LLM crawler against a site's robots.txt and report which may fetch a given path. Covers OpenAI (GPTBot, OAI-SearchBot, ChatGPT-User, OAI-AdsBot), Anthropic (ClaudeBot, Claude-User, Claude-SearchBot), Google (Google-Extended, Googlebot, Google-CloudVertexBot), Perplexity, Apple, Meta, Amazon, Mistral, Common Crawl, ByteDance and others.
Three things this gets right that a naive robots.txt reader does not:
Training vs citation. Blocking GPTBot stops training; blocking OAI-SearchBot stops you being cited in ChatGPT search. Most people want the first, not the second. Blocked citation-critical bots are called out separately.
Which blocks are actually enforceable. Perplexity-User, ChatGPT-User and meta-externalfetcher are documented by their own vendors as ignoring or possibly ignoring robots.txt. A "blocked" verdict for those is advisory, and is reported as such rather than as a clean block.
Vendor quirks. Apple documents that when robots.txt has no Applebot group but does have a Googlebot group, Applebot follows the Googlebot rules — so the effective verdict differs from the literal one.
Each crawler also carries its provenance: whether the token comes from first-party vendor documentation or only from community aggregators. Vendors that publish no crawler token at all (xAI/Grok, Microsoft Copilot) are listed separately, because absence of a rule cannot be read as allowed or blocked.
Args:
site (string): domain or any URL on it.
path (string): path to test (default '/').
include_deprecated (boolean): include retired tokens (default false).
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { crawlers[{token, vendor, purpose, allowed, via_wildcard, matched_rule, respects_robots_txt, compliance_note, provenance, quirk}], allowed_count, blocked_count, blocked_citation_critical[], unenforceable_blocks[], undocumented_vendors[], findings[] }.
Example: "Can ChatGPT and Perplexity crawl example.com?" -> ai_crawler_access(site="example.com").
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path to test the rules against, e.g. '/blog/post'. Defaults to '/'. | / |
| site | Yes | Domain or any URL on it, e.g. 'example.com'. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
| include_deprecated | No | Also resolve retired tokens (anthropic-ai, claude-web) for historical coverage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| path | Yes | |
| crawlers | Yes | |
| findings | Yes | |
| robots_found | Yes | |
| allowed_count | Yes | |
| blocked_count | Yes | |
| undocumented_vendors | Yes | |
| unenforceable_blocks | Yes | |
| blocked_citation_critical | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive. The description adds substantial behavioral context: it resolves 'every known AI/LLM crawler,' distinguishes citation vs. training bots, reports advisory vs. enforceable blocks, discloses vendor quirks (e.g., Applebot following Googlebot rules), and notes provenance of crawler tokens. This far exceeds the safety profile already conveyed by 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 long but front-loads the core purpose in the first sentence, then organizes coverage, differentiators, parameters, returns, and example in a logical, scannable structure. Every sentence adds information, though the bulleted 'Three things' and extensive crawler list make it somewhat verbose; still, it earns its length through specificity.
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, the description is exceptionally complete. It explains nuanced behavior, provides a structured return object, lists all four parameters with defaults, includes a usage example, and even anticipates edge cases like undocumented vendors. The presence of an output schema (the 'Returns' block) further covers return semantics. No notable gap remains for an agent to understand what the tool does and when to invoke it.
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?
With 100% schema description coverage, parameters are fully documented in the schema. The description's 'Args' section largely duplicates the schema (site, path, include_deprecated, response_format) and adds only minimal color (e.g., 'retired tokens' for include_deprecated). No extra meaning, constraints, or usage nuances are contributed beyond the schema, so 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?
The description opens with a specific, active statement: 'Resolve every known AI/LLM crawler against a site's robots.txt and report which may fetch a given path.' This clearly identifies the tool's function and distinguishes it from generic robots.txt checkers, further reinforced by the detailed list of covered crawlers and unique analytical angles (training vs. citation, enforceability, vendor quirks).
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 provides a concrete usage example ('Can ChatGPT and Perplexity crawl example.com?') and implies value over naive robots.txt readers with its 'Three things this gets right' section. However, it does not explicitly name sibling alternatives or state when NOT to use this tool, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canonical_host_checkCanonical Host CheckARead-onlyIdempotent
Fetch all four host/scheme variants of a domain — http/https × apex/www — and confirm they converge on a single canonical URL. Divergence is the classic cause of a homepage competing with itself in the index.
Also reports whether plain HTTP is upgraded to HTTPS, whether canonicalisation uses permanent (301/308) rather than temporary (302/307) redirects, and which variants do not serve content at all.
Args:
site (string): a domain such as 'example.com' (www and scheme are ignored).
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { domain, variants[{variant, reachable, status, final_url, hop_count, redirect_statuses[]}], canonical_url, converges, distinct_endpoints[], forces_https, score, grade, findings[] }.
Example: "Do all versions of example.com redirect to one URL?" -> canonical_host_check(site="example.com").
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | Site domain or any URL on it, e.g. 'example.com'. Only the origin is used. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| grade | Yes | |
| score | Yes | |
| domain | Yes | |
| findings | Yes | |
| variants | Yes | |
| converges | Yes | |
| forces_https | Yes | |
| canonical_url | Yes | |
| distinct_endpoints | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the read-only/idempotent annotations by detailing the additional behavioral reports: HTTPS upgrade detection, permanent vs. temporary redirect classification, and identification of non-serving variants. It also clearly documents the returned structure (hop_count, redirect_statuses, findings), adding substantial transparency without contradicting 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?
The description is well-structured and front-loaded: the core purpose appears in the first sentence, followed by concise bullet-style sections for additional reports, parameters, return payload, and an example. Every sentence contributes meaningful information with no filler or 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 the tool's moderate complexity, the description is remarkably complete: it explains what the tool does, what parameters are needed, what behavioral nuances are checked, the exact return structure, and provides a clear example. The provided annotations and schema also contribute, making this a fully self-contained tool description.
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?
The input schema already covers both parameters at 100% with descriptions. The description reinforces the site parameter by explicitly stating that 'www and scheme are ignored' (a practical clarification) and restates the response_format options and default. This adds modest but useful semantic depth 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 identifies the tool's operation: fetching the four host/scheme variants (http/https × apex/www) and checking convergence on a single canonical URL. It uses a specific verb and resource combination that distinguishes it from siblings like redirect_trace and render_check.
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 clear context for when to use the tool (when homepage variants may be competing in the index, when checking canonical convergence) and includes a concrete example query. It does not explicitly name alternative tools or state when not to use it, but the use case is well implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
content_analysisContent Quality AnalysisARead-onlyIdempotent
Measure the page's main content: word count, sentence and paragraph counts, Flesch reading ease with a plain-language reading level, estimated reading time, text-to-HTML ratio, thin-content detection, and the top non-stopword terms with their density (English and Spanish stopwords are both filtered).
Content is read from the / landmark when present, so navigation and footer chrome do not inflate the counts.
Args:
url (string): the page to check.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { word_count, sentence_count, paragraph_count, avg_words_per_sentence, reading_ease, reading_level, reading_time_minutes, thin_content, text_to_html_ratio, used_content_landmark, top_terms[{term, count, density}], score, grade, findings[] }.
Example: "Is the content on https://example.com/post too thin?" -> content_analysis(url="https://example.com/post").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| grade | Yes | |
| score | Yes | |
| findings | Yes | |
| final_url | Yes | |
| top_terms | Yes | |
| html_bytes | Yes | |
| word_count | Yes | |
| reading_ease | Yes | |
| thin_content | Yes | |
| reading_level | Yes | |
| sentence_count | Yes | |
| paragraph_count | Yes | |
| text_to_html_ratio | Yes | |
| reading_time_minutes | Yes | |
| used_content_landmark | Yes | |
| avg_words_per_sentence | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, open-world, and idempotent. The description adds meaningful behavioral context by stating that content is read from <main>/<article> landmarks to avoid inflated counts, and that both English and Spanish stopwords are filtered. It does not address edge cases like missing landmarks, but goes beyond the annotation baseline.
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 efficiently organized: a definitional first paragraph, a behavioral note, then clean 'Args' and 'Returns' sections, and a concrete example. Every sentence contributes, with no fluff or repetition.
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 2-parameter tool with an output schema, the description fully covers purpose, key behavior, return structure, and a usage example. The output schema and annotations cover safety and return types, while the description fills in what is not explicitly structured, making the tool self-contained.
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%, and the description's parameter section mostly mirrors the schema ('response_format' defaults and enums). The natural-language example adds illustrative value but does not clarify any new parameter semantics beyond what the schema already provides.
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 opens with 'Measure the page's main content' and itemizes precise metrics (word count, Flesch reading ease, text-to-HTML ratio, thin-content detection). This specific verb+resource clearly distinguishes it from sibling tools like seo_audit or meta_tags_check, which focus on different aspects.
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 example 'Is the content on https://example.com/post too thin?' provides a concrete use case, and the landmark-reading note explains a relevant context (ignoring chrome). However, it does not explicitly contrast with alternatives such as heading_structure or link_audit, so when-not-to-use guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geo_auditGEO / AI Answer-Engine Readiness AuditARead-onlyIdempotent
Score how readily an AI answer engine (ChatGPT, Claude, Perplexity, Gemini, Copilot) can fetch, parse and cite this page. Weighted across: AI crawler access (25), server-rendered content (20), structured data (15), extractable structure (15), authorship & entity signals (10), freshness (8) and content depth (7).
Two things this catches that a classic SEO tool does not:
Pages that rank fine in Google but are invisible to AI assistants, because most AI crawlers do not execute JavaScript and the content only appears after hydration.
robots.txt rules that block AI search crawlers (OAI-SearchBot, Claude-SearchBot, PerplexityBot) — the ones that build citation indexes — as opposed to the training crawlers people usually mean to block.
Args:
url (string): the page to audit.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { geo{score, grade, signals[], top_recommendations[]}, rendering, crawler_access, llms_txt, robots }.
Example: "Is https://example.com/guide ready to be cited by ChatGPT?" -> geo_audit(url="https://example.com/guide"). Note: llms.txt presence is reported but deliberately NOT scored — it is a community proposal with no committed vendor support, and Google has stated it does not use it.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| geo | Yes | |
| robots | Yes | |
| llms_txt | Yes | |
| rendering | Yes | |
| crawler_access | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description reveals key behavioral details: it weights specific criteria, it detects pages invisible to AI assistants due to JS hydration, and it distinguishes AI search crawlers from training crawlers in robots.txt. It also transparently explains why llms.txt is reported but not scored. This adds substantial context beyond the structured 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 well-structured and information-dense without being verbose. It leads with the core purpose, then presents the weighted criteria, unique capabilities, args, returns, and a clarifying note about llms.txt. Every sentence adds value, and the format is easy to scan. No unnecessary fluff or 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?
The description is comprehensive for a tool with this complexity. It explains the scoring dimensions, the return structure (geo, rendering, crawler_access, etc.), and the rationale behind not scoring llms.txt. The presence of an output schema is complemented by a clear summary of the returned fields. It also provides an example that ties the tool to a realistic query. All essential context is covered.
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?
The input schema provides 100% coverage of parameters, including descriptions for url and response_format (with enum values and default). The description repeats the parameter list but adds minimal new semantics beyond the schema. It shows an example call but does not clarify details like URL scheme defaulting, which the schema already covers. Since the schema carries the parameter documentation, a score 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 clearly states the tool's purpose: scoring how readily an AI answer engine can fetch, parse, and cite a page. It specifies the resource (a URL) and the action (scoring readiness), and it distinguishes itself from classic SEO tools by highlighting two unique capabilities. This makes it easy to understand what the tool does and how it differs from siblings.
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 provides a clear use case via an example ('Is https://example.com/guide ready to be cited by ChatGPT?') and explains what it catches that classic SEO tools do not. However, it does not explicitly name alternative sibling tools or state when NOT to use this tool in favor of a more specific one like ai_crawler_access. The guidance is implied rather than explicitly contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
heading_structureHeading StructureARead-onlyIdempotent
Extract the full h1–h6 outline and evaluate it: how many h1s, whether levels are skipped (h2 followed by h4), empty heading tags, and how many headings are phrased as questions — the last being a strong signal for featured snippets and AI citations.
Args:
url (string): the page to check.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { headings[{level, text, skips_level}], h1_count, h1_text[], level_skips, empty_headings, question_headings[], outline, score, grade, findings[] }.
Example: "Show me the heading outline of https://example.com/guide" -> heading_structure(url="https://example.com/guide").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| grade | Yes | |
| score | Yes | |
| h1_text | Yes | |
| outline | Yes | |
| findings | Yes | |
| h1_count | Yes | |
| headings | Yes | |
| final_url | Yes | |
| level_skips | Yes | |
| empty_headings | Yes | |
| question_headings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior, so the bar is lower. The description adds meaning by detailing evaluation criteria (empty headings, skipped levels, question phrasing), the returned score/grade/findings, and the output format options, going beyond the safety hints.
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 well-organized with clear sections (explanation, Args, Returns, Example) and is appropriately sized for an agent-facing tool. It loses a point because the Returns block largely duplicates the output schema, adding minor redundancy, and the example could suffice without the full return payload listing.
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 moderate complexity, the presence of an output schema, and rich annotations (read-only, idempotent, open-world), the description is complete. It explains what the tool does, what inputs it expects, what it returns, and offers a concrete invocation example, leaving no critical gap for agent selection or invocation.
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 baseline is 3. The description's Args section mostly restates the schema's parameter names, types, defaults, and formats without adding new meaning. The example invocation does demonstrate argument binding, but does not elevate the semantic value 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 opens with 'Extract the full h1–h6 outline and evaluate it' and enumerates specific checks (h1 count, level skips, empty tags, question headings), clearly distinguishing it from generic content or meta audit tools. The verb+resource combination is specific and actionable.
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 does not name sibling alternatives or state when-not to use, but it provides clear context by noting the question-heading signal is useful for featured snippets and AI citations. This implies an SEO/visibility use case without explicit exclusions, which fits the 'clear context, no exclusions' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hreflang_checkHreflang CheckARead-onlyIdempotent
Validate a page's <link rel="alternate" hreflang> annotations: language/region code validity (BCP-47), the required self-referencing entry, the x-default fallback, and duplicate codes.
With check_reciprocity=true it fetches each alternate and confirms it links back to this page — non-reciprocal hreflang is silently ignored by Google, and it is impossible to detect from one page in isolation.
Args:
url (string): the page to check.
check_reciprocity (boolean): verify alternates link back (default false).
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { declared_lang, entries[{hreflang, href, valid_code, is_self, reciprocates}], has_x_default, self_referencing, duplicate_codes[], invalid_codes[], findings[] }.
Example: "Is hreflang set up correctly on https://example.com/es/pagina?" -> hreflang_check(url="https://example.com/es/pagina", check_reciprocity=true).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
| check_reciprocity | No | Fetch each alternate to confirm it links back. Catches the most common hreflang bug. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| entries | Yes | |
| findings | Yes | |
| final_url | Yes | |
| declared_lang | Yes | |
| has_x_default | Yes | |
| invalid_codes | Yes | |
| duplicate_codes | Yes | |
| self_referencing | Yes | |
| reciprocity_checked | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows it's a safe read operation. The description adds valuable behavioral context by disclosing that with check_reciprocity=true it fetches each alternate URL, and explains the practical motivation (non-reciprocal hreflang is silently ignored by Google). It also outlines the return structure, making the tool's behavior fully transparent.
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 well-structured and efficient. It leads with the core purpose, follows with an optional advanced behavior, and then lists Args, Returns, and an Example in a scannable format. Every sentence adds information, and nothing is redundant or verbose.
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 moderate complexity, the description covers all essential aspects: what is validated, the optional reciprocity fetch, all three parameters, the expected return shape, and a usage example. The output schema is present, so the Returns summary suffices. Annotations cover safety and semantics, making this description contextually complete.
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 parameters are already well-documented in structured form. The description adds extra value by explaining check_reciprocity's purpose and consequence ('verify alternates link back'), clarifying the default for response_format, and providing an example that shows how to invoke the tool with meaningful arguments. This goes slightly beyond the schema but not dramatically, hence 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 opens with a specific, actionable verb 'Validate' and precisely names the resource: a page's `<link rel='alternate' hreflang>` annotations. It enumerates concrete checks (BCP-47 validity, self-referencing entry, x-default fallback, duplicates) that clearly distinguish it from sibling SEO tools like meta_tags_check or structured_data_check.
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 gives clear context for when to use the tool (validating hreflang setup) and includes a concrete example query that illustrates the typical use case. However, it does not explicitly state when *not* to use it or name alternative sibling tools for other SEO checks, so it falls short of the highest bar for explicit usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
image_seo_checkImage SEO CheckARead-onlyIdempotent
Audit every on the page: missing alt attributes (an accessibility failure and a lost image-search signal), decorative alt="" usage, missing width/height (which causes layout shift, a Core Web Vitals factor), lazy-loading adoption, and how many images use modern formats (WebP/AVIF) versus legacy JPEG/PNG. sources are counted as modern delivery.
Args:
url (string): the page to check.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { total_images, missing_alt, decorative_alt, missing_dimensions, lazy_loaded, modern_format, legacy_format, images[], score, grade, findings[] }.
Example: "Which images on https://example.com are missing alt text?" -> image_seo_check(url="https://example.com").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| grade | Yes | |
| score | Yes | |
| images | Yes | |
| findings | Yes | |
| final_url | Yes | |
| lazy_loaded | Yes | |
| missing_alt | Yes | |
| total_images | Yes | |
| legacy_format | Yes | |
| modern_format | Yes | |
| decorative_alt | Yes | |
| missing_dimensions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, so the bar for additional disclosure is lower. The description adds useful context beyond the annotations: it audits every <img> on the page, counts <picture> sources as modern delivery, and specifies the return payload. It does not contradict 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?
The description is front-loaded with the core audit purpose and checklist, followed by clearly labeled Args, Returns, and an Example. It is structured and dense, but the Args and Returns sections are somewhat redundant with the input and output schemas, so it is not maximally 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?
For a moderately complex tool with two documented parameters, a full output schema, and strong annotations, this description is operationally complete. It explains exactly what is checked, the nuance of <picture> sources, the output structure, and provides an invocation example, leaving no critical gap for selection or correct use.
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?
The input schema already provides thorough descriptions for both url and response_format, including defaults and the https:// default for url, giving 100% coverage. The description's Args section merely restates these in abbreviated form, and the example only maps a natural-language request to a call without adding new parameter semantics.
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 opens with the specific verb 'Audit' and names the exact resource ('every <img> on the page'), then enumerates the precise SEO checks performed (alt text, dimensions, lazy-loading, modern formats). This clearly distinguishes it from broader sibling tools like seo_audit or render_check.
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 makes the intended use obvious: it is the tool for a page-level image SEO audit, listing the exact aspects it checks and even giving an example natural-language query mapped to a tool call. It does not explicitly mention when not to use it or point to alternatives, but the context is clear and self-contained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_auditLink AuditARead-onlyIdempotent
Audit a page's outbound links: the internal/external split, rel attributes (nofollow, sponsored, ugc), links with no anchor text at all, generic anchor text ("click here", "leer más") that carries no topical signal, and the distribution of external domains. Optionally sample-verifies that links actually resolve, retrying with GET when a server rejects HEAD.
Args:
url (string): the page to audit.
check_broken (boolean): verify links resolve (default false).
sample_size (number): how many links to verify (default 25).
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { total_links, internal_links, external_links, nofollow_links, empty_anchor_text, generic_anchor_text[], external_domains[{domain, count}], checked_count, broken[], score, grade, findings[] }.
Example: "Are there broken links on https://example.com/resources?" -> link_audit(url="https://example.com/resources", check_broken=true).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| sample_size | No | How many links to verify when check_broken is true. | |
| check_broken | No | Sample links and verify they resolve. Adds up to 25 requests. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| grade | Yes | |
| score | Yes | |
| broken | Yes | |
| findings | Yes | |
| final_url | Yes | |
| ugc_links | Yes | |
| total_links | Yes | |
| checked_count | Yes | |
| external_links | Yes | |
| internal_links | Yes | |
| nofollow_links | Yes | |
| sponsored_links | Yes | |
| external_domains | Yes | |
| empty_anchor_text | Yes | |
| generic_anchor_text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, etc.), the description discloses a specific behavioral trait: 'retrying with GET when a server rejects HEAD' for broken-link verification, and notes that verification is a sample. This adds meaningful context about the tool's operational behavior without contradicting 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 well-organized: a concise opening sentence, a bullet-like list of arguments, a return structure overview, and a concrete example. Every section earns its place, and the text is scannable without being verbose.
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?
The description covers the tool's purpose, parameters, return structure, and a usage example, all within a moderate length. Combined with the detailed input schema and output schema, it provides sufficient context for an agent to select and invoke the tool correctly, even for complex queries.
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?
The input schema already describes all four parameters with types, defaults, and descriptions, achieving 100% coverage. The description's Args section largely duplicates this, only adding an example mapping. Thus the description adds minimal value beyond the schema, meriting the baseline score.
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 function with a specific verb and resource ('Audit a page's outbound links') and enumerates the exact link characteristics analyzed (internal/external split, rel attributes, anchor text issues, external domain distribution). This distinguishes it from the broader sibling tools like seo_audit and content_analysis.
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 provides clear context for when to use the tool, including a concrete example for broken-link checking. However, it does not explicitly mention alternatives or when not to use it, so it falls short of full explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
llms_txt_checkllms.txt CheckARead-onlyIdempotent
Check whether a site publishes /llms.txt and validate it against the llmstxt.org proposal: a required H1 title, an optional blockquote summary, and H2-delimited lists of - [name](url): notes links. Also detects /llms-full.txt.
Important context this tool always reports: llms.txt is a community proposal from September 2024, not an adopted standard. No major AI vendor has documented that its crawlers read llms.txt from third-party sites, and Google has publicly stated it does not support it. Publishing one is cheap and may help human readers and some documentation tooling, but it does not earn AI visibility on its own — robots.txt access, structured data and server-rendered content do. Note also that llms-full.txt is a de-facto convention popularised by docs tooling, not part of the proposal.
Use this tool to answer "do they publish one, and is it well-formed?" — not as evidence that a site is or is not AI-optimised.
Args:
site (string): domain or any URL on it.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { found, status, full_variant_found, bytes, title, has_summary_blockquote, sections[], link_count, spec_compliant, adoption_status, findings[] }.
Example: "Does example.com publish an llms.txt?" -> llms_txt_check(site="example.com").
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | Site domain or any URL on it, e.g. 'example.com'. Only the origin is used. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| bytes | Yes | |
| found | Yes | |
| title | Yes | |
| status | Yes | |
| findings | Yes | |
| sections | Yes | |
| link_count | Yes | |
| spec_compliant | Yes | |
| adoption_status | Yes | |
| full_variant_found | Yes | |
| has_optional_section | Yes | |
| has_summary_blockquote | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, openWorld, and non-destructive behavior. The description adds significant behavioral context, including that the tool 'always reports' adoption status and important caveats about llms.txt not being a standard, plus detection of llms-full.txt. This goes well beyond 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?
The description is well-organized and front-loaded with a clear purpose statement. The 'Important context' paragraph, Args, Returns, and Example sections are clearly structured. It is longer than a minimal description, but every section adds value and the formatting aids scannability.
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?
The description covers the tool's purpose, validation criteria, important caveats, parameters, return fields, and an example invocation. This is thorough especially with annotations present. It lacks only minor details like error-handling behavior, but overall it is complete enough for an AI agent to use correctly.
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 fully documented. The description's Args section merely restates the schema information without adding new semantic details. Thus, 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 clearly states the tool's function: 'Check whether a site publishes /llms.txt and validate it against the llmstxt.org proposal' and also mentions detection of /llms-full.txt. It includes specific details on what is validated (H1, blockquote, H2 lists) and directly answers the tool's purpose: 'Use this tool to answer "do they publish one, and is it well-formed?"' This distinguishes it from sibling 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?
The description provides explicit when-to-use guidance: 'Use this tool to answer "do they publish one, and is it well-formed?"' and an explicit when-not: 'not as evidence that a site is or is not AI-optimised.' It does not name alternative tools, but the context makes the intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_tags_checkMeta Tags CheckARead-onlyIdempotent
Inspect a page's head tags: title, meta description, canonical, robots directives (meta AND the X-Robots-Tag header), html lang, charset, viewport and favicon. Flags length problems, missing or duplicated tags, and anything that makes the page non-indexable.
Args:
url (string): the page to check.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { title, title_length, description, description_length, canonical, canonical_is_self, meta_robots, x_robots_tag, indexable, followable, lang, charset, viewport, score, grade, findings[] }.
Example: "Are the meta tags on https://example.com correct?" -> meta_tags_check(url="https://example.com").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| lang | Yes | |
| grade | Yes | |
| score | Yes | |
| title | Yes | |
| charset | Yes | |
| favicon | Yes | |
| findings | Yes | |
| viewport | Yes | |
| canonical | Yes | |
| final_url | Yes | |
| indexable | Yes | |
| followable | Yes | |
| description | Yes | |
| meta_robots | Yes | |
| title_length | Yes | |
| x_robots_tag | Yes | |
| canonical_is_self | Yes | |
| robots_directives | Yes | |
| description_length | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds behavioral detail by specifying what it inspects (e.g., X-Robots-Tag header) and what it flags (length problems, duplicates, non-indexability). 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 well-structured with distinct sections: intro, Args, Returns, and Example. It is sufficiently detailed without redundancy; each section adds value, including the return fields and a concrete usage example.
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 (2 params, output schema with many fields), the description covers purpose, inputs, outputs, and example usage. It is complete for correct invocation, though alternative guidance is missing (covered under usage_guidelines).
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 both parameters are fully described in the schema. The description's Args section adds little beyond the schema, but the example clarifies usage. Baseline 3 for high schema coverage.
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 inspects a page's head tags and lists specific tags (title, meta description, canonical, robots directives, etc.) and flags issues. It is specific about the resource and actions, but it does not explicitly differentiate from sibling tools like seo_audit or render_check.
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 provides an example usage but does not state when to use this tool versus alternatives. It implies usage for checking meta tags, but lacks explicit when/when-not guidance or alternative tool recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redirect_traceRedirect TraceARead-onlyIdempotent
Follow a URL's redirect chain hop by hop, reporting each status code and target. Flags long chains (which waste crawl budget), redirect loops, temporary 302/307 redirects where a permanent 301/308 belongs, and chains that do not end on HTTPS.
Args:
url (string): the starting URL.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { final_url, final_status, hops[{url, status, location}], hop_count, https_upgrade, ends_https, has_loop, has_temporary_redirect, elapsed_ms, findings[] }.
Example: "Where does http://example.com/old-page end up?" -> redirect_trace(url="http://example.com/old-page").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| hops | Yes | |
| findings | Yes | |
| has_loop | Yes | |
| final_url | Yes | |
| hop_count | Yes | |
| elapsed_ms | Yes | |
| ends_https | Yes | |
| final_status | Yes | |
| https_upgrade | Yes | |
| has_temporary_redirect | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds value by detailing the analysis behavior: it flags loops, temporary redirects, non-HTTPS endpoints, and reports hop-by-hop status codes. The Returns section also discloses the exact payload shape, which is beyond annotation coverage. No contradictions 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 structured with an opening behavioral sentence, an Args block, a Returns block, and an example. The Args and Returns blocks largely duplicate what is already in the input and output schemas, making the description longer than necessary. However, the example is helpful, and the structure is clear. Overall, it would benefit from trimming 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 the tool has only two parameters and an output schema exists, the description provides sufficient context: it explains the purpose, the analysis flags, and gives an example. It doesn't cover errors or alternative tool selection, but that is not crucial for this low-complexity tool. The description is largely complete for an agent to invoke it correctly.
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?
The input schema already provides thorough descriptions for both parameters, giving 100% coverage. The description's Args section merely restates the names and types without adding new meaning. Since schema coverage is high, the description does not need to compensate, and it doesn't add meaningful parameter semantics 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 uses a specific verb ('Follow') and resource ('a URL's redirect chain'), clearly stating it reports each status code and target. It also lists specific issues it flags (long chains, loops, temporary redirects), which distinguishes it from sibling tools like seo_audit or link_audit.
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 provides clear context for use: it helps identify redirect-related issues such as long chains wasting crawl budget and improper temporary redirects. The example query 'Where does http://example.com/old-page end up?' illustrates a direct use case. However, it does not explicitly name alternatives or state when not to use this tool, so it falls short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_checkJavaScript Rendering CheckARead-onlyIdempotent
Determine whether a page's content exists in the server HTML, or only appears after JavaScript runs.
This matters more for AI visibility than for classic SEO: Googlebot renders JavaScript, but GPTBot, ClaudeBot, PerplexityBot and CCBot largely do not. A client-rendered page can rank perfectly well in Google and still be completely invisible to every AI assistant — this tool is how you catch that.
Detects unhydrated SPA shells (empty #root / #app / #__next containers), reports how many words survive without JS, and flags documents dominated by inline script bytes.
Args:
url (string): the page to check.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { renders_without_js, server_text_words, script_bytes, html_bytes, spa_shell_detected, framework_hint, findings[] }.
Example: "Can ChatGPT actually read https://example.com/app?" -> render_check(url="https://example.com/app").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| findings | Yes | |
| html_bytes | Yes | |
| script_bytes | Yes | |
| framework_hint | Yes | |
| server_text_words | Yes | |
| renders_without_js | Yes | |
| spa_shell_detected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering read-only/idempotent behavior, the description adds meaningful behavioral details: it detects unhydrated SPA shells, reports word counts, flags script-heavy documents, and returns a specific structured object. It does not disclose potential limitations (e.g., whether JavaScript is executed) but overall exceeded annotation coverage.
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 well-structured and front-loaded with the core purpose. Each subsequent sentence adds contextual value: AI visibility rationale, detection details, parameters, return format, and a concrete example. Nothing is redundant or irrelevant.
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?
The description is highly complete given the tool's complexity. It explains why the tool matters, what it detects, what arguments it takes, what it returns, and shows a realistic example. With annotations and output schema available, no major 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% with both parameters already described. The description's 'Args' section essentially repeats the schema without adding new semantics, though the example call helps contextualize usage. Baseline 3 is appropriate given the high schema coverage.
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 a specific purpose: determining whether content exists in server HTML or requires JavaScript. It lists concrete detection capabilities (SPA shells, word count, script bytes) and explicitly distinguishes itself from classic SEO, emphasizing AI visibility. This differentiates it from sibling tools like seo_audit and ai_crawler_access.
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 gives strong contextual guidance on when to use it: when evaluating AI assistant visibility, especially for client-rendered pages. It contrasts with classic SEO and provides an explicit example question, but does not name alternative sibling tools for comparison. The 'when-not' is implied rather than explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
robots_txt_checkrobots.txt CheckARead-onlyIdempotent
Fetch and parse a site's robots.txt per RFC 9309. Reports every user-agent group with its Allow/Disallow rules, the declared sitemaps, and any lines that could not be parsed. Flags the two failures that silently deindex a site: a wildcard Disallow: /, and a robots.txt that returns 5xx (which Google treats as "disallow everything").
Args:
site (string): domain or any URL on it, e.g. 'example.com'.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { found, status, group_count, sitemaps[], blocks_everything, groups[{agents[], rules[], crawl_delay}], parse_warnings[], findings[] }.
Example: "What does example.com's robots.txt allow?" -> robots_txt_check(site="example.com").
For AI-crawler specifics use ai_crawler_access instead — it resolves each known AI bot against these rules.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | Site domain or any URL on it, e.g. 'example.com'. Only the origin is used. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| found | Yes | |
| groups | Yes | |
| status | Yes | |
| findings | Yes | |
| sitemaps | Yes | |
| group_count | Yes | |
| parse_warnings | Yes | |
| blocks_everything | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive. The description adds substantial behavioral context: RFC 9309 compliance, handling of unparseable lines, and Google's interpretation of 5xx as 'disallow everything.' It also clarifies that only the origin of a URL is used. No contradictions 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 tightly structured with clear sections: overview, args, returns, example, and alternative tool. Every sentence provides value, including the RFC reference, the deindexing flags, and the return structure. No filler or 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?
For a read-only analysis tool, this description covers behavior, parameters, return fields, an example, and a pointer to an overlapping sibling. It also includes important SEO context (deindexing risks) and complies with RFC 9309. The Returns line enumerates top-level fields, so agents understand the output shape without a formal 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% — both `site` and `response_format` are fully described in the input schema, including examples and defaults. The description restates these parameters and adds an example, but does not materially expand beyond the schema's own documentation, so the baseline of 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?
The description opens with a specific verb+resource: 'Fetch and parse a site's robots.txt per RFC 9309.' It enumerates exact outputs (user-agent groups, Allow/Disallow rules, sitemaps, unparseable lines) and flags two critical failure modes. It also distinguishes itself from sibling `ai_crawler_access` by explicitly directing AI-crawler queries to that alternative.
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 a concrete example ('What does example.com's robots.txt allow?') and an explicit alternative tool for AI-crawler specifics, establishing clear when-to-use and when-not-to-use boundaries. The mention of deindexing flags also signals relevant SEO audit scenarios, giving strong contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seo_auditFull On-Page SEO AuditARead-onlyIdempotent
Fetch a page once and audit it across seven weighted sections — meta tags & social preview, heading structure, content quality, structured data, image SEO, links and crawlability — returning a 0–100 score, an A–F grade and a prioritised fix list.
This is the tool to start with for any "how is this page doing for SEO?" question; drill into the single-purpose tools afterwards for detail.
Args:
url (string): the page to audit.
include_geo (boolean): also score AI answer-engine readiness (default false).
check_broken_links (boolean): sample-verify that links resolve (default false).
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { score, grade, indexable, sections[{id, label, score, grade, weight, issues[]}], top_recommendations[], geo, findings[] }.
Example: "Audit the SEO of https://example.com/pricing" -> seo_audit(url="https://example.com/pricing"). Note: a noindex page or a site-wide robots.txt block caps the score, because nothing else matters until that is fixed. Errors: returns an error if the URL is unreachable, non-HTML, or returns an HTTP error.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| include_geo | No | Also score GEO (AI answer-engine) readiness. Adds ~2 requests. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
| check_broken_links | No | Sample up to 25 links and verify they resolve. Slower, but catches dead links. |
Output Schema
| Name | Required | Description |
|---|---|---|
| geo | Yes | |
| url | Yes | |
| grade | Yes | |
| score | Yes | |
| status | Yes | |
| fetch_ms | Yes | |
| findings | Yes | |
| sections | Yes | |
| final_url | Yes | |
| indexable | Yes | |
| redirect_hops | Yes | |
| top_recommendations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, etc.), the description adds meaningful behavior: it fetches the page once, caps the score on noindex/robots blocks, returns specific errors for unreachable/non-HTML/HTTP-error URLs, and mentions that include_geo adds requests and check_broken_links is slower. These details give the agent a realistic model of side effects and failure modes.
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 well-organized and front-loaded: a one-sentence functional summary, followed by usage guidance, args, returns, an example, a critical note, and error conditions. Each section earns its place and no redundant fluff exists; it is appropriately sized for a complex audit 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 tool's complexity (seven audit sections, four parameters, output schema), the description is remarkably complete: it covers inputs, outputs, edge-case behavior (noindex/robots), error conditions, and example invocation. The existence of an output schema reduces the need to detail return values, and the description still provides a compact return structure overview.
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 input schema already documents all four parameters with defaults and descriptions. The description's Args section mostly restates this information with slightly shorter wording. It adds only a small increment via the usage example and confirms the default output format, but does not materially deepen parameter understanding 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's function with a specific verb ('audit') and resource ('a page'), enumerating the seven weighted sections (meta tags, heading structure, content quality, etc.). It also distinguishes itself from the sibling single-purpose tools by positioning this as the comprehensive starting point for SEO questions.
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 explicitly says 'This is the tool to start with for any "how is this page doing for SEO?" question' and directs users to 'drill into the single-purpose tools afterwards for detail,' naming the alternative pattern. This gives clear when-to-use guidance and references the sibling tools without needing to enumerate them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sitemap_checkXML Sitemap CheckARead-onlyIdempotent
Discover, fetch and validate an XML sitemap. Finds it via the robots.txt Sitemap: directive, then falls back to /sitemap.xml, /sitemap_index.xml and /sitemap-index.xml. Handles sitemap indexes (following children) and gzipped sitemaps.
Validates: URL count against the 50,000 limit, uncompressed size against 50 MiB, presence and W3C-datetime validity, URLs pointing off-origin, http:// URLs, and duplicates.
Args:
site (string): domain or any URL on it.
sitemap_url (string, optional): explicit sitemap URL.
follow_children (number): child sitemaps of an index to follow (default 3).
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { found, type, url_count, child_sitemaps[], with_lastmod, invalid_lastmod[], newest_lastmod, off_origin_urls[], exceeds_url_limit, discovered_via, score, grade, findings[] }.
Example: "Check the sitemap for example.com" -> sitemap_check(site="example.com").
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | Domain or any URL on it, e.g. 'example.com'. | |
| sitemap_url | No | Explicit sitemap URL. Omit to discover it via robots.txt, then the conventional paths. | |
| follow_children | No | How many child sitemaps of an index to follow (default 3). | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| type | Yes | |
| bytes | Yes | |
| found | Yes | |
| grade | Yes | |
| score | Yes | |
| status | Yes | |
| entries | Yes | |
| findings | Yes | |
| url_count | Yes | |
| with_lastmod | Yes | |
| child_sitemaps | Yes | |
| discovered_via | Yes | |
| duplicate_urls | Yes | |
| newest_lastmod | Yes | |
| non_https_urls | Yes | |
| oldest_lastmod | Yes | |
| invalid_lastmod | Yes | |
| off_origin_urls | Yes | |
| exceeds_url_limit | Yes | |
| exceeds_size_limit | Yes | |
| child_sitemaps_followed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral context: discovery via robots.txt and fallback paths, handling of gzipped/indexed sitemaps, and specific validation checks including URL count and lastmod validity. 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 about 150 words but efficiently uses three structured segments: discovery, validation, and invocation with example. Every sentence contributes details about the tool's behavior or expected use, avoiding redundancy with schema or annotations.
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 tool of this complexity with rich schema annotations and an output schema, the description covers discovery logic, validation rules, parameters, return payload, and an example. It leaves no gaps about edge cases like sitemap indexes or gzipped sitemaps.
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 baseline is 3. The description repeats the schema parameter descriptions and adds an example mapping 'example.com' to the site parameter, but does not introduce new semantic information 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 uses specific verbs 'Discover, fetch and validate' with the resource 'XML sitemap', and distinguishes it clearly from sibling tools like robots_txt_check by focusing on sitemaps. It also enumerates specific validation checks, making the purpose unmistakable.
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 does not explicitly name alternative tools or when not to use it, but the example 'Check the sitemap for example.com' demonstrates a clear invocation. The description implies usage by stating what it does and how discovery works, but lacks explicit comparisons to siblings like link_audit or robots_txt_check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
structured_data_checkStructured Data (Schema.org) CheckARead-onlyIdempotent
Extract and validate JSON-LD, microdata and RDFa. Reports every @type found, flags JSON-LD blocks that fail to parse (those are invisible to search engines), and checks recognised types against Google's rich-result requirements — required properties that are missing, plus recommended ones worth adding.
Covers Article/BlogPosting/NewsArticle, Product, FAQPage, HowTo, Recipe, Event, Organization, LocalBusiness, Person, WebSite, BreadcrumbList, VideoObject, JobPosting, Course, Review and AggregateRating.
Args:
url (string): the page to check.
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { json_ld_blocks, microdata_items, parse_errors[], items[{type, properties[], missing_required[], missing_recommended[], valid}], types_found[], has_organization, has_breadcrumb, score, grade, findings[] }.
Example: "Does https://example.com/product have valid Product schema?" -> structured_data_check(url="https://example.com/product").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyse, e.g. 'https://example.com/blog/post'. The scheme defaults to https://. | |
| response_format | No | Output format: 'markdown' for a human-readable summary (default) or 'json' for the full structured payload. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| grade | Yes | |
| items | Yes | |
| score | Yes | |
| has_faq | Yes | |
| findings | Yes | |
| final_url | Yes | |
| has_person | Yes | |
| rdfa_items | Yes | |
| has_article | Yes | |
| has_website | Yes | |
| types_found | Yes | |
| parse_errors | Yes | |
| has_breadcrumb | Yes | |
| json_ld_blocks | Yes | |
| microdata_items | Yes | |
| has_organization | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the readOnlyHint annotation: it explains that unparseable JSON-LD is invisible to search engines, that it checks missing required and recommended properties, and that it returns a score/grade. No contradictions 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 well-structured with an action-focused first paragraph, a concise list of covered types, and a clear args/returns/example breakdown. It is appropriately sized and every section earns its place, though the type list is long but valuable.
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 2-param schema, rich output schema, and safe annotations, the description is complete for selection and invocation. It provides the full return structure, example usage, and supported types, leaving no critical 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?
Input schema covers 100% of parameters with descriptions, so baseline is 3. The description's Args section largely restates the schema (e.g., 'url (string): the page to check') without adding extra meaning beyond what the schema already provides.
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 extracts and validates JSON-LD, microdata, and RDFa, and reports @type found, parse errors, and Google rich-result requirements. This specific verb+resource combination distinguishes it from sibling tools like render_check or seo_audit, which cover different aspects.
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 example ('Does https://example.com/product have valid Product schema?') gives a concrete use case, and the list of covered types implies when the tool applies. It does not explicitly name alternatives or exclusions, but the purpose is so specific that usage context is clear.
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. Dates show when Glama detected each change.
17 tool updates
v1.0.0- First observed
ai_crawler_access - First observed
canonical_host_check - First observed
content_analysis - First observed
geo_audit - First observed
heading_structure - First observed
hreflang_check - First observed
image_seo_check - First observed
link_audit - First observed
llms_txt_check - First observed
meta_tags_check - First observed
redirect_trace - First observed
render_check - First observed
robots_txt_check - First observed
seo_audit - First observed
sitemap_check - First observed
social_preview_check - First observed
structured_data_check
TDQS
Each tool targets a distinct SEO/GEO facet: rendering, meta tags, social preview, headings, schema, content, images, robots, sitemap, links, hreflang, redirects, canonical host, and AI-specific crawler access. The three audit tools (seo_audit, geo_audit, link_audit) are clearly separated by scope, and potential overlaps like ai_crawler_access vs robots_txt_check are explicitly cross-referenced to prevent misselection.
The dominant pattern is `<topic>_check` (10 tools), with clear variants like `_audit`, `_trace`, and `_access`. Most names are snake_case noun-compounds, but a few outliers like `heading_structure` and `content_analysis` omit the action suffix, creating minor inconsistency. Still, the prefix always identifies the SEO facet, making the set predictable overall.
At 17 tools, the count sits at the upper edge of the comfortable range, but the broad SEO/GEO domain justifies the breadth. Each tool is single-purpose and non-redundant, covering everything from classic on-page SEO to AI-specific rendering and crawler access. The slight excess over the ideal 10-15 is offset by the logical grouping and clear entry-point audit tool.
The toolkit covers the core technical SEO lifecycle: crawlability (robots, sitemap, redirects, canonical), on-page elements (meta, headings, content, images, structured data), links (including broken checks), social previews, and GEO-specific concerns (render_check, ai_crawler_access, geo_audit, llms_txt). Minor gaps like performance and mobile-friendliness checks exist, but they are outside the primary focus and agents can work around them.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
- RampifyOAuthdev.rampify
SEO MCP server: crawl your site, find AI-visibility gaps, and ship the fix from your coding agent.
Run SEO + AI-visibility (GEO) audits from Claude, Cursor & other AI clients.
Free technical-SEO audit MCP: crawl a site, run checks, return an LLM-ready shareable report.
Free SEO, GEO, and AEO audits: analyze any page or domain, AI-crawler access, agent readiness.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceMCP server for website SEO + GEO analysis. Scan any URL to get scores across 5 categories (SEO, GEO, Performance, Security, Accessibility) with actionable fix recommendations. Enables AI coding assistants to audit websites and implement fixes autonomously.-
- AlicenseNot gradedqualityCmaintenanceOpen-source technical SEO crawler MCP server built on LibreCrawl. Runs full audits inside Claude, Cursor, or Codex — 50+ checks (hreflang, schema.org, security headers, WAF detection on 200-OK pages), chunked-progressive engine for large sites, ephemeral by design (server forgets every audit after download).38MIT
- AlicenseAqualityDmaintenanceEnables AI agents to perform comprehensive SEO audits on web pages, including meta tags, headings, links, images, performance, and more, via a CLI or MCP server.181MIT

atomno-mcp-seo-auditofficial
AlicenseAqualityAmaintenanceMCP server for technical SEO audits, powered by the detail.web engine. Run a site audit straight from your AI agent to get a health score, issues across 8 categories, and a GEO sub-score.81MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/OrtaMarco/seo-geo-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
social_preview_checkSocial Preview (Open Graph & Twitter Card) CheckARead-onlyIdempotent
Validate the tags that build link-preview cards on X, LinkedIn, Facebook, Slack, WhatsApp and Discord: og:title, og:description, og:image, og:url, og:type, og:site_name and the twitter:* family. Optionally verifies the preview image actually loads, and flags the classic bug of a relative og:image URL (social scrapers require absolute URLs).
Args:
url (string): the page to check.
check_image (boolean): verify the og:image resolves (default true).
response_format ('markdown' | 'json'): output format (default 'markdown').
Returns: { open_graph{}, twitter{}, og_image_url, og_image_reachable, og_image_status, score, grade, findings[] }.
Example: "Why does my link preview look broken on LinkedIn?" -> social_preview_check(url="https://example.com/post").
Output Schema
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is known. The description adds valuable behavioral context: the optional HEAD request to verify og:image, the detection of relative og:image URLs, and the return fields. This goes beyond the annotations without contradicting them.
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 well-structured and front-loaded with the purpose. It uses concise bullet-like sections for args and returns, includes an example, and every sentence contributes to understanding the tool. No filler or 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 the tool's moderate complexity, the description covers the core functionality (tag validation, image check, relative URL flag), the input parameters, and the return object. The presence of an output schema and annotations reduces the burden, and the example clarifies the use case. It is complete for an agent to select and invoke the tool correctly.
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% (all 3 parameters have descriptions, defaults, and enums). The description merely repeats the parameter names and defaults in a more compact form, adding no new semantic meaning beyond what the schema already provides. The example usage is a minor addition but not enough to raise the score above the 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 uses a specific verb ('Validate') and identifies the resource (social preview tags for link-preview cards on X, LinkedIn, Facebook, Slack, WhatsApp, Discord). It lists the exact tag families (og:*, twitter:*) and distinguishes itself from sibling tools like meta_tags_check by focusing specifically on social preview behavior.
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 gives a concrete example ('Why does my link preview look broken on LinkedIn?') that clearly signals when to use the tool. It does not explicitly mention alternatives or exclusions, so it falls short of a 5, but the context is strong and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.