seo-mcp
Summary: seo-mcp is a free, keyless SEO MCP server that audits pages and sites, generates PDF reports, inspects robots.txt/sitemaps/structured data, checks broken links, suggests keywords, and runs PageSpeed/Lighthouse performance checks.
Audit a single page (
audit_page): full on-page audit — title, meta description, canonical, indexability, redirects, viewport, OG/Twitter, heading outline, word count, image alt coverage, link counts, structured data, issues list, and 0–100 score; optional PageSpeed withpagespeed: true.Export a page audit PDF (
export_audit_pdf): professionally formatted report with score badge, summary cards, severity-colored issues, and optional PageSpeed metrics.Audit an entire site (
audit_site): discovers URLs from the sitemap and runs on-page audits across pages (default 50), returning aggregates, common issues, and a compact worst-first per-page table (or full detail).Export a site-wide PDF (
export_site_pdf): multi-page report with overall score, coverage, common-issues rollup, and per-page details.Inspect robots.txt (
check_robots): fetch and parse user-agent groups, allow/disallow rules, and declared sitemaps.Inspect sitemaps (
check_sitemap): discover and summarize index vs urlset, URL count, and samples.Extract structured data (
extract_schema): pull JSON-LD and list schema.org@types plus microdata and parse errors.Find broken links (
find_broken_links): HEAD-check links on a page and report 4xx/5xx or unreachable ones.Get keyword ideas (
keyword_ideas): related queries for a seed term via Google Suggest (no volume).Run PageSpeed/Lighthouse (
pagespeed): performance score, lab Core Web Vitals, CrUX field data, and top opportunities — keyless or withPAGESPEED_API_KEY, with local Lighthouse fallback.
Provides Google PageSpeed Insights data including performance score, Core Web Vitals, and optimization opportunities.
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., "@seo-mcpaudit https://example.com for SEO"
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-tools-mcp
Upgrading from an earlier package name: replace the package in your MCP client command with npx -y seo-tools-mcp@latest. Existing environment settings and saved data remain compatible.
An SEO MCP server — a stdio Model Context Protocol server that gives an AI host a set of SEO tools. The MVP is 100% free and keyless: on-page/technical audits, robots.txt, sitemaps, structured data, broken-link checks, and keyword ideas.
Built on the same proven scaffold as mcp-browser-extension: SDK Server → StdioServerTransport, a flat tool registry, and a never-throw dispatch firewall.
Tools (all free, no API key)
Tool | What it does |
| Full on-page audit: title, meta description, canonical, robots, viewport, OG/Twitter, heading outline, word count, image alt coverage, link counts, structured-data presence → issues + 0–100 score. Pass |
| Fetch & parse |
| Discover & summarize a sitemap (index vs urlset, URL count, sample) |
| Pull JSON-LD structured data and list schema.org |
| HEAD-check links on a page; report 4xx/5xx/unreachable |
| Related queries for a seed term via Google Suggest (no volume) |
| Google PageSpeed Insights (Lighthouse): perf score, lab Core Web Vitals + real-user CrUX field data + top opportunities. Keyless (rate-limited); set |
Related MCP server: gkb-seo-mcp-server
Use it as an MCP server
Requires Node 20.18.1+. Local Lighthouse audits require Node 22.19+; Node 24 is recommended for all features. There is nothing to clone, build, or configure — add this to your MCP host config (e.g. a project .mcp.json) and restart the host:
{
"mcpServers": {
"seo-tools-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "seo-tools-mcp@latest"]
}
}
}Or with Claude Code: claude mcp add seo-tools-mcp -- npx -y seo-tools-mcp@latest
Or, after npm install -g seo-tools-mcp@latest, set "command": "seo-tools-mcp" with no args.
Windows
WSL2 is not required — native Windows works. One config change is, though: on Windows npx is npx.cmd, a batch shim, and MCP hosts spawn the server without a shell, which cannot execute a .cmd. So "command": "npx" fails to start. Wrap it in cmd /c:
{
"mcpServers": {
"seo-tools-mcp": {
"type": "stdio",
"command": "cmd",
"args": ["/c", "npx", "-y", "seo-tools-mcp@latest"]
}
}
}Or: claude mcp add seo-tools-mcp -- cmd /c npx -y seo-tools-mcp@latest
Develop
From a source checkout:
npm install
npm run build # → dist/src/cli.js
npm testThen point your host at the local build with "command": "node", "args": ["<abs-path>/dist/src/cli.js"].
Then ask things like "audit https://example.com for SEO" or "what does example.com's robots.txt block?".
Quick smoke test (no MCP host needed)
node -e "require('./dist/src/seo/audit').auditPage('https://example.com').then(r=>console.log(JSON.stringify(r,null,2)))"Develop
npm run typecheck # tsc --noEmit
npm run build # → dist/
npm test # node:test suite (no network — fetch is stubbed)CI (.github/workflows/ci.yml) runs typecheck → build → test on Node 20/22. Node 20.18.1+ is required by Cheerio and Undici. The optional local Lighthouse engine requires Node 22.19+; hosted PageSpeed checks remain available on Node 20.18.1+.
Performance & output size
Request caching — identical GETs are de-duplicated by a short-TTL cache with in-flight coalescing, so a
audit_page→export_audit_pdfpair (or a sitemap/robots.txt referenced during a crawl) hits the network once. Tune withSEO_MCP_CACHE_TTL_MS(milliseconds, default15000); set0to disable.Compact
audit_site— by default the site audit returns a slim, worst-first per-page table (score + issue counts) plus the aggregates, to keep the response small inside an MCP host's context. Passdetail: truefor the full per-page breakdown, or useexport_site_pdffor a formatted report.
PageSpeed (optional key)
The pagespeed tool works keyless but Google rate-limits anonymous requests. To raise the quota, grab a free PageSpeed Insights API key and set it in your MCP host config:
{
"mcpServers": {
"seo-tools-mcp": {
"type": "stdio",
"command": "node",
"args": ["<absolute-path>/seo-tools-mcp/dist/src/cli.js"],
"env": { "PAGESPEED_API_KEY": "your-key-here" }
}
}
}Roadmap (needs a key — not in the free MVP)
serp_rank— real SERP position checks (drive a browser, or a paid SERP API)domain_authority— OpenPageRank (free key) for an authority scorebacklinks— real backlink profiles (paid: Ahrefs / SEMrush / DataForSEO)
Related
MCP Browser Extension (mcp-browser-extension): let Claude, Cursor or any MCP agent use the Chrome you are already logged into, with a deny-all domain allowlist.
License
MIT
Available Tools
10 toolsaudit_pageA
Full on-page SEO audit of a URL: title, meta description, canonical, indexability (meta robots, X-Robots-Tag header, and robots.txt), redirect chain, viewport, Open Graph/Twitter, heading outline and hierarchy, word count, image alt coverage, internal/external link counts, structured-data presence, plus a list of issues and a 0–100 score. Free, no API key. Set pagespeed=true to also attach PageSpeed Insights performance metrics. After presenting the results, ASK THE USER whether they want a professionally formatted PDF report; if they say yes, call export_audit_pdf with the same url (and same pagespeed/strategy).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL (https:// optional) | |
| local | No | When pagespeed=true, force the local Lighthouse engine instead of Google PSI (no API key/quota; requires Chrome installed). Default false — PSI is used first and falls back to local automatically when it is over quota. | |
| detail | No | When pagespeed=true, also attach the full GTmetrix-style detail layer under pagespeed.detail (all category scores, diagnostics, resource breakdown, suggestions, passed checks). Default false. | |
| strategy | No | PageSpeed strategy when pagespeed=true: "mobile" (default) or "desktop" | |
| pagespeed | No | Also run PageSpeed Insights and attach performance metrics (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it enumerates the full returned payload, notes the no-API-key/free constraint, and explains that pagespeed=true attaches PSI metrics with a local-engine fallback. It stops short of documenting error/rate-limit behavior or how the URL is fetched, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and keeps the critical workflow instruction (ask the user, then call export_audit_pdf) as the final sentence. The long enumerative middle sentence is dense but each listed check conveys real capability, so waste is minimal.
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?
No output schema or annotations exist, yet the description fully describes the return contents, the free/no-key constraint, the optional performance layer, and the downstream PDF handoff. An agent has everything needed to call it and to act on the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, including local/detail/strategy. The description only reinforces the pagespeed flag and carries it forward into the PDF step ('same pagespeed/strategy'), adding workflow meaning but no syntax beyond the schema — the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Full on-page SEO audit of a URL') and enumerates exactly what is checked (title, meta, canonical, indexability, redirect chain, headings, links, structured data, issues, score). This clearly separates it from siblings like audit_site (site-level), pagespeed (performance-only), and check_robots (single concern).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context ('Free, no API key'), explains the pagespeed=true option to add PSI metrics, and prescribes a concrete follow-up workflow with export_audit_pdf. It does not, however, state when to prefer this over the sibling pagespeed tool or audit_site for whole-site scans, so exclusions are missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_siteA
Site-wide on-page SEO audit: discovers the site's URLs from its sitemap (resolving a sitemap index into child sitemaps), runs the on-page audit on each page (keyless, concurrency-limited), and returns site-level aggregates — average/min/max score, pages with errors, site-wide gaps (missing titles/meta/H1/schema), a rollup of the most common issues, and a per-page table. By DEFAULT the response is compact: per-page rows carry score and issue counts only (sorted worst-first) to keep the payload small; set detail=true to get full per-page metadata and each page's specific issues. PageSpeed is NOT run per page (too slow across many URLs). Use audit_page or pagespeed for deep per-page performance, or export_site_pdf for a formatted report.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Maximum number of pages to audit (default 50) | |
| url | Yes | Any URL on the site (https:// optional) | |
| detail | No | Return the full per-page breakdown (metadata, headings, and each page's issue list) instead of the compact score/counts table. Default false — keep it off unless the full detail is needed, as it is far larger. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that the operation is keyless (no auth), concurrency-limited (rate control), driven by sitemap discovery including sitemap-index resolution, and that PageSpeed is deliberately NOT run. It also describes the default response shape (compact, worst-first) and the cost tradeoff of detail=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and scope, and every sentence carries information an agent needs (pipeline, defaults, exclusions, alternatives). It is a single dense paragraph with long clauses, which is slightly heavy but not padded.
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?
There is no output schema, so the description must describe returns, and it does: site-level aggregates, min/max/average score, pages with errors, site-wide gaps, issue rollup, and the per-page table. Combined with the default/detail distinction, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description adds real value beyond the schema for detail by explaining the payload-size rationale for keeping it false, though it says nothing about the 'max' parameter (default 50) beyond the schema's own text.
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 precise verb+resource+scope: 'Site-wide on-page SEO audit' and then spells out the exact pipeline (sitemap discovery, per-page audit, site-level aggregates). It explicitly contrasts itself with audit_page, pagespeed, and export_site_pdf, so an agent can distinguish it from every relevant sibling.
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 names alternatives and the conditions that select them: 'Use audit_page or pagespeed for deep per-page performance, or export_site_pdf for a formatted report,' and it states when to set detail=true versus leaving it off. Both the routing decision and the parameter tradeoff are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_robotsA
Fetch and parse a site's /robots.txt — user-agent groups, allow/disallow rules, and declared sitemaps.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Any URL on the site |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It discloses the output shape (user-agent groups, rules, sitemaps) but says nothing about failure modes (missing robots.txt), rate limits, redirect handling, or permission requirements.
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?
One efficient sentence that front-loads the action and lists the returned fields without waste.
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?
Adequate for a simple single-parameter read tool, but with no annotations and no output schema, the description should disclose more about what happens when robots.txt is absent or how the response is structured.
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 single parameter 'url' is documented as 'Any URL on the site'. The description adds no parameter-level detail beyond the schema, 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?
States a specific verb (Fetch and parse) and resource (/robots.txt) and enumerates the returned content (user-agent groups, allow/disallow rules, sitemaps). Clearly distinguishable from siblings like check_sitemap and audit_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the tool's nature (robots.txt retrieval) but there is no explicit when-to-use guidance or comparison to alternatives such as check_sitemap. The agent must infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_sitemapA
Discover and summarize a sitemap (via /sitemap.xml or robots.txt): index vs urlset, URL count, and a sample of URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Any URL on the site |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the output shape (index vs urlset, URL count, sample URLs), which is useful behavioral context, but says nothing about network behavior, fallback order when /sitemap.xml is absent, error cases, or rate limits.
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?
A single front-loaded sentence that states the action and immediately enumerates the returned artifacts, with no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the work of explaining what comes back, which is the key need for this read tool. It stops short of covering failure modes (missing sitemap, robots.txt fallback behavior) or the size/format of the URL sample, leaving minor 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?
There is a single parameter and schema description coverage is 100%, with the schema already explaining it accepts 'Any URL on the site'. The description adds no parameter-level meaning, 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 gives a specific verb ('Discover and summarize') plus the resource ('sitemap') and enumerates what is returned: index vs urlset, URL count, and sample URLs. It is clearly distinguishable from most siblings, though it does not explicitly contrast itself with the closely related check_robots, which it only mentions as a discovery route.
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?
Usage is implied by the context of the sibling audit tools (an agent would infer this is for inspecting a site's sitemap), but there is no explicit statement of when to call this versus check_robots or audit_site, and no preconditions such as what happens when no sitemap exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_audit_pdfA
Generate a professionally laid-out PDF report of an on-page SEO audit (score badge, summary cards, severity-colored issue list, metadata, content/structure, social tags, and optional PageSpeed metrics). Re-runs the audit for the URL and writes a .pdf to disk, returning the file path. Use this after audit_page when the user asks for a PDF report.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to audit and export (https:// optional) | |
| path | No | Output file path (default: ./seo-audit-<host>-<date>.pdf in the current directory). ".pdf" is appended if missing. | |
| detail | No | Include the full GTmetrix-style detail in the PDF (category scores, diagnostics, resource weight, prioritized suggestions, passed checks). Defaults to true when pagespeed=true. | |
| strategy | No | Limit the PageSpeed section to one strategy: "mobile" or "desktop". Omit to include BOTH in the same file (default). | |
| pagespeed | No | Also run PageSpeed and include performance metrics in the report (default false). When true, BOTH Mobile and Desktop are included in the same PDF unless a single "strategy" is specified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key side effects: it re-runs the audit (fresh network work) and writes a .pdf to disk, returning the file path. It omits overwrite behavior, latency expectations, and failure modes, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by side effects and then usage, so the agent can stop reading early. The parenthetical inventory of report sections is long but earns its place by telling the agent what the artifact contains.
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?
No output schema exists, but the description states the return value (file path) and the write-to-disk behavior, and all five parameters are covered by the schema. A note on whether an existing file is overwritten would close the remaining 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?
Schema description coverage is 100%, so every parameter (url, path, detail, strategy, pagespeed) is already documented, and the enum on strategy is self-explanatory. The description adds report-content context that loosely maps to pagespeed/detail but no format or constraint detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Generate) and resource (PDF report of an on-page SEO audit) and enumerates the report contents, so the agent knows exactly what artifact comes back. It also distinguishes scope from the sibling export_site_pdf by tying itself to a single URL audit.Page
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this after audit_page when the user asks for a PDF report" gives an explicit precondition and trigger. It does not, however, draw an exclusion against the sibling export_site_pdf, leaving the single-page vs site-wide routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_site_pdfB
Run a site-wide audit and write a professionally formatted multi-page PDF report (overall average-score badge, summary cards, coverage, common-issues rollup, a per-page results table sorted worst-first, and a full per-page details section — metadata, structure, and each page's specific issues). Returns the file path.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Maximum number of pages to audit (default 50) | |
| url | Yes | Any URL on the site (https:// optional) | |
| path | No | Output file path (default: ./seo-site-audit-<host>-<date>.pdf). ".pdf" appended if missing. | |
| details | No | Include the full per-page details section (one card per page with metadata, structure, and issues). Default true; set false for a summary-only report. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does convey useful traits: this performs a site-wide crawl (implied network cost and latency, bounded by max), writes a file to disk (a side effect), and returns the path. It does not mention whether an existing file is overwritten, permission requirements, or how failures during the audit are surfaced.
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?
One sentence, front-loaded with the action, with the rest spent enumerating the report contents. The long parenthetical list is dense but each item is informative for judging the output; slightly overloaded for a single sentence.
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?
No output schema exists, and the description compensates by describing both the artifact (PDF sections) and the return value (file path). Report contents and the primary return are covered; only failure/overwrite behavior is absent.
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 every parameter (url, max, path, details) is already documented in the schema; baseline 3 applies. The description adds only indirect context — the details flag maps to the 'full per-page details section' and the table ordering is 'worst-first' — without explaining parameter syntax beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource — run a site-wide audit and write a multi-page PDF report — and enumerates the report's contents, so the agent knows exactly what artifact is produced. It does not, however, distinguish itself from the sibling export_audit_pdf, whose name implies a very similar operation.
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?
There is no when-to-use, when-not-to-use, or prerequisite guidance. The presence of a closely named sibling (export_audit_pdf) makes the missing differentiation a real gap — the agent must open both schemas to decide which export tool to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_schemaA
Extract JSON-LD structured data from a page and list the schema.org @types found (plus any microdata itemtypes and JSON-LD parse errors).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose meaningful behavior: it reports microdata itemtypes in addition to JSON-LD, and surfaces JSON-LD parse errors rather than failing on malformed markup. However, it says nothing about network fetching, read-only/safe nature, permissions, or rate limits.
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?
One sentence, front-loaded with the core action, with the enumerations placed in a parenthetical rather than padding the main clause. Every element earns its place and nothing is repeated.
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 read tool with no output schema and no annotations, the description adequately conveys what comes back (types, itemtypes, errors). It stops just short of complete by not clarifying whether the page is fetched live or read from an existing audit result.
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?
Only one parameter exists and schema description coverage is 100% ('Page URL'), so the schema fully documents it. The description adds no format, scope, or fetch-behavior detail beyond what the schema already states, making the baseline of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('Extract') and resource ('JSON-LD structured data from a page'), then enumerates the concrete outputs (schema.org @types, microdata itemtypes, parse errors). None of the siblings (audit_page, check_robots, pagespeed, etc.) touch structured data, so the agent can place it immediately.
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?
There is no statement of when to use this tool versus audit_page or the other audit siblings, and no prerequisites or exclusions are given. Usage is only inferable from the purpose itself, not from any routing guidance in the text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_broken_linksB
Check the links on a page with HEAD requests and report any that return 4xx/5xx or are unreachable.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max links to check (default 50) | |
| url | Yes | Page URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the method (HEAD requests) and the failure criteria (4xx/5xx or unreachable), but omits operational details such as redirect handling, timeouts, auth needs, and whether the operation is purely read-only.
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?
A single, front-loaded sentence that states the action, method, and result criteria with no wasted words. It is appropriately sized for a simple two-parameter 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?
There is no output schema, so the description should explain what the report looks like. It conveys the semantic result (broken/unreachable links) but not the return structure, pagination, or how max affects truncation, leaving some gaps for an agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (url and max) are fully documented in the schema. The description adds no syntax or format details beyond what the schema already provides, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: check links on a page and report 4xx/5xx or unreachable ones. It is clear and actionable, but does not explicitly distinguish itself from the broader sibling audit_page or explain scope relative to other audit 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 gives no when-to-use guidance, no exclusions, and does not name an alternative such as audit_page or pagespeed. An agent must infer the context from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_ideasA
Get related keyword/query ideas for a seed term via Google Suggest (free; related queries only, no search volume).
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language code, e.g. "en" (default) | |
| seed | Yes | Seed keyword or phrase |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningfully discharge part of it: it discloses the underlying source (Google Suggest), the cost profile (free), and a hard output limitation (no search volume, related queries only). It omits rate limits, authentication needs, and result-set size, which are the remaining behavioral gaps.
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?
One sentence, front-loaded with the action and resource, with the clarifying constraints tucked into a compact parenthetical. Every clause earns its place.
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 two-parameter, no-output-schema tool this covers purpose, source, cost, and the key output caveat. The main omission is any hint about the shape or volume of returned ideas and whether 'lang' materially changes results, but nothing critical to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented there, so the description needn't restate them. It references the seed concept implicitly but adds no format or syntax detail (e.g., how to handle multi-word phrases), 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?
States a specific verb (Get) and resource (related keyword/query ideas) plus the data source (Google Suggest), which is exactly what an agent needs to know. It is unmistakably distinct from the sibling audit/robots/sitemap tools, so no sibling disambiguation is required.
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 parenthetical 'free; related queries only, no search volume' tells the agent when this is the right pick (a no-cost, related-term expansion) and implicitly when it is not (when search volume is needed). It stops short of naming an alternative tool for volume-bearing keyword data, so it is clear context rather than a full when/when-not routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pagespeedA
Run Lighthouse for performance score (0–100), lab Core Web Vitals (LCP, CLS, TBT, FCP, Speed Index, TTI), and top improvement opportunities. Default engine is Google PageSpeed Insights (hosted; adds real-user CrUX field data when available; keyless but rate-limited — set PAGESPEED_API_KEY to raise the quota), and it auto-falls-back to a LOCAL Lighthouse run if PSI is over quota. Set local=true to force the local engine (no key, no quota; needs Chrome on the host; no CrUX field data; runs headless Chrome silently).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL | |
| local | No | Force the local Lighthouse engine instead of Google PSI (no API key/quota; requires Chrome installed; lab metrics only). Default false. | |
| detail | No | Return the full GTmetrix-style detail: all four category scores (Performance, Accessibility, Best Practices, SEO), diagnostics (server response, DOM size, page weight, request count), resource breakdown, prioritized suggestions with descriptions, and passed best-practice checks. Default false. | |
| strategy | No | "mobile" (default) or "desktop" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses rate limiting, API-key requirements, automatic fallback behavior on quota exhaustion, that the local path requires Chrome on the host, that local runs headless Chrome silently, and that field (CrUX) data is only available via PSI. These are exactly the operational facts an agent needs before invoking.
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?
Outputs are front-loaded in the first sentence, followed by engine behavior and the local override, so the reader gets the what before the how. It is dense but every clause carries distinct information; the long parenthetical lists add bulk without much waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does useful work by naming the metrics returned and noting that detail=true expands to full category scores, diagnostics, and prioritized suggestions. Minor gap: it never states whether results are a single snapshot or if auditing multiple URLs requires the sibling audit_site.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, including the local flag's requirement for Chrome and its lab-only nature. The description largely restates that schema text, adding only the engine-selection framing rather than new parameter semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run Lighthouse') plus the exact outputs it produces: performance score 0-100, lab Core Web Vitals (LCP, CLS, TBT, FCP, Speed Index, TTI), and improvement opportunities. This distinguishes it from siblings like audit_page and audit_site, which are not described as Lighthouse/PSI runs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for the engine decision: default PSI adds CrUX field data but is rate-limited, set PAGESPEED_API_KEY to raise quota, auto-fallback to local on quota exhaustion, and set local=true to force local (no key/quota, needs Chrome, no field data). It does not, however, explain when to choose this tool over sibling audit_page/audit_site, so it stops short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.9- Changed
audit_page4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / detailAdded value: +{ + "description": "When pagespeed=true, also attach the full GTmetrix-style detail layer under pagespeed.detail (all category scores, diagnostics, resource breakdown, suggestions, passed checks). Default false.", + "type": "boolean" +} - added
Input schema / properties / localAdded value: +{ + "description": "When pagespeed=true, force the local Lighthouse engine instead of Google PSI (no API key/quota; requires Chrome installed). Default false — PSI is used first and falls back to local automatically when it is over quota.", + "type": "boolean" +} - added
Input schema / properties / strategy / enumAdded value: +[ + "mobile", + "desktop" +]
- Added
audit_site - Changed
check_robots1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
check_sitemap1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
export_audit_pdf5 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / detailAdded value: +{ + "description": "Include the full GTmetrix-style detail in the PDF (category scores, diagnostics, resource weight, prioritized suggestions, passed checks). Defaults to true when pagespeed=true.", + "type": "boolean" +} - changed
Input schema / properties / pagespeed / descriptionPrevious value: -"Also run PageSpeed Insights and include performance metrics in the report (default false)"New value: +"Also run PageSpeed and include performance metrics in the report (default false). When true, BOTH Mobile and Desktop are included in the same PDF unless a single \"strategy\" is specified." - changed
Input schema / properties / strategy / descriptionPrevious value: -"PageSpeed strategy when pagespeed=true: \"mobile\" (default) or \"desktop\""New value: +"Limit the PageSpeed section to one strategy: \"mobile\" or \"desktop\". Omit to include BOTH in the same file (default)." - added
Input schema / properties / strategy / enumAdded value: +[ + "mobile", + "desktop" +]
- Added
export_site_pdf - Changed
extract_schema1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
find_broken_links1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
keyword_ideas1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
pagespeed4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / detailAdded value: +{ + "description": "Return the full GTmetrix-style detail: all four category scores (Performance, Accessibility, Best Practices, SEO), diagnostics (server response, DOM size, page weight, request count), resource breakdown, prioritized suggestions with descriptions, and passed best-practice checks. Default false.", + "type": "boolean" +} - added
Input schema / properties / localAdded value: +{ + "description": "Force the local Lighthouse engine instead of Google PSI (no API key/quota; requires Chrome installed; lab metrics only). Default false.", + "type": "boolean" +} - added
Input schema / properties / strategy / enumAdded value: +[ + "mobile", + "desktop" +]
8 tool updates
v0.1.0- First observed
audit_page - First observed
check_robots - First observed
check_sitemap - First observed
export_audit_pdf - First observed
extract_schema - First observed
find_broken_links - First observed
keyword_ideas - First observed
pagespeed
TDQS
Scored across 10 tools
Tools target mostly distinct SEO subtasks, but audit_page and pagespeed overlap because audit_page can optionally attach PageSpeed metrics. Similarly, check_robots/check_sitemap partially overlap with audit_page's indexability checks, though descriptions usually clarify intended use.
Nearly all names use snake_case and mostly follow a verb_noun pattern, such as audit_page, check_robots, and export_site_pdf. However, keyword_ideas and pagespeed are noun-only exceptions, so it is not a strict verb_noun pattern throughout.
Ten tools is well-scoped for an SEO audit server. Each tool covers a clear, non-trivial function: page/site audits, technical checks, PDF exports, performance, and keyword ideas.
The core technical and on-page SEO audit lifecycle is covered, including page audits, site-wide audits, robots.txt, sitemaps, structured data, broken links, performance, keyword ideas, and PDF reporting. Broader SEO capabilities like backlink analysis, rank tracking, or keyword search volume are missing, but common audit workflows are workable.
Maintenance
Related MCP Connectors
SEO MCP server for keyword research, SERP analysis, audits, and Search Console workflows.
Free SEO MCP that closes the loop: find, fix, ship as a PR or to a CMS, prove. 37 tools, no key.
SEO MCP server — backlinks, domain authority, tech stack, and 18+ tools via Common Crawl.
SEO Intelligence MCP — 13 tools: keyword research, SERP, domain audits, competitors.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for on-page SEO auditing and JSON-LD schema validation, providing tools for full SEO audit, schema validation, heading hierarchy, and image audit without requiring API keys.4535 npm2MIT
- FlicenseAqualityCmaintenanceAn MCP server providing 20 SEO tools including coverage reports, supporting both stdio and HTTP modes for data-driven SEO analysis.20-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides SEO analysis tools including backlink analysis, keyword research, and traffic estimation using Ahrefs data, with CAPTCHA solving and caching.MIT
- 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.633 npm1MIT