OnPage.dev
Server Details
Free SEO MCP that closes the loop: find, fix, ship as a PR or to a CMS, prove. 37 tools, no key.
- Status
- Healthy
- Uptime
- 99.9% over 24 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Server Listing
- OnPage.dev MCP server
TDQS
Scored across 37 tools
Several tools overlap in purpose, especially scan_page/site_audit/check_keyword/answer_readiness for page analysis and measure/find_opportunities/prioritize_fixes for data-driven prioritization. The detailed mode descriptions help, but an agent still faces ambiguous choices for common SEO tasks.
Tool names use snake_case consistently, with no camelCase or chaotic casing. However, the set mixes verb_noun names (check_keyword, scan_page, prioritize_fixes) with noun phrases (accessibility, backlinks, content), a minor deviation from a single predictable pattern.
37 tools is heavy, especially since each tool bundles many modes; the surface is broad enough to justify a suite, but multiple tools could be consolidated without losing capability. This exceeds the reasonable 3-15 range for a coherent MCP set.
The surface covers the SEO lifecycle comprehensively: audits, page scans, keyword and content analysis, backlinks, schema, technical checks, local, accessibility, AI visibility, analytics, monitoring, reporting, and fixes. No obvious major workflow is missing, though many tools require externally supplied data.
Available Tools
37 toolsaccessibilityAccessibilityARead-onlyIdempotentInspect
Accessibility for people and the European Accessibility Act. Pick with mode: wcag = WCAG 2.1 AA checks. Needs url. screen_reader = The page as a screen reader reads it. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| mode | No | Default wcag. | |
| tree | No | Optional: an accessibility snapshot from your own browser (role, name, level, children), for example Puppeteer page.accessibility.snapshot(). | |
| detail | No | brief = short summary. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds that the tool requires a url and that each mode produces a distinct kind of output, which is useful context but not rich behavioral disclosure (no scope, cost, or failure behavior).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, zero padding, and the core purpose plus the mode-keyed requirements are front-loaded. The telegraphic style ("Needs url.") is efficient, though slightly choppy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully documented, so return values and param details needn't be re-explained. The description covers the mode split and the url precondition, which is enough for an agent to call the tool correctly, though it omits guidance on the tree/detail parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, mode, tree, detail, and memory_key. The description restates the mode enum values and the url requirement without adding syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete capability (accessibility checking) and names its two concrete outputs, WCAG 2.1 AA checks and screen-reader rendering. It doesn't compare itself to siblings like scan_page, but the purpose is unambiguous without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real selection guidance for the mode parameter (wcag vs screen_reader) and a precondition ("Needs url"). However, it never says when to reach for this tool versus alternatives such as scan_page or technical, so usage is implied rather than framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_visibilityAI visibilityARead-onlyIdempotentInspect
Whether AI assistants can read, quote and recommend a site. Pick with mode: check = AI crawler access, llms.txt, 15 citability checks and the page as a model reads it. Needs url. bots = Fetch the page as Googlebot, GPTBot, ClaudeBot, PerplexityBot and more against a browser: firewall blocks, challenges, cloaking. Needs url. gaps = Where AI answers name competitors, not you, from Brand Radar or similar. Needs site, brand, responses[{question, response, links, search_queries, engine, volume}]. citations = What pages cited by AI do differently, from citation counts. Needs pages[{url, chatgpt, perplexity, gemini, google_ai_overviews, google_ai_mode}].
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| mode | No | Default check. | |
| site | No | Your site, for example example.com. | |
| brand | No | Your brand name as people write it. | |
| pages | No | ||
| detail | No | brief = short summary. | |
| source | No | Where the citation counts come from. | |
| responses | No | ||
| memory_key | No | site_memory key, records this call. | |
| competitors | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered; the description adds real behavioral substance on top, namely what each mode actually inspects (crawler access, firewall blocks, challenges, cloaking, competitor naming) and where the data originates (Brand Radar, citation counts, ahrefs/semrush). It does not mention rate limits, cost, or auth requirements, which is the remaining gap.
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 purpose sentence followed by a tight mode-by-mode breakdown; the 'mode = behavior. Needs X.' pattern is scannable and every clause carries information. The mode blocks are run-on but justified by the four-way branching and the differing input requirements.
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 10-parameter, four-mode tool with an output schema present (so return values need not be described), the description covers the mode semantics and per-mode required inputs well. It leaves out the secondary parameters (detail, source, competitors, memory_key) and any note that no parameter is strictly required, which an agent choosing a mode would benefit from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 70% schema coverage the schema does part of the work, but the description maps parameters to modes (url for check/bots, site+brand+responses for gaps, pages for citations) and spells out the nested response fields (question, response, links, search_queries, engine, volume) that the schema leaves bare. It omits any explanation of detail, source, memory_key or competitors, which are common-trap parameters here.
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?
Opens with a concrete outcome ('whether AI assistants can read, quote and recommend a site') and then enumerates four named modes (check, bots, gaps, citations) with the specific artifact each produces. An agent can immediately distinguish this from siblings like robots_txt, llms_txt or scan_page, which cover only fragments of this scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is effectively driven by mode selection, and the description states exactly what each mode needs ('Needs url', 'Needs site, brand, responses[...]', 'Needs pages[...]'), so the agent knows which inputs select which behavior. It stops short of naming when-not-to-use or pointing at alternative siblings, so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
answer_readinessAnswers for AI searchARead-onlyIdempotentInspect
Whether a page answers the questions people ask AI and Google. Pick with mode: questions = Sub-questions AI Mode fans out to, and which the page answers. Needs url, topic, questions. passages = The passages that answer given questions, or the gaps. Needs url, question. format = Answer format against the pages that rank. Needs url, question, competitors.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page. | |
| mode | No | Default questions. | |
| topic | No | The topic or main query, for example 'passport renewal'. | |
| detail | No | brief = short summary. | |
| question | No | The question people ask, for example 'how long does shipping take to Germany'. | |
| questions | No | The sub-questions an AI search engine would ask for the topic. | |
| memory_key | No | site_memory key, records this call. | |
| competitors | No | Optional: up to 2 pages that rank for the topic. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the mode-conditional invocation behavior but does not disclose anything further about cost, external calls, or output characteristics beyond what annotations and the output schema provide.
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 framing sentence followed by three compact mode clauses, each pairing a mode with what it returns and what it needs. Front-loaded and every clause earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be restated, and the mode/parameter mapping gives the agent everything required to invoke correctly. Minor gap: no guidance on default mode behavior despite the schema noting 'Default questions', which the description could have confirmed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the schema lists zero required parameters while the description supplies the conditional requirement logic per mode ('Needs url, topic, questions', 'Needs url, question', 'Needs url, question, competitors'). That is genuine semantic value the schema does not encode, and it also explains what each mode returns.
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 purpose: whether a page answers the questions people ask AI and Google, framed around an answer-readiness evaluation. It clearly separates this from generic scan/audit siblings, though the verb is somewhat implicit rather than a clean 'evaluate X against Y'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent how to select a mode (questions vs passages vs format) and which parameters each mode requires. This is real invocation guidance. It stops short of naming when to prefer a sibling tool or when not to use this one, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backlinksBacklinksARead-onlyIdempotentInspect
Turn backlink data from Ahrefs, Semrush or similar into links won back, won or cleaned up. Pick with mode: broken = Broken and lost backlinks and 404 visits into 301s and outreach. Needs rows[{target_url, source_url, anchor, domain_rating, dofollow, http_code}]. opportunities = Sites linking to competitors, and unlinked brand mentions. Needs site. outreach = One outreach email per site, as drafts for the user's mail after approval. Needs your_site, prospects[{page, type, your_url, dead_url, anchor, contact}]. disavow = A conservative disavow.txt, only after a manual action or clear negative SEO. Needs rows[{url_from, domain, is_spam, domain_rating, anchor, traffic}], reason.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default broken. | |
| rows | No | Broken backlink rows, one per linking page. | |
| site | No | Optional: your site's address. | |
| brand | No | Brand name to look for in mention pages. | |
| yours | No | Your own referring domains. | |
| detail | No | brief = short summary. | |
| format | No | Rule format, default redirects (Cloudflare Pages and Netlify _redirects). | |
| reason | No | Why a disavow is considered. | |
| audit_id | No | Optional: a finished site audit, to match on page titles too. | |
| mentions | No | Pages that mention the brand. | |
| live_urls | No | Optional: your live pages, instead of reading the sitemap. | |
| prospects | No | ||
| your_site | No | Your site or brand name, e.g. | |
| memory_key | No | site_memory key, records this call. | |
| competitors | No | Each competitor with its referring domains. | |
| sender_name | No | Name to sign with. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered. The description still adds real behavior: outreach produces drafts that require user approval before use, and disavow is guarded by a caution about manual actions or negative SEO. It does not clarify that generated redirect/disavow files are not applied automatically to the site, which is the one trait worth surfacing.
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 purpose followed by a compact mode-by-mode breakdown; each clause carries required inputs or a caution. The prose is dense and readable, though the array-literal notation is terse and slightly harder to scan than a structured list.
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 16-parameter, four-mode tool with an output schema present, the description supplies the mode routing, per-mode required inputs, and the disavow caution. Nothing an agent needs to select and invoke the tool is missing, and return values are covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 94%, so the baseline is 3, but the description goes further by mapping modes to their required payloads (rows{target_url, source_url, anchor, domain_rating, dofollow, http_code}, prospects{page, type, your_url, dead_url, anchor, contact}, rows{url_from, domain, is_spam, ...}, reason). The schema declares all params optional at top level, so this per-mode requirement mapping is genuine added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific transformation ('Turn backlink data ... into links won back, won or cleaned up') and the mode list names the four concrete jobs. It does not explicitly distinguish itself from the 'opportunities' sibling or find_opportunities, leaving a small ambiguity, but the verb+resource is clear.
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 explicit when-to-use guidance per mode: broken for lost links/404s, opportunities for competitor links and unlinked mentions, outreach for email drafts, disavow 'only after a manual action or clear negative SEO'. It also states the required inputs for each mode, which is exactly the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_keywordKeyword targetingARead-onlyIdempotentInspect
How pages target a keyword. Pick with mode: focus = One page against one keyword: 8 checks. Needs url, keyword. cannibalization = Your pages competing for one keyword, side by side on every signal, with the plan. Needs keyword, target_url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| mode | No | Default focus. | |
| rows | No | Optional Search Console rows for the keyword, to find the competing pages and their positions. | |
| detail | No | brief = short summary. | |
| keyword | No | The search term the page should rank for, for example 'running shoes'. | |
| memory_key | No | site_memory key, records this call. | |
| target_url | No | The page that should rank for it. | |
| competing_urls | No | Other pages of the same site that compete for the keyword. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the description's added value is in behavior: it discloses that focus performs '8 checks' and that cannibalization lays competing pages 'side by side on every signal, with the plan.' That is meaningful procedural context beyond the annotations, though return shape is left to the output schema.
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?
Dense and front-loaded: the core purpose leads, then each mode with its own inputs. The phrasing is compressed to the point of being slightly telegraphic ('with the plan'), but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not describe returns, and it covers the two decision points an agent must resolve: which mode and which inputs. The remaining parameters (rows, competing_urls, detail, memory_key) are fully documented in the schema, so the definition is adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline, but the description adds real meaning the schema does not carry: the schema lists zero required parameters, while the description states which inputs each mode actually needs (url+keyword for focus, keyword+target_url for cannibalization). That per-mode parameter requirement is genuinely additive.
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 names the subject (how pages target a keyword) and splits it into two concrete modes with distinct outputs: 'focus = One page against one keyword: 8 checks' and 'cannibalization = Your pages competing for one keyword.' This is more specific than the title alone, though it never differentiates itself from adjacent siblings like track_rankings or content, so it falls just short of 5.
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 'Pick with mode:' phrasing gives explicit selection criteria between the two modes and states the required inputs for each ('Needs url, keyword' vs 'Needs keyword, target_url'). It stops short of naming when to prefer this over a sibling tool, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_linksCheck linksARead-onlyIdempotentInspect
Status of URLs and links. Pick with mode: urls = Status, redirect chain and canonical of a list of URLs. Needs urls. outbound = Dead or moved links from a page to other sites, with archived copies. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The page to check. | |
| mode | No | Default urls. | |
| urls | No | Addresses to check. | |
| detail | No | brief = short summary. | |
| expected | No | Optional expected final address for each URL, in the same order. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint). The description adds the meaningful behavioral detail that outbound mode returns archived copies and redirect/canonical chains, which is useful beyond the annotations, but it omits rate limits, failure handling, or what happens with dead links.
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?
Two compact sentences, front-loaded with the resource, then structured mode-by-mode with the required input for each. Zero 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?
An output schema exists, so return value explanation is unnecessary, and the mode descriptions cover the core use cases. Minor gap: the interplay of 'expected' with the returned canonical/final URLs is not described, though that is arguably schema-level detail.
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 parameters are already documented. The description adds routing context for mode/urls/url, but for detail, expected, and memory_key it adds nothing the schema doesn't already state.
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 resource (URLs/links) and enumerates the two modes with their distinct outputs, letting an agent distinguish the tool from siblings like internal_links or backlinks. However, 'Status of URLs and links' is a slightly vague opener before the mode breakdown clarifies the actual function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly ties each mode to its required input ('urls = ... Needs urls', 'outbound = ... Needs url'), which routes the agent between the two behaviors effectively. It does not name sibling alternatives for edge cases like internal link analysis, but the mode guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareCompareARead-onlyInspect
Compare pages side by side. Pick with mode: pages = Your page against up to 3 competitors. Needs url, competitors. html = Two versions of HTML before and after. Needs before, after. preview = Deploy preview against production before merging. Needs preview_url, production_url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address, for example https://example.com. | |
| mode | No | Default pages. | |
| after | No | HTML after the change. | |
| paths | No | Paths like /pricing, default /. | |
| before | No | HTML before the change. | |
| detail | No | brief = short summary. | |
| keyword | No | Optional search term to compare keyword use. | |
| memory_key | No | site_memory key, records this call. | |
| competitors | No | Competitor page addresses. | |
| preview_url | No | The deploy preview URL. | |
| bypass_token | No | Vercel protection bypass secret. | |
| production_url | No | The live site. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered. The description adds mode-dependent behavior and per-mode input requirements, which goes beyond the annotations, though it says nothing about permissions, rate limits, or what the comparison returns.
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 purpose, then a tight one-line-per-mode breakdown. Every clause carries information; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not explain return values, and annotations cover the safety profile. The mode/parameter mapping makes the 12-parameter tool navigable, though optional params like paths, detail, keyword, and memory_key are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine value beyond the schema by grouping parameters per mode (url+competitors for pages, before+after for html, preview_url+production_url for preview), which the flat schema does not express.
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 ("Compare pages side by side") and then enumerates the three modes with a concrete description of each comparison. An agent can tell exactly what the tool does and how the three variants differ without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps each mode to a scenario (pages = you vs competitors, html = before/after versions, preview = deploy preview vs production) and names the parameters each mode requires. It stops short of naming when not to use the tool or alternatives among siblings, but the mode-routing guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentContent strategyARead-onlyInspect
What to write and how, in the site's own voice, from the pages that rank and the user's search data. Pick with mode: brief = A content brief from the pages that rank. Needs keyword, competitors. topics = Search Console queries into topics, with the page that owns each, and keyword gaps. Needs rows[{query, page, clicks, impressions, position, url}]. intent = Your page against the search intent of the pages that rank. voice = Learn how the site writes from its best articles. Needs urls. calendar = A dated calendar of refreshes and new pages, steered by what worked here. draft = A draft against the site's voice, sources and SEO, before approval. Needs html.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional: your existing page for this term. | |
| html | No | The draft as HTML, title in <title> or <h1>. | |
| mode | No | Default brief. | |
| rows | No | Search Console rows by query and page. | |
| urls | No | The site's own best articles, ones that rank and that the owner likes. | |
| ideas | No | Topics without a page yet. | |
| start | No | First day, YYYY-MM-DD, default today. | |
| weeks | No | Weeks to plan, default 8. | |
| detail | No | brief = short summary. | |
| keyword | No | The search term the page should rank for. | |
| queries | No | Search Console rows by query and page, for the site-wide check. | |
| audit_id | No | Optional: a finished site audit, for internal link suggestions. | |
| per_week | No | Items per week, default 2. | |
| memory_key | No | site_memory key, records this call. | |
| competitors | No | Pages that rank for the term. | |
| webhook_url | No | Optional https Slack or Discord webhook for a Monday reminder; off stops it. | |
| competitor_rows | No | Optional keyword gap: competitors' organic keywords (Ahrefs organic-keywords or Semrush domain_organic for each competitor, or Semrush keyword gap rows). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds little beyond that — it hints at side effects (webhook Monday reminder, memory_key recording the call, draft 'before approval') but never states permissions, rate limits, or reversibility, so with annotations carrying the burden a 3 is appropriate.
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 opening states the tool's job and then the mode list is dense and front-loaded, with each mode entry pairing a verb with its required inputs. It is longer than average but nearly every clause carries routing or required-parameter information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover safety. For a 17-parameter, six-mode dispatcher the description supplies the critical mode-to-required-parameter mapping, though it leaves some parameters (detail, start, weeks, per_week, audit_id, ideas) mapped only via the schema, which is acceptable given 100% schema coverage.
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 alone would justify a baseline 3. The description earns above baseline by stating which parameters each mode requires ('Needs keyword, competitors', 'Needs rows[{query, page, clicks, impressions, position, url}]', 'Needs urls', 'Needs html') — information the schema cannot convey, since required is empty and every parameter is optional there.
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 names a concrete deliverable ('What to write and how, in the site's own voice') and then enumerates six distinct modes — brief, topics, intent, voice, calendar, draft — each with its own output. This distinguishes it sharply from siblings like text_quality, answer_readiness, and check_keyword, which an agent can rule out without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Pick with mode:' plus per-mode needs (brief needs keyword, competitors; topics needs rows[...]; voice needs urls; draft needs html) tells the agent exactly how to route within the tool. What is missing is any when-not-to-use or explicit cross-reference to sibling tools, which is why this falls 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.
dashboardSEO dashboardAInspect
A daily SEO data feed for key pages and a live dashboard in the chat. Pick with mode: feed = Start a daily feed of key pages; returns feed_id. Needs url. data = The feed as clean tables over time. Needs feed_id, dataset. build = Blueprint for a live SEO command center with realtime GA4 visitors. Needs feed_id.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD. | |
| url | No | Home page of the site. | |
| from | No | Start date, YYYY-MM-DD. | |
| mode | No | Default feed. | |
| name | No | Optional name, for example the client's name. | |
| pages | No | Optional key pages to track, up to 10. | |
| detail | No | brief = short summary. | |
| format | No | blueprint (default) for Claude Dashboards, or html for a complete, designed dashboard page filled with the feed's data, ready to show as an artifact. | |
| dataset | No | ||
| feed_id | No | Feed from create_dashboard_feed. | |
| replace | No | Replace this connection's existing feed. | |
| sources | No | What the user has connected in Claude. | |
| bigquery | No | Optional, for ready SQL. | |
| fix_log_id | No | Optional fix log from log_fix, to include shipped fixes. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so mutation status and open-world behavior are covered structurally. The description adds meaningful state-chaining context ('returns feed_id', data mode consumes feed_id/dataset, build produces a blueprint) but says nothing about whether re-running feed mode overwrites prior output, what sources must be connected first, or what the returned dashboard actually contains.
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 mode-first structure is front-loaded and the per-mode clauses are telegraphic with no filler sentences. It is dense to the point of clipped grammar, but every phrase carries a required-input or output fact, so nothing is wasted.
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 15-parameter, nested-object, multi-mode tool with an output schema, the description supplies what the structured fields cannot: which mode to pick and which inputs each mode demands. Remaining gaps (how the three modes interact across a session, what the feed/dashboard delivers in practice) are modest given the output schema and high schema coverage.
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 93%, so the baseline is 3, and the description clears that bar by mapping parameters to modes (feed needs url, data needs feed_id and dataset, build needs feed_id) - a cross-parameter dependency the flat schema with no required fields cannot convey. It adds nothing about the many remaining optional parameters (from/to, pages, replace, sources, bigquery, memory_key), which the schema mostly documents on its own.
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 leads with a concrete verb+resource ('daily SEO data feed for key pages and a live dashboard in the chat') and then decomposes the tool into three named modes with distinct deliverables, which is well beyond a restatement of the name. It never distinguishes itself from plausible siblings like watch or site_audit, so an agent still has to guess whether this is the right entry point within the suite.
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?
'Pick with mode: feed = ... data = ... build = ...' is explicit routing guidance and is reinforced by naming the required inputs for each branch, which the schema cannot express since zero parameters are marked required. There are no when-not conditions or pointers to alternative sibling tools for overlapping tasks such as tracking or auditing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edge_workerCloudflare WorkersBRead-onlyIdempotentInspect
Fixes applied at the edge on the user's own Cloudflare, on any CMS. Pick with mode: rules = One Worker that fixes a whole section by rules. Needs audit_id. prerender = Serve rendered HTML to AI crawlers for JavaScript apps. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A page of the app, for example https://app.example.com/pricing. | |
| mode | No | Default rules. | |
| detail | No | brief = short summary. | |
| audit_id | No | Id of a completed site audit (start_site_audit, then get_site_audit until complete). | |
| site_name | No | Brand name for title endings, for example 'Acme Shoes'. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'Fixes applied at the edge on the user's own Cloudflare', which describes a mutating deployment to the user's Cloudflare account, while annotations declare readOnlyHint=true and destructiveHint=false. A write action presented as read-only is the exact contradiction pattern to flag. It also omits the auth/permission requirements such a deployment would need.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool is, then mode-by-mode detail and prerequisites in three tight sentences; every clause carries information. The telegraphic 'Pick with mode:' / 'Needs audit_id.' style is slightly clipped but wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the two modes plus their prerequisites are covered. However, for an openWorld tool that touches the user's own Cloudflare, the description never states the authorization/setup prerequisite, what exactly is deployed, or whether it can be undone, leaving meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the schema already documents url, mode, detail, audit_id, site_name and memory_key. The description does add one piece of meaning beyond the schema: the conditional requirement that rules needs audit_id and prerender needs url, which the flat schema does not express.
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 resource (a Worker running on the user's own Cloudflare, CMS-agnostic) and splits it into two named modes, rules and prerender, with a one-line definition of each. An agent can tell what the tool produces, though no sibling tool is named to differentiate it from the many other fix/asset generators in the suite.
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 mode-selection guidance and the prerequisite for each mode: 'rules ... Needs audit_id' and 'prerender ... Needs url'. That is actionable when-to-use context, but it never says when to prefer edge_worker over siblings such as llms_txt, robots_txt, or get_fix_pack, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entityEntity and trustARead-onlyIdempotentInspect
How Google understands who is behind a site. Pick with mode: graph = Organization, sameAs, logo and founder in structured data. Needs url. trust = Author, about, contact and policy signals. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address, for example https://example.com/blog/post. | |
| mode | No | Default graph. | |
| detail | No | brief = short summary. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered. The description adds a useful signal ('Needs url') that compensates for the schema showing zero required parameters, but it discloses nothing about cost, rate limits or output behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with the conceptual framing front-loaded, then the mode split. Every sentence carries information; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analysis tool with an output schema and a fully described input schema, the description covers the essentials: purpose, mode selection and the url requirement. Return-value details are correctly omitted since the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the terse schema text ('Default graph') by explaining what each mode actually yields. It still says nothing about 'detail' or 'memory_key', which the schema already names.
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?
Frames the resource clearly ('How Google understands who is behind a site') and then specifies that it operates in two named modes, graph (Organization/sameAs/logo/founder) and trust (Author/about/contact/policy). An agent can tell what the tool returns, though it never uses a crisp verb like 'analyze' or 'extract' and doesn't name a 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?
'Pick with mode: graph = ... trust = ...' gives explicit guidance for choosing between the two internal modes, which is genuinely useful. However it offers no when-to-use versus alternatives like 'schema' or 'content', and no when-not guidance, so tool-level selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_googleExplain Google and BingARead-onlyIdempotentInspect
Explain what Google Search Console and Bing Webmaster Tools report, and what to do. Pick with mode: index_status = Index coverage and rich result statuses, with the fix. Needs rows[{url, coverageState, verdict, indexingState, robotsTxtState, pageFetchState}]. manual_action = A manual action, with the cleanup plan and reconsideration draft. Needs action. bing = Bing Webmaster crawl issues, and Bing against Google per query.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default index_status. | |
| rows | No | ||
| site | No | The site or Search Console property. | |
| action | No | The manual action as Search Console shows it. | |
| detail | No | brief = short summary. | |
| issues | No | Bing crawl or index issues. | |
| memory_key | No | site_memory key, records this call. | |
| sample_urls | No | Example URLs Google listed. | |
| bing_queries | No | ||
| google_queries | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered. The description adds genuine non-structured context: it returns remediation content ('with the fix', 'the cleanup plan and reconsideration draft') rather than raw report data, which an agent could not infer from 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?
Front-loads the purpose, then uses a compact mode = meaning / needs-X pattern that is easy to scan. Dense but every clause carries information; the trailing 'bing' clause is slightly terse about what data it consumes but not wasteful.
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 10-parameter, multi-mode tool with an output schema present, the description covers all three modes and their required inputs, and the return shape is handled by the output schema. Minor gaps remain (site, detail, memory_key are left to the schema), but nothing critical for correct invocation 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 70%, and the description adds mode-conditional parameter requirements that the schema does not encode since all 10 params are optional: rows[{url, coverageState, verdict, indexingState, robotsTxtState, pageFetchState}] for index_status, action for manual_action. This is real added meaning over the flat optional schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Explain what Google Search Console and Bing Webmaster Tools report, and what to do') and breaks the tool into three named modes with their outputs. An agent can distinguish it from diagnostic siblings like site_audit or technical, though no sibling is named explicitly.
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 a clear mode-selection rule (index_status / manual_action / bing) and states the input each mode needs (rows[...], action, bing query data), which is effectively the when-to-use guidance. It does not state when to prefer a sibling tool or when this tool is inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_opportunitiesFind search opportunitiesARead-onlyIdempotentInspect
Turn Search Console, GA4 or Ahrefs rows (also rows the user pastes) into the fastest wins, instead of judging them by hand; content_decay and traffic_drop take search_type for Discover, News, Image or Video rows. Pick with mode: ctr_gaps = Page 1 results with a click-through rate far below normal. Needs rows[{position, page, query, clicks, impressions, ctr}]. striking_distance = Queries at positions 8 to 20 worth a push. Needs rows[{position, page, query, clicks, impressions, ctr}]. content_decay = Pages slowly losing clicks over months: a refresh queue. Needs rows[{url, month, clicks}]. traffic_drop = Explain a drop page by page, by device and country. Needs rows[{url, before, after, query, device, country}]. prune = Keep, refresh, merge (301), noindex or remove (410) per page. Needs rows[{url, clicks, impressions, conversions, referring_domains, inlinks}]. discover = Readiness for Google Discover and News, with Discover or News rows. paid_organic = Google Ads terms against Search Console: ad spend you can test cutting, content to write. Needs ads[{term, cost, clicks, conversions}], gsc[{query, position, clicks, page}]. anomalies = Spike and drop days in daily rows, with Google updates near them. Needs rows[{date, clicks, impressions, page}]. ai_queries = Question and prompt-style queries per page, for AI answers. Needs rows[{query, page, clicks, impressions, position}].
| Name | Required | Description | Default |
|---|---|---|---|
| ads | No | Google Ads search terms. | |
| gsc | No | Search Console queries. | |
| mode | No | Default ctr_gaps. | |
| rows | No | Search Console rows for one period (28 days works well). | |
| urls | No | Article pages to check. | |
| detail | No | brief = short summary. | |
| drop_date | No | Optional first day of the drop, YYYY-MM-DD, to check Google updates around it. | |
| fix_log_id | No | Optional fix log from log_fix, to spot undone fixes on losing pages. | |
| memory_key | No | site_memory key, records this call. | |
| brand_terms | No | Optional brand names, handled apart. | |
| search_type | No | Search Console search type of the rows, default web. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds mode-specific output goals ('a refresh queue', 'Explain a drop page by page') and input constraints, but no extra behavioral context such as auth requirements or return format beyond what the schema and output schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loads the core purpose and then devotes each sentence to a mode, so little is wasted. It would be more scannable as a bulleted list rather than a single dense paragraph, but the information density is appropriate for nine modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and all parameters documented, the description is nearly complete for mode selection and required row fields. It does not explain how auxiliary parameters (urls, drop_date, fix_log_id, etc.) pair with specific modes, leaving some integration detail to inference.
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 parameters like ads, gsc, mode, and others are already documented. However, the description adds crucial meaning by mapping each mode to the exact fields required inside the generic rows array (e.g., ctr_gaps needs position, page, query, clicks, impressions, ctr), which the schema alone does not specify.
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 ('turn rows into fastest wins') and resource (Search Console/GA4/Ahrefs rows), and enumerates nine distinct modes with their distinct outputs. An agent can distinguish this from siblings like prioritize_fixes or check_keyword without opening other 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 explicit mode-selection criteria ('ctr_gaps = Page 1 results with a click-through rate far below normal', etc.) and states the required row shape for each mode. It lacks any when-not-to-use guidance or naming of external sibling alternatives, but the internal routing is very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fix_logFix logAInspect
Record shipped fixes, keep them live and report on them. Pick with mode: log = Record a shipped fix; checked every 6 hours, restore code on regression. Needs fixes[{url, field, new, old, via, ref}]. report = Every fix with status and results: a monthly client report. Needs fix_log_id.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default log. | |
| brand | No | For the report: your agency name for the header. | |
| fixes | No | ||
| month | No | For the report: YYYY-MM. | |
| detail | No | brief = short summary. | |
| format | No | status (default), a client report, or GA4 annotations (one per ship date) for the Admin API. | |
| verify | No | Check the live pages now (4 pages per call). | |
| webhook | No | Optional https URL (Slack, Discord, Zapier, n8n, a GitHub Action) that gets the restore code when a fix is undone. | |
| fix_log_id | No | Add to an existing log. | |
| memory_key | No | site_memory key, records this call. | |
| shipped_at | No | Date the fixes went live, YYYY-MM-DD. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say not-read-only, open-world, non-idempotent, non-destructive), the description discloses real behavior: fixes are re-checked every 6 hours and code is restored on regression, the webhook receives restore code when a fix is undone, verify checks live pages at 4 pages per call, and format=annotations emits GA4 Admin API annotations. Auth/permission requirements are not covered, keeping it at 4.
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 purpose followed by two clearly labeled mode branches; nothing reads as filler and the per-branch prerequisite lists are compact. The bracketed "fixes[{url, field, new, old, via, ref}]" shorthand is terse but functional rather than elegant.
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 11 parameters at 91% schema coverage and an output schema present, the description does the work that matters: mode selection, branch prerequisites, verification cadence, and webhook notification behavior. Only authentication/authorization context and the relationship to sibling monitoring tools are 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 coverage is 91%, so the baseline is 3, but the description adds mode-scoped meaning the flat schema does not convey: which parameters belong to the log branch (fixes subfields url/field/new/old/via/ref) versus the report branch (fix_log_id), plus the 6-hour check semantics tied to the logged values. Minor tension exists between the schema's "Add to an existing log" phrasing for fix_log_id and the description presenting it as required for report mode.
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 opening sentence states a specific verb and resource ("Record shipped fixes, keep them live and report on them") and the mode branch spells out both operations, so the agent knows exactly what the tool does. It does not, however, name or contrast any sibling (e.g. watch, tracking, site_memory), so it falls short of the 5-level sibling differentiation bar.
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?
"Pick with mode: log = ... report = ..." gives explicit branch conditions, and the "Needs fixes[...]" / "Needs fix_log_id" clauses state which inputs each branch requires. There is no when-not guidance and no named alternative tool, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fix_packFixes as codeAInspect
Fixes ready to ship: as code, for a CMS through its MCP, as a pull request or at the edge. Pick with mode: fixes = Title, description, canonical, social tags, JSON-LD; platform html, wordpress, shopify, webflow, wix, storyblok, sanity, contentful, strapi, ghost, magento, git or cloudflare. Needs url. alt_texts = Write and ship missing alt texts. Needs url. web_vitals = Speed fixes as tags, WordPress steps or a Worker. Needs url. wordpress = Send fixes, new drafts and post updates to the OnPage.dev WordPress plugin for one-click approval and undo. Needs site_key.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| alts | No | Step 2: the alt text per image src. | |
| mode | No | Default fixes. | |
| note | No | Optional reason shown to the site owner. | |
| detail | No | brief = short summary. | |
| changes | No | Optional field and new value pairs. | |
| failing | No | Metrics that fail for real users, if known. | |
| platform | No | html (default) for code to paste; wordpress, webflow, wix, shopify, storyblok, sanity, contentful, strapi, ghost or magento for a plan with the exact fields and | |
| site_key | No | The site key from the plugin, wpk_... | |
| change_id | No | Status of an earlier send. | |
| framework | No | With platform git: the site's framework. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, openWorldHint=true and destructiveHint=false. The description adds real context beyond that for the wordpress mode: fixes, drafts and post updates are sent to the plugin with one-click approval and undo, which reassures about reversibility. It does not disclose auth requirements, rate limits, or whether repeated non-idempotent calls duplicate sends, so it is useful but partial.
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 mode list is dense but consistently structured ('mode = output. Needs x.'), and the deliverable is front-loaded. The opening clause 'Fixes ready to ship' is marketing filler, and cramming four modes plus platform lists into one paragraph makes it harder to scan than bullets would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described. For a 12-parameter, 4-mode tool the description covers the mode taxonomy and required inputs well; the main omission is any signal about ordering relative to siblings (e.g. analyze first, then generate fixes).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by binding parameters to modes – url is required for fixes/alt_texts/web_vitals and site_key for wordpress. That mode-to-parameter dependency is not expressible in the flat schema and is the single most useful thing added here.
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 concrete deliverable – a 'fix pack' emitted as code, CMS payload, PR, or edge worker – and enumerates the four modes (fixes, alt_texts, web_vitals, wordpress) with the artifact each produces. That is specific verb+resource+output. It does not, however, name or contrast itself against closely related siblings such as prioritize_fixes, plan, accessibility, or web_vitals, so an agent must infer the boundary.
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 through mode semantics and the per-mode prerequisites ('Needs url', 'Needs site_key'), which tells an agent which mode requires what input. There is no explicit when-to-use/when-not guidance and no routing to alternatives, e.g. which sibling to call first to decide which fixes are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
internal_linksInternal linksARead-onlyIdempotentInspect
Internal links and link equity. Pick with mode: suggest = Links to add, with anchors, applied by Worker or CMS. Needs audit_id. equity = Internal PageRank and click depth from a site audit. Needs audit_id.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default suggest. | |
| topic | No | Topic or main keyword of the target page. | |
| detail | No | brief = short summary. | |
| phrases | No | Optional: phrases to turn into the link, besides the anchor text, for example natural variants. | |
| audit_id | No | Id of a completed site audit. | |
| platform | No | Optional: also return the links ready to apply: a Cloudflare Worker that links the first mention on each page, a WordPress edit plan, or the edits for the code. | |
| memory_key | No | site_memory key, records this call. | |
| target_url | No | Page that should receive links. | |
| important_urls | No | Optional. Pages that matter most, for example top pages by clicks or revenue. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context that suggested links can be 'applied by Worker or CMS', but says nothing about return format, cost, or limits beyond what annotations and the output schema provide.
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 content is front-loaded (topic statement first, then mode routing) and every phrase carries a distinct fact. It is terse and slightly telegraphic, but there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and all 9 parameters are fully documented in the schema. The description supplies the mode-selection logic and audit_id prerequisite, leaving only minor gaps such as how the modes interact with the application-oriented params.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns above that by explaining the semantics of the mode enum (what 'suggest' and 'equity' actually return) and reaffirming the audit_id requirement, adding meaning beyond the schema's bare 'Default suggest.'
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 names the resource (internal links / link equity) and splits it into two concrete modes with their distinct outputs (links to add with anchors vs. Internal PageRank and click depth). This is specific enough for an agent to know what the tool produces, though it does not explicitly name which siblings it overlaps with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mode routing is explicit: 'suggest = Links to add...', 'equity = Internal PageRank and click depth', plus a stated prerequisite ('Needs audit_id') for both. This tells the agent when to pick each mode, but provides no guidance on when not to use the tool or which sibling to prefer instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
layoutLayout and first screenARead-onlyIdempotentInspect
What visitors and crawlers see on every screen size. Pick with mode: render = First screen on phone, tablet and desktop in a real browser, and what crawlers without JavaScript get (default). Needs url. probe = A measurement script to run in the user's own browser tool. analyze = Analyse the results of that script. Needs url, results.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| mode | No | Default render. | |
| no_js | No | Optional: the probe result with JavaScript turned off, for an exact comparison. | |
| detail | No | brief = short summary. | |
| results | No | One probe result per viewport, each with device set to phone, tablet or desktop. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive behavior, and the description adds real context: render uses "a real browser" and captures "what crawlers without JavaScript get," while probe delegates execution to the user's browser. That materially explains execution model beyond the structured safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by a compact per-mode breakdown; every clause carries information. It is telegraphic and slightly dense, but there is no filler to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers mode semantics and required inputs for a 6-parameter tool. The main residual gap is that it does not call out optional params (no_js, detail, memory_key) or differentiate from siblings, though the schema fills those in.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining what each mode value actually produces and which params each mode requires. It leaves no_js, detail, and memory_key to the schema, but those are already well documented there.
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 the resource concretely: "What visitors and crawlers see on every screen size," and then describes each mode's distinct output (first-screen rendering vs. a probe script vs. analysis). This lets an agent distinguish the three behaviors. It never positions itself against sibling tools like content or technical, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit mode-selection guidance ("Pick with mode"), marks render as the default, and names the required inputs per mode ("Needs url," "Needs url, results"). It does not say when to prefer this tool over sibling tools such as content or scan_page, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
llms_txtllms.txtARead-onlyIdempotentInspect
The llms.txt file for AI assistants. Pick with mode: generate = Write one from the sitemap and home page. Needs url. validate = Check an existing one and its links. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Home page of the site, for example https://example.com. | |
| mode | No | Default generate. | |
| text | No | Optional llms.txt content to validate instead of the live file. | |
| detail | No | brief = short summary. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description usefully states that generate derives content from the sitemap and home page and that validate inspects links, but says nothing about network access, rate limits, or that memory_key causes the call to be recorded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse sentences, front-loaded with the resource and then the mode decision. Every clause carries information; nothing is padded or restated.
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 5-parameter tool with full schema coverage plus an output schema, the description covers the decision an agent must make (which mode, and that a URL is needed) and correctly leaves return values to the output schema. The incomplete handling of the text/detail/memory_key path 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?
Schema coverage is 100%, so the baseline is 3; the description exceeds it by supplying the conditional requirement the schema does not encode ('Needs url' for both modes) even though no parameter is marked required. It is slightly imprecise, since url may be unnecessary when text is supplied, and it never mentions text, detail, or memory_key.
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?
Names the resource (the llms.txt file for AI assistants) and splits it into two concrete operations with explicit verbs: generate writes one from the sitemap and home page, validate checks an existing one and its links. It does not, however, distinguish itself from adjacent siblings such as robots_txt or sitemap, which an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Pick with mode' framing gives a clear branch rule, and each mode's precondition ('Needs url') tells the agent what must be supplied before calling. No exclusions or alternative-tool routing are given, so it stops 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.
localLocal SEOARead-onlyIdempotentInspect
Local search: the site, the Business Profile and the map. Pick with mode: check = LocalBusiness markup, NAP, locations and the Business Profile (default). Needs url. reviews = Reply drafts for Google reviews, unhappy ones first, for the user's GBP connector after approval. Needs reviews[{rating, author, text, date, replied, review_id}]. demand = Business Profile search terms and geo-grid ranks into new service and location pages.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The home page, a location page or the locations overview page. | |
| city | No | Main city, left out when matching terms to pages. | |
| grid | No | Optional geo-grid rankings. | |
| mode | No | Default check. | |
| pages | No | The site's page URLs, e.g. | |
| terms | No | Search terms from the Business Profile performance report. | |
| detail | No | brief = short summary. | |
| contact | No | Where unhappy customers can reach you, e.g. | |
| reviews | No | ||
| business | No | Business name to sign with. | |
| memory_key | No | site_memory key, records this call. | |
| gbp_profile | No | Optional: the Google Business Profile of this location, from the user's GBP connector or typed by the user, to compare with the site. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the bar is lower. The description adds real behavioral context beyond them: reviews mode only produces reply drafts routed to the user's GBP connector 'after approval', unhappy reviews are handled first, and GBP profile data is used only for comparison. No contradiction with the readOnly hint.
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 domain, then three tight mode clauses each stating purpose and required input. Dense but every clause carries routing information. Slightly compressed notation (e.g. 'Needs reviews[{...}]') costs a little readability.
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 12-parameter multi-mode tool with an output schema (so return values need not be explained), the description covers all three modes and their key inputs and side effects. It leaves secondary parameters (city, grid, terms, detail, contact, memory_key) unexplained, but those are documented in the schema at 92% coverage.
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 92%, so the baseline is 3, but the description adds value the schema cannot: it maps which inputs each mode requires (url for check, the reviews[] array for reviews) even though every top-level parameter is formally optional (required: 0). That per-mode requirement linkage is genuine added semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete domain (local search: site, Business Profile, map) and decomposes it into three clearly labeled modes with distinct outputs, so an agent can tell what the tool produces. The bare name 'local' is weak, but the description compensates. It differentiates internally by mode rather than from siblings like schema or entity, so it stops just short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit mode selection with defaults and prerequisites ('check... (default). Needs url', 'reviews... Needs reviews[...]', 'demand = ...'). That is strong within-tool routing. It does not name when to avoid the tool or which sibling (schema, entity, track_rankings) to prefer instead, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measureMeasure resultsAIdempotentInspect
Prove and measure with numbers from the user's Search Console, GA4, Ahrefs or Semrush, including numbers the user pastes. Use it instead of calculating by hand: it handles spelling variants, control groups and trends. Pick with mode: impact = Before and after fixes, against pages you did not touch. Needs pages[{url, before, after, changed, fix}]. ai_citations = AI citations before and after, per engine. Needs pages[{url, before, after, changed}]. ai_referrals = Visits from ChatGPT, Perplexity, Gemini and other assistants, from GA4. Needs rows[{source, sessions, landing_page, period, conversions, revenue}]. brand_split = Brand versus non-brand clicks and how each moved. Needs brand_terms, rows[{query, keyword, clicks, traffic, impressions, position}]. share_of_voice = Share of the clicks against competitors from rank rows. Needs your_domain, rows[{keyword, position, volume, domain, url, group}].
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of each period in days. | |
| mode | No | Default impact. | |
| rows | No | ||
| pages | No | ||
| detail | No | brief = short summary. | |
| source | No | Where the counts come from, for example Ahrefs Brand Radar. | |
| fix_date | No | Date the fixes went live, YYYY-MM-DD. | |
| watch_ids | No | Optional watch ids, to list what changed on each page and when. | |
| fix_log_id | No | Optional fix log from log_fix: takes the fix date from it and saves the result per fix, with a rollback plan for fixes that did worse. | |
| memory_key | No | site_memory key, records this call. | |
| brand_terms | No | Brand and product names, and misspellings. | |
| rows_before | No | Optional same rows from an earlier period. | |
| your_domain | No | Your domain, e.g. example.com. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotent=true, destructive=false), and the description adds real behavioral context beyond them: fix_log_id saves results per fix and produces a rollback plan for fixes that did worse, and memory_key records the call into site_memory. It does not discuss rate limits or failure behavior, but the mutation/persistence semantics are disclosed.
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 purpose and the mode-selection rationale, then compressed into a dense mode-by-mode input list. Every clause carries information, though the packed enumeration reads as terse rather than ideally structured prose.
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 13 parameters, five modes, 85% schema coverage, an output schema, and annotations, the description supplies the mode-to-input mapping and persistence semantics an agent needs to invoke it correctly. Minor gaps remain around default behavior for unlisted optional parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 85% (baseline 3), and the description goes further by spelling out the concrete field sets required per mode — e.g. pages[{url, before, after, changed, fix}] for impact and rows[{source, sessions, landing_page, period, conversions, revenue}] for ai_referrals. This meaningfully compensates for the untyped nested object arrays the schema leaves bare.
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?
Opens with a specific verb and scope: prove and measure numbers from named sources (Search Console, GA4, Ahrefs, Semrush) plus pasted data. It distinguishes itself from calculation-by-hand and from sibling analytics tools by enumerating the five modes it produces, so an agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage ('Use it instead of calculating by hand') and gives per-mode selection guidance with the required input shape for each mode. It does not name a sibling tool to prefer or state when not to use it, so it falls short of full when/when-not/alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
planPlan the workARead-onlyIdempotentInspect
Plans for migrations, experiments and the team. Pick with mode: redirects = Redirect map for a migration or URL change. split_test = SEO split test on a page template, with the Worker. Needs urls, field, pattern. sprint = Fixes into a week plan of tickets per role. Needs fixes[{title, url, detail, severity, impact, effort}].
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default redirects. | |
| urls | No | Pages of one template. | |
| field | No | What to change. | |
| fixes | No | ||
| hours | No | Hours per week per role, default 8 each. | |
| weeks | No | Weeks to plan, default 4. | |
| clicks | No | Optional clicks per page for a balanced split. | |
| detail | No | brief = short summary. | |
| format | No | Output format, default redirects (Cloudflare Pages and Netlify). | |
| pattern | No | The new value with {title} or {description} as placeholders. | |
| new_site | No | New site address, to read its sitemap instead of new_urls. | |
| new_urls | No | ||
| old_site | No | Old site address, to read its sitemap instead of old_urls. | |
| old_urls | No | ||
| memory_key | No | site_memory key, records this call. | |
| start_date | No | Optional planned start, YYYY-MM-DD. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, openWorld, so safety is covered. The description adds mode-specific behavioral context the annotations cannot: what each mode produces (redirect map, Worker-based split test, week plan of tickets per role) and the required input shapes, which is genuine added value.
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 mode breakdown is front-loaded right after a one-line purpose statement, and each clause carries distinct information. It is dense shorthand rather than filler, though the compact "=" notation reads a little run-on.
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 16-parameter, multi-mode tool, the description covers the three modes' key inputs and the output schema handles returns. However, it leaves many parameters (hours, weeks, detail, format, old_site/new_site, clicks, memory_key, start_date) unmapped to modes, so an agent must infer which apply when.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 81% schema coverage the baseline is 3, but the description goes further by mapping parameters to modes (split_test needs urls/field/pattern; sprint needs fixes with its subfields), which the schema alone cannot express since param applicability is mode-dependent.
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 names the verb ("Plans") and the three concrete resources/use cases (migrations, split tests, team sprints), then breaks each mode down so an agent can tell redirects from split_test from sprint. It is specific and non-tautological, though it does not differentiate from any sibling tool by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent how to select behavior via "Pick with mode" and gives a condition/purpose for each of the three modes, plus the inputs each mode needs. There is no "when not to use" guidance or pointer to alternative sibling tools, keeping it out of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prioritize_fixesRank fixes by traffic impactARead-onlyIdempotentInspect
Use when Search Console, GA4, Ahrefs or Semrush data is available, also to explain a traffic drop (pass clicks_previous): ranks the fixes by the traffic or revenue they can win. Rank SEO fixes by how much traffic they can win, using data from the user's other connected tools. With GA4, also pass each page's organic conversions (key events) or revenue, and fixes are ranked by the money they can bring instead of clicks.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | Yes | ||
| detail | No | brief = short summary. | |
| source | No | Where the numbers come from. | |
| audit_id | No | Optional id of a finished site audit, so pages are not scanned again. | |
| currency | No | Currency of revenue, for example EUR or USD. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| status | Yes | |
| actions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety burden is light. The description adds real behavioral detail beyond them: passing clicks_previous triggers a refresh fix, and supplying GA4 conversions or revenue switches the ranking objective from clicks to money.
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 usage condition and click-loss tip are front-loaded, but the second sentence largely restates the title and the first sentence's ranking claim without adding information, creating noticeable redundancy in a short description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and annotations cover safety. The description supplies the data-source preconditions and the two objective-switching behaviors an agent needs, leaving only minor gaps such as scope limits (max 10 pages).
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 83%, so the baseline is 3. The description adds genuine semantics on top of the schema by explaining the purpose of clicks_previous (diagnosing traffic drops) and of conversions/revenue (re-ranking by monetary return), which the schema fields alone only hint at.
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: ranks SEO fixes by the traffic or revenue they can win. An agent can tell this is a prioritization tool rather than a raw data collector, though it never names the sibling it is distinguished from (e.g. find_opportunities or plan).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger conditions are given: use when Search Console, GA4, Ahrefs or Semrush data is available, and additionally to explain a traffic drop by passing clicks_previous. It lacks exclusion criteria or named alternatives, but the when-to-use context is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_recrawlRecrawlAIdempotentInspect
Get changed pages recrawled. Pick with mode: recrawl = Check pages are indexable, sitemap lastmod entries, IndexNow and Search Console steps (default). Needs urls. indexnow = Submit URLs to IndexNow, or set up the key. Needs urls.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | The site's IndexNow key (8 to 128 letters, digits or dashes). | |
| mode | No | Default recrawl. | |
| urls | No | Changed pages on one site. | |
| detail | No | brief = short summary. | |
| memory_key | No | site_memory key, records this call. | |
| indexnow_key | No | Optional IndexNow key that is live at /<key>.txt. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false and openWorld=true, so the safety profile is covered. The description adds meaningful behavioral detail beyond that: it enumerates the steps the recrawl performs (indexability check, sitemap lastmod, IndexNow, Search Console) and discloses a practical requirement ('Needs urls') that the schema does not enforce, since zero parameters are marked required.
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 core action is front-loaded in the first sentence, then mode semantics follow in a compact form. 'Needs urls' is repeated for each mode, which is mildly redundant but serves as an emphasis of the shared requirement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a 6-parameter, 0-required tool the description supplies the missing mode semantics and the practical 'needs urls' constraint, leaving little an agent needs but doesn't have.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description earns a bump because the schema's own enum descriptions are terse ('Default recrawl'), whereas the description explains what 'recrawl' and 'indexnow' actually do and flags that 'urls' is effectively needed for both, adding meaning the schema lacks.
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 ('Get changed pages recrawled') and then breaks the tool into its two operating modes, so the agent understands what it does. It doesn't name or contrast against sibling tools like sitemap or a dedicated IndexNow tool, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent how to choose a mode: 'recrawl' (default) versus 'indexnow', and describes what each does. This is clear when-to-use guidance for the sub-behaviors, though it gives no when-not-to-use or cross-tool alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
robots_txtrobots.txtARead-onlyIdempotentInspect
robots.txt for search and AI crawlers. Pick with mode: test = Which crawlers may fetch a URL, and the rule that decides. Needs url. ai_policy = Rules per AI crawler: allow AI search, block training. Needs url, policy.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| mode | No | Default test. | |
| detail | No | brief = short summary. | |
| policy | No | Which AI crawlers to allow. | |
| memory_key | No | site_memory key, records this call. | |
| robots_txt | No | Optional robots.txt content to test instead of the live file. | |
| user_agents | No | Crawler names, for example Googlebot, GPTBot, ClaudeBot, PerplexityBot. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds the useful behavioral fact that required inputs vary by mode, but says nothing about the robots_txt override, user_agents, or memory_key side effects, leaving that to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the resource and then the mode decision; every clause carries information an agent needs to select a mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the mode split plus prerequisite params are covered. Coverage of the auxiliary inputs (detail, user_agents, robots_txt, memory_key) is left entirely to the schema, which is acceptable given 100% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, mode, detail, policy, user_agents and the robots_txt override. The description only reinforces which params are needed per mode, which is marginal added meaning over the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (robots.txt) and splits it into two concrete capabilities, test and ai_policy, each with a one-line outcome. An agent can tell the two modes apart, though it gives no signal about how this differs from the sibling llms_txt tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says how to pick: 'Pick with mode: test = ...' and 'ai_policy = ...', and names the prerequisites for each ('Needs url', 'Needs url, policy'). There is no when-not guidance or sibling alternative routing, which keeps it 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.
scan_pageSEO and AI scanARead-onlyInspect
Scan a page for Google and AI search: 0-100 score, issues to fix first with why and how, AI readiness and key facts. Pick with mode: page = A live page by url (default). Needs url. html = Unpublished HTML before deploy, to gate a release. Needs html. deep = Everything measured on one page, by section. Needs url. rescan = Scan again after fixes and compare with the last scan. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| html | No | The complete HTML document, up to 900 KB. | |
| mode | No | Default page. | |
| detail | No | brief = short summary. | |
| sections | No | Sections to include. Default: all. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, openWorld, and non-idempotent, so the safety profile is covered. The description adds mode-specific prerequisites ("Needs url" / "Needs html") and the compare-with-last-scan behavior of rescan, which is real context beyond the structured fields, though it does not mention limits or how the scan is scoped.
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 value proposition, then a compact mode list where every clause carries needed information. No filler sentences; the dense prose is justified by the number of distinct modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description need not explain return values, and it covers the mode branching well. Its gap is that it never positions this against broad siblings like site_audit or accessibility, leaving the page-vs-site choice to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the schema's mode field says only "Default page" while the description gives each enum value distinct meaning and its required companion parameter. That is meaningful semantic value added on top of the schema, though detail, sections, and memory_key get no extra explanation.
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 ("Scan a page") and enumerates the concrete outputs (0-100 score, prioritized issues with why/how, AI readiness, key facts), which separates it from single-facet siblings like accessibility, content, or technical. An agent can immediately tell this is the broad page-level SEO/AI scan.
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 mode breakdown is explicit when-to-use guidance: page for a live URL, html for unpublished HTML gating a release, deep for per-section measurement, rescan for post-fix comparison. Each mode names its required input, so the agent can pick correctly without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schemaStructured dataARead-onlyIdempotentInspect
JSON-LD structured data for rich results. Pick with mode: generate = Write JSON-LD for a page: type Article, Product, FAQPage, Organization, BreadcrumbList, VideoObject, Event, Recipe, JobPosting, SoftwareApplication, ProfilePage or Course. Needs url. validate = Validate JSON-LD for rich results. Needs jsonld. product_page = Check an existing ecommerce product page (price, stock, merchant listing fields). To write Product JSON-LD use generate with type Product. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| mode | No | Default generate. | |
| type | No | Schema type, default auto. | |
| detail | No | brief = short summary. | |
| jsonld | No | The JSON-LD as text, with or without the <script> tag. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuine behavior beyond that: what each mode actually does (generate produces JSON-LD, validate checks it, product_page inspects an existing ecommerce page for price/stock/merchant fields) and the required input per mode.
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 one-line purpose, then uses a compact mode = behavior = requirement structure that is easy to scan. Dense but every fragment carries routing or prerequisite information; only the type enumeration is slightly list-heavy.
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 six-parameter, three-mode tool with an output schema and full annotation coverage, the description covers what each mode does and what each needs, so an agent has enough to call it. It leaves the memory_key side effect and the detail parameter's impact largely to the schema, 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?
Schema coverage is 100%, so the baseline is 3, but the description goes further by tying parameters together across the mode enum: url is needed for generate and product_page, jsonld for validate, and the type enum is spelled out with a note that 'auto' is the default. That cross-parameter conditional logic is not expressible in the flat schema and adds real value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (JSON-LD structured data for rich results) and then decomposes the tool into three concrete operations: generate, validate, and product_page. Each mode is described with its own verb and required input, so an agent can tell exactly what the tool produces in each case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives per-mode selection guidance and prerequisites ('Needs url', 'Needs jsonld') and disambiguates an easy mistake by routing Product writing to 'generate with type Product'. It does not name any sibling alternative or state when not to use the tool, so it stops short of a full when-to-use/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
site_auditWhole-site auditAInspect
Audit a whole site, step by step, and work with the result. Pick with mode: start = Start an audit of up to 25 pages; returns audit_id. Needs url. continue = Scan the next pages; call until complete. Issues by code, sections, average score. Needs audit_id. import = Turn a crawl from Screaming Frog, Ahrefs or Semrush (up to 500 pages) into an audit_id. Needs pages[{url, status, redirect_to, title, meta_description, h1}]. compare = What changed since the last audit, or against a competitor audit. Needs audit_id. report = A client-ready report page with a link. Needs audit_id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address, for example https://example.com. | |
| mode | No | Default start. | |
| note | No | Optional short note for the reader, shown at the top. | |
| brand | No | Optional agency or team name to show instead of OnPage.dev. | |
| links | No | Optional internal links, for link equity, orphans and internal link suggestions. | |
| pages | No | One row per crawled page. | |
| detail | No | brief = short summary. | |
| source | No | Where the rows come from, for example Screaming Frog or Ahrefs Site Audit. | |
| audit_id | No | The id returned by start_site_audit. | |
| max_pages | No | How many pages to audit, default 10, at most 25. | |
| memory_key | No | site_memory key, records this call. | |
| previous_audit_id | No | Optional: the audit to compare with. | |
| competitor_audit_id | No | Optional: a finished audit of a competitor's site, to compare the two sites side by side instead of over time. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint false, destructiveHint false, openWorldHint true), so the description's job is to add workflow context — which it does: start returns an audit_id, continue iterates until complete, import converts external crawl data into an audit_id, and report produces a client-ready page with a link. The multi-step state-chaining and the 25/500 page caps are useful disclosures beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded ('Audit a whole site, step by step') and each mode is presented as a compact 'mode = behavior. Needs X.' unit. It is telegraphic and runs together as one block, but nearly 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?
Covers all five modes, their required arguments, and step limits, and an output schema exists so return values need not be described. The compare mode only says 'Needs audit_id' without mentioning the schema's previous_audit_id/competitor_audit_id options, a minor gap for a 13-parameter 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 100%, so the baseline is 3, but the description adds real value by mapping which parameter each mode requires (url for start, audit_id for continue/compare/report, pages[{...}] for import) — for a mode-dispatch tool this mapping is the key semantic an agent needs.
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 ('Audit a whole site') and enumerates five distinct modes (start, continue, import, compare, report), so an agent immediately understands this is the whole-site audit orchestrator rather than a single-page scan. It does not explicitly distinguish itself from siblings like scan_page or technical, which keeps it at 4 rather than 5.
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?
Each mode carries inline usage context: 'call until complete' for continue, 'compare the two sites side by side' for compare, and the required argument per mode. This is strong when-to-use guidance for a mode-dispatch tool, though it offers no explicit exclusions or pointers to alternative siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sitemapXML sitemapARead-onlyIdempotentInspect
The XML sitemap. Pick with mode: check = Check the sitemap and a sample of its URLs. Needs url. generate = Write a sitemap from a page list or audit. Needs audit_id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The site's home page, or the sitemap URL itself. | |
| mode | No | Default check. | |
| detail | No | brief = short summary. | |
| audit_id | No | A finished site audit. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds useful behaviour (check samples the sitemap's URLs; generate derives a sitemap from a page list or a finished audit), but it doesn't resolve the tension between 'Write a sitemap' and readOnlyHint=true — it should say the generated sitemap is an artifact returned to the caller rather than a change to the site. No rate limits, no side effects, no auth requirements stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, mode selection front-loaded, zero filler. Every sentence carries routing information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the mode/parameter contract is fully covered. Minor gaps remain around the detail flag's effect and around how generate relates to site_audit, but for a two-mode tool with 100% schema coverage this is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by mapping modes to the parameters they require (url for check, audit_id for generate) — information the schema's terse 'Default check.' does not convey. It still says nothing about detail, memory_key, or the url-vs-sitemap-URL distinction beyond what the schema already contains.
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 mode definitions supply real verbs and resources: 'check = Check the sitemap and a sample of its URLs' and 'generate = Write a sitemap from a page list or audit.' An agent can tell this is a two-mode sitemap tool. However, the tool is not distinguished from nearby siblings such as site_audit, robots_txt, or llms_txt, so it falls short of a 5.
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 explicit mode-selection guidance with the triggering parameter for each branch ('check ... Needs url', 'generate ... Needs audit_id'), which is exactly what an agent needs to route a request. It stops at context though — there is no when-not-to-use and no pointer to an alternative sibling when the sitemap is not the right target.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
site_memorySite memoryAInspect
A memory per site that every OnPage.dev tool writes to, across chats and clients. Open it first when working on a site over time. Pick with mode: open = Open or create the memory, bind it to this chat, get the brief and next steps (default). Needs url. next = The best next steps from everything recorded. timeline = What happened, newest first. note = Record a decision or context. Needs note. forget = Delete the memory (ask the user first). Needs memory_key.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The site's home page. | |
| kind | No | ||
| mode | No | Default open. | |
| note | No | ||
| limit | No | ||
| detail | No | brief = short summary. | |
| memory_key | No | The memory_key you got when the memory was created. | |
| share_learning | No | Opt in (true) or out (false) of sharing anonymous results: only the fix type and the rounded lift, never the site, URLs or numbers. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states that forget mode deletes the memory, which is a destructive operation, but the annotations declare destructiveHint=false. This directly contradicts the tool's own behavioral description. Even though other modes are well explained, the contradiction is serious enough to cap this dimension at 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, then compactly enumerates each mode with its behavior and required inputs. Every clause earns its place despite covering five modes, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex eight-parameter, multi-mode tool, the description covers the main modes and their required inputs well, and an output schema exists so return values need not be explained. However, it omits meaning for kind, limit, detail, and share_learning, and the destructiveHint contradiction leaves the agent with an inconsistent behavioral picture.
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 description adds conditional requirements for url, note, and memory_key, and clarifies the default mode. However, it does not explain the kind, limit, detail, or share_learning parameters, and schema description coverage is only moderate. It adds useful mode-linked semantics but leaves several parameters unaddressed.
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 defines the tool as a site-specific memory that every OnPage.dev tool writes to, distinguishing it from all sibling tools. The multi-mode behavior is stated up front, so an agent immediately understands this is the central persistent memory layer for a site.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to open it first when working on a site over time, then explains when to use each mode: open for setup and brief, next for next steps, timeline for history, note for recording context, and forget for deletion. Required parameters per mode and the instruction to ask the user before forgetting are also included.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snippetSnippets and share cardsARead-onlyIdempotentInspect
How a page looks in Google and when shared, measured in pixels the way Google truncates. Use it instead of estimating title or description length. Pick with mode: search = Title and description as Google shows them; give title (and description) or a url to read them. social = Open Graph and X cards, and the share image. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Page to read the current title and description from, when no title is given. | |
| mode | No | Default search. | |
| title | No | Proposed title tag text. | |
| detail | No | brief = short summary. | |
| memory_key | No | site_memory key, records this call. | |
| description | No | Proposed meta description. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds behavior they don't cover: results are 'measured in pixels the way Google truncates', and social mode imposes a url requirement. It does not discuss return format, but the output schema handles that.
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 value (pixel-accurate snippet/sharing preview), then mode selection and requirements. Dense and mostly waste-free, though the mid-sentence mode explanations read a touch run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only preview tool with a 6-param, fully documented schema and an output schema, the description covers purpose, mode selection, and input requirements well. Return values are delegated to the output schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies the mode enum ('search = Title and description as Google shows them; social = Open Graph and X cards'), the title/description-or-url interplay, and that social mode 'Needs url'. This is more than the schema restates.
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+resource: how a page renders as a Google snippet and as a social share card, measured in pixels. The two-mode split (search vs social) makes the scope concrete. It doesn't explicitly differentiate from siblings like 'share' or 'explain_google', so it stops short of a 5.
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 when-to-use guidance: 'Use it instead of estimating title or description length' names an alternative practice to avoid. It also explains what each mode is for and which inputs each needs. No explicit when-not-to-use, but the alternative framing is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
technicalTechnical SEOARead-onlyIdempotentInspect
Technical checks across pages and logs. Pick with mode: hreflang = Hreflang across language versions, with the corrected tag set. Needs url. parameters = URL parameters and filters that waste crawl budget. duplicates = Duplicate and near-duplicate pages. Needs audit_id. extract = One value pulled from many pages. Needs urls. logs = Access logs: what Googlebot and AI crawlers really crawl, with IP verification. Needs log.
| Name | Required | Description | Default |
|---|---|---|---|
| log | No | Raw access log lines, one request per line. | |
| url | No | Full address of one language version of the page. | |
| mode | No | Default hreflang. | |
| urls | No | Optional extra URLs, for example from server logs or Search Console. | |
| regex | No | A regular expression; the first group is returned if there is one, otherwise the whole match. | |
| detail | No | brief = short summary. | |
| jsonld | No | A JSON-LD path: the @type, then the properties, for example Product.offers.price or Article.author.name. | |
| audit_id | No | Id of a completed site audit. | |
| selector | No | CSS selector, for example .price, h1 or link[rel=canonical]. | |
| attribute | No | With selector: read this attribute instead of the text, for example href or content. | |
| memory_key | No | site_memory key, records this call. | |
| sitemap_urls | No | Optional: the URLs from the site's sitemap, to find pages bots never crawl. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds mode-specific behavior ('IP verification', 'corrected tag set', 'waste crawl budget'), which is useful, but says nothing about rate limits, cost, or how results differ per mode.
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 definition is densely front-loaded: the general purpose opens, then each mode is a compact clause. The mode list reads as a run-on, but no sentence is wasted.
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 12 params but 0 required, the mode-to-parameter dependency is the critical missing piece from the schema, and the description supplies it. An output schema exists, so return values need not be explained, and the remaining gap is only the absence of sibling routing.
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 documents every parameter and the baseline is 3. The description adds real value beyond that by mapping which parameter each mode requires, which the schema cannot express on its own.
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 enumerates all five modes (hreflang, parameters, duplicates, extract, logs) and says what each finds, so an agent understands the tool's scope. The umbrella phrase 'Technical checks across pages and logs' is generic, and no sibling tool is named for contrast, which keeps it short of a 5.
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?
'Pick with mode' plus per-mode requirements ('Needs url', 'Needs audit_id', 'Needs urls', 'Needs log') tells the agent exactly how to invoke each branch. There is no explicit when-not-to-use and no routing to siblings like sitemap or scan_page, so it stops 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.
text_qualityText qualityARead-onlyIdempotentInspect
Readability and correct language. Pick with mode: readability = Readability that fits the page and the pages that rank. Needs url. spelling = Spelling and grammar errors in about 30 languages. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Your page. | |
| mode | No | Default readability. | |
| detail | No | brief = short summary. | |
| keyword | No | Optional: the search term, for context. | |
| memory_key | No | site_memory key, records this call. | |
| competitors | No | Optional: top organic results for the keyword. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered and the bar is lower. The description adds two useful behavioral facts beyond structured data: the ~30-language coverage for spelling and the url prerequisite. It stops there and adds nothing about limits or interpretation of results.
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?
Short and front-loaded, with the core purpose first and mode selection immediately after. The telegraphic "Needs url" phrasing and terse fragments cost a little polish but no sentence is wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param read-only tool with rich annotations and an output schema, the description covers purpose, mode selection and the key prerequisite adequately. Missing sibling routing and per-parameter context are minor given the schema and output schema carry the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description clarifies the mode enum (readability vs spelling) and reinforces the url requirement, but detail, keyword, memory_key and competitors are left entirely to the schema. Value added over schema is marginal.
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 clear purpose (readability + language correctness) and splits it into two named modes, readability and spelling. An agent can tell this apart from siblings like content or accessibility. It stops short of naming sibling alternatives explicitly, so it is clear but not fully differentiated.
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?
"Pick with mode" gives explicit selection guidance: readability for fit-to-page and ranking-page fit, spelling for grammar/errors. Each mode's scope and the shared "Needs url" prerequisite are stated. No when-not-to-use or alternative-tool guidance is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trackingTracking and consentARead-onlyIdempotentInspect
Whether analytics and consent are set up right, and whether the numbers add up. Pick with mode: ga4 = GA4 tags, events and duplicates. Needs url. consent = Cookie banner and Consent Mode v2. Needs url. gsc_vs_ga4 = Search Console clicks against GA4 sessions per page: broken or filtered tracking. Needs gsc[{page, clicks}], ga4[{landing_page, sessions}].
| Name | Required | Description | Default |
|---|---|---|---|
| ga4 | No | GA4 sessions per landing page, organic Google only. | |
| gsc | No | Search Console clicks per page. | |
| url | No | Full address of the page, for example https://example.com/. | |
| mode | No | Default ga4. | |
| detail | No | brief = short summary. | |
| memory_key | No | site_memory key, records this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the per-mode behavior (what each check inspects) but says nothing about auth needs, rate limits, or cost. Adequate but thin given annotations do most of the work.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the mode selection and then walks each mode compactly in parallel structure. It is telegraphic but every clause carries routing or input information; nothing is padding.
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?
Modes, their purposes, and their required inputs are covered, and an output schema exists so return values need not be explained. Minor gaps are the undocumented detail/memory_key semantics, but those are covered by the schema descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds value the schema cannot express: with zero top-level required params, it clarifies the conditional requirement of url for ga4/consent modes and the required gsc/ga4 array shapes for gsc_vs_ga4. Only detail and memory_key go unmentioned, and those are self-documenting in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The lead sentence is a bit abstract ('whether the numbers add up'), but the mode breakdown gives concrete, specific checks: GA4 tags/events/duplicates, cookie banner and Consent Mode v2, and GSC clicks vs GA4 sessions. An agent can tell what each mode does without opening the schema. It does not differentiate itself from adjacent siblings like technical or measure, which keeps it out of 5 territory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs 'Pick with mode' and maps each mode to its purpose and required inputs, which is real routing guidance among the tool's own modes. However, it never states when to choose this tool over siblings such as technical, measure, or scan_page, so the alternative-selection guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_rankingsSmart rank tracker that knows what mattersAInspect
Use for ongoing rank tracking without picking keywords by hand. Each run, fetch Search Console rows by query and page (last 7 or 28 days) and, if connected, the rows of Ahrefs Rank Tracker (rank-tracker-overview) or Semrush Position Tracking, plus GA4 conversions or revenue per landing page if available, and pass them with the tracker_id (leave it out on the first run to create a tracker).
| Name | Required | Description | Default |
|---|---|---|---|
| site | No | Your site. Needed on the first run. | |
| action | No | run (default), status or stop. | |
| detail | No | brief = short summary. | |
| gsc_rows | No | Search Console rows by query and page for the period. | |
| fix_log_id | No | Optional fix log (log_fix) whose pages count as work done. | |
| memory_key | No | site_memory key, records this call. | |
| tracker_id | No | From the first run. Leave out to create a tracker. | |
| conversions | No | Optional GA4 key events or revenue per landing page. | |
| webhook_url | No | Optional https webhook for the changes (Slack and Discord work). | |
| tracker_rows | No | Ahrefs Rank Tracker or Semrush Position Tracking rows. | |
| money_keywords | No | Optional keywords you always want followed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | No | |
| events | No | |
| groups | No | |
| trackerId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, openWorldHint=true, so the mutation/open-world nature is already flagged. The description adds real value beyond that: it discloses the stateful create-on-first-run behavior (omit tracker_id to create a tracker) and the per-run data-collection workflow.
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 primary use case and packed into a single dense sentence with no filler. It is a bit run-on and reads like an instruction sequence, but every clause carries operational 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?
An output schema exists so return values need not be described, and the 'run' path is well covered. However the tool exposes action=run/status/stop, detail, memory_key, fix_log_id, webhook_url and money_keywords, and the description explains none of the status/stop or notification behavior — a notable gap for an 11-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. Most of what the description says about parameters (tracker_id from first run, rows sourced from GSC/Ahrefs/Semrush/GA4) is already echoed in the schema descriptions. It does add the 'last 7 or 28 days' period hint, but that is marginal.
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 (ongoing rank tracking) and describes the concrete data sources it aggregates (Search Console, Ahrefs Rank Tracker, Semrush Position Tracking, GA4). An agent can tell it is a rank-tracking aggregation tool, though it never explicitly names or differentiates from the sibling 'tracking'/'watch' 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?
'Use for ongoing rank tracking without picking keywords by hand' gives a clear use context, and it explains the first-run bootstrap ('leave it out on the first run to create a tracker'). It stops short of stating when NOT to use it or which sibling to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watchKeep watchingAInspect
Monitoring that runs on its own and posts changes to a webhook. Each kind takes action create (default), status or stop where it applies. Pick with mode: page = Watch one page (or a competitor page with competitor_of) for SEO changes. Needs url. page_status = Latest result of a page watch. Needs watch_id. page_stop = Stop a page watch. Needs watch_id. site_audit = Audit the whole site every 1, 7 or 30 days and alert on regressions. guard = Every 6 hours: robots.txt, sitemap, https, noindex and canonical on key pages, for deploy accidents. competitors = Weekly new, updated and removed pages from competitors' sitemaps, flagged by your topics.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address, for example https://example.com/pricing. | |
| mode | No | Default page. | |
| pages | No | Key pages to guard besides the home page (money pages first). | |
| action | No | create (default), status or stop. | |
| detail | No | brief = short summary. | |
| topics | No | Your topics or keywords, to flag overlapping pages. | |
| guard_id | No | For status and stop. | |
| watch_id | No | For status and stop. | |
| max_pages | No | Pages per audit, default 25. | |
| every_days | No | How often, default 7. | |
| memory_key | No | site_memory key, records this call. | |
| competitors | No | Competitor home pages. | |
| schedule_id | No | For status and stop. | |
| webhook_url | No | Optional https URL that receives a JSON POST when something changes, for example a Slack or Discord incoming webhook. | |
| competitor_of | No | Optional: your own page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, openWorldHint=true), the description discloses that the tool runs automatically, posts to a webhook, and follows schedules (every 1/7/30 days, every 6 hours, weekly). It also describes mode-specific actions and required IDs, which enriches behavioral understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then organises mode details in a readable sequence. While dense, it avoids filler and is appropriately sized for a 15-parameter multi-mode 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?
With an output schema and full schema descriptions, the description need not explain return values. It covers the main modes and schedules, but leaves action/ID usage for guard, site_audit, and competitors unspecified, 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?
Schema coverage is 100%, so the baseline is 3. The description adds cross-parameter meaning by mapping modes to required parameters (e.g., page needs url, page_status needs watch_id), though it omits such mapping for guard, site_audit, and competitors.
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 the tool's purpose as autonomous monitoring that posts changes to a webhook, and enumerates six modes with specific resources (page, site, robots.txt, etc.). It does not contrast the tool with siblings like site_audit or tracking, so it stops short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for each mode (e.g., page for SEO changes, guard for deploy accidents) and notes action create/status/stop. However, it offers no explicit guidance on when to choose this tool over alternatives such as the site_audit or tracking siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_vitalsCore Web VitalsARead-onlyIdempotentInspect
Core Web Vitals from real Chrome users. Pick with mode: now = The latest field data for a page or site. Needs url. trend = Weekly history, before and after a change date. Needs url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full address of the page, for example https://example.com/pricing. | |
| mode | No | Default now. | |
| detail | No | brief = short summary. | |
| memory_key | No | site_memory key, records this call. | |
| change_date | No | Optional date a speed fix went live, YYYY-MM-DD. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, open-world semantics, and the description adds real value on top: the data source is real Chrome user field data, and trend returns weekly history segmented before/after a change date. It does not mention quotas, latency, or auth, which is a minor gap given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that front-load the resource, then the mode decision rule; no filler or repetition of the title. Every clause carries either scope or a selection condition.
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 a full schema, an output schema covering return values, and annotations covering the safety profile, the description supplies the missing decision logic (which mode, what each needs). It stops short of clarifying optionality of change_date within trend or what 'brief' detail omits, but nothing critical for correct invocation 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 coverage is 100%, so the baseline is 3, but the description genuinely enhances the mode enum by explaining what each value returns, and ties url/change_date to the mode that requires them. It leaves detail and memory_key to 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?
Names a specific resource — Core Web Vitals field data from real Chrome users — and splits it into two clearly labeled modes (now = latest field data, trend = weekly history). An agent can tell what it returns, though there is no explicit differentiation from nearby siblings like measure or technical.
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?
'Pick with mode: now = ... trend = ...' gives a direct selection rule for the two modes, and each mode states its prerequisite ('Needs url'). No alternative-tool routing or exclusion guidance against the other 30+ siblings is offered, which keeps it 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
content1 field changed- added
Input schema / properties / webhook_urlAdded value: +{ + "description": "Optional https Slack or Discord webhook for a Monday reminder; off stops it.", + "maxLength": 1000, + "type": "string" +}
- Changed
get_fix_pack1 field changed- changed
Input schema / properties / changes / items / properties / field / enumPrevious value: -[ - "title", - "meta_description", - "canonical", - "og_title", - "og_description", - "og_image", - "jsonld", - "image_alt" -]New value: +[ + "title", + "meta_description", + "canonical", + "og_title", + "og_description", + "og_image", + "jsonld", + "image_alt", + "post_content", + "new_post" +]
35 tool updates
- Changed
accessibility1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
ai_visibility1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
answer_readiness1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
backlinks1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
check_keyword1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
check_links1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
compare1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
content11 fields changed- added
Input schema / properties / htmlAdded value: +{ + "description": "The draft as HTML, title in <title> or <h1>.", + "maxLength": 921600, + "type": "string" +} - added
Input schema / properties / ideasAdded value: +{ + "description": "Topics without a page yet.", + "items": { + "maxLength": 2000, + "type": "string" + }, + "maxItems": 50, + "type": "array" +} - changed
Input schema / properties / mode / enumPrevious value: -[ - "brief", - "topics", - "intent" -]New value: +[ + "brief", + "topics", + "intent", + "voice", + "calendar", + "draft" +] - added
Input schema / properties / per_weekAdded value: +{ + "description": "Items per week, default 2.", + "maximum": 7, + "minimum": 1, + "type": "number" +} - removed
Input schema / properties / rows / items / propertiesRemoved value: -{ - "clicks": { - "type": "number" - }, - "impressions": { - "type": "number" - }, - "keyword": { - "description": "Ahrefs/Semrush name for query.", - "maxLength": 2000, - "type": "string" - }, - "page": { - "maxLength": 2048, - "type": "string" - }, - "position": { - "type": "number" - }, - "query": { - "maxLength": 2000, - "type": "string" - }, - "traffic": { - "description": "Estimated monthly traffic, used in place of clicks.", - "minimum": 0, - "type": "number" - }, - "url": { - "description": "Ahrefs/Semrush name for page.", - "maxLength": 2048, - "type": "string" - }, - "volume": { - "description": "Monthly search volume, used in place of impressions when there is no Search Console data.", - "minimum": 0, - "type": "number" - } -} - removed
Input schema / properties / rows / maxItemsRemoved value: -1000 - removed
Input schema / properties / rows / minItemsRemoved value: -1 - added
Input schema / properties / startAdded value: +{ + "description": "First day, YYYY-MM-DD, default today.", + "maxLength": 10, + "type": "string" +} - added
Input schema / properties / urlsAdded value: +{ + "description": "The site's own best articles, ones that rank and that the owner likes.", + "items": { + "maxLength": 2048, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" +} - added
Input schema / properties / weeksAdded value: +{ + "description": "Weeks to plan, default 8.", + "maximum": 52, + "minimum": 1, + "type": "number" +} - removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
dashboard1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
edge_worker1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
entity1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
explain_google1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
find_opportunities1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
fix_log1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
get_fix_pack1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
internal_links1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
layout1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
llms_txt1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
local1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
measure1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
plan1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
request_recrawl1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
robots_txt1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
scan_page1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
schema1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
share1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
site_audit1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
site_memory1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
sitemap1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
snippet1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
technical1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
text_quality1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
tracking1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
watch1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
- Changed
web_vitals1 field changed- removed
Output schema / descriptionRemoved value: -"The result as structured data; fields depend on mode."
37 tool updates
- Changed
accessibility2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
ai_visibility2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
answer_readiness2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
backlinks2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
check_keyword2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
check_links2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
compare7 fields changed- added
Input schema / properties / bypass_tokenAdded value: +{ + "description": "Vercel protection bypass secret.", + "maxLength": 200, + "type": "string" +} - changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call." - changed
Input schema / properties / mode / enumPrevious value: -[ - "pages", - "html" -]New value: +[ + "pages", + "html", + "preview" +] - added
Input schema / properties / pathsAdded value: +{ + "description": "Paths like /pricing, default /.", + "items": { + "maxLength": 2048, + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - added
Input schema / properties / preview_urlAdded value: +{ + "description": "The deploy preview URL.", + "maxLength": 2048, + "type": "string" +} - added
Input schema / properties / production_urlAdded value: +{ + "description": "The live site.", + "maxLength": 2048, + "type": "string" +}
- Changed
content2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
dashboard2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
edge_worker2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
entity2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
explain_google2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
find_opportunities4 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - added
Input schema / properties / drop_dateAdded value: +{ + "description": "Optional first day of the drop, YYYY-MM-DD, to check Google updates around it.", + "maxLength": 10, + "type": "string" +} - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call." - changed
Input schema / properties / mode / enumPrevious value: -[ - "ctr_gaps", - "striking_distance", - "content_decay", - "traffic_drop", - "prune", - "discover", - "paid_organic" -]New value: +[ + "ctr_gaps", + "striking_distance", + "content_decay", + "traffic_drop", + "prune", + "discover", + "paid_organic", + "anomalies", + "ai_queries" +]
- Changed
fix_log2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
get_fix_pack7 fields changed- added
Input schema / properties / change_idAdded value: +{ + "description": "Status of an earlier send.", + "maxLength": 40, + "type": "string" +} - added
Input schema / properties / changesAdded value: +{ + "description": "Optional field and new value pairs.", + "items": { + "properties": { + "field": { + "enum": [ + "title", + "meta_description", + "canonical", + "og_title", + "og_description", + "og_image", + "jsonld", + "image_alt" + ], + "type": "string" + }, + "value": {} + }, + "required": [ + "field", + "value" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" +} - changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call." - changed
Input schema / properties / mode / enumPrevious value: -[ - "fixes", - "alt_texts", - "web_vitals" -]New value: +[ + "fixes", + "alt_texts", + "web_vitals", + "wordpress" +] - added
Input schema / properties / noteAdded value: +{ + "description": "Optional reason shown to the site owner.", + "maxLength": 300, + "type": "string" +} - added
Input schema / properties / site_keyAdded value: +{ + "description": "The site key from the plugin, wpk_...", + "maxLength": 60, + "type": "string" +}
- Changed
internal_links2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
layout2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
llms_txt2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
local2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
measure2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
plan2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
prioritize_fixes2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
request_recrawl2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
robots_txt2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
scan_page2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
schema2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
share2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
site_audit2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
site_memory1 field changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary."
- Changed
sitemap2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
snippet2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
technical2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
text_quality2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
track_rankings2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
tracking2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
watch2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
- Changed
web_vitals2 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"brief returns a short summary, default full."New value: +"brief = short summary." - changed
Input schema / properties / memory_key / descriptionPrevious value: -"Optional site_memory key, to record this call in the site memory."New value: +"site_memory key, records this call."
37 tool updates
- Changed
accessibility1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
ai_visibility1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
answer_readiness1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
backlinks1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
check_keyword1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
check_links1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
compare1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
content1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
dashboard1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
edge_worker1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
entity1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
explain_google1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
find_opportunities1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
fix_log1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
get_fix_pack1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
internal_links1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
layout1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
llms_txt1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
local1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
measure1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
plan1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
prioritize_fixes1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
request_recrawl1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
robots_txt1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
scan_page1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
schema2 fields changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +} - changed
Input schema / properties / mode / enumPrevious value: -[ - "generate", - "validate", - "product" -]New value: +[ + "generate", + "validate", + "product_page" +]
- Changed
share1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
site_audit1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
site_memory1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
sitemap1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
snippet2 fields changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +} - changed
Input schema / properties / url / descriptionPrevious value: -"Full address of the page."New value: +"Page to read the current title and description from, when no title is given."
- Changed
technical1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
text_quality1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
track_rankings1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
tracking1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
watch1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
- Changed
web_vitals1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "brief returns a short summary, default full.", + "enum": [ + "full", + "brief" + ], + "type": "string" +}
50 tool updates
- Changed
accessibility1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
ai_visibility1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Removed
analyze_logs - Changed
answer_readiness1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
backlinks1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Removed
check_hreflang - Changed
check_keyword1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
check_links1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Removed
check_product_page - Removed
check_url_parameters - Changed
compare1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Added
content - Removed
create_content_brief - Changed
dashboard1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
edge_worker1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
entity1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
explain_google1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Removed
extract_from_pages - Removed
find_duplicate_content - Changed
find_opportunities1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
fix_log1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
get_fix_pack1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
internal_links1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
layout3 fields changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +} - changed
Input schema / properties / mode / descriptionPrevious value: -"Default analyze."New value: +"Default render." - changed
Input schema / properties / mode / enumPrevious value: -[ - "analyze", - "probe" -]New value: +[ + "render", + "probe", + "analyze" +]
- Changed
llms_txt1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
local1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Removed
map_topics - Removed
match_intent - Changed
measure1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Added
plan - Removed
plan_redirects - Removed
plan_split_test - Removed
plan_sprint - Changed
prioritize_fixes1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Removed
render_page - Changed
request_recrawl1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
robots_txt1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
scan_page1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
schema2 fields changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +} - changed
Input schema / properties / mode / enumPrevious value: -[ - "generate", - "validate" -]New value: +[ + "generate", + "validate", + "product" +]
- Changed
share1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
site_audit1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
site_memory1 field changed- added
Input schema / properties / share_learningAdded value: +{ + "description": "Opt in (true) or out (false) of sharing anonymous results: only the fix type and the rounded lift, never the site, URLs or numbers.", + "type": "boolean" +}
- Changed
sitemap1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
snippet1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Added
technical - Changed
text_quality1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
track_rankings1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
tracking1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
watch1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
- Changed
web_vitals1 field changed- added
Input schema / properties / memory_keyAdded value: +{ + "description": "Optional site_memory key, to record this call in the site memory.", + "maxLength": 80, + "type": "string" +}
6 tool updates
- Removed
check_local_seo - Changed
explain_google4 fields changed- added
Input schema / properties / bing_queriesAdded value: +{ + "items": { + "properties": { + "clicks": { + "minimum": 0, + "type": "number" + }, + "impressions": { + "minimum": 0, + "type": "number" + }, + "position": { + "minimum": 0, + "type": "number" + }, + "query": { + "maxLength": 2000, + "type": "string" + } + }, + "required": [ + "query", + "clicks" + ], + "type": "object" + }, + "maxItems": 5000, + "type": "array" +} - added
Input schema / properties / google_queriesAdded value: +{ + "items": { + "properties": { + "clicks": { + "minimum": 0, + "type": "number" + }, + "impressions": { + "minimum": 0, + "type": "number" + }, + "position": { + "minimum": 0, + "type": "number" + }, + "query": { + "maxLength": 2000, + "type": "string" + } + }, + "required": [ + "query", + "clicks" + ], + "type": "object" + }, + "maxItems": 5000, + "type": "array" +} - added
Input schema / properties / issuesAdded value: +{ + "description": "Bing crawl or index issues.", + "items": { + "properties": { + "issue": { + "maxLength": 200, + "type": "string" + }, + "url": { + "maxLength": 2048, + "type": "string" + } + }, + "required": [ + "url", + "issue" + ], + "type": "object" + }, + "maxItems": 5000, + "type": "array" +} - changed
Input schema / properties / mode / enumPrevious value: -[ - "index_status", - "manual_action" -]New value: +[ + "index_status", + "manual_action", + "bing" +]
- Changed
find_opportunities4 fields changed- added
Input schema / properties / adsAdded value: +{ + "description": "Google Ads search terms.", + "items": { + "properties": { + "clicks": { + "minimum": 0, + "type": "number" + }, + "conversions": { + "minimum": 0, + "type": "number" + }, + "cost": { + "minimum": 0, + "type": "number" + }, + "term": { + "maxLength": 2000, + "type": "string" + } + }, + "required": [ + "term", + "cost" + ], + "type": "object" + }, + "maxItems": 10000, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / brand_termsAdded value: +{ + "description": "Optional brand names, handled apart.", + "items": { + "maxLength": 60, + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / gscAdded value: +{ + "description": "Search Console queries.", + "items": { + "properties": { + "clicks": { + "minimum": 0, + "type": "number" + }, + "page": { + "maxLength": 2048, + "type": "string" + }, + "position": { + "minimum": 0, + "type": "number" + }, + "query": { + "maxLength": 2000, + "type": "string" + } + }, + "required": [ + "query", + "position" + ], + "type": "object" + }, + "maxItems": 10000, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / mode / enumPrevious value: -[ - "ctr_gaps", - "striking_distance", - "content_decay", - "traffic_drop", - "prune", - "discover" -]New value: +[ + "ctr_gaps", + "striking_distance", + "content_decay", + "traffic_drop", + "prune", + "discover", + "paid_organic" +]
- Added
local - Added
site_memory - Changed
tracking3 fields changed- added
Input schema / properties / ga4Added value: +{ + "description": "GA4 sessions per landing page, organic Google only.", + "items": { + "properties": { + "landing_page": { + "maxLength": 2000, + "type": "string" + }, + "sessions": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "landing_page", + "sessions" + ], + "type": "object" + }, + "maxItems": 5000, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / gscAdded value: +{ + "description": "Search Console clicks per page.", + "items": { + "properties": { + "clicks": { + "minimum": 0, + "type": "number" + }, + "page": { + "maxLength": 2048, + "type": "string" + } + }, + "required": [ + "page", + "clicks" + ], + "type": "object" + }, + "maxItems": 5000, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / mode / enumPrevious value: -[ - "ga4", - "consent" -]New value: +[ + "ga4", + "consent", + "gsc_vs_ga4" +]
3 tool updates
- Changed
ai_visibility1 field changed- changed
Input schema / properties / mode / enumPrevious value: -[ - "check", - "gaps", - "citations" -]New value: +[ + "check", + "bots", + "gaps", + "citations" +]
- Changed
find_opportunities3 fields changed- changed
Input schema / properties / mode / enumPrevious value: -[ - "ctr_gaps", - "striking_distance", - "content_decay", - "traffic_drop" -]New value: +[ + "ctr_gaps", + "striking_distance", + "content_decay", + "traffic_drop", + "prune", + "discover" +] - added
Input schema / properties / search_typeAdded value: +{ + "description": "Search Console search type of the rows, default web.", + "enum": [ + "web", + "discover", + "news", + "image", + "video" + ], + "type": "string" +} - added
Input schema / properties / urlsAdded value: +{ + "description": "Article pages to check.", + "items": { + "maxLength": 2048, + "type": "string" + }, + "maxItems": 5, + "type": "array" +}
- Changed
schema1 field changed- changed
Input schema / properties / type / enumPrevious value: -[ - "auto", - "Article", - "Product", - "FAQPage", - "Organization", - "BreadcrumbList" -]New value: +[ + "auto", + "Article", + "Product", + "FAQPage", + "Organization", + "BreadcrumbList", + "VideoObject", + "Event", + "Recipe", + "JobPosting", + "SoftwareApplication", + "ProfilePage", + "Course" +]
108 tool updates
- Added
accessibility - Removed
ai_crawler_policy - Added
ai_visibility - Removed
analyze_layout - Added
answer_readiness - Added
backlinks - Removed
build_disavow - Removed
build_edge_rules - Removed
build_seo_dashboard - Removed
check_accessibility - Removed
check_ai_visibility - Removed
check_answer_format - Removed
check_consent - Removed
check_entity_graph - Removed
check_focus_keyword - Removed
check_ga4_tracking - Added
check_keyword - Added
check_links - Removed
check_og_tags - Removed
check_outbound_links - Removed
check_question_coverage - Removed
check_readability - Removed
check_sitemap - Removed
check_snippet - Removed
check_spelling - Removed
check_trust_signals - Removed
check_urls - Removed
check_vitals_trend - Removed
check_web_vitals - Added
compare - Removed
compare_ai_citations - Removed
compare_html - Removed
compare_pages - Removed
compare_site_audits - Removed
create_dashboard_feed - Added
dashboard - Removed
deep_audit - Removed
diagnose_cannibalization - Removed
diagnose_traffic_drop - Removed
draft_outreach - Added
edge_worker - Added
entity - Added
explain_google - Removed
explain_index_status - Removed
explain_manual_action - Removed
export_findings - Removed
find_ai_visibility_gaps - Removed
find_answer_passages - Removed
find_content_decay - Removed
find_ctr_gaps - Removed
find_link_opportunities - Added
find_opportunities - Removed
find_striking_distance - Removed
fix_alt_texts - Removed
fix_broken_backlinks - Removed
fix_core_web_vitals - Added
fix_log - Removed
generate_llms_txt - Removed
generate_schema - Removed
generate_sitemap - Removed
get_dashboard_data - Removed
get_fix_log - Changed
get_fix_pack8 fields changed- added
Input schema / properties / altsAdded value: +{ + "description": "Step 2: the alt text per image src.", + "items": { + "properties": { + "alt": { + "maxLength": 300, + "type": "string" + }, + "src": { + "maxLength": 2000, + "type": "string" + } + }, + "required": [ + "src", + "alt" + ], + "type": "object" + }, + "maxItems": 50, + "type": "array" +} - added
Input schema / properties / failingAdded value: +{ + "description": "Metrics that fail for real users, if known.", + "items": { + "enum": [ + "LCP", + "INP", + "CLS", + "FCP", + "TTFB" + ], + "type": "string" + }, + "maxItems": 5, + "type": "array" +} - changed
Input schema / properties / framework / descriptionPrevious value: -"With platform git: the site's framework. auto (default) detects it from the page."New value: +"With platform git: the site's framework." - added
Input schema / properties / modeAdded value: +{ + "description": "Default fixes.", + "enum": [ + "fixes", + "alt_texts", + "web_vitals" + ], + "type": "string" +} - changed
Input schema / properties / platform / descriptionPrevious value: -"html (default) for code to paste; wordpress, webflow, wix, shopify, storyblok, sanity, contentful, strapi, ghost or magento for a plan with the exact fields and MCP or API calls that the user's own connection to that platform applies after approval; git for framework code and a pull request; or cloudflare for a Worker that applies the fixes as the page is served, on any CMS on the user's own Cloudflare."New value: +"html (default) for code to paste; wordpress, webflow, wix, shopify, storyblok, sanity, contentful, strapi, ghost or magento for a plan with the exact fields and" - changed
Input schema / properties / url / descriptionPrevious value: -"Full address of the page, for example https://example.com/pricing. A bare domain like example.com also works."New value: +"Full address of the page, for example https://example.com/pricing." - removed
Input schema / requiredRemoved value: -[ - "url" -] - changed
Output schema / descriptionPrevious value: -"The same result as the text, as structured data."New value: +"The result as structured data; fields depend on mode."
- Removed
get_layout_probe - Removed
get_prerender_worker - Removed
get_site_audit - Removed
get_watch - Removed
import_site_audit - Added
internal_links - Added
layout - Added
llms_txt - Removed
log_fix - Removed
map_link_equity - Added
measure - Removed
measure_ai_citations - Removed
measure_ai_referrals - Removed
measure_brand_split - Removed
measure_impact - Removed
measure_share_of_voice - Changed
request_recrawl9 fields changed- changed
Input schema / properties / indexnow_key / descriptionPrevious value: -"Optional IndexNow key that is live at /<key>.txt. Without it, submit_indexnow explains the setup."New value: +"Optional IndexNow key that is live at /<key>.txt." - added
Input schema / properties / keyAdded value: +{ + "description": "The site's IndexNow key (8 to 128 letters, digits or dashes).", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / modeAdded value: +{ + "description": "Default recrawl.", + "enum": [ + "recrawl", + "indexnow" + ], + "type": "string" +} - removed
Input schema / properties / urls / maxItemsRemoved value: -10 - removed
Input schema / properties / urls / minItemsRemoved value: -1 - removed
Input schema / requiredRemoved value: -[ - "urls" -] - added
Output schema / descriptionAdded value: +"The result as structured data; fields depend on mode." - removed
Output schema / propertiesRemoved value: -{ - "indexNow": { - "type": [ - "object", - "null" - ] - }, - "pages": { - "items": { - "type": "object" - }, - "type": "array" - }, - "sitemap": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "pages" -]
- Removed
rescan_and_compare - Added
robots_txt - Removed
scan_html - Changed
scan_page6 fields changed- added
Input schema / properties / htmlAdded value: +{ + "description": "The complete HTML document, up to 900 KB.", + "maxLength": 921600, + "type": "string" +} - added
Input schema / properties / modeAdded value: +{ + "description": "Default page.", + "enum": [ + "page", + "html", + "deep", + "rescan" + ], + "type": "string" +} - added
Input schema / properties / sectionsAdded value: +{ + "description": "Sections to include. Default: all.", + "items": { + "enum": [ + "speed", + "links", + "accessibility", + "images", + "rich_results", + "security", + "content", + "technical" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / url / descriptionPrevious value: -"Full address of the page, for example https://example.com/pricing. A bare domain like example.com also works."New value: +"Full address of the page, for example https://example.com/pricing." - removed
Input schema / requiredRemoved value: -[ - "url" -] - changed
Output schema / descriptionPrevious value: -"The same result as the text, as structured data."New value: +"The result as structured data; fields depend on mode."
- Removed
schedule_site_audit - Added
schema - Removed
screen_reader_view - Added
share - Removed
share_audit_report - Removed
share_result - Added
site_audit - Added
sitemap - Added
snippet - Removed
start_site_audit - Removed
submit_indexnow - Removed
suggest_internal_links - Removed
test_robots - Added
text_quality - Changed
track_rankings1 field changed- changed
Input schema / properties / fix_log_id / descriptionPrevious value: -"Optional fix log (log_fix) whose pages count as work done. Kept on the tracker."New value: +"Optional fix log (log_fix) whose pages count as work done."
- Added
tracking - Removed
unwatch - Removed
validate_llms_txt - Removed
validate_schema - Added
watch - Removed
watch_competitor_content - Removed
watch_page - Removed
watch_site_guard - Added
web_vitals
8 tool updates
- Added
draft_outreach - Added
measure_ai_referrals - Added
measure_brand_split - Added
measure_share_of_voice - Added
plan_sprint - Added
request_recrawl - Added
watch_competitor_content - Added
watch_site_guard
1 tool update
- Changed
get_fix_pack2 fields changed- changed
Input schema / properties / platform / descriptionPrevious value: -"html (default) for code to paste, wordpress for a plan your WordPress connection can apply, git for framework code and the steps to open a pull request, or cloudflare for a Cloudflare Worker that applies the fixes as the page is served, on any CMS, when the domain runs through the user's own Cloudflare."New value: +"html (default) for code to paste; wordpress, webflow, wix, shopify, storyblok, sanity, contentful, strapi, ghost or magento for a plan with the exact fields and MCP or API calls that the user's own connection to that platform applies after approval; git for framework code and a pull request; or cloudflare for a Worker that applies the fixes as the page is served, on any CMS on the user's own Cloudflare." - changed
Input schema / properties / platform / enumPrevious value: -[ - "html", - "wordpress", - "git", - "cloudflare" -]New value: +[ + "html", + "wordpress", + "git", + "cloudflare", + "webflow", + "wix", + "shopify", + "storyblok", + "sanity", + "contentful", + "strapi", + "ghost", + "magento" +]
1 tool update
- Added
track_rankings
10 tool updates
- Added
build_disavow - Added
check_outbound_links - Added
check_spelling - Changed
compare_site_audits1 field changed- added
Input schema / properties / competitor_audit_idAdded value: +{ + "description": "Optional: a finished audit of a competitor's site, to compare the two sites side by side instead of over time.", + "maxLength": 2000, + "type": "string" +}
- Added
diagnose_cannibalization - Changed
diagnose_traffic_drop3 fields changed- changed
Input schema / properties / rows / descriptionPrevious value: -"Search Console rows for both periods, per page (or per page and query)."New value: +"Search Console rows for both periods, per page (or per page and query, device or country)." - added
Input schema / properties / rows / items / properties / countryAdded value: +{ + "description": "Optional: country code, to see where the drop is.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / deviceAdded value: +{ + "description": "Optional: MOBILE, DESKTOP or TABLET, to see where the drop is.", + "maxLength": 2000, + "type": "string" +}
- Added
explain_manual_action - Added
generate_sitemap - Added
plan_split_test - Added
share_audit_report
9 tool updates
- Changed
check_local_seo1 field changed- added
Input schema / properties / gbp_profileAdded value: +{ + "description": "Optional: the Google Business Profile of this location, from the user's GBP connector or typed by the user, to compare with the site.", + "properties": { + "city": { + "maxLength": 2000, + "type": "string" + }, + "hours": { + "description": "Opening hours per day; leave a day out when closed.", + "items": { + "properties": { + "closes": { + "description": "HH:MM", + "maxLength": 2000, + "type": "string" + }, + "day": { + "description": "Monday to Sunday.", + "maxLength": 2000, + "type": "string" + }, + "opens": { + "description": "HH:MM", + "maxLength": 2000, + "type": "string" + } + }, + "required": [ + "day" + ], + "type": "object" + }, + "maxItems": 14, + "type": "array" + }, + "phone": { + "maxLength": 2000, + "type": "string" + }, + "postcode": { + "maxLength": 2000, + "type": "string" + }, + "primary_category": { + "description": "For example Dentist, Italian restaurant, Plumber.", + "maxLength": 2000, + "type": "string" + }, + "street": { + "maxLength": 2000, + "type": "string" + }, + "title": { + "maxLength": 2000, + "type": "string" + }, + "website": { + "description": "The website link on the profile.", + "maxLength": 2000, + "type": "string" + } + }, + "type": "object" +}
- Changed
explain_index_status4 fields changed- added
Input schema / properties / rows / items / properties / richResultsResultAdded value: +{ + "description": "URL Inspection richResultsResult as returned (detectedItems with richResultType and item issues).", + "type": "object" +} - added
Input schema / properties / rows / items / properties / rich_issueAdded value: +{ + "description": "The issue from the Enhancements report, for example Missing field \"price\".", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / rich_result_typeAdded value: +{ + "description": "From the Enhancements report export, for example Product snippets or FAQ.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / rich_severityAdded value: +{ + "description": "ERROR or WARNING.", + "maxLength": 2000, + "type": "string" +}
- Added
find_content_decay - Changed
find_ctr_gaps5 fields changed- added
Input schema / properties / rows / items / properties / keywordAdded value: +{ + "description": "Ahrefs/Semrush name for query.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / trafficAdded value: +{ + "description": "Estimated monthly traffic, used in place of clicks.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / rows / items / properties / urlAdded value: +{ + "description": "Ahrefs/Semrush name for page.", + "maxLength": 2048, + "type": "string" +} - added
Input schema / properties / rows / items / properties / volumeAdded value: +{ + "description": "Monthly search volume, used in place of impressions when there is no Search Console data.", + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / rows / items / requiredPrevious value: -[ - "page", - "impressions", - "position" -]New value: +[ + "position" +]
- Changed
find_striking_distance6 fields changed- changed
Input schema / properties / rows / descriptionPrevious value: -"Search Console rows by query and page for one period."New value: +"Search Console rows by query and page for one period, or Ahrefs/Semrush organic keyword rows." - added
Input schema / properties / rows / items / properties / keywordAdded value: +{ + "description": "Ahrefs/Semrush name for query.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / trafficAdded value: +{ + "description": "Estimated monthly traffic, used in place of clicks.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / rows / items / properties / urlAdded value: +{ + "description": "Ahrefs/Semrush name for page.", + "maxLength": 2048, + "type": "string" +} - added
Input schema / properties / rows / items / properties / volumeAdded value: +{ + "description": "Monthly search volume, used in place of impressions when there is no Search Console data.", + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / rows / items / requiredPrevious value: -[ - "page", - "query", - "impressions", - "position" -]New value: +[ + "position" +]
- Added
fix_alt_texts - Added
fix_core_web_vitals - Changed
map_topics6 fields changed- added
Input schema / properties / competitor_rowsAdded value: +{ + "description": "Optional keyword gap: competitors' organic keywords (Ahrefs organic-keywords or Semrush domain_organic for each competitor, or Semrush keyword gap rows).", + "items": { + "properties": { + "competitor": { + "description": "Competitor domain or ranking URL.", + "maxLength": 2000, + "type": "string" + }, + "keyword": { + "maxLength": 2000, + "type": "string" + }, + "position": { + "type": "number" + }, + "url": { + "maxLength": 2048, + "type": "string" + }, + "volume": { + "type": "number" + } + }, + "type": "object" + }, + "maxItems": 1000, + "type": "array" +} - added
Input schema / properties / rows / items / properties / keywordAdded value: +{ + "description": "Ahrefs/Semrush name for query.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / trafficAdded value: +{ + "description": "Estimated monthly traffic, used in place of clicks.", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / rows / items / properties / urlAdded value: +{ + "description": "Ahrefs/Semrush name for page.", + "maxLength": 2048, + "type": "string" +} - added
Input schema / properties / rows / items / properties / volumeAdded value: +{ + "description": "Monthly search volume, used in place of impressions when there is no Search Console data.", + "minimum": 0, + "type": "number" +} - removed
Input schema / properties / rows / items / requiredRemoved value: -[ - "query", - "page" -]
- Changed
suggest_internal_links2 fields changed- added
Input schema / properties / phrasesAdded value: +{ + "description": "Optional: phrases to turn into the link, besides the anchor text, for example natural variants.", + "items": { + "maxLength": 80, + "type": "string" + }, + "maxItems": 6, + "type": "array" +} - added
Input schema / properties / platformAdded value: +{ + "description": "Optional: also return the links ready to apply: a Cloudflare Worker that links the first mention on each page, a WordPress edit plan, or the edits for the code.", + "enum": [ + "cloudflare", + "wordpress", + "git" + ], + "type": "string" +}
3 tool updates
- Added
find_ai_visibility_gaps - Added
find_link_opportunities - Added
schedule_site_audit
3 tool updates
- Added
compare_site_audits - Changed
fix_broken_backlinks4 fields changed- added
Input schema / properties / rows / items / properties / lost_reasonAdded value: +{ + "description": "For lost backlinks (Ahrefs all-backlinks with history, lost_reason): notfound, lostredirect, removedfromhtml, pageerror, pageredirected, noindex or notcanonical.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / referrerAdded value: +{ + "description": "The page visitors came from (GA4 pageReferrer). A page on your own site means a broken internal link.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / snippetAdded value: +{ + "description": "Text around the lost link (Ahrefs snippet_left + anchor + snippet_right), to quote in the outreach email.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / rows / items / properties / visitsAdded value: +{ + "description": "Visits or page views that hit target_url, for example GA4 views of your 404 page per path.", + "minimum": 0, + "type": "number" +}
- Added
import_site_audit
1 tool update
- Added
fix_broken_backlinks
70 tool updates
- Changed
ai_crawler_policy2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
analyze_layout1 field changed- added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
analyze_logs3 fields changed- added
Input schema / properties / log / maxLengthAdded value: +819200 - added
Input schema / properties / sitemap_urls / items / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
build_edge_rules3 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - added
Input schema / properties / site_name / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
build_seo_dashboard5 fields changed- added
Input schema / properties / bigquery / properties / ga4_dataset / maxLengthAdded value: +2000 - added
Input schema / properties / bigquery / properties / gsc_dataset / maxLengthAdded value: +2000 - added
Input schema / properties / bigquery / properties / project / maxLengthAdded value: +2000 - added
Input schema / properties / feed_id / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_accessibility2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_ai_visibility2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_answer_format4 fields changed- added
Input schema / properties / competitors / items / maxLengthAdded value: +2048 - added
Input schema / properties / question / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_consent2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_entity_graph1 field changed- added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
check_focus_keyword3 fields changed- added
Input schema / properties / keyword / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_ga4_tracking2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_hreflang2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_local_seo2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_og_tags1 field changed- added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
check_product_page2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_question_coverage5 fields changed- added
Input schema / properties / competitors / items / maxLengthAdded value: +2048 - added
Input schema / properties / questions / items / maxLengthAdded value: +2000 - added
Input schema / properties / topic / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_readability3 fields changed- added
Input schema / properties / competitors / items / maxLengthAdded value: +2048 - added
Input schema / properties / keyword / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
check_sitemap2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_snippet3 fields changed- added
Input schema / properties / description / maxLengthAdded value: +2000 - added
Input schema / properties / title / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_trust_signals2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_url_parameters3 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - added
Input schema / properties / urls / items / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_urls2 fields changed- added
Input schema / properties / expected / items / maxLengthAdded value: +2000 - added
Input schema / properties / urls / items / maxLengthAdded value: +2048
- Changed
check_vitals_trend3 fields changed- added
Input schema / properties / change_date / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
check_web_vitals2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
compare_ai_citations1 field changed- added
Input schema / properties / pages / items / properties / url / maxLengthAdded value: +2048
- Changed
compare_html3 fields changed- added
Input schema / properties / after / maxLengthAdded value: +921600 - added
Input schema / properties / before / maxLengthAdded value: +921600 - added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
compare_pages3 fields changed- added
Input schema / properties / competitors / items / maxLengthAdded value: +2048 - added
Input schema / properties / keyword / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
create_content_brief4 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - added
Input schema / properties / competitors / items / maxLengthAdded value: +2048 - added
Input schema / properties / keyword / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
create_dashboard_feed5 fields changed- added
Input schema / properties / fix_log_id / maxLengthAdded value: +2000 - added
Input schema / properties / name / maxLengthAdded value: +2000 - added
Input schema / properties / pages / items / maxLengthAdded value: +2048 - added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
deep_audit1 field changed- added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
diagnose_traffic_drop4 fields changed- added
Input schema / properties / fix_log_id / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / query / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
explain_index_status10 fields changed- added
Input schema / properties / rows / items / properties / coverageState / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / googleCanonical / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / indexingState / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / lastCrawlTime / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / pageFetchState / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / robotsTxtState / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / url / maxLengthAdded value: +2048 - added
Input schema / properties / rows / items / properties / userCanonical / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / verdict / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
export_findings3 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - added
Input schema / properties / slack_webhook_url / maxLengthAdded value: +2048 - added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
extract_from_pages6 fields changed- added
Input schema / properties / attribute / maxLengthAdded value: +2000 - added
Input schema / properties / jsonld / maxLengthAdded value: +1048576 - added
Input schema / properties / regex / maxLengthAdded value: +2000 - added
Input schema / properties / selector / maxLengthAdded value: +2000 - added
Input schema / properties / urls / items / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
find_answer_passages3 fields changed- added
Input schema / properties / question / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
find_ctr_gaps3 fields changed- added
Input schema / properties / rows / items / properties / page / maxLengthAdded value: +2048 - added
Input schema / properties / rows / items / properties / query / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
find_duplicate_content2 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
find_striking_distance3 fields changed- added
Input schema / properties / rows / items / properties / page / maxLengthAdded value: +2048 - added
Input schema / properties / rows / items / properties / query / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
generate_llms_txt2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
generate_schema2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
get_dashboard_data4 fields changed- added
Input schema / properties / feed_id / maxLengthAdded value: +2000 - added
Input schema / properties / from / maxLengthAdded value: +2048 - added
Input schema / properties / to / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
get_fix_log4 fields changed- added
Input schema / properties / brand / maxLengthAdded value: +2000 - added
Input schema / properties / fix_log_id / maxLengthAdded value: +2000 - added
Input schema / properties / month / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
get_fix_pack2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
get_layout_probe1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
get_prerender_worker2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
get_site_audit1 field changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000
- Changed
get_watch2 fields changed- added
Input schema / properties / watch_id / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
log_fix9 fields changed- added
Input schema / properties / fix_log_id / maxLengthAdded value: +2000 - added
Input schema / properties / fixes / items / properties / new / maxLengthAdded value: +2048 - added
Input schema / properties / fixes / items / properties / note / maxLengthAdded value: +2000 - added
Input schema / properties / fixes / items / properties / old / maxLengthAdded value: +2048 - added
Input schema / properties / fixes / items / properties / ref / maxLengthAdded value: +2000 - added
Input schema / properties / fixes / items / properties / url / maxLengthAdded value: +2048 - added
Input schema / properties / shipped_at / maxLengthAdded value: +2000 - added
Input schema / properties / webhook / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
map_link_equity3 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - added
Input schema / properties / important_urls / items / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
map_topics4 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - added
Input schema / properties / rows / items / properties / page / maxLengthAdded value: +2048 - added
Input schema / properties / rows / items / properties / query / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
match_intent5 fields changed- added
Input schema / properties / competitors / items / maxLengthAdded value: +2048 - added
Input schema / properties / keyword / maxLengthAdded value: +2000 - added
Input schema / properties / queries / items / properties / page / maxLengthAdded value: +2048 - added
Input schema / properties / queries / items / properties / query / maxLengthAdded value: +2000 - added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
measure_ai_citations4 fields changed- added
Input schema / properties / fix_date / maxLengthAdded value: +2000 - added
Input schema / properties / pages / items / properties / url / maxLengthAdded value: +2048 - added
Input schema / properties / source / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
measure_impact5 fields changed- added
Input schema / properties / fix_date / maxLengthAdded value: +2000 - added
Input schema / properties / fix_log_id / maxLengthAdded value: +2000 - added
Input schema / properties / pages / items / properties / fix / maxLengthAdded value: +2000 - added
Input schema / properties / pages / items / properties / url / maxLengthAdded value: +2048 - added
Input schema / properties / watch_ids / items / maxLengthAdded value: +2000
- Changed
plan_redirects4 fields changed- added
Input schema / properties / new_site / maxLengthAdded value: +2048 - added
Input schema / properties / new_urls / items / maxLengthAdded value: +2048 - added
Input schema / properties / old_site / maxLengthAdded value: +2048 - added
Input schema / properties / old_urls / items / maxLengthAdded value: +2048
- Changed
prioritize_fixes3 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - added
Input schema / properties / pages / items / properties / queries / items / properties / query / maxLengthAdded value: +2000 - added
Input schema / properties / pages / items / properties / url / maxLengthAdded value: +2048
- Changed
render_page1 field changed- added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
rescan_and_compare2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
scan_html3 fields changed- added
Input schema / properties / html / maxLengthAdded value: +921600 - added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
scan_page2 fields changed- added
Input schema / properties / url / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
screen_reader_view1 field changed- added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
share_result1 field changed- added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
start_site_audit1 field changed- added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
submit_indexnow3 fields changed- added
Input schema / properties / key / maxLengthAdded value: +2000 - added
Input schema / properties / urls / items / maxLengthAdded value: +2048 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
suggest_internal_links3 fields changed- added
Input schema / properties / audit_id / maxLengthAdded value: +2000 - added
Input schema / properties / target_url / maxLengthAdded value: +2048 - added
Input schema / properties / topic / maxLengthAdded value: +2000
- Changed
test_robots3 fields changed- added
Input schema / properties / robots_txt / maxLengthAdded value: +524288 - added
Input schema / properties / url / maxLengthAdded value: +2048 - added
Input schema / properties / user_agents / items / maxLengthAdded value: +2000
- Changed
unwatch2 fields changed- added
Input schema / properties / watch_id / maxLengthAdded value: +2000 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The same result as the text, as structured data.", + "type": "object" +}
- Changed
validate_llms_txt2 fields changed- added
Input schema / properties / text / maxLengthAdded value: +1048576 - added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
validate_schema1 field changed- added
Input schema / properties / jsonld / maxLengthAdded value: +1048576
- Changed
watch_page3 fields changed- added
Input schema / properties / competitor_of / maxLengthAdded value: +2048 - added
Input schema / properties / url / maxLengthAdded value: +2048 - added
Input schema / properties / webhook_url / maxLengthAdded value: +2048
3 tool updates
- Added
build_seo_dashboard - Added
create_dashboard_feed - Added
get_dashboard_data
9 tool updates
- Added
check_sitemap - Added
check_url_parameters - Added
check_vitals_trend - Added
diagnose_traffic_drop - Added
extract_from_pages - Added
find_ctr_gaps - Added
find_duplicate_content - Added
find_striking_distance - Added
measure_ai_citations
3 tool updates
- Added
build_edge_rules - Added
explain_index_status - Added
get_prerender_worker
Related MCP Connectors
One MCP for all your SEO: rankings, AI search, fixes & reports. Fixed in code, proven in numbers.
Free technical-SEO audit MCP: crawl a site, run checks, return an LLM-ready shareable report.
SEO research SaaS exposed as 30+ MCP tools. Forge niche analysis, plans, and writer-ready briefs.
Open-source AI SEO over MCP: audits, ranks, keywords, backlinks + AI visibility (GEO).
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceFree, open-source desktop SEO crawler with a built-in MCP server. 250 technical SEO, GEO and AI-search checks across 23 areas, run locally; MCP tools list crawls, inspect issues, run Lighthouse, check AI-crawler access, and apply confirmation-gated WordPress fixes with rollback.76 PyPI17MIT
- AlicenseNot gradedqualityAmaintenanceEnables SEO audits, keyword research, rank tracking, and Core Web Vitals reporting through an MCP interface using only free services.11 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for SEO, performance, GEO, and UX audits with 37 tools covering technical SEO, Lighthouse performance, AI search optimization, content analysis, accessibility, security, and more.1MIT
- AlicenseAqualityBmaintenanceSEO MCP over Search Console, GA4, PageSpeed, Cloudflare, IndexNow, CrUX, and 7 technical-SEO HTTP tools.70318 PyPI554MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.