technical-seo-mcp
This server provides 14 MCP tools for technical and on-page SEO audits on live websites, returning actionable, severity-rated findings in Markdown, JSON, or HTML. It runs locally via stdio with no external API keys.
Full-site audits:
seo_full_auditruns the complete technical checklist on a single URL;crawl_auditcrawls up to 100 pages (seeded from sitemap or internal links) and aggregates site-wide issues like broken links, redirect chains, duplicate titles/descriptions, and orphan URLs.Technical SEO checks:
check_renderingdetects JS shells;check_httpsverifies SSL and HTTP→HTTPS redirects;check_page_essentialsaudits title, meta description, H1, canonical, Open Graph, viewport, image lazy-loading, and dimensions;check_cachinginspects Cache-Control, compression, ETag/Last-Modified;check_sitemapvalidates sitemap.xml;check_robotsverifies robots.txt;check_structured_dataextracts and validates JSON-LD;check_ai_crawlersreports allow/block status for GPTBot, ClaudeBot, Google-Extended, PerplexityBot, and CCBot, and checks llms.txt/noindex;check_url_structureanalyzes clean-URL best practices offline (up to 500 URLs);check_hreflangvalidates international hreflang annotations.On-page SEO:
check_keyword_placementanalyzes keyword presence in titles, headings, meta, URL, image alt, and density (up to 25 keywords).Core Web Vitals:
run_lighthouseruns Lighthouse to measure LCP, CLS, INP/TBT, and performance/SEO scores.Output & workflow: Markdown for inline reading, JSON for CI, standalone HTML for sharing;
compare_to_baselinediffs against previous runs to highlight new failures and fixes; supports progress notifications, cancellation, and localhost/private IP auditing.
Verifies Google-Extended (Google's AI training crawler) access by analyzing robots.txt and header/meta robots directives as part of the AI-crawler audit.
Runs Google Lighthouse performance and SEO audits on a URL, reporting scores and Core Web Vitals (LCP, CLS, INP) with actionable speed opportunities.
Checks whether PerplexityBot (Perplexity's AI crawler) is allowed to crawl the site, analyzing robots.txt and noindex/nofollow signals.
Click on "Deploy 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., "@technical-seo-mcpWhy isn't my homepage ranking for 'SEO tools'?"
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.
technical-seo-mcp
An MCP server that audits websites for technical and on-page SEO — so you can ask your AI assistant "why isn't this page ranking?" and get a specific, actionable answer.
14 tools covering crawlability, HTTPS, Core Web Vitals, sitemaps, robots.txt,
structured data, international SEO (hreflang), keyword placement, and AI-crawler access. Reports come back as
Markdown, JSON for CI, or a standalone HTML file you can open and send to a client.
No API keys. No accounts. Every check runs directly against the live site.
Table of contents
Related MCP server: SEOctopus
Why this exists
SEO tools tend to give you a dashboard. What you usually want is an answer.
Because this runs as an MCP server, your assistant can chain a diagnosis:
audit the page, notice the h1 is missing, read the actual template file,
and propose the fix — in one conversation. The report is designed for that:
every finding says what is wrong and how to fix it, with paste-ready snippets
where they help.
It is also deliberately small: two runtime dependencies, no database, no telemetry, no signup.
Features
14 focused tools — one full audit, one site crawl, and twelve individual checks you can run in isolation
AI-crawler visibility — per-bot
robots.txtstatus for GPTBot, ClaudeBot, Google-Extended, PerplexityBot, and CCBot, plusllms.txtandnoindexdetection in both theX-Robots-Tagheader and the meta tagSite-wide aggregation —
crawl_auditreports "this problem is on 80% of your pages, fix it once in the template" instead of repeating it per pageThree output formats — Markdown inline, JSON for CI pipelines, or a shareable HTML file
Regression tracking —
compare_to_baselinediffs against your last run and reports new failures, new warnings, and fixed itemsActionable findings — severity-rated ✅/⚠️/❌, each with the concrete fix
Fast — every URL is fetched exactly once per audit and shared across checks
Safe by construction — see Security
Screenshots
HTML report (output: "html") — a standalone file you can open, print, or
send to a client. Sections with findings expand by default; all-clear sections
stay collapsed. All CSS is inlined and nothing is fetched, so it works offline.

Prerequisites
Requirement | Version | Notes |
Node.js | ≥ 20.10 | Uses built-in |
An MCP client | any | See supported clients. |
Google Chrome | any recent | Only for |
Chrome is auto-detected on macOS, Linux, and Windows. Set CHROME_PATH if yours
lives somewhere unusual. Lighthouse itself is fetched on demand via npx on
first use — no install step, but the first run is slower.
Quick start
Claude Code
claude mcp add technical-seo -- npx -y technical-seo-mcpThen ask: "Run a full technical SEO audit on example.com"
Three similar names, one project — worth knowing before you edit any config:
Name
What it is
technical-seo-mcpthe npm package — what you install
seo-mcpthe command it installs (
technical-seo-mcpalso works)
technical-seothe server name your client shows; you choose this in the config
Only the package name is fixed. Name the server whatever you like —
seo,audit, anything — by changing the label in your client config.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"technical-seo": {
"command": "npx",
"args": ["-y", "technical-seo-mcp"]
}
}
}Config file locations:
macOS —
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows —
%APPDATA%\Claude\claude_desktop_config.jsonLinux —
~/.config/Claude/claude_desktop_config.json
Restart Claude Desktop after editing.
Cursor / Windsurf / other clients
Any client that speaks MCP over stdio works with the same command:
{
"mcpServers": {
"technical-seo": {
"command": "npx",
"args": ["-y", "technical-seo-mcp"]
}
}
}Global install
If you prefer a pinned binary over npx resolution:
npm install -g technical-seo-mcp
seo-mcp --versionThen use "command": "seo-mcp" with no args in your client config.
From source
git clone https://github.com/sourav2024/seo-mcp
cd seo-mcp
npm install
npm run verify # lint + tests + MCP protocol smoke test
claude mcp add technical-seo -- node "$PWD/server.js"Verify the setup
Two things are worth checking separately, because they fail for different reasons.
1. Does the server itself run? This rules out Node version and install problems:
npx -y technical-seo-mcp --version # prints e.g. 1.0.02. Did your client actually connect? A server that runs fine can still fail to register — usually a typo in the config JSON or a config file that wasn't reloaded.
Claude Code — run
/mcp. You should seetechnical-seolisted as connected.Claude Desktop — the tools appear under the 🔨 icon in the message box. Restart the app after editing the config; it does not reload on its own.
Any client — ask "What technical SEO tools do you have?" The assistant should list
seo_full_audit,crawl_audit, and the twelvecheck_*tools.
3. Run your first audit. This confirms the whole path works end to end:
"Run a full technical SEO audit on example.com"
You should get a report with ✅/⚠️/❌ per check. If any step fails, see Troubleshooting.
There is no build step — the project is plain ESM and runs directly on Node 20+.
Supported MCP clients
Client | Status | Notes |
Claude Code | ✅ Tested |
|
Claude Desktop | ✅ Tested | Via |
Cursor | — Untested | Standard stdio MCP config |
Windsurf | — Untested | Standard stdio MCP config |
Zed | — Untested | Standard stdio MCP config |
Continue.dev | — Untested | Standard stdio MCP config |
Custom (MCP SDK) | ✅ | Anything speaking MCP over stdio |
"Untested" means the server follows the stdio MCP spec and should work, but no maintainer has verified it. If you use one of these, a confirmation (or a bug report) is welcome.
Protocol support
stdio transport (no HTTP — see Security)
Tools annotated
readOnlyHint, since audits never mutate the target siteTool failures return
isError: trueresults rather than protocol errors, so the model can read and react to themProgress notifications for long operations: pass a
progressTokenandcrawl_audit,seo_full_audit, andrun_lighthousereport as they goCancellation: cancelling a request stops the crawl between pages and terminates a running Lighthouse process
structuredContentonoutput: "json", so a client can consume the result object without re-parsing a string
Tools
Site-level audits
Tool | Checks |
| Everything below on one URL, in one report with ✅/⚠️/❌ per item (except Lighthouse). Supports |
| Crawls up to |
Technical SEO
Tool | Checks |
| Fetches the page without JavaScript and detects client-side JS shells that Google/AI crawlers struggle to read — recommends SSR/SSG when needed |
| Valid SSL certificate on |
| Clean-URL rules: ≤ ~60 chars, lowercase, hyphens not underscores, no accents, no messy query params, shallow hierarchy. Offline — makes no requests |
|
|
|
|
|
|
|
|
| International SEO. Validates BCP-47 hreflang values (catching |
| Extracts schema.org JSON-LD (tolerates arrays and |
| Effective allow/block status per bot — GPTBot, ClaudeBot, Google-Extended, PerplexityBot, CCBot — and the |
| Lighthouse performance + SEO scores and Core Web Vitals: LCP (≤ 2.5 s), CLS (≤ 0.1), INP (≤ 200 ms — falls back to TBT when a lab run can't simulate interactions), plus top speed opportunities. Mobile by default. Slow (~1–2 min); requires Chrome |
On-page SEO
Tool | Checks |
| Where target keywords appear: |
Not covered, by design
Keyword research — search volume and difficulty need external paid data (Ahrefs, Semrush, Google Keyword Planner)
Backlinks / off-page SEO — requires a crawled link index
Rendered-page visual checks — pair with Playwright MCP for screenshots and JS-rendered inspection
Usage examples
Ask in plain language; the client picks the tool.
You say | Tool used |
"Run a full technical SEO audit on example.com" |
|
"Crawl example.com and find site-wide SEO issues" |
|
"Audit example.com and give me an HTML report I can send to a client" |
|
"Can GPTBot and ClaudeBot crawl my site?" |
|
"Is my LCP under 2.5 seconds on mobile?" |
|
"Check keyword placement for 'freight broker software' on example.com" |
|
"Validate my JSON-LD" |
|
"I target the US and Canada — is my hreflang set up right?" |
|
"Do my hreflang alternates all link back to each other?" |
|
"Re-audit and tell me what changed since last time" |
|
"Why isn't this page indexed?" |
|
A useful pattern: audit, then fix
Because the assistant has both the audit and your codebase, you can go straight from finding to patch:
"Audit localhost:3000, then fix everything you found in the Next.js layout."
CI integration
output: "json" gives you machine-readable results:
{
"target": "https://example.com",
"generated_at": "2026-07-27T10:00:00.000Z",
"counts": { "pass": 18, "warn": 4, "fail": 2 },
"sections": [{ "section": "Page essentials", "checks": [{ "severity": "fail", "text": "..." }] }]
}Fail a build when counts.fail > 0, or use compare_to_baseline to fail only on
new regressions:
SEO_MCP_STATE_DIR=./.seo-baselines # commit these to track over timeOutput formats
seo_full_audit and crawl_audit accept:
output: "markdown"(default) — the report inline, ✅/⚠️/❌ per check.output: "json"— structured per-check severity plus{pass, warn, fail}counts, ready for CI or a dashboard.output: "html"— writes a standalone HTML file and returns its path plus a one-line summary. The markup never goes through the MCP transport, so it costs no context. Sections with findings expand, all-clear sections collapse, and fix snippets render as copyable code blocks. All CSS is inlined and nothing is fetched, so it works offline, overfile://, and as an email attachment. Light/dark aware and print-friendly.output_path— a destination file or directory. Defaults to./seo-report-<host>-<date>.html(seo-crawl-…for crawls).
compare_to_baseline: true— prepends a diff: new failures, new warnings, and fixed items since the last run. The first run saves a baseline.
Baselines are stored per target, one file each, under your OS state directory
(~/Library/Application Support/seo-mcp on macOS, $XDG_STATE_HOME/seo-mcp or
~/.local/state/seo-mcp on Linux, %LOCALAPPDATA%\seo-mcp on Windows) — never
inside the package, which is read-only under npx. Override with
SEO_MCP_STATE_DIR.
Configuration
Every setting is an optional environment variable with a safe default.
Invalid values fall back to the default and log a warning rather than crashing.
See .env.example for the fully commented list.
This server does not read .env files — MCP servers are launched by a client, so
set variables in the client config:
{
"mcpServers": {
"technical-seo": {
"command": "npx",
"args": ["-y", "technical-seo-mcp"],
"env": {
"SEO_MCP_LOG_LEVEL": "debug",
"SEO_MCP_CRAWL_DELAY_MS": "1000"
}
}
}
}Variable | Default | Purpose |
|
|
|
|
|
|
|
| Per-request timeout (1000–120000) |
|
| Timeout for HTTPS/redirect probes |
|
| Cap on bytes read per response (64 KB–256 MB) |
|
| Redirect hops before giving up (1–20) |
|
| Politeness delay between crawled pages (0–60000) |
|
| Hard ceiling on |
|
| Parallel page fetches during a crawl (1–8). Raise only for sites you own |
|
| Lighthouse run timeout (30000–600000) |
| OS default | Where baselines are stored |
|
| Allow auditing localhost / private IPs — see Security |
| auto | Chrome binary for Lighthouse |
There are no secrets or API keys. Nothing is ever logged that could carry a credential: URL userinfo and credential-bearing query parameters are stripped from log output, and sensitive field names are redacted.
Architecture
server.js MCP tool registration only — no audit logic
src/
config.js All tunables; validated env vars with safe defaults
logger.js Structured stderr logging with redaction
url-guard.js URL validation and SSRF / private-host checks
tool-result.js MCP result shapes and error-message mapping
version.js Version and identity constants
checks/
index.js Registry — re-exports every check
helpers.js Shared fetch, redirect walking, stemming, report parsing
rendering.js JS-shell detection
https.js SSL + http→https redirect classification
urls.js Clean-URL rules
page-essentials.js Title/meta/h1/canonical/OG/viewport/images
caching.js Cache-Control, compression, ETag, size
sitemap.js Sitemap validation, URL sampling, collection
robots.js robots.txt validation
keywords.js Keyword placement + density
structured-data.js JSON-LD / schema.org validation
ai-crawlers.js Per-bot robots status, llms.txt, noindex detection
lighthouse.js Core Web Vitals via npx lighthouse + Chrome detection
crawl.js Multi-page crawl + aggregation
report.js markdown/JSON/HTML output + baseline diffing
html-report.js Standalone HTML renderer (inlined CSS, no subresources)
test/ node:test suites (fixtures, output, guards, logging, config)
scripts/smoke.js End-to-end MCP wire-protocol checkThree design decisions worth knowing:
server.jsholds no audit logic;checks/never touches MCP. That boundary is what makes every check directly unit-testable without a client.Every URL is fetched exactly once per audit. Checks accept an optional prefetched
pageand a shared resource cache, so a full audit makes 5 requests — the page,robots.txt,sitemap.xml,llms.txt, and onehttp://redirect probe — instead of re-requesting the page for each of the five checks that need it.Failures are contained.
Promise.allSettledmeans an unreachable sitemap degrades to one ❌ line instead of losing the whole report, and every tool handler is wrapped so nothing can escape into the transport.Crawl workers share one queue. Raising
SEO_MCP_CRAWL_CONCURRENCYadds workers that pull from the same queue, so link discovery still reaches pages found by other workers and no URL is fetched twice.
Troubleshooting & FAQ
Common problems — connection failures, missing Chrome, timeouts, permission errors — and answers to recurring questions are in docs/troubleshooting.md.
The fastest first step for almost any issue is debug logging:
{ "env": { "SEO_MCP_LOG_LEVEL": "debug", "SEO_MCP_LOG_FORMAT": "text" } }All logs go to stderr — stdout carries the MCP protocol.
Roadmap
Not commitments — ideas, roughly in priority order. Feedback welcome.
Next
check_images— deeper image audit (dimensions, formats,srcset, alt quality)Core Web Vitals from real field data (CrUX API) alongside lab numbers
Internal-link graph analysis: orphan pages, click depth, anchor-text distribution
Later
DNS-rebinding protection (resolve and pin the address before connecting)
Configurable crawl concurrency with per-host rate limiting
MCP resources for browsing saved baselines
MCP prompts for common workflows ("pre-launch checklist", "fix my Core Web Vitals")
Optional JS rendering behind a flag, for SPA-heavy sites
Under consideration
A GitHub Action wrapping the JSON output for PR comments
Competitor comparison (audit N URLs side by side)
Contributing
Contributions are welcome — especially new checks and false-positive fixes. Start with CONTRIBUTING.md, which covers the layout, how to add a check, and what makes a good one.
git clone https://github.com/sourav2024/seo-mcp
cd seo-mcp
npm install
npm run verify # lint + tests + MCP smoke testBy participating you agree to the Code of Conduct.
Security
This server is designed to run locally over stdio, where the URLs it fetches come from you. It defends against hostile content from audited sites: URL scheme validation, per-hop redirect re-validation, HTML escaping in reports, prototype-pollution-safe parsing, body-size caps, and no-shell subprocess spawning.
Two things to know:
Auditing private hosts works by default (
localhost,10.x,192.168.x). That's intentional and useful locally.If you expose this to input you don't control, set
SEO_MCP_ALLOW_PRIVATE_HOSTS=false. That enables SSRF protection, blocking private, loopback, and link-local targets — including the169.254.169.254cloud-metadata address — and re-checking every redirect hop.
Full threat model, known limitations, and a hardening checklist: SECURITY.md.
Found a vulnerability? Report it privately — please don't open a public issue.
Support this project
This is free and MIT-licensed, and it stays that way. If it saved you an afternoon of SEO debugging, you can sponsor the work on GitHub.
Things that help just as much and cost nothing: starring the repo, filing a good bug report, or telling me which check produced a false positive on your site.
License
MIT © sourav2024
Acknowledgements
Model Context Protocol and the TypeScript SDK, by Anthropic
Google Lighthouse for Core Web Vitals measurement
Zod for input schema validation
Google's Search Central documentation and the schema.org vocabulary, which define what most of these checks are checking against
Available Tools
13 toolscheck_ai_crawlersCheck AI crawler access & indexabilityARead-only
Report the effective robots.txt allow/block status for GPTBot, ClaudeBot, Google-Extended, PerplexityBot, CCBot, and the * default (flagging blanket Disallow: / without per-bot overrides). Checks for /llms.txt, and flags noindex/nofollow in both the X-Robots-Tag response header and — critical failures invisible to a plain robots.txt check.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to check (robots.txt/llms.txt are checked at its origin) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint annotations already covering safety, the description adds valuable behavioral context: it enumerates the exact bots checked, the handling of blanket disallow, and the sources for noindex/nofollow (header and meta tag). This goes beyond the annotations and does not contradict 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 two sentences that front-load the primary purpose and follow with critical details. Every phrase earns its place, and there is no unnecessary verbosity.
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 (checking multiple bots, headers, meta tags) and no output schema, the description covers the full scope of checks. It lacks an explicit statement about the report format or error behavior, but the 'Report' framing plus the listed checks gives sufficient context for an agent.
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 schema already provides 100% description coverage for the single 'url' parameter, including that robots.txt/llms.txt are checked at the origin. The tool description confirms this behavior but adds no new parameter-level semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report') and resource ('effective robots.txt allow/block status for GPTBot, ClaudeBot, Google-Extended, PerplexityBot, CCBot, and the * default') and additional checks (llms.txt, noindex/nofollow via X-Robots-Tag and meta robots). It clearly distinguishes from the sibling 'check_robots' by focusing on AI crawlers and indexability signals.
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 implies when to use this tool by noting 'critical failures invisible to a plain robots.txt check', which differentiates it from a generic robots check. However, it does not explicitly state 'use this instead of check_robots' or list exclusions, so it stops short of full usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_cachingCheck caching & delivery headersARead-only
Inspect Cache-Control, content-encoding (gzip/brotli), ETag/Last-Modified headers and HTML document size for easy speed wins.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to check, e.g. https://example.com |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful context by listing exactly which headers are inspected (Cache-Control, content-encoding, ETag/Last-Modified) and the HTML document size. It does not detail network fetch behavior or failure modes, but that is partially covered by openWorldHint and the read-only nature.
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 one concise sentence, immediately starting with the action verb 'Inspect' and enumerating specific headers without any verbose or redundant phrasing. Every word contributes to understanding the tool's purpose and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, one-parameter read-only tool with clear annotations and a detailed list of what is inspected, the description is fairly complete. It does not specify the return format, but with no output schema and the tool's straightforward nature, this is a minor gap.
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 schema provides a 100% descriptive coverage for the single 'url' parameter with a clear example ('Page URL to check, e.g. https://example.com'). The description does not add extra parameter semantics beyond what the schema already includes, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Inspect') and resource ('Cache-Control, content-encoding, ETag/Last-Modified headers and HTML document size'), which precisely defines the tool's function. It also distinguishes itself from sibling audit tools by focusing on caching and delivery headers rather than general SEO or rendering checks.
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 implies usage for evaluating caching headers and speed optimization opportunities, but it provides no explicit when-to-use or when-not-to-use guidance, nor does it reference alternatives among the sibling tools. The context is present but not clarified with exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_httpsCheck HTTPS / SSLARead-only
Verify the site serves https:// with a valid certificate and that http:// permanently (301) redirects to https://.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to check, e.g. https://example.com |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, covering safety. The description adds useful behavioral details by defining what constitutes the check (valid certificate and 301 redirect), which goes beyond the generic tool name. It does not mention response format or edge cases, but given the annotation coverage, this is adequate.
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 a single, well-structured sentence that delivers all necessary information without any fluff. It is concise and front-loaded with the core behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description adequately explains the check. The return value is not explicitly stated, but in the context of sibling check tools, 'verify' implies a pass/fail result, making it reasonably 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?
The input schema fully describes the url parameter with an example and constraints, so schema coverage is 100%. The description does not add extra semantics beyond what the schema already provides, matching the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's function with a specific verb ('verify') and two concrete checks: serving https:// with a valid certificate and http:// 301 redirecting to https://. This strongly differentiates it from sibling tools like check_url_structure or check_caching.
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 context for use is clear: when you need to confirm HTTPS enforcement and proper redirect behavior. It does not explicitly mention exclusions or alternatives, but the specialized scope is evident from the description and sibling names, so it meets the 'clear context, no exclusions' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_keyword_placementCheck on-page keyword placementARead-only
Analyze where target keywords appear on a page: (and whether it's front-loaded), URL path, meta description, H1, H2 subheadings, first ~100 words, image alt text, and keyword density (flags both thin usage and stuffing). Matching is plural/stem-tolerant ('freight broker' matches 'freight brokers'). Pass keywords as an array (one report section per keyword); a single keyword string is also accepted. Returns ✅/⚠️/❌ per placement.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyze | |
| keyword | No | Single keyword (backward-compatible alternative to keywords) | |
| keywords | No | Target keywords/phrases — one report section each |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds valuable behavioral context: matching is plural/stem-tolerant, flags both thin usage and stuffing, returns emoji statuses, and accepts both array and string input. This goes beyond the schema and annotations, though it doesn't cover side effects (which are minimal for a read-only tool).
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 a single paragraph with clear, information-dense content. Every sentence adds value: placement locations, matching behavior, input flexibility, and output format. Slightly dense but efficient, no wasted words.
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 tool has 3 parameters, no output schema, but the description compensates by listing what elements are checked, how input is handled, and the return format. It's complete enough for an agent to select and invoke correctly, though it doesn't describe the exact output structure (e.g., JSON shape) which would be helpful if no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (all params have descriptions), so baseline is 3. The description adds meaning by explaining how keywords are used (one report section per keyword), accepts a single string alternative, and describes the matching tolerance—adding value beyond the schema's basic descriptions.
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 analyzes where target keywords appear on a page and lists specific elements (title, URL, meta description, H1, H2, first 100 words, image alt text, keyword density). It distinguishes from siblings like seo_full_audit by focusing specifically on keyword placement, not a general SEO 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 indicates when to use this tool: to analyze keyword placement on a single page. It provides details on input formats (array or single string) and matching behavior (plural/stem-tolerant). However, it doesn't explicitly contrast with sibling tools or state when not to use it, though the specialized scope implies usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_page_essentialsCheck on-page essentialsARead-only
Check a page's title, meta description, single h1, canonical tag, Open Graph tags, responsive viewport meta (mobile-first), image lazy-loading, WebP/AVIF usage, and explicit image width/height (CLS risk).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to check, e.g. https://example.com |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, indicating a safe, read-only network operation. The description adds context by listing the checks performed, but it does not disclose additional behavioral details like the return format or potential failure modes. Since annotations cover the safety profile, the description's extra behavioral context is modest, warranting a 3 rather than higher.
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 a single sentence that packs in many specific items, but it's not overly long and each item is relevant. It could be structured as bullet points for easier scanning, but the list format is efficient and avoids unnecessary verbiage.
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 simple input (one URL) and strong annotations, the description fully enumerates the scope of what is checked, giving an agent a complete picture. It does not explain the output format, but since there is no output schema, this is a minor gap. The description is sufficiently complete for the tool's simplicity.
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 has 100% coverage for the single 'url' parameter, including a description and example. The tool description does not add further meaning about parameter usage beyond what the schema already provides, so it aligns with the baseline score 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 what the tool does with a specific verb 'Check' and enumerates the exact on-page elements it verifies (title, meta description, H1, canonical, Open Graph, viewport, lazy-loading, image formats, CLS). This list explicitly distinguishes it from sibling tools like check_url_structure or check_rendering, which target different SEO 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 description provides clear context for when to use the tool: to verify a set of specific on-page HTML essentials. However, it does not explicitly mention alternatives (e.g., seo_full_audit for a broader audit) or specify when not to use it, so it lacks explicit exclusions but gives enough context for an agent to infer appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_renderingCheck server-rendered HTMLARead-only
Fetch a page without executing JavaScript and detect whether it serves real server-rendered HTML or an empty client-side JS shell (hard for Google/AI to interpret).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to check, e.g. https://example.com |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses a key behavioral trait: it fetches without executing JavaScript. This is non-obvious and adds context about how the check works and what it detects. It also explains the practical implication for search engines/AI, which is valuable behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is concise and front-loaded with the main action ('Fetch a page without executing JavaScript'). Every phrase adds value, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers the essential purpose and behavior. It could optionally describe the return format, but that is not necessary for understanding what the tool does. The context about Google/AI interpretability adds completeness.
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 has 100% coverage with a clear description for the single 'url' parameter. The tool description does not add additional parameter-specific semantics, so the baseline score of 3 is appropriate given the schema's completeness.
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 ('fetch', 'detect') and resource ('server-rendered HTML vs client-side JS shell'), clearly distinguishing it from sibling audit tools that check different aspects like URL structure or HTTPS. It unambiguously states what the tool does.
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 implies the tool is for checking rendering behavior and why it matters ('hard for Google/AI to interpret'), giving clear context for when to use it. However, it does not explicitly mention alternatives or exclusion criteria, though none of the sibling tools directly overlap with this specific rendering check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_robotsCheck robots.txtARead-only
Fetch /robots.txt, verify it exists and is valid (not an HTML page or redirect), references the sitemap, and does not block the entire site.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Any URL on the site — the origin's /robots.txt is checked |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint. The description adds concrete behavioral details: fetching /robots.txt, checking for HTML/redirects, sitemap reference, and site-wide block. This goes beyond the annotations and gives the agent a clear picture of the operation.
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 a single, well-structured sentence that front-loads the action ('Fetch') and lists all checks without redundancy. Every phrase adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema and read-only annotations, the description is quite complete. It covers what is fetched and the validation logic, though it doesn't describe the return format, which is a minor gap.
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 100% coverage with the description 'Any URL on the site — the origin's /robots.txt is checked'. The tool description adds no further parameter detail, so baseline 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 states a specific verb 'Fetch' and resource '/robots.txt', with explicit verification criteria (existence, not HTML/redirect, sitemap reference, no site-wide block). This clearly distinguishes it from sibling tools like check_sitemap and check_ai_crawlers.
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 clearly implies the tool is for validating robots.txt, but it does not explicitly state when to use it versus alternatives like check_sitemap. However, the purpose is unambiguous enough that an agent would know when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_sitemapCheck sitemap.xmlARead-only
Fetch /sitemap.xml, count entries, flag admin/cart/checkout/internal-search URLs, sample up to 10 URLs to verify they return 200 without redirects, and check lastmod presence/freshness.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Any URL on the site — the origin's /sitemap.xml is checked |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the readOnlyHint and openWorldHint annotations: it samples up to 10 <loc> URLs and verifies they return 200 without redirects, and it checks lastmod freshness. These are concrete actions that inform the agent about network calls and validations. However, it does not disclose details like potential timeouts or rate limits, so it stops short of a perfect score.
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 a single sentence that packs all key actions efficiently. It is front-loaded with the fetch action and preserves clarity by using a list-like structure. No wasted words.
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?
Despite lacking an output schema, the description outlines all the checks performed: fetching the sitemap, counting entries, flagging specific URLs, sampling for HTTP status, and checking lastmod. This gives the agent a solid understanding of the tool's behavior. The only missing piece is a description of the output format, which would be helpful but is not critical given the detailed action list.
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 schema description for the 'url' parameter already fully explains its semantics: 'Any URL on the site — the origin's /sitemap.xml is checked'. With 100% schema coverage, the description adds no extra parameter-level meaning, so the baseline score 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 clearly identifies the tool's primary action ('Fetch /sitemap.xml') and enumerates specific checks (count entries, flag admin/cart/checkout/internal-search URLs, sample 10 URLs for HTTP 200 without redirects, check lastmod presence/freshness). This is a specific verb+resource combination that distinguishes it from sibling tools like crawl_audit or check_url_structure.
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 context for when to use the tool: to audit a site's sitemap.xml. It does not explicitly state when not to use it or name alternative tools, but the scope is unambiguous given the sibling list. This aligns with 'clear context, no exclusions' rather than explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_structured_dataCheck structured data (JSON-LD)ARead-only
Extract and validate schema.org JSON-LD on a page (tolerates arrays and @graph). Checks Organization (incl. sameAs links), SoftwareApplication (name/description/applicationCategory/offers), FAQPage (Question/acceptedAnswer structure), and BreadcrumbList. Flags malformed JSON-LD blocks and provides a ready-to-paste Organization example when none exists.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to analyze |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description adds valuable behavioral detail: tolerates arrays and @graph, flags malformed JSON-LD, checks specific schema properties, and provides a ready-to-paste Organization example when none exists. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at three sentences, front-loaded with the primary action, and every additional detail (tolerated structures, specific checks, fallback behavior) earns its place. No redundant or filler content.
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 core behavior, including what it validates and how it handles malformed or missing JSON-LD. Given the simple parameter schema and lack of output schema, it is sufficiently complete, though a brief note on return format would make it fully comprehensive.
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 has full coverage (100%) for the single 'url' parameter, and the description does not add additional parameter-level semantics. The baseline of 3 applies because the schema already documents the parameter adequately.
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 ('Extract and validate') and resource ('schema.org JSON-LD on a page'), and enumerates specific entity types checked (Organization, SoftwareApplication, FAQPage, BreadcrumbList). This clearly distinguishes it from sibling SEO tools like check_https or run_lighthouse.
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: when a page's structured data needs to be validated or extracted. It does not explicitly mention alternatives or exclusions, but the detailed scope of checks makes the use case evident in the context of sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_url_structureCheck clean-URL rulesARead-only
Analyze one or more URLs against clean-URL best practices: ≤ ~60 chars, lowercase, hyphens not underscores, no accents/special chars, no messy query params, shallow hierarchy. Offline — no requests are made.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | URLs to analyze |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, and the description adds the valuable behavioral detail that no requests are made (offline). It also enumerates the specific heuristics used, giving more transparency about what the analysis checks.
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 two sentences: the first states the action and criteria, the second notes the offline behavior. It is tightly written with no redundant words or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (one parameter, no output schema) and the presence of the offline disclaimer, the description is sufficient. It could possibly mention what kind of result is returned, but this is not essential for a simple analysis tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the single parameter 'urls' completely (100% coverage), so the description doesn't need to add much. It mentions 'one or more URLs' which aligns with the schema, but adds no new semantic detail beyond what is already provided.
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 analyzes URLs against clean-URL best practices, listing specific criteria (length, lowercase, hyphens, etc.). It distinguishes itself from sibling tools by focusing solely on URL structure rather than rendering, crawling, or other SEO 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 description makes it clear when to use this tool (for checking URL structure) and highlights that it is offline, implying it can be used without making requests to the site. However, it does not explicitly name alternatives or describe when not to use it, so it falls slightly short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crawl_auditCrawl and audit multiple pagesARead-only
Crawl a site (seeded from sitemap.xml, sitemap-index aware; falls back to following internal links) and audit up to max_pages pages with a polite delay. Each page is fetched once and shared across checks. Aggregates: site-wide issues (same problem on >50% of pages — fix once in the template), broken internal links (404s), multi-hop redirect chains, duplicate titles/meta descriptions, orphan sitemap URLs, and remaining per-page issues.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Site URL to crawl, e.g. https://example.com | |
| output | No | Report format. markdown (default) returns the report inline; json returns per-check severity and {pass, warn, fail} counts; html writes a standalone, shareable HTML file to disk and returns its path plus a short summary (use when the user wants a report to open, save, or send) | markdown |
| max_pages | No | Maximum pages to audit (default 25, max 100) | |
| output_path | No | html only — destination file or directory. Defaults to ./seo-report-<host>-<date>.html in the current directory | |
| compare_to_baseline | No | Diff against (and update) the saved baseline for this target — reports new failures/warnings and items fixed since the last run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the readOnlyHint and openWorldHint annotations: it discloses a polite delay, that each page is fetched once and shared across checks, the '>50% of pages' heuristic for site-wide issues, and fallback to internal links. It does not mention baseline updates for compare_to_baseline (a side effect), but that is covered in the schema, and the description does not contradict 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 a single, dense paragraph that front-loads the action ('Crawl a site...') and uses a colon-separated list for the aggregates. It is efficient and every clause contributes value, though the length makes it slightly less scannable than a shorter alternative.
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 with five parameters and a complex crawl-and-audit workflow, the description covers the core behaviors: crawl seeding, delay, page-sharing, and the specific aggregate checks. It does not enumerate the return structure in detail, but the output schema explains format options, and the description provides enough for an agent to understand the tool's scope.
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 schema fully documents all five parameters. The description adds conceptual meaning by explaining the crawl context ('sitemap-index aware', 'falls back to following internal links') and the role of max_pages ('audit up to max_pages pages with a polite delay'), which goes beyond the schema's field-level descriptions.
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: 'Crawl a site... and audit up to max_pages pages' and lists specific aggregated checks such as broken internal links, redirect chains, duplicate titles, and orphan sitemap URLs. This concrete enumeration distinguishes it from sibling tools like check_sitemap or seo_full_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 implies when to use this tool by describing the crawl strategy (seeded from sitemap.xml, falls back to internal links) and the aggregation of site-wide issues across pages. However, it does not explicitly state when this tool should be preferred over alternatives like seo_full_audit or check_url_structure, nor does it mention exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_lighthouseRun Lighthouse (Core Web Vitals)ARead-only
Run Google Lighthouse (performance + SEO categories) on a URL via npx. Reports scores and Core Web Vitals — LCP (≤ 2.5s), CLS (≤ 0.1), and INP (≤ 200ms; falls back to TBT when the lab run can't measure interactions) — plus top speed opportunities. Slow (~1-2 min); requires Chrome installed.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to measure | |
| form_factor | No | mobile (default, matches Google's mobile-first indexing) or desktop | mobile |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint and openWorldHint annotations, the description adds rich behavioral detail: runs via npx, reports specific metrics with thresholds, explains the INP/TBT fallback, mentions top speed opportunities, and discloses timing and Chrome requirement. 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 compact yet information-dense: it packs purpose, metric details, fallback behavior, timing, and a prerequisite into four efficient sentences without redundancy. Every sentence contributes value.
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?
It explains what the tool reports (scores, Core Web Vitals, speed opportunities) and caveats like slowness and Chrome requirement. However, since there is no output schema, it could be more explicit about the return format (e.g., JSON object, text report) or whether artifacts are saved. Still, the essential usage is well 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 schema already covers both parameters with full descriptions (url and form_factor), so baseline is 3. The description does not add parameter-specific details beyond the schema; it focuses on output and behavior rather than parameter nuances.
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 runs Google Lighthouse for performance and SEO categories, naming specific Core Web Vitals metrics. However, it does not explicitly differentiate from sibling tools like seo_full_audit that also cover SEO, so it lacks explicit sibling distinction.
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 useful context by noting it is 'Slow (~1-2 min)' and 'requires Chrome installed', which implies when it is appropriate to use. It does not explicitly name alternatives or when-not-to-use, but the context gives clear practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seo_full_auditFull technical SEO auditARead-only
Run the full technical SEO checklist on a URL: rendering (server-rendered vs JS shell), HTTPS/SSL + redirect, page essentials (title, meta description, h1, canonical, Open Graph, mobile viewport, image lazy-loading/WebP/dimensions), caching headers, structured data (JSON-LD), sitemap.xml, robots.txt, and AI-crawler access. Returns a Markdown report with ✅/⚠️/❌ per check (or structured JSON with output: 'json', or a shareable HTML file with output: 'html'). Set compare_to_baseline: true to diff against the previous run. Does not include Lighthouse (use run_lighthouse separately — it is slower).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to audit, e.g. https://example.com | |
| output | No | Report format. markdown (default) returns the report inline; json returns per-check severity and {pass, warn, fail} counts; html writes a standalone, shareable HTML file to disk and returns its path plus a short summary (use when the user wants a report to open, save, or send) | markdown |
| output_path | No | html only — destination file or directory. Defaults to ./seo-report-<host>-<date>.html in the current directory | |
| compare_to_baseline | No | Diff against (and update) the saved baseline for this target — reports new failures/warnings and items fixed since the last run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint, but the description adds substantial behavioral detail: output formats (Markdown with ✅/⚠️/❌, JSON with severity and pas/warn/fail counts, HTML written to disk), baseline diff behavior via compare_to_baseline, and the explicit exclusion of Lighthouse. It also discloses that HTML output writes a file, which is a side effect beyond the read-only audit itself. 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 dense but every sentence earns its place. The first clause front-loads the purpose, the long checklist sentence is organized by category, and the remaining sentences cover output modes, baseline comparison, and exclusion. 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 complexity and the absence of an output schema, the description is thorough: it explains all output formats, baseline diffing, file-writing behavior, and the Lighthouse exclusion. It could add notes about URL accessibility/errors or explicitly state which sibling checks are included (e.g., whether keyword placement/URL structure are covered), but it is complete enough for an agent to select and invoke 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 covers 100% of parameters with detailed descriptions, including the output enum, defaults, and output_path specifics. The description summarizes some of this (e.g., 'structured JSON with output: json', 'shareable HTML file with output: html') but does not add meaning beyond what the schema already provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Run') and resource ('full technical SEO checklist on a URL'), enumerating concrete checks (rendering, HTTPS, page essentials, cache, structured data, etc.). It clearly distinguishes itself from the sibling individual checker tools by being the comprehensive 'full' audit, and it explicitly names run_lighthouse as a separate tool for Lighthouse.
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 tells the agent when to use this tool: when a full technical SEO audit is requested. It also provides an explicit exclusion and alternative: 'Does not include Lighthouse (use run_lighthouse separately — it is slower).' The sibling list of targeted check_* tools implies that for single-aspect checks, the individual tools are more appropriate, giving clear usage context.
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.
13 tool updates
v1.0.0- First observed
check_ai_crawlers - First observed
check_caching - First observed
check_https - First observed
check_keyword_placement - First observed
check_page_essentials - First observed
check_rendering - First observed
check_robots - First observed
check_sitemap - First observed
check_structured_data - First observed
check_url_structure - First observed
crawl_audit - First observed
run_lighthouse - First observed
seo_full_audit
TDQS
Scored across 13 tools
Every tool targets a distinct technical SEO concern: rendering, HTTPS, caching, sitemap, robots, structured data, AI crawler access, keyword placement, and Lighthouse. The composite full audit is clearly differentiated from individual checks, and each check has a focused scope with no two tools doing the same thing.
Most tools follow a clear check_<subject> convention, with crawl_audit and run_lighthouse as verb-noun exceptions, and seo_full_audit as the composite. The pattern is predictable and readable, though not perfectly uniform.
13 tools cover the technical SEO domain thoroughly without redundancy. Each tool addresses a specific aspect, and the count is well within the sweet spot for a domain-specific server.
The toolset covers the core technical SEO lifecycle: rendering, HTTP/HTTPS, on-page elements, caching, crawlability, structured data, AI crawlers, keyword placement, and performance. Minor gaps exist, such as hreflang/pagination checks and a general (non-AI) robots meta inspection, but these are edge cases agents can work around.
Maintenance
Related MCP Connectors
- CalmSEOOAuthcom.calmseo
SEO MCP server for keyword research, SERP analysis, audits, and Search Console workflows.
- RampifyOAuthdev.rampify
SEO MCP server: crawl your site, find AI-visibility gaps, and ship the fix from your coding agent.
SEO MCP server — backlinks, domain authority, tech stack, and 18+ tools via Common Crawl.
Free technical-SEO audit MCP: crawl a site, run checks, return an LLM-ready shareable report.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA production-ready remote MCP server that performs comprehensive SEO audits, providing structured insights on on-page SEO, technical health, and social metadata without requiring local setup.29-
- AlicenseBqualityDmaintenanceAn MCP server that gives AI assistants 23 SEO tools for rank tracking, Google Analytics, site audits, keyword research, competitive analysis, and more, accessible through natural language.2510MIT
- AlicenseAqualityBmaintenanceAn MCP server that gives AI agents tools to inspect a website's visibility to AI answer engines, including crawler permissions, llms.txt, structured data, on-page signals, and a full 29-check AI-readiness audit.532MIT
- AlicenseAqualityDmaintenanceAn MCP server that provides a suite of SEO analysis tools for auditing meta tags, headings, links, keyword density, page speed, and sitemaps without requiring external API keys.6501MIT