Skip to main content
Glama

Server Details

Free WCAG 2.2/ADA/508 accessibility MCP: scan, AI fixes, verify, vision audit, localhost tunnel

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
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

A4.1/5.0

Scored across 17 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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 tools
add_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").

NameRequiredDescriptionDefault
urlYesThe site to add, for example https://shop.example.com. One domain per site.
contextNoExplain 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_modelNoThe 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

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 pageA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
urlNoLive page to check (pass this or `html`)
htmlNoHTML to test for ARIA correctness (pass this or `url`)
contextNoExplain 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."
selectorNoOnly report findings on this element and its descendants (e.g. the `selector` from a scan_page issue). ARIA references outside it still resolve.
llm_modelNoThe 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.
nodeLimitNoMax nodes returned per rule (default 5, max 50)
tunnel_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 contrastA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
urlNoLive 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).
levelNoConformance level to judge. Default "AA". "AAA" adds the enhanced-contrast (1.4.6) verdict and AAA palette suggestions.
isBoldNoWhether text is bold (default false, or the element's computed weight with url + selector)
contextNoExplain 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."
fontSizeNoFont size in px (default 16, or the element's computed size with url + selector)
selectorNoCSS selector of the text element on `url` (e.g. the `selector` from a scan_page issue)
llm_modelNoThe 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.
backgroundNoBackground color (hex or rgb). Optional with url + selector.
foregroundNoForeground color (hex or rgb). Optional with url + selector.
brandColorsNoPre-supplied brand palette. Skips URL extraction if provided.
tunnel_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

detect_frameworkDetect the site frameworkA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
urlYesURL to inspect
contextNoExplain 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_modelNoThe 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_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 scansA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
urlNoURL to scan now as the CURRENT side (deployed, staging, or http://localhost:3000). Omit when passing currentId.
wcagNoOnly these WCAG criteria. A prefix selects the whole guideline ("1.4") or principle ("2").
levelNoHighest 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).
rulesNoOnly these rule ids (WebAbility type such as "missing_alt" or axe rule id such as "image-alt"). See get_rules.
formatNo"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.
contextNoExplain 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."
viewportNoViewport for live scans (default: desktop). Use the same viewport the baseline used.
currentIdNoscan_history id to use as the CURRENT side instead of scanning `url`
llm_modelNoThe 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.
minImpactNoOnly findings at this severity or above (critical > serious > moderate > minor)
baselineIdNoscan_history id of the BASELINE scan (local installs only)
baselineUrlNoScan this URL live as the baseline (e.g. production) — use when there is no stored baseline
rootSelectorNoCSS selector to limit live scans to (optional)
tunnel_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 flowA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
wcagNoOnly these WCAG criteria. A prefix selects the whole guideline ("1.4") or principle ("2").
levelNoHighest 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).
rulesNoOnly these rule ids (WebAbility type such as "missing_alt" or axe rule id such as "image-alt"). See get_rules.
formatNo"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.
contextNoExplain 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."
maxPagesNoMax pages to scan (default 10)
startUrlYesStarting URL of the journey
llm_modelNoThe 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.
minImpactNoOnly findings at this severity or above (critical > serious > moderate > minor)
sourceRootNoLocal project root (local installs only) for `sourceCandidates[]` on issues without a framework `source` pointer.
autoNavigateNoThe 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_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
urlNoPage URL — also used to auto-extract brand palette for contrast issues if `brandColors` is not provided.
htmlYesThe element's outerHTML — send at most ~600 chars
issueYesIssue object from scan_page (with selector, wcag, impact, message, fix.currentValue), or a plain-text issue description
contextNoParent element outerHTML for context (~400 chars)
frameworkYesCSS framework — use detect_framework first
llm_modelNoThe 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.
brandColorsNoBrand palette for brand-aligned suggestions. If omitted on a contrast issue with a `url`, auto-extracted via the scanner.
tunnel_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 reportA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe audit id returned by start_audit
contextNoExplain 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_modelNoThe 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

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 tagA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
contextNoExplain 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_modelNoThe 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

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 rulesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
ruleNoOnly 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.
tagsNoaxe 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.
engineNoWhich engine's rules to list (default all)
contextNoExplain 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_modelNoThe 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.
fixabilityNoOnly rules of this fixability tier

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 plansA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
contextNoExplain 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_modelNoThe 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

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 snippetA
Read-onlyIdempotent
Inspect

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).

NameRequiredDescriptionDefault
htmlYesHTML content to test — a full document or a fragment
tagsNoWCAG tags to check (default ["wcag2a","wcag2aa","wcag21aa","wcag22aa"])
wcagNoOnly these WCAG criteria. A prefix selects the whole guideline ("1.4") or principle ("2").
levelNoHighest 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).
rulesNoOnly these rule ids (WebAbility type such as "missing_alt" or axe rule id such as "image-alt"). See get_rules.
widthNoViewport width (browser engine only, default 1280)
engineNo"in-process" (default): jsdom, ms, structural rules. "browser": headless Chromium + axe-core, includes contrast.
formatNo"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.
heightNoViewport height (browser engine only, default 800)
contextNoExplain 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_modelNoThe 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.
minImpactNoOnly findings at this severity or above (critical > serious > moderate > minor)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 issuesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
urlYesURL to scan (e.g. https://webability.io or http://localhost:3000)
wcagNoOnly these WCAG criteria. A prefix selects the whole guideline ("1.4") or principle ("2").
levelNoHighest 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).
rulesNoOnly these rule ids (WebAbility type such as "missing_alt" or axe rule id such as "image-alt"). See get_rules.
formatNo"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.
contextNoExplain 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."
viewportNoViewport size (default: desktop)
llm_modelNoThe 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.
minImpactNoOnly findings at this severity or above (critical > serious > moderate > minor)
sourceRootNoLocal project root (local installs only). Issues without a framework `source` pointer get `sourceCandidates[]` — files whose contents match the selector's id/class/attribute tokens.
rootSelectorNoCSS selector to limit scan scope (optional)
tunnel_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
urlYesURL to audit (a public/staging URL the server can reach, or a webability-tunnel URL — not localhost)
contextNoExplain 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_modelNoThe 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.
includeAgentNoAlso run the agentic manual-audit pass (keyboard/focus/modal exploration). Slower. Default false.
tunnel_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 fixA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
urlYesURL now serving the fix (deployed, staging, or http://localhost:3000). Also accepted as `page` or `pageUrl`.
wcagNoOptional: 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.
contextNoExplain 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."
selectorYesCSS selector of the element you fixed — use the `selector` from the original scan_page issue
viewportNoViewport size (default: desktop). Use the same viewport the issue was found at.
llm_modelNoThe 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_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
urlYesURL to audit visually
contextNoExplain 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."
fullPageNoCapture full scrolled page instead of just viewport (default: false)
viewportNoViewport size (default: desktop)
llm_modelNoThe 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.
brandColorsNoBrand hex colors for context-aware filtering
tunnel_secretNoSecret printed by `webability-tunnel`. Required when `url` is a tunnel URL; the URL alone will be refused by the relay. Ignored otherwise.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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. 1 tool update
    • Changedflow_scan2 fields changed
      • changedInput schema / properties / autoNavigate / description
        Previous 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."
      • changedInput schema / required
        Previous value: -[
        -  "startUrl",
        -  "autoNavigate"
        -]New value: +[
        +  "startUrl"
        +]
  2. 4 tool updates
    • Addedadd_site
    • Addedcreate_upgrade_link
    • Addedget_install_snippet
    • Addedlist_sites
  3. 5 tool updates
    • Changedcheck_color_contrast1 field changed
      • addedInput schema / properties / level
        Added 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"
        +}
    • Changeddiff_scan1 field changed
      • addedInput schema / properties / level
        Added 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"
        +}
    • Changedflow_scan1 field changed
      • addedInput schema / properties / level
        Added 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"
        +}
    • Changedscan_html1 field changed
      • addedInput schema / properties / level
        Added 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"
        +}
    • Changedscan_page1 field changed
      • addedInput schema / properties / level
        Added 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"
        +}
  4. 1 tool update
    • Changedscan_page1 field changed
      • changedInput schema / properties / url / description
        Previous 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)"
  5. 13 tool updates
    • Changedcheck_aria6 fields changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
      • changedInput schema / properties / html / description
        Previous value: -"HTML to test for ARIA correctness"New value: +"HTML to test for ARIA correctness (pass this or `url`)"
      • addedInput schema / properties / selector
        Added 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"
        +}
      • addedInput schema / properties / tunnel_secret
        Added 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"
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "description": "Live page to check (pass this or `html`)",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "html"
        -]New value: +[]
    • Changedcheck_color_contrast8 fields changed
      • changedInput schema / properties / background / description
        Previous value: -"Background color (hex or rgb)"New value: +"Background color (hex or rgb). Optional with url + selector."
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
      • changedInput schema / properties / fontSize / description
        Previous value: -"Font size in px (default 16)"New value: +"Font size in px (default 16, or the element's computed size with url + selector)"
      • changedInput schema / properties / foreground / description
        Previous value: -"Foreground color (hex or rgb)"New value: +"Foreground color (hex or rgb). Optional with url + selector."
      • changedInput schema / properties / isBold / description
        Previous value: -"Whether text is bold (default false)"New value: +"Whether text is bold (default false, or the element's computed weight with url + selector)"
      • addedInput schema / properties / selector
        Added value: +{
        +  "description": "CSS selector of the text element on `url` (e.g. the `selector` from a scan_page issue)",
        +  "type": "string"
        +}
      • changedInput schema / properties / url / description
        Previous 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)."
      • changedInput schema / required
        Previous value: -[
        -  "foreground",
        -  "background"
        -]New value: +[]
    • Changeddetect_framework1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changeddiff_scan1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changedflow_scan1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changedgenerate_ai_fix1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changedget_audit1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changedget_rules3 fields changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
      • changedInput schema / properties / rule / description
        Previous 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."
      • changedInput schema / properties / tags / description
        Previous 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."
    • Changedscan_html1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changedscan_page1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changedstart_audit1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changedverify_fix1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
    • Changedvisual_audit1 field changed
      • removedInput schema / properties / conversation_id
        Removed 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"
        -}
  6. 13 tool updates
    • Changedcheck_aria1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "html",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "html"
        +]
    • Changedcheck_color_contrast1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "foreground",
        -  "background",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "foreground",
        +  "background"
        +]
    • Changeddetect_framework1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "url"
        +]
    • Changeddiff_scan2 fields changed
      • changedInput schema / properties / format / description
        Previous 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."
      • changedInput schema / required
        Previous value: -[
        -  "context",
        -  "llm_model"
        -]New value: +[]
    • Changedflow_scan2 fields changed
      • changedInput schema / properties / format / description
        Previous 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."
      • changedInput schema / required
        Previous value: -[
        -  "startUrl",
        -  "autoNavigate",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "startUrl",
        +  "autoNavigate"
        +]
    • Changedgenerate_ai_fix1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "issue",
        -  "html",
        -  "framework",
        -  "llm_model"
        -]New value: +[
        +  "issue",
        +  "html",
        +  "framework"
        +]
    • Changedget_audit1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "id"
        +]
    • Changedget_rules1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "context",
        -  "llm_model"
        -]New value: +[]
    • Changedscan_html2 fields changed
      • changedInput schema / properties / format / description
        Previous 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."
      • changedInput schema / required
        Previous value: -[
        -  "html",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "html"
        +]
    • Changedscan_page2 fields changed
      • changedInput schema / properties / format / description
        Previous 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."
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "url"
        +]
    • Changedstart_audit1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "url"
        +]
    • Changedverify_fix1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "selector",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "url",
        +  "selector"
        +]
    • Changedvisual_audit1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "context",
        -  "llm_model"
        -]New value: +[
        +  "url"
        +]

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.