webability
Server Details
Free WCAG 2.2/ADA/508 accessibility MCP: scan, AI fixes, verify, vision audit, localhost tunnel
- Status
- Healthy
- Uptime
- 99.9% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- snayyar00/webability-mcp
- GitHub Stars
- 0
- Server Listing
- @webability/mcp
TDQS
Scored across 17 tools
The eight scan-family tools (scan_page, scan_html, flow_scan, check_aria, check_color_contrast, visual_audit, diff_scan, verify_fix) heavily overlap in surface, but each description sharply delineates scope (whole page vs snippet vs journey vs one element vs one rule family vs vision). The targeted checks (check_aria, check_color_contrast) are effectively subsets of scan_page, which could tempt misselection, but the guidance to prefer scan_page for iteration keeps them mostly distinct.
Nearly all names use consistent snake_case verb_noun form (add_site, get_rules, scan_page, verify_fix, start_audit). A few deviate in word order (flow_scan, diff_scan) or omit a verb (visual_audit), but the casing and vocabulary remain predictable throughout.
17 tools is slightly heavy but justified by the breadth of the domain (scanning, targeted checks, vision audit, diff/verify loops, fix generation, durable audits, plus site/billing management). Each tool maps to a real workflow step, so the count is reasonable rather than padded.
The find-fix-verify loop is fully covered (scan_page/scan_html → generate_ai_fix → verify_fix → diff_scan), along with audits, visual coverage, rule discovery, framework detection, site onboarding and billing. Minor gaps like no remove/delete_site or update-account operations exist but are easily worked around.
Available Tools
17 toolsadd_siteAdd a site to the accountAInspect
Add a website to the signed-in WebAbility account. The site gets the full widget for its first 30 days and a first scan. Returns the site id and plan tier. Next: put the get_install_snippet tag on the site, and use create_upgrade_link to get a payment link for the WebAbility Pro plan. Needs a free WebAbility account (an AI agent can sign itself up with "Sign in with AgentID").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The site to add, for example https://shop.example.com. One domain per site. | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=true). The description adds meaningful context beyond them: the 30-day full-widget window, the included first scan, the return fields (site id and plan tier), and the account requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then workflow guidance, then the prerequisite. Every sentence contributes, though the parenthetical about self-signup is slightly tangential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description names the return values (site id and plan tier) and the follow-up tools, plus the account prerequisite. It covers what an agent needs to invoke and chain this correctly, missing only edge cases like duplicate-domain handling.
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 carries the parameter documentation burden. The description adds no parameter-specific syntax or constraints beyond what the schema already states, which is the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Add a website to the signed-in WebAbility account." It clearly distinguishes itself from siblings like list_sites and get_install_snippet, 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?
Provides explicit next-step routing ("put the get_install_snippet tag on the site, and use create_upgrade_link to get a payment link for the WebAbility Pro plan") and a prerequisite (needs a free account). It names related tools but does not state when-not to use this tool, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_ariaValidate ARIA in HTML or on a pageARead-onlyIdempotentInspect
Validate ARIA attribute + accessible name/role/value usage — in an HTML snippet (html) or on a live page (url), optionally limited to one element and its descendants (selector). Runs axe-core cat.aria and cat.name-role-value rules (aria-* attribute correctness, role validity, required parents/children, aria-hidden-focus, accessible names). Returns violations. A selector that matches nothing, or a page that answers an HTTP error, is an error — never "no violations". Nodes cap at 5 per rule by default — every rule reports nodesTotal + truncated; raise nodeLimit (max 50). NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Live page to check (pass this or `html`) | |
| html | No | HTML to test for ARIA correctness (pass this or `url`) | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| selector | No | Only report findings on this element and its descendants (e.g. the `selector` from a scan_page issue). ARIA references outside it still resolve. | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| nodeLimit | No | Max nodes returned per rule (default 5, max 50) | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial context beyond them: error semantics (an unmatched selector or HTTP error is an error, never 'no violations'), the default per-rule node cap of 5 with nodesTotal/truncated reporting, and the hosted-server refusal of localhost/private addresses with concrete workarounds.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by rules, output, error semantics, caps, and a clearly delineated NOTE. It is dense and long, but nearly every clause carries operational information; only minor tightening is possible.
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 7-parameter, no-output-schema tool, the description covers return shape ('violations'), error conditions, truncation behavior, and the connectivity constraint that would otherwise cause silent failures. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by clarifying selector semantics ('ARIA references outside it still resolve') and reiterating the nodeLimit default/max and tunnel_secret requirement, adding real invocation context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Validate) and resource (ARIA attribute + accessible name/role/value usage), and scopes it to an HTML snippet or a live page. It names the exact axe-core rule categories (cat.aria, cat.name-role-value), which distinguishes it from siblings like check_color_contrast and scan_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the html-vs-url choice and the selector narrowing case, and even routes the local-dev-server scenario to either running the MCP locally or using a tunnel. It does not explicitly contrast itself against scan_html/scan_page, so the differentiation is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_color_contrastCheck color contrastARead-onlyIdempotentInspect
Check text contrast against the WCAG AA threshold (4.5:1, or 3:1 for large text); the AAA verdict is shown only when you pass level: "AAA". Either pass a foreground / background color pair, or pass url + selector to read the element's own text color, background (composited from the nearest painted ancestors), font size and weight from the live page; explicit colors win over the page. A gradient or image background is reported as an error, never a guessed ratio. When it fails, suggests BRAND-aligned replacements — extracts the actual brand palette from the url page using our scanner (CSS vars + most-used colors), or use a provided brandColors array. No url and no brandColors = ratio + pass/fail only. NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Live page: with `selector`, the colors are read from that element; on a failing pair, the brand palette is extracted from it (uses our scanner — CSS vars + dominant colors). | |
| level | No | Conformance level to judge. Default "AA". "AAA" adds the enhanced-contrast (1.4.6) verdict and AAA palette suggestions. | |
| isBold | No | Whether text is bold (default false, or the element's computed weight with url + selector) | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| fontSize | No | Font size in px (default 16, or the element's computed size with url + selector) | |
| selector | No | CSS selector of the text element on `url` (e.g. the `selector` from a scan_page issue) | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| background | No | Background color (hex or rgb). Optional with url + selector. | |
| foreground | No | Foreground color (hex or rgb). Optional with url + selector. | |
| brandColors | No | Pre-supplied brand palette. Skips URL extraction if provided. | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, yet the description adds substantial behavioral context: gradient/image backgrounds are reported as errors rather than guessed, brand palette extraction behavior, and the critical hosted-server limitation (localhost/private addresses refused) with two concrete workarounds. This is exactly the kind of environment-specific constraint an agent needs.
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 and thresholds, then modes, then the hosted-server caveat. It is dense and long, but nearly every clause carries actionable information; the localhost/tunnel note could arguably be tightened but is not 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?
For an 11-parameter tool with no output schema, the description covers return semantics (ratio, pass/fail, AAA verdict, brand-aligned suggestions), failure modes (gradient/image = error), and the environment constraint. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: the url/selector interaction (reads element colors, extracts palette on failure), the precedence of explicit colors, and the tunnel_secret requirement when url is a tunnel URL. It clarifies cross-parameter behavior the schema documents only per-field.
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 ('Check text contrast against the WCAG AA threshold') with exact thresholds (4.5:1, 3:1 large text), clearly distinguishing it from siblings like check_aria or visual_audit. An agent immediately knows what the tool computes and returns.
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 lays out the two invocation modes (foreground/background pair vs url+selector), the precedence rule ('explicit colors win over the page'), and the degenerate case ('No url and no brandColors = ratio + pass/fail only'). It also names the alternative workflows for local dev servers (run MCP locally or use a tunnel), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_upgrade_linkGet a WebAbility Pro payment linkAInspect
Get a Stripe Checkout link that puts one site on the WebAbility Pro plan (the widget subscription). Give the link to the human who pays (your owner). When they pay, the plan activates on that site automatically; check with list_sites. You never handle card details. The site must be on the account (add_site first). Needs a free WebAbility account.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The site to upgrade, as added with add_site (for example shop.example.com) | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| billing_interval | No | Billing period. Default monthly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false; the description adds genuinely new context beyond these — that the agent never handles card details, that plan activation happens automatically after payment, and that the site must already exist on the account. It does not clarify what happens if the link is requested twice, which the non-idempotent hint implies matters.
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, front-loaded with the outcome (a checkout link) and then the operational essentials: who receives it, what happens after payment, the security boundary, and the prerequisite. 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 no output schema, the description still covers the return artifact (a link to hand off), the post-call lifecycle (payment triggers activation), and the prerequisite chain. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so domain, billing_interval, context, and llm_model are already documented at the schema level. The description only reinforces that the domain must correspond to a site added via add_site, adding marginal value — the correct baseline when the schema does the heavy lifting.
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: returns a Stripe Checkout link that places one site on the WebAbility Pro plan. It is clearly distinguishable from siblings like add_site, list_sites, and the scan/audit tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says who the link goes to (the human who pays), the prerequisite (site must be on the account, add_site first), the account requirement, and the follow-up verification via list_sites. An agent knows exactly when and why to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_frameworkDetect the site frameworkARead-onlyIdempotentInspect
Detect a page's stack as two separate fields: framework — the application framework, CMS or site builder (e.g. nextjs, nuxt, sveltekit, vitepress, astro, gatsby, wordpress, shopify, mediawiki, vue, react; "unknown" when no signal) — and cssToolkit (tailwind, bootstrap, mui, plain-css). Lists the evidence it used and the value to pass as generate_ai_fix framework. scan_page reports the same two fields from the same detection. NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to inspect | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read profile, but the description adds substantial non-obvious behavior: the hosted server refuses localhost/private addresses, requires `tunnel_secret` for tunnel URLs, and returns an evidence list plus the value to feed into `generate_ai_fix`.
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 before the network caveats, and each sentence carries information. It is dense and long, with the local-dev-server note consuming significant space, but nothing is pure 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 no output schema, the description fully carries the return-value burden by naming both output fields and the evidence list. Combined with the network/tunnel guidance, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented, but the description adds real meaning by explaining how `tunnel_secret` is obtained and when it is required, and by tying `framework` output to the `generate_ai_fix` parameter.
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 ('Detect a page's stack') and enumerates the exact output fields (`framework`, `cssToolkit`) with example values. It also distinguishes itself from the sibling `scan_page`, noting they return the same two fields from the same detection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operating context: it explains that `scan_page` reports the same fields (implying when this narrower tool suffices), and gives explicit remediation paths for local dev servers. It lacks an explicit 'use this instead of X when you only need Y' statement, so it 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.
diff_scanCompare two accessibility scansARead-onlyIdempotentInspect
Compare two scans of the same page and report what changed: fixed[] (in the baseline, gone now), new[] (regressions — not in the baseline, present now), remaining[] (still there). Page-level complement to verify_fix (one element). Baseline is a scan_history id (baselineId, local installs) or a live scan of baselineUrl; current is url (scanned live now) or another history id (currentId). Findings are matched by issue id (rule + element), so a changed class/id on a fixed element reads as fixed AND new — check new[] before calling it a regression. Typical loop: scan_page → edit → diff_scan(baselineId=, url=) → confirm new[] is empty. NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to scan now as the CURRENT side (deployed, staging, or http://localhost:3000). Omit when passing currentId. | |
| wcag | No | Only these WCAG criteria. A prefix selects the whole guideline ("1.4") or principle ("2"). | |
| level | No | Highest WCAG conformance level to report. Default "AA" — Level AAA criteria are not reported. Pass "AAA" to include them (naming one AAA criterion in `wcag`, e.g. "3.2.5", also includes it). | |
| rules | No | Only these rule ids (WebAbility type such as "missing_alt" or axe rule id such as "image-alt"). See get_rules. | |
| format | No | "compact" prints one line per element with rule metadata once. "json" returns every field (html, fix values, source). Default: JSON when it fits inline (under ~24k chars), otherwise compact plus a JSON summary of every count. | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| viewport | No | Viewport for live scans (default: desktop). Use the same viewport the baseline used. | |
| currentId | No | scan_history id to use as the CURRENT side instead of scanning `url` | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| minImpact | No | Only findings at this severity or above (critical > serious > moderate > minor) | |
| baselineId | No | scan_history id of the BASELINE scan (local installs only) | |
| baselineUrl | No | Scan this URL live as the baseline (e.g. production) — use when there is no stored baseline | |
| rootSelector | No | CSS selector to limit live scans to (optional) | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantive traits beyond them: matching is done by issue id (rule + element), a changed class/id can make a fixed element read as both fixed AND new, and the hosted server refuses localhost and requires a tunnel secret. These are non-obvious behaviors an agent must know to interpret results correctly.
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 return shape, then the semantic caveat, then the usage loop, then the host constraint — a logical order where each block earns its place. It is dense and long, and some parameter commentary (e.g. tunnel_secret) partially duplicates the schema, but nothing is wasted or misleading.
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?
Although there is no output schema and 14 parameters, the description enumerates the returned keys, explains the four baseline/current parameters, and covers the deployment constraints. An agent has everything needed to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a conceptual model the schema lacks: baseline is a history id or a live URL, current is a live URL or another history id, and the viewport should match the baseline. This clarifies the four-way relationship among url/currentId/baselineId/baselineUrl beyond the individual field docs.
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 two scans of the same page) and enumerates the exact output shape (fixed[], new[], remaining[]). It explicitly positions itself against a sibling — 'Page-level complement to verify_fix (one element)' — so an agent can distinguish the two without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use loop (scan_page → edit → diff_scan → confirm new[] is empty), names the alternative (verify_fix), and describes the baseline/current source combinations. It also states a hard usage constraint (localhost/private addresses refused on this hosted server) with two concrete workarounds.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_scanScan a multi-page user flowARead-onlyIdempotentInspect
Scan a multi-page user journey. Walks startUrl plus the autoNavigate URLs sequentially (deterministic — one page fully rendered and scanned before the next), then returns ONE consolidated report with issues deduplicated across pages, each carrying the same fix payload as scan_page. Every requested URL gets an explicit outcome in pages[] (scanned / nav_failed / scan_failed / redirected_duplicate / duplicate_request / skipped_cap / blocked — bot-challenge, not a clean page) — a page is never silently dropped. Better than per-page scans for journeys (login → checkout etc). Without autoNavigate it scans only startUrl, exactly like scan_page. NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| wcag | No | Only these WCAG criteria. A prefix selects the whole guideline ("1.4") or principle ("2"). | |
| level | No | Highest WCAG conformance level to report. Default "AA" — Level AAA criteria are not reported. Pass "AAA" to include them (naming one AAA criterion in `wcag`, e.g. "3.2.5", also includes it). | |
| rules | No | Only these rule ids (WebAbility type such as "missing_alt" or axe rule id such as "image-alt"). See get_rules. | |
| format | No | "compact" prints one line per element with rule metadata once. "json" returns every field (html, fix values, source). Default: JSON when it fits inline (under ~24k chars), otherwise compact plus a JSON summary of every count. | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| maxPages | No | Max pages to scan (default 10) | |
| startUrl | Yes | Starting URL of the journey | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| minImpact | No | Only findings at this severity or above (critical > serious > moderate > minor) | |
| sourceRoot | No | Local project root (local installs only) for `sourceCandidates[]` on issues without a framework `source` pointer. | |
| autoNavigate | No | The URLs to walk after startUrl, in order (the MCP server is headless and cannot discover a journey interactively). Omit or pass [] to scan only startUrl as a single page. | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety (readOnly, idempotent, non-destructive); the description adds substantial behavior: deterministic sequential rendering, one consolidated deduplicated report, the full set of per-page outcomes (scanned/nav_failed/scan_failed/... and blocked bot-challenge), and the guarantee a page is never silently dropped. It also discloses the hosted-server constraint that localhost/private IPs are refused, which is exactly the kind of behavioral context annotations cannot convey.
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 behavior and outcome contract; each sentence carries information. The final local-host/tunnel sentence is long and slightly digressive, but it prevents failed calls, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-param tool with no output schema, the description covers the return contract (one report, pages[] outcomes, deduped issues with fix payloads), the hosted-vs-local constraint, and the autoNavigate fallback. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds meaning beyond the schema for autoNavigate ("walks ... sequentially", "omit ... to scan only startUrl") and tunnel_secret (required when url is a tunnel URL, ignored otherwise). This clarifies interaction between parameters that the schema documents only individually.
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 ("Scan a multi-page user journey") and immediately differentiates itself from the sibling scan_page ("Without autoNavigate it scans only startUrl, exactly like scan_page"). An agent can distinguish its scope 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 states when to prefer it ("Better than per-page scans for journeys (login → checkout etc)"), the degenerate case that equals scan_page, and names two concrete alternatives for local-dev scanning (run MCP locally vs. tunnel). When/when-not/alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_ai_fixSuggest a framework-aware fixAInspect
Generate framework-aware fix alternatives for a specific accessibility issue. For color contrast issues, returns 3 alternatives (minimal, brand-aligned, high contrast); brand palette is auto-extracted from the live URL using our scanner if brandColors is omitted. For label/ARIA issues, returns 1-2 alternatives. Each alternative includes ready-to-paste code for the detected framework. NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Page URL — also used to auto-extract brand palette for contrast issues if `brandColors` is not provided. | |
| html | Yes | The element's outerHTML — send at most ~600 chars | |
| issue | Yes | Issue object from scan_page (with selector, wcag, impact, message, fix.currentValue), or a plain-text issue description | |
| context | No | Parent element outerHTML for context (~400 chars) | |
| framework | Yes | CSS framework — use detect_framework first | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| brandColors | No | Brand palette for brand-aligned suggestions. If omitted on a contrast issue with a `url`, auto-extracted via the scanner. | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses a hard reachability constraint (localhost/private addresses refused on the hosted server), the reason (cloud-hosted, cannot reach your machine), and two concrete workarounds including the secret requirement. This is exactly the kind of runtime behavior an agent cannot infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core capability with zero waste, then adds operational caveats in a clearly separated NOTE. Somewhat long, but every sentence (contrast-vs-ARIA branching, localhost refusal, tunnel secret) carries information the agent needs.
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 8-param tool with no output schema, yet the description covers output cardinality, auto-extraction behavior, and the hosted-server constraint. The remaining gaps (e.g., what happens on framework mismatch, latency/LLM variability) are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so baseline is 3. The description adds genuine meaning: brandColors auto-extracted from live URL when omitted, and tunnel_secret required for tunnel URLs. It exceeds the schema on those two params, though it does not elaborate on llm_model or context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('generate') plus resource ('framework-aware fix alternatives for a specific accessibility issue'), with output shape made concrete (3 contrast alternatives, 1-2 label/ARIA alternatives, ready-to-paste code). This clearly distinguishes it from siblings like verify_fix or detect_framework.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when each branch applies (contrast vs label/ARIA issues) and detailed guidance for the local-dev-server case, but does not name sibling alternatives (e.g., detect_framework first, verify_fix to validate) inside the description itself. Strong context, no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_auditGet audit status and reportARead-onlyIdempotentInspect
Check an audit started with start_audit: returns overall status, per-step progress (scan → viewports → screenshots → agent → excel → publish), and — once complete — a severity summary plus short-lived download URLs for the report (JSON) and the Excel workbook. Poll every ~15s while status is pending/running. Only the account that started an audit can read it. Free with a WebAbility account.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The audit id returned by start_audit | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, yet the description adds material behavior they don't cover: download URLs are 'short-lived', ownership gates access, polling cadence, and the tool is free with an account. These are real operational traits an agent needs, not restatement of the 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?
A single dense paragraph that front-loads the core purpose, then return values, then polling cadence and access constraints. No filler sentences; every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the return-value burden: status, per-step progress, severity summary, and JSON/Excel download URLs. Combined with auth, cost, and polling notes, an agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the id field already documents 'The audit id returned by start_audit', which the description merely echoes. The description adds no format, range, or validation detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check an audit started with start_audit') and enumerates exactly what is returned, including the per-step pipeline (scan → viewports → screenshots → agent → excel → publish). It explicitly ties itself to the sibling start_audit, so an agent can distinguish it from scan_page or visual_audit 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?
Gives concrete operational guidance: 'Poll every ~15s while status is pending/running', names start_audit as the prerequisite producer of the id, and states the access restriction ('Only the account that started an audit can read it'). This is when-to-use plus when-not (you can't read others' audits) in one paragraph.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_install_snippetGet the widget install tagARead-onlyIdempotentInspect
Get the one-line script tag that installs the WebAbility accessibility widget. Put it in the or before of every page of a site added with add_site. The widget finds the site by its domain, so the same tag works on every site. No account needed.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior. The description adds real context beyond that: no account is needed, the widget resolves the site by domain, and the same tag works across sites, which pre-empts a likely agent question about per-site variation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what the tool returns, then where to place it, then the domain-resolution detail. 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 simple zero-required-parameter getter with no output schema, the description fully covers the return value (a one-line script tag), placement, and the add_site dependency. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (context, llm_model) are analytics-only plumbing fully documented in the schema. The description correctly omits them, so this is baseline rather than a gap.
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 - returns the one-line script tag that installs the WebAbility widget - and ties it to a sibling (add_site) so the agent knows the prerequisite. It is clearly distinguishable from the scan/audit tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete placement guidance (<head> or before </body>) and names the dependency on add_site. It does not state when the tool should NOT be called or offer an alternative, so it falls short of explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rulesList accessibility rulesARead-onlyIdempotentInspect
List accessibility rules from both engines — axe-core (104) and the WebAbility detectors (90+) — with optional filters. Every rule carries fixability (mechanical | contextual | visual) and a fix op template, so you can pick the rules worth auto-fixing before scanning. Returns ruleId, engine, description, help, helpUrl, tags/wcag, fixability, fix.
| Name | Required | Description | Default |
|---|---|---|---|
| rule | No | Only rules whose id contains these whole words (e.g. "link" → link-name, skip-link, not blink; "color-contrast"; case and -/_ insensitive). Also accepted: ruleId, id, query. | |
| tags | No | axe tag filter (e.g. ["wcag2aa"], ["best-practice"], ["cat.aria"]; a category also works without "cat."). WebAbility rules match on their WCAG criterion tag (e.g. "wcag143"). An unknown tag or category is an error that lists the valid ones. | |
| engine | No | Which engine's rules to list (default all) | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| fixability | No | Only rules of this fixability tier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral value beyond that: rule counts per engine, the three fixability tiers with their meaning, the presence of a fix op template, and the returned fields — enough for an agent to know what it gets back before calling.
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 sentences, both front-loaded: the first names the resource, both engines and the counts, the second explains the payload. No filler, and the payoff ('pick the rules worth auto-fixing before scanning') lands early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (ruleId, engine, description, help, helpUrl, tags/wcag, fixability, fix), and all six parameters are optional and fully documented in the schema. Nothing an agent needs to select or invoke this tool 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 goes further by explaining what fixability values mean (mechanical | contextual | visual) and why one would filter on them, and by tying rule metadata to the filter. The 'context' and 'llm_model' analytics params are explained only in the schema, keeping it out of 5 territory.
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 ('List accessibility rules from both engines') plus the exact scope (axe-core 104 rules, WebAbility 90+) and the optional-filter behavior. No sibling tool lists rules — the others scan, check, or fix — so the agent can tell this is the catalog lookup rather than an execution 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?
Gives a clear use context: filter by fixability 'so you can pick the rules worth auto-fixing before scanning,' which positions it as a pre-scan discovery step. It never states when NOT to use it or names an alternative tool, 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.
list_sitesList the account sites and plansARead-onlyIdempotentInspect
List the sites on the signed-in WebAbility account with each site id, plan tier and the date the current plan ends. Use it to check that a payment activated WebAbility Pro on a site. Needs a free WebAbility account.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered structurally. The description adds the auth prerequisite (free account required) and the returned fields, but says nothing about pagination, result limits, or what happens with zero sites.
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 sentences, zero filler, with the core action and returned fields front-loaded and the prerequisite and use case trailing in priority order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no output schema, strong annotations, and fully documented parameters, the description covers purpose, use case and prerequisite adequately. Return-shape and pagination behavior are the only unaddressed items, and they are minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (context, llm_model) carry detailed analytics-only instructions in the schema. The description adds no parameter guidance, which is acceptable given the schema does the work, but it contributes nothing beyond 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 names a specific verb and resource (list the sites on the signed-in account) and enumerates the returned fields (site id, plan tier, plan end date). It does not explicitly contrast with any sibling such as add_site, but the read-scoped account focus makes it distinguishable in practice.
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 a concrete use case — 'check that a payment activated WebAbility Pro on a site' — and states a prerequisite ('Needs a free WebAbility account'). It stops short of naming alternatives or when-not-to-use conditions, 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.
scan_htmlScan an HTML snippetARead-onlyIdempotentInspect
Scan a raw HTML snippet or component markup without serving it — IN-PROCESS by default (jsdom + WebAbility detectors + axe-core): milliseconds, no browser, no network, so it fits inside a tight edit loop. Fragments are auto-wrapped into a document. Returns scan_page's shape (issues / summary) with fix.op + fixability on every finding. jsdom has no layout, so visual-tier rules (contrast, target size, focus ring) are NOT evaluated — the dropped count is reported as skippedVisual; pass engine: "browser" to run the axe-core headless-browser path for those (slower, axe rules only, returns axe violations).
| Name | Required | Description | Default |
|---|---|---|---|
| html | Yes | HTML content to test — a full document or a fragment | |
| tags | No | WCAG tags to check (default ["wcag2a","wcag2aa","wcag21aa","wcag22aa"]) | |
| wcag | No | Only these WCAG criteria. A prefix selects the whole guideline ("1.4") or principle ("2"). | |
| level | No | Highest WCAG conformance level to report. Default "AA" — Level AAA criteria are not reported. Pass "AAA" to include them (naming one AAA criterion in `wcag`, e.g. "3.2.5", also includes it). | |
| rules | No | Only these rule ids (WebAbility type such as "missing_alt" or axe rule id such as "image-alt"). See get_rules. | |
| width | No | Viewport width (browser engine only, default 1280) | |
| engine | No | "in-process" (default): jsdom, ms, structural rules. "browser": headless Chromium + axe-core, includes contrast. | |
| format | No | "compact" prints one line per element with rule metadata once. "json" returns every field (html, fix values, source). Default: JSON when it fits inline (under ~24k chars), otherwise compact plus a JSON summary of every count. | |
| height | No | Viewport height (browser engine only, default 800) | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| minImpact | No | Only findings at this severity or above (critical > serious > moderate > minor) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety (readOnly, idempotent, closed world); the description adds substantive behavior: jsdom has no layout so contrast/target-size/focus-ring rules are skipped, the dropped count surfaces as skippedVisual, and the browser path is slower, axe-only, and returns violations instead of the normal shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, but the key fact (in-process, no browser, no network) is front-loaded and each clause carries real information. Slightly heavy but nothing is 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 12 parameters and no output schema, the description carries the return-value burden and largely discharges it by describing issues/summary, fix.op, fixability, skippedVisual, and the axe violations shape. Minor gaps remain around the analytics-only params, but the core call semantics are covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description enriches the engine parameter well beyond its schema text by tying it to which rules run and what output shape comes back (skippedVisual vs violations).
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 raw HTML snippet/component markup without serving it. It also implicitly separates itself from scan_page by noting it returns scan_page's shape, letting an agent tell the two apart without opening schemas.
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 context — in-process is for a tight edit loop (milliseconds, no browser), and engine: "browser" is the escape hatch when visual-tier rules are needed. It does not explicitly say when to prefer scan_page over this tool, so no full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_pageScan a page for accessibility issuesARead-onlyIdempotentInspect
Scan a web page for WCAG accessibility issues. Works on any URL — deployed sites, localhost, staging. Returns issues (violations the scanner stands behind; findings the engines cannot decide are settled by the AI judge — a violation with a fix, or a pass recorded in judged[] with its reason — and anything unsettled is dropped, never listed for review) and a summary. On React ≤18 / Vue dev builds each issue carries source ({file, line, column, component}) read from the live component tree. Every issue carries a structured fix.op (add-attribute | set-attribute | remove-attribute | add-element | remove-element | add-text-content | suggest) with fix.attribute / fix.value when known, and a fixability tier (mechanical = apply as given; contextual = op known, value needs judgment; visual = needs rendered output, propose only). NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to scan (e.g. https://webability.io or http://localhost:3000) | |
| wcag | No | Only these WCAG criteria. A prefix selects the whole guideline ("1.4") or principle ("2"). | |
| level | No | Highest WCAG conformance level to report. Default "AA" — Level AAA criteria are not reported. Pass "AAA" to include them (naming one AAA criterion in `wcag`, e.g. "3.2.5", also includes it). | |
| rules | No | Only these rule ids (WebAbility type such as "missing_alt" or axe rule id such as "image-alt"). See get_rules. | |
| format | No | "compact" prints one line per element with rule metadata once. "json" returns every field (html, fix values, source). Default: JSON when it fits inline (under ~24k chars), otherwise compact plus a JSON summary of every count. | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| viewport | No | Viewport size (default: desktop) | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| minImpact | No | Only findings at this severity or above (critical > serious > moderate > minor) | |
| sourceRoot | No | Local project root (local installs only). Issues without a framework `source` pointer get `sourceCandidates[]` — files whose contents match the selector's id/class/attribute tokens. | |
| rootSelector | No | CSS selector to limit scan scope (optional) | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld/destructive=false, yet the description still adds substantial behavior: how violations vs judged[] vs dropped results are produced, the fix.op/fixability taxonomy, source pointers on React/Vue dev builds, and the hard constraint that the hosted server refuses localhost/private addresses. That last point materially changes how an agent must call the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long and dense, but front-loaded with the core purpose and output shape, and the paragraphs each carry distinct information (returns, source pointers, fix ops, hosting limits, local alternatives). A few details duplicate the schema, keeping it from a 5.
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 12-parameter tool with no output schema, the description fully explains the return structure (issues, summary, judged[], fix fields) plus the operational constraints an agent needs, leaving nothing critical 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 description coverage is 100%, so all 12 parameters are already documented in the schema itself. The description mostly restates schema semantics (tunnel_secret requirement, sourceRoot/sourceCandidates, url examples) rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — scan a web page for WCAG accessibility issues — and the scope (any URL, deployed/localhost/staging) makes it distinguishable from siblings like scan_html, flow_scan, and visual_audit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong context: it works on deployed sites, localhost, and staging, and it spells out two workarounds (local MCP install or tunnel) when the hosted server refuses private addresses. It does not explicitly route the agent to a sibling (e.g. scan_html for markup-only or flow_scan for multi-step), so it stops short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_auditStart a full accessibility auditAInspect
Kick off a FULL accessibility audit deliverable for a URL — a persistent, timestamped artifact, not an inline scan. Runs the server-side pipeline (axe + advanced checks + mobile viewports + annotated screenshots + optional agent spot-check) and produces a downloadable report and a formatted Excel workbook (Cover / Status / Barriers / ADA context sheets) stored durably. Returns immediately with an audit id; poll get_audit for progress and, when complete, download URLs. Use this when someone needs a durable artifact to attach as evidence of testing effort for a compliance officer or legal response — for iterating on code, use scan_page + verify_fix instead. Needs a free WebAbility account (sign in by connecting https://mcp.webability.io/mcp/auth, or run webability login). Set includeAgent:true to add the slower agentic manual-audit pass. To audit a local dev server, open a tunnel (webability-tunnel --port 3000) and pass its URL as url with the printed secret as tunnel_secret; keep the tunnel open until get_audit reports complete (about 5 minutes) — the pipeline loads the page several times.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit (a public/staging URL the server can reach, or a webability-tunnel URL — not localhost) | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| includeAgent | No | Also run the agentic manual-audit pass (keyboard/focus/modal exploration). Slower. Default false. | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety/open-world flags, and the description adds substantial behavior beyond them: async fire-and-return with an `id`, polling via get_audit, ~5 minute runtime, tunnel must stay open because the pipeline loads the page several times. This is exactly the operational context annotations cannot convey.
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 it produces, then usage routing, then setup mechanics. Dense but nearly every clause carries actionable information; the parenthetical sheet listing and pipeline component list are slightly heavier than necessary but still informative.
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 an async mutation-ish tool with no output schema, the description covers auth, async contract, polling target, runtime, tunnel requirements, and the return payload (id + download URLs). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: includeAgent triggers a slower agentic pass, tunnel_secret is required only for tunnel URLs and otherwise ignored, and url must be server-reachable (not localhost). This enriches the two non-obvious parameters.
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 ('Kick off') and resource ('FULL accessibility audit deliverable for a URL'), and explicitly contrasts itself with an inline scan. It also names the exact sibling alternative (scan_page + verify_fix), so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('when someone needs a durable artifact to attach as evidence for a compliance officer or legal response') and when-not ('for iterating on code, use scan_page + verify_fix instead'). Prerequisites (free WebAbility account, sign-in path) and the tunnel workflow are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_fixVerify an accessibility fixARead-onlyIdempotentInspect
Re-scan a specific element after applying an accessibility fix and confirm the violation is gone. After you edit the code and serve it (deployed, staging, or http://localhost:3000), call this with the URL and the selector you fixed to get a machine-checked verified: true|false (DOM engines only — visual_audit findings are out of scope). Pass the WCAG criterion (e.g. "1.1.1") or axe rule id (e.g. "color-contrast") to check just that criterion; omit it to require the element be clean of ALL violations. A blocked page (bot-challenge / HTTP error) is reported as unverified, never a pass — verification fails closed. verified: true is only returned when the selector matched at least one element AND the criterion is one the DOM engines check; if the selector matches no element the result is verified: false with reason "not-found" ("selector matched no elements"), a criterion outside the coverage set returns reason "not-verifiable" ("not checked by any WebAbility tool"); a finding in scope that only the AI judge can settle, when the judge did not run or gave no verdict, also returns "not-verifiable", and shadow-DOM (>>>) / iframe selectors return "unsupported-selector" — pass the element's current selector, or re-run scan_page if your fix removed the element. Pair with scan_page → generate_ai_fix → verify_fix for a full find-fix-verify cycle. NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL now serving the fix (deployed, staging, or http://localhost:3000). Also accepted as `page` or `pageUrl`. | |
| wcag | No | Optional: WCAG criterion (e.g. "1.1.1", "1.4.3") or axe rule id (e.g. "color-contrast") to verify specifically. Omit to require the element be free of ALL violations. | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| selector | Yes | CSS selector of the element you fixed — use the `selector` from the original scan_page issue | |
| viewport | No | Viewport size (default: desktop). Use the same viewport the issue was found at. | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/idempotent safety profile; the description adds far more: it fails closed (blocked page = unverified, never a pass), enumerates exact reason codes (not-found, not-verifiable, unsupported-selector) and the conditions producing them, and defines precisely when verified:true is returned. It also discloses the hosted-server network restriction, which annotations cannot convey.
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 and every clause carries actionable detail (reason codes, environment caveats). It is dense and long for a single block of prose, but little of it is filler, so the size is largely justified rather than 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?
For a 7-param, no-output-schema, behaviorally intricate verification tool, the description covers return semantics, failure modes, scope boundaries, and environment constraints. An agent has everything needed to invoke it correctly and interpret the result without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline, but the description adds real semantics: the wcag param's omit-vs-pass behavior (check one criterion vs require clean of ALL), and guidance that selector must be the element's current selector (re-run scan_page if it was removed). Minor gap: it doesn't discuss context, llm_model, or viewport semantics beyond matching the original scan.
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 names a specific verb and resource ('Re-scan a specific element after applying an accessibility fix and confirm the violation is gone'). It distinguishes itself from siblings by explicitly scoping out visual_audit findings and positioning itself in the scan_page → generate_ai_fix → verify_fix cycle.
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 states exactly when to call it ('after you edit the code and serve it'), what to pass (URL + the selector you fixed), and names the alternatives/cycle it belongs to. It also flags a critical when-NOT condition: localhost/private addresses are refused on the hosted server, with two concrete workarounds (local MCP, tunnel + secret).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
visual_auditVisual accessibility auditAInspect
Pixel-level accessibility audit using Claude vision. Catches issues that DOM scanners miss: icon contrast (1.4.11), focus visibility (2.4.7), "looks like a button but isn't" (4.1.2), text rendered as images (1.4.5), visual hierarchy mismatches. Takes a URL, opens it in a headless browser, screenshots, and runs vision-based detection. Complements scan_page — run both for full coverage. Sign in with a free WebAbility account for vision and full audits (sign in by connecting https://mcp.webability.io/mcp/auth, or run webability login). Fair-use rate limits apply. NOTE: on this HOSTED server, localhost and private addresses are refused — it runs in our cloud and cannot reach your machine. Two ways to scan a local dev server: run the MCP locally (npx -y @webability/mcp, simplest — nothing leaves the machine), or open a tunnel (webability-tunnel --port 3000) and pass its URL as url together with the printed secret as tunnel_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit visually | |
| context | No | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| fullPage | No | Capture full scrolled page instead of just viewport (default: false) | |
| viewport | No | Viewport size (default: desktop) | |
| llm_model | No | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| brandColors | No | Brand hex colors for context-aware filtering | |
| tunnel_secret | No | Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld/idempotent/destructive flags; the description goes far beyond by disclosing the auth requirement, fair-use rate limits, the cloud-vs-local reachability limitation, and the mechanism (headless browser screenshot then vision detection). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does and its differentiator before moving to prerequisites and the localhost/tunnel caveat. Dense but each sentence carries operational information; the numbered issue list is arguably slightly long but defensible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a 7-parameter openWorld tool, the description supplies the missing context: auth, rate limits, reachability, and local-dev workarounds. An agent has everything needed to decide and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds cross-parameter semantics by explaining that a tunnel URL must be paired with the printed secret as `tunnel_secret` and that the URL alone will be refused. It does not add much for viewport/fullPage/brandColors, hence not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (pixel-level accessibility audit via vision) and enumerates the exact WCAG issues it catches, which distinguishes it from generic DOM scanners. It also explicitly positions itself against the sibling scan_page ('Complements scan_page — run both for full coverage').
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 explicit when-to-use (issues DOM scanners miss), when-to-run-both (with scan_page), prerequisites (sign-in to WebAbility), and hard constraints (localhost/private addresses refused on hosted server). It even routes the agent to two concrete alternatives for local dev servers.
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.
1 tool update
- Changed
flow_scan2 fields changed- changed
Input schema / properties / autoNavigate / descriptionPrevious value: -"REQUIRED — the URLs to walk after startUrl (the MCP server is headless and cannot discover a journey interactively). For a single page, use scan_page instead."New value: +"The URLs to walk after startUrl, in order (the MCP server is headless and cannot discover a journey interactively). Omit or pass [] to scan only startUrl as a single page." - changed
Input schema / requiredPrevious value: -[ - "startUrl", - "autoNavigate" -]New value: +[ + "startUrl" +]
4 tool updates
- Added
add_site - Added
create_upgrade_link - Added
get_install_snippet - Added
list_sites
5 tool updates
- Changed
check_color_contrast1 field changed- added
Input schema / properties / levelAdded value: +{ + "description": "Conformance level to judge. Default \"AA\". \"AAA\" adds the enhanced-contrast (1.4.6) verdict and AAA palette suggestions.", + "enum": [ + "AA", + "AAA" + ], + "type": "string" +}
- Changed
diff_scan1 field changed- added
Input schema / properties / levelAdded value: +{ + "description": "Highest WCAG conformance level to report. Default \"AA\" — Level AAA criteria are not reported. Pass \"AAA\" to include them (naming one AAA criterion in `wcag`, e.g. \"3.2.5\", also includes it).", + "enum": [ + "A", + "AA", + "AAA" + ], + "type": "string" +}
- Changed
flow_scan1 field changed- added
Input schema / properties / levelAdded value: +{ + "description": "Highest WCAG conformance level to report. Default \"AA\" — Level AAA criteria are not reported. Pass \"AAA\" to include them (naming one AAA criterion in `wcag`, e.g. \"3.2.5\", also includes it).", + "enum": [ + "A", + "AA", + "AAA" + ], + "type": "string" +}
- Changed
scan_html1 field changed- added
Input schema / properties / levelAdded value: +{ + "description": "Highest WCAG conformance level to report. Default \"AA\" — Level AAA criteria are not reported. Pass \"AAA\" to include them (naming one AAA criterion in `wcag`, e.g. \"3.2.5\", also includes it).", + "enum": [ + "A", + "AA", + "AAA" + ], + "type": "string" +}
- Changed
scan_page1 field changed- added
Input schema / properties / levelAdded value: +{ + "description": "Highest WCAG conformance level to report. Default \"AA\" — Level AAA criteria are not reported. Pass \"AAA\" to include them (naming one AAA criterion in `wcag`, e.g. \"3.2.5\", also includes it).", + "enum": [ + "A", + "AA", + "AAA" + ], + "type": "string" +}
1 tool update
- Changed
scan_page1 field changed- changed
Input schema / properties / url / descriptionPrevious value: -"URL to scan (e.g. https://example.com or http://localhost:3000)"New value: +"URL to scan (e.g. https://webability.io or http://localhost:3000)"
13 tool updates
- Changed
check_aria6 fields changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -} - changed
Input schema / properties / html / descriptionPrevious value: -"HTML to test for ARIA correctness"New value: +"HTML to test for ARIA correctness (pass this or `url`)" - added
Input schema / properties / selectorAdded value: +{ + "description": "Only report findings on this element and its descendants (e.g. the `selector` from a scan_page issue). ARIA references outside it still resolve.", + "type": "string" +} - added
Input schema / properties / tunnel_secretAdded value: +{ + "description": "Secret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.", + "type": "string" +} - added
Input schema / properties / urlAdded value: +{ + "description": "Live page to check (pass this or `html`)", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "html" -]New value: +[]
- Changed
check_color_contrast8 fields changed- changed
Input schema / properties / background / descriptionPrevious value: -"Background color (hex or rgb)"New value: +"Background color (hex or rgb). Optional with url + selector." - removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -} - changed
Input schema / properties / fontSize / descriptionPrevious value: -"Font size in px (default 16)"New value: +"Font size in px (default 16, or the element's computed size with url + selector)" - changed
Input schema / properties / foreground / descriptionPrevious value: -"Foreground color (hex or rgb)"New value: +"Foreground color (hex or rgb). Optional with url + selector." - changed
Input schema / properties / isBold / descriptionPrevious value: -"Whether text is bold (default false)"New value: +"Whether text is bold (default false, or the element's computed weight with url + selector)" - added
Input schema / properties / selectorAdded value: +{ + "description": "CSS selector of the text element on `url` (e.g. the `selector` from a scan_page issue)", + "type": "string" +} - changed
Input schema / properties / url / descriptionPrevious value: -"Live URL to extract brand palette from (uses our scanner — CSS vars + dominant colors)."New value: +"Live page: with `selector`, the colors are read from that element; on a failing pair, the brand palette is extracted from it (uses our scanner — CSS vars + dominant colors)." - changed
Input schema / requiredPrevious value: -[ - "foreground", - "background" -]New value: +[]
- Changed
detect_framework1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
diff_scan1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
flow_scan1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
generate_ai_fix1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
get_audit1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
get_rules3 fields changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -} - changed
Input schema / properties / rule / descriptionPrevious value: -"Only rules whose id contains this text (e.g. \"color-contrast\", \"label\"; case and -/_ insensitive). Also accepted: ruleId, id, query."New value: +"Only rules whose id contains these whole words (e.g. \"link\" → link-name, skip-link, not blink; \"color-contrast\"; case and -/_ insensitive). Also accepted: ruleId, id, query." - changed
Input schema / properties / tags / descriptionPrevious value: -"axe tag filter (e.g. [\"wcag21aa\"], [\"best-practice\"], [\"cat.aria\"]). WebAbility rules match on their WCAG criterion tag (e.g. \"wcag143\")."New value: +"axe tag filter (e.g. [\"wcag2aa\"], [\"best-practice\"], [\"cat.aria\"]; a category also works without \"cat.\"). WebAbility rules match on their WCAG criterion tag (e.g. \"wcag143\"). An unknown tag or category is an error that lists the valid ones."
- Changed
scan_html1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
scan_page1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
start_audit1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
verify_fix1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
- Changed
visual_audit1 field changed- removed
Input schema / properties / conversation_idRemoved value: -{ - "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.", - "type": "string" -}
13 tool updates
- Changed
check_aria1 field changed- changed
Input schema / requiredPrevious value: -[ - "html", - "context", - "llm_model" -]New value: +[ + "html" +]
- Changed
check_color_contrast1 field changed- changed
Input schema / requiredPrevious value: -[ - "foreground", - "background", - "context", - "llm_model" -]New value: +[ + "foreground", + "background" +]
- Changed
detect_framework1 field changed- changed
Input schema / requiredPrevious value: -[ - "url", - "context", - "llm_model" -]New value: +[ + "url" +]
- Changed
diff_scan2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"\"compact\" prints one line per element with rule metadata once — far fewer tokens than the default JSON. Default json."New value: +"\"compact\" prints one line per element with rule metadata once. \"json\" returns every field (html, fix values, source). Default: JSON when it fits inline (under ~24k chars), otherwise compact plus a JSON summary of every count." - changed
Input schema / requiredPrevious value: -[ - "context", - "llm_model" -]New value: +[]
- Changed
flow_scan2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"\"compact\" prints one line per element with rule metadata once — far fewer tokens than the default JSON. Default json."New value: +"\"compact\" prints one line per element with rule metadata once. \"json\" returns every field (html, fix values, source). Default: JSON when it fits inline (under ~24k chars), otherwise compact plus a JSON summary of every count." - changed
Input schema / requiredPrevious value: -[ - "startUrl", - "autoNavigate", - "context", - "llm_model" -]New value: +[ + "startUrl", + "autoNavigate" +]
- Changed
generate_ai_fix1 field changed- changed
Input schema / requiredPrevious value: -[ - "issue", - "html", - "framework", - "llm_model" -]New value: +[ + "issue", + "html", + "framework" +]
- Changed
get_audit1 field changed- changed
Input schema / requiredPrevious value: -[ - "id", - "context", - "llm_model" -]New value: +[ + "id" +]
- Changed
get_rules1 field changed- changed
Input schema / requiredPrevious value: -[ - "context", - "llm_model" -]New value: +[]
- Changed
scan_html2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"\"compact\" prints one line per element with rule metadata once — far fewer tokens than the default JSON. Default json."New value: +"\"compact\" prints one line per element with rule metadata once. \"json\" returns every field (html, fix values, source). Default: JSON when it fits inline (under ~24k chars), otherwise compact plus a JSON summary of every count." - changed
Input schema / requiredPrevious value: -[ - "html", - "context", - "llm_model" -]New value: +[ + "html" +]
- Changed
scan_page2 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"\"compact\" prints one line per element with rule metadata once — far fewer tokens than the default JSON. Default json."New value: +"\"compact\" prints one line per element with rule metadata once. \"json\" returns every field (html, fix values, source). Default: JSON when it fits inline (under ~24k chars), otherwise compact plus a JSON summary of every count." - changed
Input schema / requiredPrevious value: -[ - "url", - "context", - "llm_model" -]New value: +[ + "url" +]
- Changed
start_audit1 field changed- changed
Input schema / requiredPrevious value: -[ - "url", - "context", - "llm_model" -]New value: +[ + "url" +]
- Changed
verify_fix1 field changed- changed
Input schema / requiredPrevious value: -[ - "url", - "selector", - "context", - "llm_model" -]New value: +[ + "url", + "selector" +]
- Changed
visual_audit1 field changed- changed
Input schema / requiredPrevious value: -[ - "url", - "context", - "llm_model" -]New value: +[ + "url" +]
Related MCP Connectors
Scan URLs or HTML for WCAG 2.2 violations. 75-rule manifest, weighted score, shareable reports.
Security, SEO and AI-visibility scanner for web apps · free scans and focused checks via MCP.
Scan URLs for WCAG 2.1 violations, generate AI fixes, and produce VPAT 2.5 compliance reports.
Scan a web page for accessibility, security, privacy, quality and SEO issues, with fixes.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAutonomous WCAG 2.1 accessibility auditor that scans, fixes, re-verifies, and generates VPAT 2.5 EN 301 549 reports using AI vision analysis + DOM scanning.4,113 npm1MIT
- AlicenseNot gradedqualityCmaintenanceVisual frontend accessibility inspector MCP server. WCAG contrast checking, touch target validation, heading hierarchy audits, responsive screenshots, and S+ grading across mobile and desktop viewports.21 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding assistants to test web accessibility by scanning URLs, detecting violations, and running focused audits on keyboard navigation, screen reader compatibility, and WCAG criteria — all within the assistant's loop.MIT
- AlicenseAqualityCmaintenanceProvides conversational, actionable accessibility testing for AI agents, including auditing, prioritization, and code-level fixes.225 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.