a11y-toolkit
This server is the a11y-toolkit MCP server: it gives an AI agent a WCAG 2.2 accessibility workflow — measure contrast, audit pages, snapshot/diff for regressions, and generate legal accessibility declarations.
Contrast checking —
a11y_contrast_pairreturns exact WCAG ratios plus 1.4.3 (AA), 1.4.6 (AAA) and 1.4.11 (non-text) verdicts and suggests the nearest passing color;a11y_suggest_colorfinds the closest color hitting a target ratio (default 4.5).Text over images —
a11y_contrast_imagepixel-samples the real background of a region and reports worst/median/p95 ratio and the % of area passing AA.Static page audit —
a11y_audit_urlfetches a URL and flags automatic WCAG 2.2 signals (missing alt, unnamed controls, unlabeled fields, missing lang/title, heading skips, blocked zoom, positive tabindex, untitled iframes) ranked by severity.Rendered snapshots —
a11y_snapshotcaptures interactive elements (tag, role, accessible name, href) and real tab order (requires local Playwright).Regression diffing —
a11y_diffcompares two snapshots for added/removed/renamed interactives and focus-order changes;a11y_diff_urlssnapshots and diffs two URLs (e.g. staging vs production) in one call.Legal declarations —
a11y_generate_declarationproduces an accessible HTML accessibility statement (RD 1112/2018 or EAA / Ley 11/2023 wording), in Spanish or English, optionally written to a file.Screen-reader monitoring —
a11y_aria_live_snippetreturns JS that logs every aria-live announcement (time, politeness, role, text) for injection into a page.Localized output — several tools accept
lang(esdefault, oren).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@a11y-toolkitcheck contrast for #1f2328 on #fbfaf7"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
a11y-toolkit — the accessibility layer for AI coding agents
16 MCP tools + 5 prompts + a skill that give any AI agent (Claude, Cursor, Windsurf, Codex…) the full WCAG 2.2 loop: audit → fix → document → watch. Zero dependencies at its core; every finding ships with a concrete remediation your agent can apply.
Accessibility is not optional anymore: the European Accessibility Act is in force since June 2025, ADA suits keep landing, and AI agents now write most of the web. This toolkit makes "is it accessible?" a one-question ask — and "then fix it" a one-command job.
What no other a11y tool gives an agent
Capability | axe-core / Lighthouse / pa11y | a11y-toolkit |
Text contrast over images/gradients (pixel sampling of the real background, hostile-zone grid) | ✗ | ✓ |
Legal accessibility statements (EAA / RD 1112/2018), accessible HTML, es/en | ✗ | ✓ |
Regression watch between builds: accessible names + real tab-order diff | ✗ | ✓ |
Remediation text per finding, written for an agent to apply | ✗ | ✓ |
Focus-order regression detection | ✗ | ✓ |
Runs with zero dependencies (stdlib only; Playwright optional for the deep pass) | heavy runtimes | ✓ |
Screen-reader aria-live announcement monitor | ✗ | ✓ |
0-100 score computed from weighted findings | ✓ (Lighthouse, subset of rules) | ✓ (fuller rule set) |
Criterion explanations on demand for agents | ✗ | ✓ |
Static core parity: ARIA validity, autocomplete 1.3.5, link purpose, list structure, duplicate ids | ✓ | ✓ |
Output optimized for MCP/LLM consumption (JSON, severity-ranked, es/en) | ✗ | ✓ |
Related MCP server: Accessibility MCP Server
The tools (16)
Tool | What it does |
| Express static WCAG audit of a URL or raw HTML: 20+ signals with a weighted 0-100 score (alt, accessible names, labels, autocomplete 1.3.5, keyboard onclick, unknown ARIA roles, broken aria-labelledby, unnamed duplicated landmarks, meta refresh, skip mechanism, lang validity, title, headings, blocked zoom, captions, autoplay audio, generic/duplicated link text, target=_blank warnings, tabindex>0, aria-hidden-on-focusable, tables, duplicate ids, accesskeys). Per-finding remediation. |
| Rendered audit (local Playwright/Chromium): real computed text contrast vs effective backgrounds with alpha compositing (1.4.3), minimum target size 24×24 (2.5.8 — new in WCAG 2.2), focus-indicator heuristic (2.4.7), :focus/:hover state contrast, open shadow DOM traversed — all static checks on the live DOM. |
| Exact ratio + verdicts 1.4.3/1.4.6/1.4.11. Accepts |
| Text over images: pixel-level sampling of the actual background → worst/median/p95 ratio, % area passing AA, hostile-zone detection on a 3×3 grid. |
(rendered audit) | adds :focus/:hover state contrast (disabled exempt) and same-origin iframes |
| Nearest opaque color (true RGB distance) reaching the target ratio (4.5 default). |
| Legal accessibility statement in HTML: RD 1112/2018 art. 10 (Spanish public sector) or European Accessibility Act wording (Directive (EU) 2019/882 / Ley 11/2023). es/en. The document is itself accessible. |
| Interactive elements (tag, role, accessible name, href) + real tab focus order + the computed accessibility tree (what a screen reader announces). Requires Playwright. |
| Regression diff between two snapshots: added/removed/renamed interactives, focus-order changes. |
| Snapshot two URLs and diff in one call (staging vs production). |
| Injectable monitor logging every aria-live announcement (time, politeness, role, text) — what a screen reader would say, visible on screen. |
| Explains any WCAG 2.2 criterion in plain language: what it requires, typical failures, and which toolkit tool verifies it. |
| Infinite-scroll audit — the documented disaster nobody automates (Deque + APG Feed pattern): real scrolling batches, does focus SURVIVE, is new content ANNOUNCED, does the feed END or offer load-more. |
| Keyboard-trap detection (2.1.2) with REAL Tab walking: up to 60 stops, cycle detection, and the decisive test — does Escape release? Correct modals are not reported. |
| Deterministic safe auto-fixes on HTML: unblock zoom (1.4.4), exact autocomplete tokens (1.3.5), missing lang, empty title. Everything requiring judgment is returned as |
| Reflow at 320px (1.4.10) — the check axe and Lighthouse don't automate: real horizontal scroll + overflowing elements at 320px viewport. |
| Returns an honest badge as accessible SVG: score, date, scope ("automated screening"), never "conformant" — the anti-overclaim seal. |
5 prompts (slash-commands in supporting clients): audit-page (full audit workflow +
what automation can't check), fix-contrast, pre-deploy-check (audit + diff → GO/NO-GO),
declaration-eaa (collects legal fields, generates), conformance-wcagem (the three-tier
WCAG-EM ladder).
Install
Registry name:
mcp-name: io.github.kinti/a11y-toolkit· PyPI: a11y-toolkit
Claude Code (one command):
claude mcp add a11y-toolkit -- uvx --from a11y-toolkit a11y-toolkit-mcpAny MCP client with JSON config (Claude Desktop, Cursor, Windsurf, VS Code…):
{
"mcpServers": {
"a11y-toolkit": {
"command": "uvx",
"args": ["--from", "a11y-toolkit", "a11y-toolkit-mcp"],
"timeoutMs": 60000
}
}
}Or from the repo without publishing:
{ "mcpServers": { "a11y-toolkit": {
"command": "uvx", "args": ["--from", "git+https://github.com/kinti/a11y-toolkit", "a11y-toolkit-mcp"] } } }The rendered audit, snapshots and diffs use Playwright if present
(pip install playwright && playwright install chromium); everything else works with
zero dependencies.
The skill (teaches your agent when/how to use all of this)
git clone https://github.com/kinti/a11y-toolkit && cd a11y-toolkit
./skill/install-skill.sh # → ~/.zcode/skills and ~/.claude/skillsCLI — same engine, one command
a11ytoolkit pair "#1f2328" "#fbfaf7" # contrast, per-criterion verdicts
a11ytoolkit image hero.jpg --text "#ffffff" --region 120,40,420,90
a11ytoolkit audit --url https://example.com --lang en # express static audit
a11ytoolkit declaration --entidad "Acme" --url https://acme.example \
--estado parcial --marco eaa --lang en --output decl.html
a11ytoolkit snapshot https://mysite --out before.json # before deploy (needs Playwright)
a11ytoolkit diff before.json after.json # after deployRun from a clone with python3 a11y.py <subcommand>; from PyPI with uvx --from a11y-toolkit a11ytoolkit ….
Watch it continuously (the deployment gate)
a11ytoolkit audit --url https://mysite --pages 5 > audit.json # light crawl
python3 -m a11ybudget --init < audit.json > budget.json # accept today's baseline
a11ytoolkit budget --budget budget.json --audit audit.json # only NEW findings block (exit 2)
a11ytoolkit sarif --from-audit audit.json -o a11y.sarif # GitHub code scanning formatexamples/a11y-watch.yml turns this into a weekly scheduled check that fails
on regressions and publishes the SARIF to code scanning.
Validated against real pages, not just fixtures
Before shipping the current rule set we benchmarked against axe-core 4.10 on real
pages (methodology and results) — same Chromium, same Playwright.
That pass caught a real WCAG failure on gov.uk that axe does not report (blue
button text at 3.91:1, manually verified) and drove out five of our own false
positives (hidden skip links reported as tiny targets, honeypot fields, non-tabbable
aria-hidden controls, single-context generic links). Every divergence has a
regression fixture.
Honesty, built in
Automation covers ~1/3 of WCAG — every audit says so. The audit-page prompt and the
bundled skill then have the agent check what it can (keyboard operability, focus
visibility, zoom reflow, announced errors) using
the manual checklist, and
recommend a screen-reader pass for the rest. A filter, not a verdict.
Security & scope
A local tool: runs on your machine as your user. path (image) and output_path
(statement) read/write local paths — use it in MCP clients you trust. Nothing leaves your
machine except the URL you explicitly audit.
Development
python3 test_contrast.py && python3 test_audit.py && python3 test_dom.py && python3 test_mcp.pytest_dom.py self-skips without Playwright. Releases: tag vX.Y.Z → CI publishes to PyPI
(trusted publishing); server.json is the official MCP Registry manifest. Listed on
Smithery too. Contributions welcome — see
CONTRIBUTING.md (the golden rules: zero dependencies at the core,
es/en strings everywhere, honest scope notes).
Roadmap
Rendered audit (computed contrast, target size 2.5.8, focus indicator)
0-100 weighted score · ARIA validity · criterion explanations
Computed accessibility tree in snapshots + tree diff
SARIF export → findings as GitHub code-scanning / PR annotations (
a11ytoolkit sarif)Honest dated badge as accessible SVG (
a11y_badge)Accessibility error budget: only NEW findings block (
a11ytoolkit budget+examples/a11y-watch.yml)Multi-page same-domain crawl with aggregated scores (
pagesparameter)Scheduled surveillance recipe (weekly audit + budget gate as a GitHub Action)
WCAG-EM conformance ladder (
conformance-wcagemprompt + guided protocol)Same-origin iframes in the rendered audit + :focus/:hover state contrast
Author
Jesús Quintana Fernández (jquin.net) — SEO/GEO consultant and web-accessibility practitioner since 2003. MIT © 2026.
Available Tools
16 toolsa11y_aria_live_snippetA
Returns injectable JavaScript for an aria-live announcement monitor (bookmarklet or page.evaluate): logs every dynamic-region announcement with time, politeness, role and text — what a screen reader would say, visible on screen.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | monitor panel language (es default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It discloses the runtime behavior of the generated code in useful detail: it logs every dynamic-region announcement with time, politeness, role and text, and renders a visible on-screen panel — exactly what an agent needs to predict the result. It does not restate safety/profile, but returning a code string is inherently side-effect-free.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the artifact and its behavior, using a parenthetical for the deployment modes. No filler, though the em-dash clause packs several details densely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey what the tool yields, and it does by enumerating the logged fields and the visible panel. For a one-optional-param code generator this is essentially complete, with only the exact return shape left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional lang param is fully documented in the schema ('monitor panel language (es default)'), so baseline 3 applies. The description adds no meaning beyond the schema about the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Returns) and resource (injectable JavaScript for an aria-live announcement monitor), and clarifies the artifact type an agent will receive. This is clearly distinguishable from every sibling (audits, contrast, diff, keyboard), which instead measure or mutate a page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(bookmarklet or page.evaluate)' implies the two deployment contexts, giving implied usage guidance. However, there is no explicit when-to-use/when-not-to-use statement or named alternative, so the agent must infer the scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_audit_domA
Deep RENDERED WCAG audit via local Playwright/Chromium: real computed text contrast against effective backgrounds with alpha compositing (1.4.3), minimum target size 24×24 (2.5.8, new in WCAG 2.2), visible focus indicator heuristic (2.4.7), plus rendered versions of the static checks (alt, accessible names, labels, headings, lang/title, tabindex, aria-hidden, captions, tables). Findings include remediation. Requires playwright: pip install playwright && playwright install chromium.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| lang | No | ||
| timeout | No | page load timeout seconds (45 default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the Playwright/Chromium runtime dependency with the exact install command, describes what each check measures (alpha compositing, 24×24 targets), and states that findings include remediation. It stops short of describing failure modes, rate limits, or output shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads the primary purpose before the parenthetical criterion list and ends with the prerequisite. The criterion parentheticals are information-rich, though slightly heavy; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param tool with no output schema and no annotations, the description covers purpose, scope, checks, remediation output, and runtime prerequisites well. The gap is parameter-level semantics, which is the one area left thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 33% – url and lang have no descriptions, and only timeout is documented in the schema. The description adds nothing about the parameters (no URL format, no explanation of the lang enum's effect on locale-specific checks), so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('deep RENDERED WCAG audit via local Playwright/Chromium') and enumerates the exact checks performed with WCAG criterion numbers. It also implicitly distinguishes itself from a11y_audit_url by describing 'rendered versions of the static checks'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Deep RENDERED' framing and the 'rendered versions of the static checks' phrase imply this is the heavier Playwright-based counterpart to the static a11y_audit_url, but no explicit when-to-use or when-not-to-use guidance is given. An agent must infer the routing from the adjective 'deep'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_audit_urlA
Express WCAG 2.2 audit of a URL or an HTML string: 20+ automated signals with a weighted 0-100 score — images without alt (1.1.1), controls without accessible names (4.1.2), form fields without labels (3.3.2), missing autocomplete on user-data fields (1.3.5), click handlers on non-interactive elements (2.1.1), unknown ARIA roles and broken aria-labelledby (4.1.2), duplicated unnamed landmarks, timed meta refresh (2.2.1), missing skip mechanism (2.4.1), lang/title (3.1.1, 2.4.2), heading structure (1.3.1), blocked zoom (1.4.4), captions (1.2.2), autoplay audio (1.4.2), generic/duplicated link text (2.4.4), target=_blank without warning (3.2.5), positive tabindex (2.4.3), aria-hidden on focusable elements, tables without th, duplicate ids, duplicate accesskeys. Each finding includes concrete remediation. Filter, not verdict: automation covers ~1/3 of WCAG; query a11y_criterion for what a criterion means.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to fetch and audit | |
| html | No | raw HTML to audit directly (overrides url) | |
| lang | No | output language (es default) | |
| pages | No | light same-domain crawl: audit up to N pages, aggregated by score and recurring signals (default 1, max 20) | |
| timeout | No | fetch timeout seconds (30 default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the coverage limitation (~1/3 of WCAG), that it is automation-only, that each finding includes remediation, and that output is a weighted 0-100 score. It omits fetch-failure/network error behavior and single-page vs crawl semantics for 'pages'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the closing routing sentence are front-loaded and well-placed, but the middle is a long wall of signal names and SC numbers that is heavier than an agent strictly needs to select the tool. It is dense rather than wasteful, so still serviceable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no annotations and no output schema, the description covers scope, scoring model, remediation inclusion, and interpretation limits. Return-value structure is not detailed, but the key decision-relevant context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the url/html relationship ('or an HTML string') but does not expand on crawl aggregation, timeout, or the lang default beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Express WCAG 2.2 audit of a URL or an HTML string') and enumerates the exact signal set with WCAG SC references. An agent can distinguish it from siblings like a11y_audit_dom or a11y_diff_urls without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as a 'filter, not verdict' and routes the agent to a11y_criterion to interpret a criterion, plus notes html overrides url. It stops short of contrasting with the closest sibling (a11y_audit_dom), so the when-to-use guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_autofixA
DETERMINISTIC safe auto-fixes applied to HTML — the honest anti-overlay: a short closed list of fixes where the correct answer is unique (unblock viewport zoom 1.4.4, add the exact autocomplete token 1.3.5, fill missing html lang and empty title when provided). Everything requiring judgment (alt text, contrast, accessible names) is NOT touched — it returns no_aplicados with the reason and remediation instead. Returns fixed_html + aplicados + no_aplicados.
| Name | Required | Description | Default |
|---|---|---|---|
| html | Yes | raw HTML to fix | |
| lang | No | only if provided and <html> lacks lang | |
| title | No | only if provided and <title> is empty |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does well: deterministic behavior, a closed fix list, explicit non-goals, and the return shape (fixed_html + aplicados + no_aplicados). It omits idempotency/auth details, but for a pure HTML-string transform those are minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, but the single dense paragraph contains marketing noise ('the honest anti-overlay') and mixed Spanish identifiers that reduce scannability. Trimmed, it would be sharper.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by naming the return keys and the no_aplicados reason/remediation behavior. Combined with the 100%-covered input schema, an agent has what it needs to invoke and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description restates the schema conditions ('fill missing html lang and empty title when provided'), adding only marginal meaning beyond the schema's own conditional wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('deterministic safe auto-fixes applied to HTML') and enumerates the closed list of fixes, which clearly differentiates it from the surrounding a11y audit/suggestion siblings. An agent can tell this is a fixer, not an auditor, without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the when-not boundary: 'Everything requiring judgment (alt text, contrast, accessible names) is NOT touched' and routes those cases to no_aplicados with remediation. It does not name a specific sibling alternative, but the exclusions are clear enough to select correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_badgeA
Returns an HONEST accessibility badge as accessible SVG: score, date and scope (automated screening ≈ 1/3 of WCAG), color-coded by score. Deliberately does NOT say "conformant" — the honest seal. Embed it in audited sites or statements.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| fecha | No | ISO date (today by default) | |
| score | Yes | 0-100 (from an audit result) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the output format (accessible SVG), contents, color-coding behavior, and a deliberate semantic constraint ('does NOT say conformant', automated screening ≈ 1/3 of WCAG). It doesn't state permissions or side-effect behavior, but for a read-only badge generator this is solid disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and payload, and the remaining sentence adds a distinct behavioral caveat. Stylistic touches ('HONEST', the honest seal) cost a little density but don't obscure meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly describes the return value (SVG contents) and the scope caveat, which is what an agent needs to route and use it. The unmentioned 'lang' parameter and lack of precise formatting details keep it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description echoes some meaning ('color-coded by score', 'date ... scope') that overlaps the schema's own field descriptions. The 'lang' enum parameter is untouched in the description, and no extra format guidance (e.g. how scope is derived) is added, so it sits at the 3 baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns an ... accessibility badge as accessible SVG') plus the payload it carries (score, date, scope), so the agent knows exactly what it produces. It never names a sibling, so a 5 for explicit sibling differentiation isn't earned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an intended context ('Embed it in audited sites or statements') and implies an audit must precede it, which is useful. It offers no explicit when-not condition or comparison against alternatives like a11y_generate_declaration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_contrast_imageA
TEXT OVER IMAGE contrast: pixel-level sampling of the real background behind the text box → worst/median/p95 ratio, % of area passing AA, and automatic hostile-zone detection on a 3×3 grid (zona_peor). What pair-only checkers cannot do. region="x,y,w,h" recommended.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| path | Yes | ||
| region | No | ||
| sample | No | ||
| text_color | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does disclose the computation method (pixel-level sampling of real background) plus the return semantics (worst/median/p95 ratio, % area passing AA, 3x3 hostile-zone detection). It omits auth requirements, failure modes, and error behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose ('TEXT OVER IMAGE contrast') and packs detail densely with no filler sentences. The telegraphic arrow style and untranslated jargon ('zona_peor') slightly reduce immediate legibility.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and 4 of 5 parameters undocumented at 0% coverage, the definition is materially incomplete for a tool whose inputs are non-obvious. It describes outputs well but leaves an agent unable to confidently supply sample, lang, or text_color format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description must compensate, but it only documents region as 'x,y,w,h' and implies it is recommended. path, text_color, sample, and the lang enum (es/en) are left entirely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (contrast measurement for text over images via pixel-level sampling) and explicitly carves out what it is not: 'What pair-only checkers cannot do,' directly contrasting with the sibling a11y_contrast_pair. An agent can distinguish this from the pair checker without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'What pair-only checkers cannot do' implies the tool is for real-background image cases rather than flat color pairs, and 'region=... recommended' hints at expected usage. However, it never states explicitly when to prefer this over a11y_contrast_pair or a11y_audit_url, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_contrast_pairA
Exact WCAG contrast ratio for a color pair: per-criterion verdicts 1.4.3 (AA), 1.4.6 (AAA), 1.4.11 (non-text). Accepts #hex, rgb(), hsl(), CSS color names; rgba/hsl with alpha is composited over the background. If AA fails, suggests the nearest passing color.
| Name | Required | Description | Default |
|---|---|---|---|
| bg | Yes | ||
| fg | Yes | ||
| lang | No | output language (es default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and discloses useful behavior: accepted color syntaxes, alpha compositing over background, and a fallback suggestion when AA fails. It does not detail the exact return structure, but covers the key behavioral traits for a computation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences, front-loaded with the core purpose and then criteria, followed by input handling and fallback behavior. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple computation tool with no annotations and no output schema, the description covers purpose, input formats, alpha compositing, and failure behavior. It could specify the exact return shape (e.g., ratio value plus pass/fail per criterion) but is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only lang has a description), so the description must compensate. It specifies the accepted color formats for fg and bg and explains alpha handling, adding meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation: 'Exact WCAG contrast ratio for a color pair' with per-criterion WCAG verdicts. It clearly distinguishes itself from sibling a11y_contrast_image by operating on two colors rather than an image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for evaluating a specific color pair, but gives no explicit guidance on when to choose this over siblings like a11y_suggest_color or a11y_audit_url. The failure suggestion is a feature, not a usage directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_criterionA
Explains a WCAG 2.2 success criterion in plain language (es/en): what it requires, typical failures, and how to verify it with this toolkit (which tool automates which part). Codes like "1.4.3", "2.5.8", "4.1.2". Use it whenever you need to explain WHY a finding matters or what the criterion actually says.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | criterion number, e.g. 1.4.3 | |
| lang | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the burden, and it does well: it discloses the return shape (requirement, typical failures, verification, tool-to-criterion mapping) and the bilingual es/en behavior. It does not state that it is read-only or offline/lookup-based, but nothing about it is misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what it does and ending with the when-to-use rule. The inline code examples are slightly redundant but cheap and genuinely reduce ambiguity about the input format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description must carry the return-value burden and it does, enumerating what the explanation contains. Minor gap: no hint about failure behavior for an invalid code or whether codes map to WCAG 2.1 vs 2.2.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (only 'code' documented). The description compensates by giving concrete code formats ('1.4.3', '2.5.8', '4.1.2') and the es/en language pair, effectively documenting the undocumented lang parameter's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Explains') and resource ('a WCAG 2.2 success criterion') with contents spelled out: requirements, typical failures, and verification mapping. This clearly separates it from the audit/contrast/autofix siblings, which measure or mutate rather than explain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions: 'Use it whenever you need to explain WHY a finding matters or what the criterion actually says.' That is a clear usage context, though it does not name a specific sibling alternative to prefer for the lookup-adjacent case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_diffA
Regression diff between two accessibility snapshots (before/after a deploy): added/removed/renamed interactives and focus-order changes. ok=false means a regression to review. Accepts inline JSON (starting with "{") or file paths.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | BEFORE snapshot (inline JSON or path) | |
| b | Yes | AFTER snapshot (inline JSON or path) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It usefully discloses the return convention ('ok=false means a regression to review') and the dual input mode, but says nothing about limits on snapshot size, whether inputs must be produced by a11y_snapshot, or any failure/side-effect behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, zero filler, with the core purpose and the diff contents front-loaded ahead of the ok=false convention. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the right thing by explaining the ok=false return meaning. Combined with 100% schema coverage on both params, an agent can invoke it correctly; only the sibling-boundary (vs a11y_diff_urls) is left open.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameter descriptions already state BEFORE/AFTER and 'inline JSON or path'. The description's input-mode sentence simply restates that, adding no new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Regression diff between two accessibility snapshots') and enumerates what the diff contains (added/removed/renamed interactives, focus-order changes), which is far more specific than the bare name. It does not, however, distinguish itself from the sibling a11y_diff_urls, which is the most likely confusion point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'before/after a deploy' implies a regression-review use case, so usage is inferable. There is no explicit when-to-use-this-vs-a11y_diff_urls guidance and no stated prerequisite (e.g., that inputs must come from a11y_snapshot).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_diff_urlsB
Snapshot two URLs and diff them in a single call (e.g. staging vs production). Requires local Playwright.
| Name | Required | Description | Default |
|---|---|---|---|
| url_a | Yes | ||
| url_b | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the environment prerequisite (local Playwright), which is genuinely useful, but says nothing about network access, permissions, what gets compared, pagination/limits, or what a diff output looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the operation and appends the prerequisite and an example. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-URL comparison tool with no annotations and no output schema, the description omits key operational details an agent needs: authentication requirements, expected return shape, and any rate or duration limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and both required parameters (url_a, url_b) are bare strings. The description's example clarifies that the two URLs are meant to be compared but does not specify ordering, format, or whether they must be same-origin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound verb (snapshot and diff) on a specific resource (two URLs), with a concrete example (staging vs production). It is distinguishable from a11y_snapshot and a11y_diff, though naming it as a one-call convenience over those siblings would sharpen it further.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical example implies the intended use case of comparing two environments, but there is no explicit when-to-use guidance or routing to alternatives like a11y_snapshot plus a11y_diff. Usage 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.
a11y_generate_declarationB
Generates an Accessibility Statement in HTML: art. 10 RD 1112/2018 (Spanish public sector, marco="rd1112") or European Accessibility Act wording (Directive (EU) 2019/882 / Ley 11/2023, marco="eaa"; EN output uses Directive (EU) 2016/2102 / EAA wording). The generated document is itself accessible. Saves to output_path when given.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| lang | No | ||
| marco | No | ||
| estado | Yes | ||
| metodo | No | ||
| entidad | Yes | ||
| feedback | No | ||
| output_path | No | save the HTML here (optional) | |
| reclamacion | No | ||
| fecha_revision | No | ||
| fecha_evaluacion | No | ||
| contenido_no_accesible | No | ||
| disponibilidad_alternativa | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden. It does disclose two useful behaviors: the output is itself accessible, and it writes to output_path when provided. It omits whether an existing file is overwritten, whether HTML is also returned when output_path is absent, and any permission/auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core action and framework mapping; no filler. Sentences are long and parenthetical-heavy, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter generation tool with no annotations and no output schema, the description is under-specified: the meaning of the required estado enum and most optional content fields is nowhere available, so an agent cannot reliably fill the required inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 8% across 13 parameters, so the description must compensate and largely does not. It meaningfully explains marco's two values and lang's effect on wording plus output_path, but leaves the required parameters entidad, url and especially the estado enum (plena/parcial/no_conforme), metodo, feedback, reclamacion, dates and the two content fields entirely undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact ('Generates an Accessibility Statement in HTML') plus the two regulatory regimes it can produce, which clearly separates it from the audit/contrast/diff siblings. It never names a sibling, but the generated-resource framing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real guidance on which framework/regime applies ('Spanish public sector' for rd1112 vs EAA/Ley 11/2023 for eaa), which is effectively usage guidance for the marco parameter. However it offers no condition for choosing this tool over alternatives or any prerequisite/ordering guidance (e.g. audit first to determine estado).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_keyboardA
Keyboard-trap detection (2.1.2) with REAL Tab walking in Chromium: up to 60 real tab stops, cycle detection (the modal pattern), then the decisive test — does ESCAPE release the cycle? A modal that cycles and releases on Escape is correct and NOT reported; a cycle Escape cannot leave is a trap (high severity). Returns the full tab stop list too. Requires local Playwright.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| lang | No | ||
| max_pasos | No | max real Tab presses (60 default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: up to 60 real tab stops, cycle detection logic, the Escape-release decision rule, severity classification, and the environment prerequisite ('Requires local Playwright'). It also notes it returns the full tab stop list, covering return behavior in the absence of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the criterion and core mechanism, then layers the decision rule. Dense but each clause (Escape test, severity, Playwright requirement, return value) earns its place; slightly long with the mid-sentence em-dash asides.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must cover results and safety/context — it names the returned tab stop list and the local-Playwright requirement, which is substantial. The lang parameter's effect and the shape of severity output remain unstated, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: url and lang have no schema descriptions, and the description never explains what lang (es/en) controls or what url should point to. It tangentially touches max_pasos via 'up to 60 real tab stops,' but that default is already documented in the schema, so it adds little and leaves two parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: keyboard-trap detection for WCAG criterion 2.1.2 via real Tab walking in Chromium. The scope ('cycle detection... does ESCAPE release the cycle?') distinguishes it clearly from sibling tools like a11y_audit_url or a11y_audit_dom, which are broader audits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong context on when it fires and how results are judged: a modal that cycles and releases on Escape is correct and NOT reported, while an unescapable cycle is high severity. It implies the target scenario (modal/dialog keyboard behavior) but never explicitly names when to prefer siblings like a11y_audit_url over this narrow check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_reflowA
Reflow check at 320px — criterion 1.4.10 (AA), the check axe and Lighthouse do not automate. Loads the URL at 1280px, then at 320px, and reports real horizontal scroll + the overflowing elements. Method note: browser zoom RE-LAYS OUT at 320 CSS px (that is the standard's own equivalence: 1280 @ 400% zoom = 320px), so the correct measurement is a 320px viewport. Requires local Playwright.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| lang | No | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the measurement procedure (load at 1280px, then 320px), what is returned (real horizontal scroll and the overflowing elements), and a hard prerequisite ('Requires local Playwright'). It omits auth/network/rate-limit traits and does not restate that the operation is non-mutating, but the operational profile is largely conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and criterion before the method detail, and every sentence carries information (scope, output, prerequisite). The parenthetical method note about zoom re-layout is defensible justification but lengthens the definition more than strictly needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, so the description is the only source of behavior — it covers procedure, output shape and environment requirement well. However, two of three parameters (lang, timeout) are left entirely unexplained, leaving the agent unable to populate them confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 3 parameters, so the description must compensate, and it does not: only 'url' is implicitly explained ('Loads the URL'). The 'lang' enum and 'timeout' parameters are completely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific check ('Reflow check at 320px') tied to a named WCAG criterion (1.4.10 AA), which cleanly separates it from the generic a11y_audit_url sibling. It also explicitly claims the niche of checks 'axe and Lighthouse do not automate', so an agent can place it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear context for use: this is the tool for 1.4.10 reflow verification that automated scanners miss. It does not name a sibling alternative or state when-not-to-use, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_scrollB
Infinite-scroll accessibility audit — the documented disaster nobody automates (Deque guidance + ARIA APG Feed pattern; criteria 2.4.3, 4.1.3, 2.2.2). Real scrolling batches in Chromium with a live-region observer: does the focused element SURVIVE each batch (re-render destroys it — the documented failure)? Is new content ANNOUNCED (aria-live/status receives text, role=feed)? Does the feed END or offer a load-more alternative (footer reachability)? APG feed pattern as positive signal. Honest guard: if no standard items are detected (login walls, non-standard markup) the unfounded signals are skipped with a note. Requires local Playwright.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| lang | No | ||
| max_tandas | No | scroll batches (5 default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does disclose real behavioral traits: it drives scrolling batches in Chromium, runs a live-region observer, checks focused-element survival across re-renders, and skips signals with a note when no standard items are found (login walls). It also discloses the environment requirement. It omits return format and any timing/rate caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core scoping clause is front-loaded, but the body is padded with rhetorical framing ("the documented disaster nobody automates") and a stack of parenthetical checks. It is readable but under-tightened for the information delivered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param tool with no annotations and no output schema, the description explains the checks performed but never describes what the caller receives back (findings, structure, scoring), which is a real gap when no output schema exists. The behavioral and guard coverage is good; the result contract is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: only max_tandas has a schema description, while url and lang (an enum) are bare. The description implies batching semantics ('Real scrolling batches') but does not explain url, what lang changes, or how many batches are useful. It only partially compensates for the documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: an accessibility audit of infinite-scroll behavior, with named criteria (2.4.3, 4.1.3, 2.2.2). That scope is clearly distinct from siblings like a11y_keyboard or a11y_contrast_image, though it never names any sibling explicitly. The editorializing ("the documented disaster nobody automates") adds noise but does not obscure the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scope (audit a page that lazy-loads content on scroll), and a prerequisite is stated ("Requires local Playwright"). However, it never states when NOT to use it or which sibling (e.g. a11y_audit_url, a11y_keyboard) to prefer for related focus/announcement checks. No explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_snapshotA
Accessibility snapshot of a URL: interactive elements (tag, role, accessible name, href) in DOM order, the REAL tab focus order, and when Playwright ≥1.49 is available the computed ACCESSIBILITY TREE (aria snapshot — what a screen reader announces). Save it before a deploy and compare after with a11y_diff. Requires local Playwright.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the runtime prerequisite ('Requires local Playwright') and a conditional capability ('when Playwright ≥1.49 is available the computed ACCESSIBILITY TREE'), so the agent knows output varies by environment. It omits return format/size and any auth or failure behavior, keeping it short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then packs the output contents, version caveat, and workflow into two tight sentences. Dense but every clause carries information; minor cost is the parenthetical stacking.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description appropriately enumerates the return contents, and it covers the key prerequisite. For a single-required-param snapshot tool with no annotations, this is close to complete; only pagination/size limits and failure modes are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'url' parameter has no schema description, but the description supplies the meaning ('snapshot of a URL', i.e., the page to capture). That is sufficient for a one-parameter tool, though it adds no format constraints or protocol requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Accessibility snapshot of a URL') followed by a precise inventory of what it captures: interactive elements with tag/role/name/href, real tab focus order, and the computed accessibility tree. It is clearly distinguishable from siblings like a11y_audit_url or a11y_keyboard without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow ('Save it before a deploy and compare after with a11y_diff'), naming the alternative tool for comparison. It does not, however, say when to prefer this over a11y_audit_url or a11y_audit_dom, so the sibling routing is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
a11y_suggest_colorA
Nearest opaque color (RGB distance) to fg that reaches the target ratio against bg (4.5 default). Returns the color, its ratio and whether it lightens or darkens.
| Name | Required | Description | Default |
|---|---|---|---|
| bg | Yes | ||
| fg | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. It discloses the algorithm (nearest opaque color using RGB distance) and that it returns the color, its ratio, and whether it lightens or darkens, which is helpful. However, it omits whether the suggested color is guaranteed to meet the target, how ties are handled, and any failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, information-dense sentence that front-loads the most important details (what it returns, the algorithm) with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter function with no output schema and no annotations, the description covers the return concept and default target but lacks details on the color input format, edge-case behavior, and guarantees (e.g., if target is unreachable). It is minimally sufficient but leaves gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage and 3 parameters, the description only partially compensates: it states that fg and bg are colors and target is the ratio (default 4.5), but the parameter names (fg, bg, target) are still not explicitly linked, and the color format (e.g., hex, rgb) is not specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (suggest) and resource (color), describes the algorithm (nearest opaque color by RGB distance), the goal (reaching a target contrast ratio against bg), and the expected output. Clearly distinct from siblings like a11y_contrast_pair which checks contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage is clear from 'suggest' and the contrast target, but there are no explicit when-to-use/when-not statements or references to alternatives like a11y_autofix or a11y_contrast_pair.
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.
12 tool updates
v3.3.0- Changed
a11y_aria_live_snippet1 field changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Idioma del panel del monitor (es por defecto)"New value: +"monitor panel language (es default)"
- Added
a11y_audit_dom - Changed
a11y_audit_url6 fields changed- added
Input schema / properties / htmlAdded value: +{ + "description": "raw HTML to audit directly (overrides url)", + "type": "string" +} - added
Input schema / properties / lang / descriptionAdded value: +"output language (es default)" - added
Input schema / properties / pagesAdded value: +{ + "description": "light same-domain crawl: audit up to N pages, aggregated by score and recurring signals (default 1, max 20)", + "type": "integer" +} - added
Input schema / properties / timeoutAdded value: +{ + "description": "fetch timeout seconds (30 default)", + "type": "number" +} - added
Input schema / properties / url / descriptionAdded value: +"URL to fetch and audit" - removed
Input schema / requiredRemoved value: -[ - "url" -]
- Added
a11y_autofix - Added
a11y_badge - Changed
a11y_contrast_pair1 field changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Idioma de la salida (es por defecto)"New value: +"output language (es default)"
- Added
a11y_criterion - Changed
a11y_diff2 fields changed- changed
Input schema / properties / a / descriptionPrevious value: -"Snapshot ANTES (JSON inline o ruta)"New value: +"BEFORE snapshot (inline JSON or path)" - changed
Input schema / properties / b / descriptionPrevious value: -"Snapshot DESPUÉS (JSON inline o ruta)"New value: +"AFTER snapshot (inline JSON or path)"
- Changed
a11y_generate_declaration2 fields changed- removed
Input schema / properties / lang / descriptionRemoved value: -"Idioma de la declaración (es por defecto; en = Directive (EU) 2016/2102 / EAA wording)" - changed
Input schema / properties / output_path / descriptionPrevious value: -"Guarda el HTML en esta ruta (opcional)"New value: +"save the HTML here (optional)"
- Added
a11y_keyboard - Added
a11y_reflow - Added
a11y_scroll
9 tool updates
v2.3.0- First observed
a11y_aria_live_snippet - First observed
a11y_audit_url - First observed
a11y_contrast_image - First observed
a11y_contrast_pair - First observed
a11y_diff - First observed
a11y_diff_urls - First observed
a11y_generate_declaration - First observed
a11y_snapshot - First observed
a11y_suggest_color
TDQS
Scored across 16 tools
Each tool targets a distinct aspect of accessibility auditing (static audit, rendered audit, contrast pair vs. image, snapshots, diffs, keyboard, reflow, scroll, etc.), and descriptions clearly delineate boundaries. Minor overlap exists between a11y_audit_url and a11y_audit_dom, but the 'static' vs 'rendered Playwright' distinction is spelled out.
Nearly all tools use the a11y_ prefix followed by descriptive snake_case nouns/verbs (a11y_audit_url, a11y_contrast_pair, a11y_diff_urls). A few names are slightly less verb-like (a11y_badge, a11y_snapshot), but the pattern is predictable and readable.
16 tools is slightly heavy but each covers a distinct WCAG area (contrast, keyboard, reflow, snapshots, diffs, declarations, autofix, criteria explanation), so the surface is well-scoped for a comprehensive a11y toolkit rather than bloated.
The toolkit covers automated audit (static + rendered), manual checks simulation (keyboard, reflow, scroll), contrast analysis (pair and image), regression diffing, remediation guidance, criterion explanation, and documentation generation — a full lifecycle from detection to reporting with no obvious gaps for its stated purpose.
Maintenance
Related MCP Connectors
Accessibility compliance for AI coding tools. WCAG 2.2 reviews with shared evidence.
Scan URLs for WCAG 2.1 violations, generate AI fixes, and produce VPAT 2.5 compliance reports.
Accessibility pre-checks (WCAG/BFSG) in a real browser + statement drafts. Pay per call.
- mcpOAuthcom.screenshotink
Screenshot, diff, audit and sitemap-capture any web page — 5 MCP tools for AI agents.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables AI agents to perform comprehensive accessibility audits on websites using Playwright and axe-core against WCAG standards. Provides detailed compliance reports with violation summaries and remediation guidance across multiple browsers.3-
- AlicenseAqualityCmaintenanceProvides conversational, actionable accessibility testing for AI agents, including auditing, prioritization, and code-level fixes.228 npmMIT
- AlicenseAqualityDmaintenanceEnables AI agents to perform comprehensive web accessibility checks (WCAG 2.1/2.2) including color contrast analysis, ARIA validation, and full accessibility report generation without requiring any API key.8MIT
- AlicenseNot gradedqualityDmaintenanceProvides AI agents with web accessibility analysis tools via MCP, enabling checks for alt text, heading hierarchy, color contrast, ARIA validation, and form accessibility.34 npmMIT