Skip to main content
Glama

a11y-toolkit — the accessibility layer for AI coding agents

WCAG 2.2 for your coding agent — audit, fix, document and watch. Zero dependencies, es/en.

37 MCP tools, 5 prompts and a skill covering the whole WCAG 2.2 loop: audit, fix, document, watch, hand off — and now blindfold usability testing, where the agent attempts real tasks perceiving only what a screen reader exposes. 51 of 55 A/AA criteria carry automated signals (93%), every finding ships with a concrete remediation your agent can apply, and the rendered tools run on whichever browser you have — Chromium, Firefox, WebKit, Chrome or Edge.

The European Accessibility Act is in force since June 2025, ADA suits keep landing, and AI agents now write most of the web. A scan is not a defence: the machine finds, the human signs.

Quickstart

# MCP — one line, any MCP client (Claude, Cursor, Codex, Windsurf, …)
claude mcp add a11y-toolkit -- uvx --from a11y-toolkit a11y-toolkit-mcp

# CLI — same engine, one command
pip install a11y-toolkit
a11ytoolkit audit --url https://example.com
a11ytoolkit pair "#1f2328" "#fbfaf7"

Static audits, contrast math, PDF/DOCX screening and the evidence pack run with zero dependencies. The rendered tools (real contrast over images, keyboard traps, reflow, forms) additionally need Playwright: pip install playwright && playwright install chromium.

CI PyPI npm Downloads License: MIT MCP Sponsor Socket score OpenSSF Scorecard OpenSSF Best Practices ACT Rules Releases Dependencies Python Versions GitHub Release

Related MCP server: Accessibility MCP Server

Features

Capability

axe-core / Lighthouse / pa11y

a11y-toolkit

Text contrast over images and gradients (pixel sampling of the real background)

No

Yes

VPAT 2.5 (WCAG) draft from the evidence pack — US/ADA counterpart of the EAA statement

No

Yes

Form error testing: fills invalid data, really submits, judges what happens

No

Yes

Keyboard traps: real Tab walk + Escape-release test, plus focus/input-triggered navigation

No

Yes

Infinite-scroll audit: focus survival, announcements, feed end

No

Yes

Reflow at 320px and the WCAG text-spacing override, measured

No

Yes

Screen reader transcript: what a blind user hears, linearized

No

Yes

Tooltips that ignore Escape caught by actually hovering (1.4.13)

No

Yes

Legal statements for the EAA / RD 1112/2018, in Spanish and English

No

Yes

An evidence pack a human can sign — hashes, matrix, empty signature block

No

Yes

ACT Rules interop: EARL export + per-rule consistency report against official W3C test cases

No

Yes

WCAG 3 draft preview — regroup 2.2 findings under the draft's outcomes, no fake score

No

Yes

The engine examines itself: seeded WCAG mutant bank — regenerable exam, kill rate + false positives via placebos

No

Yes

Sequential diagnosis: pass a URL and the page's own evidence orders the exams (severity only breaks ties)

No

Yes

Runs with zero dependencies at core, speaks es/en, any browser you have

Heavy runtimes

Zero dependencies

The tools (37)

Full reference — descriptions, arguments, return shapes and behavior — in docs/tools.md. All tools accept lang (en|es) unless noted; output is JSON unless noted. Generated from server.TOOLS by scripts/gen_readme.py.

Tool

Category

What it does

a11y_audit_url

Audit

Express WCAG audit

a11y_audit_dom

Audit

Rendered WCAG audit

a11y_audit_pdf

Audit

PDF accessibility screening

a11y_docx_screen

Audit

DOCX accessibility screening

a11y_locate

Locate

Locate element by accessible name

a11y_journey_verdict

Blindfold testing

Blindfold journey verdict

a11y_autofix

Fix & contrast

Deterministic safe auto-fixes

a11y_patches

Fix & contrast

Sealed patch-set (sha-keyed)

a11y_contrast_pair

Fix & contrast

Contrast ratio + verdicts

a11y_contrast_image

Fix & contrast

Text-over-image contrast

a11y_contrast_dom

Fix & contrast

Live-element contrast sampling

a11y_suggest_color

Fix & contrast

Nearest passing color

a11y_generate_declaration

Document

Accessibility statement (EAA/RD 1112)

a11y_generate_vpat

Document

VPAT 2.5 report (WCAG edition)

a11y_generate_openacr

Document

OpenACR YAML report (GSA)

a11y_badge

Document

Honest SVG badge

a11y_snapshot

Watch (regressions)

A11y snapshot + tab order

a11y_diff

Watch (regressions)

Snapshot regression diff

a11y_diff_urls

Watch (regressions)

Staging vs production diff

a11y_aria_live_snippet

Watch (regressions)

aria-live monitor snippet

a11y_criterion

Knowledge & context

WCAG criterion explained

a11y_html_validate

Knowledge & context

W3C Nu validation

a11y_keyboard

Interactions

Keyboard-trap detector

a11y_forms

Interactions

Form error testing

a11y_hover

Interactions

Hover dismissibility (1.4.13)

a11y_reflow

Interactions

320px reflow check

a11y_scroll

Interactions

Infinite-scroll audit

a11y_sr_transcript

Interactions

Screen reader transcript

a11y_reduced_motion

Interactions

prefers-reduced-motion honored?

a11y_forced_colors

Interactions

forced-colors survival heuristic

a11y_vtt_check

Interactions

WebVTT caption quality

a11y_evidence

Coverage & evidence

Evidence pack (verifiable handoff)

a11y_disprove

Coverage & evidence

Disprover: re-verify findings

a11y_ledger

Coverage & evidence

Coverage ledger (persistent)

a11y_wcag3_preview

Coverage & evidence

WCAG 3 draft preview (no score)

a11y_scope

Coverage & evidence

Applicability scope (semi-automatic)

a11y_route

Routing

Tool router (goal or page to steps)

The 5 prompts

  • audit-page (url*, language): Full accessibility audit workflow for a URL: automated tools + what to verify manually (keyboard, screen reader, zoom). Every prompt exists in English and Spanish.

  • fix-contrast (fg*, bg*, context): Guided contrast fix: verify the pair (or the text-over-image region), get the nearest passing color, apply it to the code. Every prompt exists in English and Spanish.

  • pre-deploy-check (url*, baseline): Pre-deploy regression check: express audit of the URL plus snapshot diff against a baseline snapshot. Every prompt exists in English and Spanish.

  • declaration-eaa (entity*, url*, status): Generate a European Accessibility Act / RD 1112/2018 accessibility statement, collecting any missing legal fields from the user. Every prompt exists in English and Spanish.

  • blindfold-task (url*, goal*, kind, language): Blindfold usability test — the agent attempts a real task perceiving ONLY the accessibility tree and acting only by accessible name and keyboard, logging friction per step; closes with a11y_journey_verdict. The capability no other accessibility tool has: task-based non-visual testing where the agent IS the screen-reader user. Every prompt exists in English and Spanish.

Install

mcp-name: io.github.kinti/a11y-toolkit · PyPI: a11y-toolkit · Zenodo DOI: 10.5281/zenodo.22843722

Works with any MCP-capable client — Claude Code/Desktop, Cursor, Windsurf, VS Code, Codex CLI, OpenCode, ZCode, Zed, Cline, Continue, Kimi Code… See docs/clients.md for every verified config format. Node-native? npx -y @kinti/a11y-toolkit mcp… — the npm launcher runs the same engine (npm/). Composing it with the popular servers (Playwright, GitHub, Filesystem, Fetch…) — docs/interop.md. Start-to-finish recipes (audit → fix → seal → CI): docs/cookbook.md.

claude mcp add a11y-toolkit -- uvx --from a11y-toolkit a11y-toolkit-mcp

Or with JSON config:

{
  "mcpServers": {
    "a11y-toolkit": {
      "command": "uvx",
      "args": ["--from", "a11y-toolkit", "a11y-toolkit-mcp"],
      "timeoutMs": 60000
    }
  }
}

Rendered tools use Playwright if present and accept a browser parameter (auto, chromium, firefox, webkit, chrome, msedge — auto-detects the first available). Accept auth_state (Playwright storage_state path) to audit behind login. Everything else works with zero dependencies.

The skill

git clone https://github.com/kinti/a11y-toolkit && cd a11y-toolkit
./skills/install-skill.sh     # → ~/.zcode/skills and ~/.claude/skills

Agent hook — a11ytoolkit init

Agents that read AGENTS.md on their own get the rule that matters — after any UI change, re-audit before calling the work done — with the exact commands:

cd your-project
uvx --from a11y-toolkit a11ytoolkit init     # writes/merges the AGENTS.md hook (idempotent)
uvx --from a11y-toolkit a11ytoolkit guard --file index.html   # write-time gate: NEW high/medium refuse the save

It also prints the MCP config block and the optional skill install step. --check reports whether the hook is present (exit 1 if not — CI-friendly).

The gate: init also installs a write-time guard (Claude Code PreToolUse hook). Every save of a user-facing file is audited against git HEAD — new high/medium findings refuse the save with the remediation right there, so the AI holding the pen fixes them in the same second the failure would have been born. Low severity and findings already in HEAD warn. A11Y_GATE=off disables; --no-gate skips install; the refusal carries the honesty line: the gate audits what the engine sees — a filter, not a verdict.

The gate refusing a save with new findings, the AI fixing them, the save
allowed

Languages — community locale packs

All user-facing messages (findings, remediations, legal wording) live in locale packs — one JSON per language, es and en ship today. Adding a language is a single-file PR: copy _template.json, translate keeping the {placeholders}, and python3 tests/test_locales.py validates it mechanically (keys, placeholders, plural rule, completeness). Same community model as axe-core's locales — with validation axe-core doesn't have. Guide: docs/i18n.md. Downstream products can layer brand wording via overlays without forking.

Claim an open language: French, Brazilian Portuguese and German have seeded issues under good first issue — one JSON file, mechanical validation, credit in the README and in the release notes. Any other language: use the Add a language template. Human translation only — machine translation is rejected; the catalog IS the product's voice.

CLI — same engine, one command

Install it with pip install a11y-toolkit (or uv tool install a11y-toolkit).

a11ytoolkit audit --changed                     # ONLY what changed since HEAD (CI gate)
a11ytoolkit audit --changed --base origin/main  # a branch's changes — exit 2 on high/medium
a11ytoolkit audit --url https://example.com --pages 5   # sitemap-first crawl
a11ytoolkit pair "#1f2328" "#fbfaf7"                    # contrast
a11ytoolkit image hero.jpg --text "#fff" --region 120,40,420,90
a11ytoolkit forms https://mysite/contact                # form errors
a11ytoolkit kbd https://mysite                          # keyboard traps + 3.2.1/3.2.2
a11ytoolkit reflow https://mysite                       # 320px reflow
a11ytoolkit scroll https://medium.com/feed              # infinite scroll
a11ytoolkit validate --url https://example.com          # W3C Nu
a11ytoolkit hover https://mysite                        # tooltip dismissibility
a11ytoolkit dom https://mysite                          # rendered audit (contrast, 2.5.8, focus)
a11ytoolkit fix --file page.html -o fixed.html          # safe autofix
a11ytoolkit declaration --entity "Acme" --url https://… --status partial --framework eaa
a11ytoolkit snapshot https://mysite --out before.json   # before deploy
a11ytoolkit diff before.json after.json                 # after deploy
a11ytoolkit evidence audit.json -o pack.json            # verifiable evidence pack
a11ytoolkit disprove --url https://mysite               # re-verify findings
a11ytoolkit budget --budget budget.json --audit audit.json  # only NEW findings block
a11ytoolkit budget --init-snapshot s.json > structural.json      # structural budget: today's structure is accepted
a11ytoolkit budget --budget structural.json --snapshot s2.json   # only NEW rendered structure blocks (exit 0/2)
a11ytoolkit engines https://mysite                        # same page in 3 engines: behavioral divergences, pairwise
a11ytoolkit trace https://mysite --script journey.json -o t.json  # scripted real journey, then: trace diff t_old.json t.json
a11ytoolkit patterns https://mysite                       # APG keyboard contracts, live: dialog / tablist / disclosure / combobox / menu / slider
a11ytoolkit ledger recurrence --ledger a11y-ledger.json   # chronic signals + hot urls: the review queue without ML
a11ytoolkit contrast-dom https://mysite --walk            # perceptual pass: per-element ratios, thresholds, suggestions
a11ytoolkit sarif --from-audit audit.json -o a11y.sarif # GitHub code scanning
a11ytoolkit badge --score 92 --out badge.svg            # honest SVG
a11ytoolkit contrast-dom https://mysite --selector ".hero h1"  # auto-region pixel sampling
a11ytoolkit vpat pack.json --product "Acme" -o vpat.html      # VPAT 2.5 (WCAG) draft
a11ytoolkit openacr pack.json --product "Acme" -o openacr.yaml # OpenACR YAML (GSA) draft
a11ytoolkit earl --from-audit audit.json -o earl.json          # ACT Rules / EARL export
a11ytoolkit wcag3 --from-audit audit.json                      # WCAG 3 draft preview (no score)
a11ytoolkit route --goal "gate my PR"                          # which tools for the task
a11ytoolkit route --file page.html                             # diagnosis: the page orders the exams
a11ytoolkit mutants --seed 7 --n 12                            # the engine's sealed self-exam
a11ytoolkit fingerprints pages/*.html -o templates.json        # twin pages → one audit per template
a11ytoolkit audit --url page.html --standard en301549          # EN 301 549 clause on every finding
a11ytoolkit annotate page.html --report r.json -o marked.html  # per-element marks on a byte-exact copy
a11ytoolkit locate --file page.html --query "Submit"           # element by accessible name → route selector
a11ytoolkit patches --file page.html -o patches.json           # sealed fix record (verify with --verify)
a11ytoolkit journey friction.json -o verdict.json             # blindfold journey: friction log -> scored verdict
a11ytoolkit scope audit.json --standard en301549 -o scope.json  # applicability scope, EN clauses, human-confirmed
a11ytoolkit criteria --list --level AA --new-in 2.2            # the offline Quick Ref, filterable
a11ytoolkit wizard --url https://client.web --lang es          # guided: 3 questions → standard, audit, scope, annex
a11ytoolkit corpus verify corpus                  # the frozen corpus, verified

Standards coverage

Which market's law each command serves: docs/standards-coverage.md — EN 301 549 (EU-27 + EEA + Canada), Section 508 (US federal), RGAA 4.1 (France), WCAG-direct (Latin America and most ADA practice) — one engine, the standard of 27+ countries.

Coverage: 51 of 55 WCAG 2.2 A/AA criteria (93%)

With automated signal

Manual-only (genuinely human)

1.1.1, 1.2.2, 1.2.3, 1.2.5, 1.3.1–1.3.5, 1.4.1–1.4.5, 1.4.10–1.4.13, 2.1.1, 2.1.2, 2.1.4, 2.2.1, 2.2.2, 2.4.1–2.4.7, 2.4.11, 2.5.1–2.5.4, 2.5.7, 2.5.8, 3.1.1, 3.1.2, 3.2.1–3.2.4, 3.2.6, 3.3.1–3.3.4, 3.3.8, 4.1.2, 4.1.3

1.2.1 (audio transcripts), 1.2.4 (live captions), 2.3.1 (flash detection), 3.3.7 (redundant entry)

The 4 manual-only criteria each have a knowledge entry (a11y_criterion) telling the agent exactly how to verify them by hand. The boundary is printed on every report.

The engine behind a11y.es

a11y.es is a Spanish-market accessibility service that runs this engine. The service is a separate codebase; this repository is the engine.

Monitoring? You can absolutely build it yourself with this engine: a cron running a11ytoolkit audit plus budget and diff is a legitimate path — deliberately so, that is what the MIT license promises. a11y.es exists for those who would rather not maintain it: scheduled audits with a real browser, alerts on what breaks between releases, a sealed evidence vault anyone can verify years later, and an agency portfolio — start free with 3 sites. And the one thing no script can give: a human auditor's signature when you have to prove it.

Validated against real pages

Benchmarked against axe-core 4.10 on real pages monthly (methodology and results). Task-based agent benchmark on live sites, including a stratified sample of Spain's most important pages (method and results). Found a contrast finding on gov.uk that axe leaves incomplete (search button at 3.91:1; manual review showed the visible part is an icon that passes the 3:1 non-text threshold, so it is not a conformance failure). Drove out our own false positives (hidden skip links, honeypot fields, single-context generic links, image-alt accname — each with a regression fixture).

Also run against the official W3C ACT test cases: scripts/act_report.py regenerates the EARL implementation report — 100% consistent with every published ACT rule it implements (355 official test cases, 20/20 rules, zero inconsistencies, verified per release against the w3c/wcag-act-rules repository; per-rule breakdown in docs/act-report-summary.md). The WCAG 2.2 catalog (86 criteria, A/AA/AAA) and the WCAG 3 outcome registry are likewise verified against their canonical w3.org sources (scripts/wcag22_ingest.py, scripts/wcag3_ingest.py).

Why I built this

I have been auditing websites for accessibility since 2003. In twenty years the tools got faster and the failures stayed the same: the same missing alt text, the same keyboard traps, the same forms that swallow your work. When AI agents started writing most of the web, the audit gap stopped being a staffing problem and became an infrastructure one.

So I built the tool I always wanted next to me on an audit. Not another scanner — scanners exist. A toolkit that does half the work, says exactly where it stops, and packages the rest for the person who signs. The gov.uk finding you read about above is not a synthetic benchmark case: this engine found it, and the manual review is what caught the false positive before it shipped as a claim.

If it saves you an afternoon, leave a star — it genuinely helps the next auditor find it. If it doesn't, open an issue and tell me what is missing.

Honesty, built in

Every audit says: automation covers 93% of the 55 A/AA criteria (roughly a third of all WCAG once AAA and the genuinely-human checks are counted) — the rest needs a human. The audit-page prompt and the skill have the agent check what it can (keyboard, focus, zoom, announced errors) using the manual checklist. A filter, not a verdict. The remaining human work is priced per criterion — MIN 23 (read and confirm), MED 19 (verify in the browser), MAX 13 (real interaction and judgment); full table. And the evidence pack is the handoff object for the person who signs, screen reader transcript included, so the reviewer sees what a blind user hears.

Security & scope

A local tool: runs on your machine as your user. a11y_audit_url accepts http/https only (no file:// — use --file/html for local HTML). a11y_html_validate in html mode POSTs content to the W3C service (url mode shares only the URL; self-hosted vnu supported). path/output_path read/write local paths — use it in MCP clients you trust.

Development

make test   # every suite by discovery

tests/test_dom.py self-skips without Playwright. tests/test_solido.py enforces the design invariants (catalog parity, version alignment, count coverage, hostile-HTML fuzz). Releases: make release V=X.Y.Z — bumps, gates, tags and pushes atomically.

Generated surfaces — never edit by hand: this README's tool table and docs/tools.md come from server.TOOLS (scripts/gen_readme.py), and llms.txt — this repo's index for agents, llmstxt.org convention — from the same source (scripts/gen_llms.py). Both --check in the Makefile gates: adding a tool and forgetting them fails the suite.

Roadmap

Done recently: rendered audit with shadow DOM and state contrast, form error testing plus autofix, keyboard traps, infinite scroll, reflow, the W3C Nu integration, SARIF and error budgets, the evidence pack (spec published, self-verifying), sitemap crawling, behind-login auditing, browser auto-detection, the screen reader transcript, and per-criterion effort pricing. The full history lives in the changelog.

Next, roughly in this order:

  • Attestation interlock: let an external auditor's signature reference the evidence pack by hash (their schema, my side adapts)

  • Publish the monthly axe-core benchmark results from CI, run over real pages

  • Screen-reader transcript cross-checks against NVDA and VoiceOver output

  • More verified client configs (JetBrains AI, Gemini CLI), same treatment as docs/clients.md

Community

A practical ladder: translate → docs → bug → feature. Everything you ship is credited below and in the release notes.

Contributors

Contributor

Contributions

@kinti

Engine, tests, docs, audits — everything so far

The next name here is probably a translator's: claim an open locale issue and your language ships in the next release with your name on it.

Author

Jesús Quintana Fernández (jquin.net) — SEO/GEO consultant and web-accessibility practitioner since 2003. MIT © 2026.

License & name

The code is MIT — use it, sell it, embed it, fork it, including in closed-source products. One thing MIT does not cover: the name. "a11y-toolkit", the logo and the project marks are reserved and are not part of the MIT grant — a fork or redistribution that modifies the code ships under its own name, not ours. Same playbook as Debian and Firefox: permissive code, protected brand.

Built something with a11y-toolkit? Tell us — public tools get featured and credited.

Available Tools

37 tools
a11y_aria_live_snippeta11y-toolkit: aria-live monitor snippetA
Read-onlyIdempotent

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. — Diagnostics aid to inject in a browser; not an audit by itself. Returns the injectable JavaScript as text (bookmarklet or page.evaluate).

Inputs: lang.

a11y_audit_doma11y-toolkit: Rendered WCAG auditA
Read-onlyIdempotent

Deep RENDERED WCAG audit via local Playwright/Chromium: real computed text contrast against effective backgrounds with alpha compositing (1.4.3), pixel-sampled measurement of text over images/gradients (background captured with the text transparent), 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. — Use instead of a11y_audit_url on JS-heavy pages; needs local Playwright. Returns JSON: {mode, url, score 0-100, findings [{criterion, severity, signal, issue, remediation}], summary, score_note} — same shape as the static audit.

Inputs: url (required), lang, target, browser, +4 more.

a11y_audit_pdfa11y-toolkit: PDF accessibility screeningA
Read-onlyIdempotent

PDF accessibility screening — the space nobody automated (axe, pa11y, Lighthouse: HTML only). Zero-dep structural first pass on a LOCAL file: tagged tree (/StructTreeRoot — the root failure), title, language, outline, /Alt entries, text layer (scanned detection), encryption, and AcroForm fields without accessible labels (/TU — what a screen reader announces; 3.3.2 inputs, 4.1.2 buttons). Full PDF/UA conformance needs a spec validator (veraPDF); this finds the failures that make full validation pointless. Use for enterprise document pipelines and PDFs linked from the audited site. Returns JSON: {mode: "pdf", pages, tagged, lang, title, images, alt_entries, form_fields, form_labels, findings, summary, limits}.

Inputs: path (required), lang.

a11y_audit_urla11y-toolkit: Express WCAG auditA
Read-onlyIdempotent

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), low-quality alt text (filenames, generics, placeholders; also 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. — Prefer a11y_audit_dom when JS renders the content or contrast/2.5.8/focus matter; use pages for light multi-page sampling. Static CANNOT measure class/var() CSS contrast (1.4.3): the report's not_measured says so — a 100 is never 'contrast is fine'. Returns JSON: {mode, url|file, score 0-100, findings [{criterion, severity, signal, issue, remediation}], summary {high, medium, low}, limits, score_note, overlay_widgets? (detected third-party overlay scripts — data, not a WCAG finding)}.

Inputs: url, html, lang, pages, +3 more.

a11y_autofixa11y-toolkit: Deterministic safe auto-fixesA
Read-onlyIdempotent

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 not_applied with the reason and remediation instead. Returns fixed_html + applied + not_applied. — Only the closed allowlist of provably safe fixes; judgment fixes come back as not_applied with remediation. Returns JSON: {fixed_html, applied [{fix, …}], not_applied [{issue, remediation}]} as text content (the agent writes the file).

Inputs: html (required), url, lang, title, +1 more.

a11y_badgea11y-toolkit: Honest SVG badgeA
Read-onlyIdempotent

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. — Scope: the honest SVG seal for audited sites; the machine-readable bundle is a11y_evidence. Returns the honest SVG badge as text content (the agent writes the file).

Inputs: score (required), date, lang.

a11y_contrast_doma11y-toolkit: Live-element contrast samplingA
Read-onlyIdempotent

REAL contrast of an element against whatever is behind it (image, gradient, video, photo): loads the page in Chromium, screenshots the element matched by selector with its text turned transparent — so only the real background is sampled, no text pixels, no antialiasing edges — and contrasts the pixels with the text color (computed from the element when not given). The automated version of a11y_contrast_image: no manual screenshot, no region math. Requires local Playwright. — Use instead of a11y_contrast_image when the text lives in a live page (captures and measures it automatically); for flat pairs use a11y_contrast_pair. Returns JSON: {url, selector, text_color, worst_ratio, median_ratio, p95_ratio, area_passes_aa_normal_text_4_5, worst_zone?, sampled_pixels, interpretation}.

Inputs: url (required), selector (required), lang, sample, +4 more.

a11y_contrast_imagea11y-toolkit: Text-over-image contrastA
Read-onlyIdempotent

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 (worst_zone). What pair-only checkers cannot do. region="x,y,w,h" recommended. — Use instead of a11y_contrast_pair whenever the background is a photo/gradient. Returns JSON: {worst_ratio, median_ratio, p95_ratio, area_passes_aa_normal_text_4_5, worst_zone, sampled_pixels}.

Inputs: path (required), text_color (required), lang, region, +1 more.

a11y_contrast_paira11y-toolkit: Contrast ratio + verdictsA
Read-onlyIdempotent

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. — For flat pairs; text over images needs a11y_contrast_image. Returns JSON: {text, background, ratio, verdicts [{criterion, level, threshold, passes}], aa_suggestion?}.

Inputs: bg (required), fg (required), lang.

a11y_criteriona11y-toolkit: WCAG criterion explainedA
Read-onlyIdempotent

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". Give a finding SIGNAL instead (e.g. img_no_alt, kbd_trap — the id in every audit finding) and it resolves to its criterion AND its published ACT rule(s) with official w3.org links. Use it whenever you need to explain WHY a finding matters or what the criterion actually says. — Knowledge lookup; does not fetch or audit anything — includes the official Understanding WCAG 2.2 link for the criterion. Returns JSON: {criterion, level, understanding, toolkit_signals, requires, typical_failures, how_to_check} — signal mode adds {signal, act_rules [{id, name, status, url}]}; {error, …} for unknown codes.

Inputs: code, lang, signal.

a11y_diffa11y-toolkit: Snapshot regression diffA
Read-onlyIdempotent

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. — Compares two existing snapshots; a11y_diff_urls snapshots both for you. Returns JSON: {ok, added, removed, renamed, focus_order_changed, first_differences} — ok:false means a regression to review.

Inputs: a (required), b (required).

a11y_diff_urlsa11y-toolkit: Staging vs production diffA
Read-onlyIdempotent

Snapshot two URLs and diff them in a single call (e.g. staging vs production). Requires local Playwright. — Convenience for staging-vs-production; manual control is snapshot + a11y_diff. Returns the same diff shape as a11y_diff, for two live URLs.

Inputs: url_a (required), url_b (required), auth_state.

a11y_disprovea11y-toolkit: Disprover: re-verify findingsA
Read-onlyIdempotent

Disprover pattern (from Cloudflare's security-audit-skill): re-runs the audit against the live page and marks each finding confirmed or rejected — findings that don't reproduce are rejected with the reason. Catches false positives, race conditions, and page changes between audit and report. Returns a fresh score over confirmed findings only. — Run this before acting on any audit report. Returns JSON: {confirmed, rejected, score} — a fresh score over confirmed findings only.

Inputs: url (required), lang, report, timeout.

a11y_docx_screena11y-toolkit: DOCX accessibility screeningA
Read-onlyIdempotent

DOCX accessibility screening — the other half of enterprise paperwork. Zero-dep structural pass on a LOCAL .docx: images with no alt text (docPr without descr), fake headings (bold+big paragraphs with no Heading style — invisible to navigation pane and TOC), document language, tables without marked header row. Full review needs a human; this finds what makes it pointless. Returns JSON: {mode: "docx", language, images, tables, findings, summary, limits}.

Inputs: path (required), lang.

a11y_evidencea11y-toolkit: Evidence pack (verifiable handoff)A
Read-onlyIdempotent

Builds the verifiable evidence pack: the machine→human handoff object for WCAG conformance work. Takes one or more audit reports (any mode — static, rendered, reflow, keyboard, scroll) and returns: the full 55-criterion A/AA matrix (automated-fail / automated-review / not-flagged — NOT pass / not-run / manual-only), each row priced with its human-effort class (MIN 1-3 / MED 5-10 / MAX 15-30 min of human review remaining) and total remaining minutes every artifact SHA-256-hashed with timestamps, an empty signature block (name, credential, date) whose statement must reference the pack's own sha256, and the tamper-evidence rule stated. Vendor-neutral: any qualified human can review it. Evidence, never conformance. — The tier-3 handoff object; feed it every audit report you have. Returns the pack JSON (a11y-evidence-pack/2) as text content (the agent writes the file). Run after the audits you trust, and pass verified codes from the manual checklist — agent-verified never erases an automated-fail.

Inputs: reports (required), lang, build, scope, +3 more.

a11y_forced_colorsa11y-toolkit: forced-colors survival heuristicA
Read-onlyIdempotent

Does content survive forced-colors: active (Windows High Contrast)? Loads the page normally, flags SVGs with hardcoded colored fills (they fall back to inherited and icons can vanish), then emulates forced-colors and compares. Review-grade heuristic — the definitive check is visual on Windows HCM; this prepares it. Heuristic rev 1: SVG fills only, images queued for the next rev. Returns JSON: {mode, normal, forced, score, findings, limits}.

Inputs: url (required), lang, browser, timeout, +1 more.

a11y_formsa11y-toolkit: Form error testingA
Destructive

Form error testing (3.3.1 Error Identification, 3.3.3 Error Suggestion) — the guided flow no competitor automates: fills every validatable field with INVALID data, really submits, and judges the post-submit DOM — are errors identified in text and associated with the field (aria-invalid + aria-describedby, error summary, role=alert), or does the form swallow them? Native browser validation counts as identification (unless the form has novalidate); forms that navigate on submit are honestly noted as not measurable in-page. Requires local Playwright. Returns JSON: per-field error judgments {field, submitted_value_class, error_identified, announced, suggestion_present} plus an overall 3.3.1/3.3.3 verdict. Use on test/staging forms, or forms you own: invalid data is REALLY submitted. Do not run against production forms that trigger real emails, orders or leads.

Inputs: url (required), lang, browser, timeout, +1 more.

a11y_generate_declarationa11y-toolkit: Accessibility statement (EAA/RD 1112)A
Idempotent

Generates an Accessibility Statement in HTML: art. 10 RD 1112/2018 (Spanish public sector, framework="rd1112") or European Accessibility Act wording (Directive (EU) 2019/882 / Ley 11/2023, framework="eaa"; EN output uses Directive (EU) 2016/2102 / EAA wording). The generated document is itself accessible. Saves to output_path when given. — Legal statement generator; drive inaccessible_content from audit findings and a11y_evidence. Returns {html, summary} — the accessible legal statement; writes a file only when output_path is given.

Inputs: url (required), entity (required), status (required), lang, +9 more.

a11y_generate_openacra11y-toolkit: OpenACR YAML report (GSA)A
Idempotent

Generates an OpenACR (the GSA open standard, VPAT-derived) accessibility conformance report in machine-readable YAML from an a11y_evidence pack (or raw audit reports): the full 55-criterion WCAG 2.2 A/AA matrix as chapters with one web component per criterion, adherence levels starting at not-evaluated (automated fails force does-not-support; review-level signals stay not-evaluated with the evidence in notes) and notes auto-filled from the pack (status, measured values, remaining human effort, sha256). Same honesty rule as a11y_generate_vpat: the machine fills notes, a qualified human sets levels via overrides (supports, partially_supports, …; hyphenated OpenACR forms accepted). OpenACR is what US federal procurement and GSA buyers parse — emit it from the same pack as the human-readable VPAT. — The machine-readable (GSA OpenACR YAML) sibling of a11y_generate_vpat — emit both from the same pack: humans read the VPAT, procurement systems parse the OpenACR. Returns {yaml, summary {level: count}, levels {code: level}, pack_sha256, format, draft} — the OpenACR YAML draft; writes a file only when output_path is given. Run after the audits you trust; validate and render in the GSA OpenACR editor (gsa.github.io/openacr-editor) — a qualified human must set the final adherence levels before publishing.

Inputs: product (required), lang, pack, notes, +10 more.

a11y_generate_vpata11y-toolkit: VPAT 2.5 report (WCAG edition)A
Idempotent

Generates a VPAT 2.5 (WCAG edition) accessibility conformance report in accessible HTML from an a11y_evidence pack (or raw audit reports): the full 55-criterion WCAG 2.2 A/AA table with Remarks auto-filled from the pack (status, measured values, examples, remaining human effort) and every Conformance Level starting at Not Evaluated — automated fails force Does Not Support, review-level signals stay Not Evaluated with the evidence in Remarks, and a qualified human sets the rest via overrides (supports, partially_supports, does_not_support, not_applicable, not_evaluated). The document is a DRAFT until the signature block, which must reference the pack sha256, is completed. VPAT is the US/ADA counterpart of a11y_generate_declaration (EU/EAA): the machine fills Remarks, the human signs the claim. — The US/ADA counterpart of a11y_generate_declaration; feed it the a11y_evidence pack — levels stay Not Evaluated until a qualified human sets them. Returns {html, summary {level: count}, levels {code: level}, pack_sha256, draft} — the VPAT draft; writes a file only when output_path is given. Run after the audits you trust; a qualified human must set the final levels (overrides) and sign before publishing — the machine fills Remarks, never the claim.

Inputs: product (required), lang, pack, notes, +9 more.

a11y_hovera11y-toolkit: Hover dismissibility (1.4.13)A
Read-onlyIdempotent

Content on Hover or Focus (1.4.13): finds tooltip/overlay candidates, hovers each, and tests whether Escape dismisses the result — tooltips that do not dismiss are flagged. Requires local Playwright. — Scope: tooltips only; full audit is a11y_audit_dom, keyboard traps are a11y_keyboard. Returns JSON: {candidates, dismissed_on_escape, findings}.

Inputs: url (required), lang, browser, timeout, +1 more.

a11y_html_validatea11y-toolkit: W3C Nu validationA
Read-onlyIdempotent

The W3C's own parser as a toolkit mode: checks a URL or raw HTML against the Nu Html Checker (validator.w3.org/nu) — doctype, encoding, structural validity, plus alt/lang/role issues from the authoritative source, mapped to WCAG criteria where they overlap. PRIVACY: html mode POSTs the document to the W3C service (url mode shares only the URL, like a11y_audit_url); self-hosted vnu instances supported via base_url for sensitive content. Returns JSON: Nu validator messages mapped to WCAG criteria where they overlap.

Inputs: url, html, lang, base_url.

a11y_journey_verdicta11y-toolkit: Blindfold journey verdictA
Read-onlyIdempotent

Blindfold journey verdict — the capability no other accessibility tool has: the agent attempted a REAL task (sign up, checkout, password reset) perceiving only the accessibility tree and acting by accessible name and keyboard; perceive via your browser accessibility snapshot (state-preserving). This turns its friction log into a deterministic scored verdict. Pass = task completable non-visually by the agent; friction items map to WCAG criteria and flow into the evidence pack (report:journey). Use with the blindfold-task prompt: act by accessible name, log friction per step, then call this. Task usability evidence, never conformance. Returns JSON: {verdict pass|partial|fail|blocked, score 0-100, findings [{criterion, severity, signal, issue, remediation, step}], summary, rules} — writes a file only when output_path is given. Run only after a real blindfold attempt (the blindfold-task prompt): the verdict prices the walk, it does not replace it.

Inputs: url, lang, seal, task, +4 more.

a11y_keyboarda11y-toolkit: Keyboard-trap detectorA
Read-onlyIdempotent

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. — Scope: keyboard traps (2.1.2); focus visibility is part of a11y_audit_dom. Returns JSON: {tab_stops, trap_detected, escape_releases, findings}. Run on pages with modals, dialogs or embedded apps; a plain content page has nothing to trap.

Inputs: url (required), lang, browser, max_steps, +1 more.

a11y_ledgera11y-toolkit: Coverage ledger (persistent)A

Coverage ledger (from Cloudflare's security-audit-skill): persistent record of what has been audited, when, and with what result. Actions: record (add audit result), gaps (what has never been checked on a URL), summary (portfolio overview). Accumulates across runs — second audits show resolved findings. record returns the stored entry; gaps returns criteria never checked; summary returns {entries, active_signals, resolved, mean_score}. record after every audit run; gaps before planning the next pass. The ledger file accumulates across runs — give each project its own ledger_path.

Inputs: action (required), url, lang, report, +1 more.

a11y_locatea11y-toolkit: Locate element by accessible nameA
Read-onlyIdempotent

Find an element by its accessible name and get its deterministic route selector (the same tag:nth-of-type identity annotate() uses): controls, headings, images with alt, iframes with title, fields with an explicit name. High confidence only on exact unique matches; when several elements share the name it refuses to pick one and returns the full candidate list (ambiguous) — a match is never invented. Feeds agents that edit code by selector and panel deep-links.

Inputs: html (required), query (required), lang, role, +1 more.

a11y_patchesa11y-toolkit: Sealed patch-set (sha-keyed)A
Read-onlyIdempotent

Sealed patch-set of the deterministic safe fixes: build runs a11y_autofix once and records WHICH fixes were applied to WHICH page (SHA-256-keyed, format a11y-patches/1, engine version stamped); verify re-checks a set against a page — the same page must reproduce the same fixes, a different page is stale (sets never blind-apply). The artifact an agent or CI applies upstream: fixing the original web is the client job, the engine hands over the evidence.

Inputs: html (required), lang, title, action, +1 more.

a11y_reduced_motiona11y-toolkit: prefers-reduced-motion honored?A
Read-onlyIdempotent

Does the site HONOR prefers-reduced-motion? Loads the page normally, counts looping CSS animations (>0.15s infinite), then reloads emulating prefers-reduced-motion: reduce and counts again. If the number does not drop, the site ignores the user's preference (2.2.2; 2.3.3 AAA). Nobody else automates this — axe leaves it as manual review. Covers CSS animations and video[autoplay]; JS/WebGL/scroll-parallax remain manual. Returns JSON: {mode, normal, reduced, respects, score, findings, limits}.

Inputs: url (required), lang, browser, timeout, +1 more.

a11y_reflowa11y-toolkit: 320px reflow checkA
Read-onlyIdempotent

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. — Scope: 320px reflow only (1.4.10); for the full rendered pass use a11y_audit_dom. Returns JSON: {url, viewport, horizontal_scroll, offenders [{selector, width}]}. Run once per template, not per page: fixed-width layouts are a property of the template.

Inputs: url (required), lang, browser, timeout, +1 more.

a11y_routea11y-toolkit: Tool router (goal or page to steps)A
Read-onlyIdempotent

The router — start here when unsure which tool solves a task: state the goal in plain language ("gate my PR", "fix the contrast of my hero", "generate the legal statement") and get the ordered tool sequence with the why of each step. Deterministic keyword index over the toolkit map, not an LLM guessing; when nothing matches, the honest fallback route says where everyone begins. Makes 33 specialized tools an O(1) choice — ask once instead of scanning descriptions. Optional sequential-diagnosis mode: pass url or html and the router takes the page's cheap vitals (static pass) and orders the next exams by expected yield — the evidence decides (forms → form error testing, menus → keyboard, video → caption content), severity only breaks ties; the ordered plan never replaces the full catalog. Returns JSON: {route, steps [{step, tool, why}], alternates, prompts, cli, note} — the ordered tool sequence for the goal. Diagnosis mode (url/html passed): {mode: diagnose, vitals {score, summary, signals}, symptoms [{symptom, evidence}], steps [...], guarantee} — evidence orders the exams, severity breaks ties.

Inputs: url, goal, html, lang.

a11y_scopea11y-toolkit: Applicability scope (semi-automatic)A
Read-onlyIdempotent

Semi-automatic applicability scoping — the layer between the audit and the conformance claim (the pattern of the Government of Canada CIO wizard for EN 301 549, informed by the audit instead of 118 hand-answered questions). Reads the features block of the reports (media elements, form controls — positive evidence of what the audit SAW) and proposes the structural exclusions: no video anywhere → 1.2.x proposed-excluded, no form controls → 3.3.x proposed-excluded. The machine PROPOSES, the human CONFIRMS via answers {"1.2.4": {"status": "excluded", "reason": "…"}} — only confirmed exclusions may become not-applicable downstream (a11y_evidence, a11y_generate_vpat, a11y_generate_openacr); a proposal never excludes. standard=en301549 adds the EN 301 549 V4.1.1 (2026) clause to every row (9.x web / 10.x documents / 11.x software — numbering verified 55/55 A/AA) and the EN-only families (5, 6, 7, 8, 12, 13) as honest applicability rows this toolkit does not evaluate. Live counter: N of 55 criteria in scope. — The applicability layer before conformance: run after the audits, confirm the machine proposals via answers, then feed the scope here — a11y_evidence/vpat/openacr turn confirmed exclusions into not-applicable with their reason. Returns JSON: {format: a11y-scope/1, standard, target, criteria [{criterion, level, status, clause?, evidence?, reason?}], counters, en301549_families?, sha256} — statuses in-scope|proposed-excluded|excluded; only human-confirmed exclusions count downstream. Run after the audits, before any conformance artifact: confirm the machine proposals via answers, then pass the scope to a11y_evidence — only human-confirmed exclusions become not-applicable, and each exclusion carries its reason.

Inputs: reports (required), lang, target, answers, +2 more.

a11y_scrolla11y-toolkit: Infinite-scroll auditA
Read-onlyIdempotent

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. — For paginated feeds only; general page audit is a11y_audit_url/dom. Returns JSON: {mode, url, score, findings [{criterion, severity, signal, issue, remediation}], summary} — same shape as the audits.

Inputs: url (required), lang, browser, auth_state, +1 more.

a11y_snapshota11y-toolkit: A11y snapshot + tab orderA
Read-onlyIdempotent

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. — Capture half of the watch loop; compare with a11y_diff (or a11y_diff_urls for two live URLs). Returns JSON: {url, ts, elements [{tag, role, name, ref…}], focus_order}.

Inputs: url (required), auth_state.

a11y_sr_transcripta11y-toolkit: Screen reader transcriptA
Read-onlyIdempotent

Screen reader TRANSCRIPT: what a blind user HEARS on this page. Walks the accessibility tree linearly and returns the announcement text with roles, names and states — the linearized reading experience, as prose an agent can READ to understand the page from a blind user's perspective. — Read-only: for structure use a11y_snapshot, for keyboard traps use a11y_keyboard. Requires Playwright. Returns JSON: {url, total, announcements [{time, politeness, role, text}] — the linearized reading order}.

Inputs: url (required), lang, browser, timeout, +1 more.

a11y_suggest_colora11y-toolkit: Nearest passing colorA
Read-onlyIdempotent

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. — The fixer companion to a11y_contrast_pair failures. Returns JSON: {color, ratio, action} — the nearest opaque color reaching the target.

Inputs: bg (required), fg (required), target.

a11y_vtt_checka11y-toolkit: WebVTT caption qualityA
Read-onlyIdempotent

WebVTT caption QUALITY (1.2.2) — the substance, not the presence. Everyone stops at " exists"; this downloads and parses the actual .vtt and judges what viewers get: malformed timing lines, empty cues, overlaps, impossible reading speed (>21 chars/second, BBC/Netflix standard) and coverage vs the media duration when given. Pass the .vtt URL (same http/https guard as the audits). Not a substitute for human review of accuracy or speaker identification. Returns JSON: {mode: "vtt", cues, characters, captioned_seconds, findings [{criterion, severity, signal, issue, remediation}], summary, limits}.

Inputs: url (required), lang, duration.

a11y_wcag3_previewa11y-toolkit: WCAG 3 draft preview (no score)A
Read-onlyIdempotent

WCAG 3 demo — the view layer nobody ships: takes an audit report and re-groups its WCAG 2.2 findings under the outcomes of the WCAG 3 Working Draft (10 September 2026). Informative only: WCAG 3 is not a completed standard, the W3C has published no official WCAG 2 to WCAG 3 mapping (this one is curated and labeled as such), and NO score, tier or conformance claim is produced — the draft's tier thresholds are still TBD. Use it to show teams where today's 2.2 findings will land tomorrow; keep auditing against WCAG 2.2. Returns JSON: {mode, draft, disclaimer, mapping_note, no_score, conformance_model, outcomes [{outcome, draft_url, findings, severity, signals, criteria_22}], counts, unmapped} — never a score. Run after any audit when the team asks "what about WCAG 3?"; re-baseline on each W3C draft publication (roughly March/September).

Inputs: report (required), lang.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 37 tools

    Disambiguation4/5

    Most tools have clearly distinct targets: static vs rendered audits, PDF/DOCX/VTT screening, contrast pair/image/DOM, snapshot vs diff, and remediation vs evidence/report generation. There is some conceptual overlap among page-audit entry points (a11y_audit_url, a11y_html_validate, a11y_disprove) and the conformance-artifact tools (evidence, scope, VPAT, OpenACR, declaration), but descriptions and the router make the intended selection explicit.

    Naming Consistency4/5

    All tool names use a consistent a11y_ snake_case prefix, and most follow a recognizable verb_noun or action-oriented pattern (audit_url, generate_vpat, suggest_color, diff_urls). A few are noun-only artifacts (a11y_ledger, a11y_evidence, a11y_badge, a11y_patches), but the convention remains predictable rather than chaotic.

    Tool Count2/5

    At 37 tools, the surface is far above the well-scoped range and imposes a significant selection burden even for a broad accessibility domain. The router helps, and many tools are genuinely specialized, but the count is still heavy enough that it exceeds what most agents can comfortably navigate without routing assistance.

    Completeness4/5

    The lifecycle is unusually complete: routing, static/rendered audits, document and caption screening, keyboard/forms/hover/scroll/reflow/motion checks, remediation, regression diffing, evidence packaging, legal/conformance reports, and knowledge lookup. Minor gaps remain around manual-review checklist generation and live assistive-technology interaction, but there are no obvious dead ends for the core automated accessibility workflow.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Enables 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
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables 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.
      8
      36 PyPI
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides AI agents with web accessibility analysis tools via MCP, enabling checks for alt text, heading hierarchy, color contrast, ARIA validation, and form accessibility.
      46 npm
      MIT