Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

A11Y Toolkit

PYPI · A11Y-TOOLKIT · 2 COMPONENTS

The accessibility layer for AI coding agents: audit, fix, document and watch - WCAG 2.2.

0 this week 96 Trust /100

Last scanned (22 hours ago)

Scores higher than 98% of PyPI servers

Category Testing and QA

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to kinti/a11y-toolkit). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 3 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability75
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 9808 tokens (~280/item across 35 items; 35 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 35 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 36 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 1 Nov 26 0
    • Tool safety: pass → unverified ▼ security
    • Stability: pass → unverified ▼ security
    • Tool coverage: 100 → unverified ▼ functional
    • Schema quality: 100 → unverified ▼ functional
    • Capabilities: pass → unverified ▼ functional
    • Package version: 5.25.1 → 5.26.0 functional
  • 31 Oct 26 +16
    • Malware scan: unverified → pass ▲ security
    • Stability: 0.97 → pass security
  • 30 Oct 26 0
    • Package version: 5.19.0 → 5.25.1 functional
    • Package version: 5.19.0 → 5.20.0 functional
  • 29 Oct 26 −16
    • Malware scan: pass → unverified ▼ security
    • Schema quality: 8090 → 9016 ▼ functional
    • Stability: pass → 0.93 functional
    • Package version: 5.16.0 → 5.19.0 functional
  • 26 Oct 26 0
    • Tool safety: pass → unverified ▼ security
    • Stability: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Schema quality: 100 → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Package version: 5.15.0 → 5.16.0 functional
  • 25 Oct 26 +1
    • Tool safety: pass → unverified ▼ security
    • Stability: fail → unverified ▼ security
    • Stability: fail → pass ▲ security
    • Schema quality: 100 → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Capabilities: pass → unverified ▼ functional
    • Package version: 5.14.0 → 5.15.0 functional
  • 24 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 23 Oct 26 0
    • Malware scan: unverified → pass ▲ security
    • Package version: 5.11.0 → 5.14.0 functional
    • Package version: 5.11.0 → 5.13.0 functional
    • Package version: 5.11.0 → 5.12.0 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed pypi/a11y-toolkit@5.26.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo kinti/a11y-toolkit
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/kinti/a11y-toolkit/.github/workflows/publish.yml@refs/tags/v5.26.0
Rekor log index 3617030948
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:0ec17a93023296dfa516581f19b1e77f007bc60d7705f8481a51f9054f749d30

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted setuptools.build_meta

Background: Why install scripts are a supply-chain risk →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 35 exposed · ~9,449 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
a11y_aria_live_snippet ~99

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

NameTypeReqDescription
langstring–monitor panel language (en default)

No output schema declared.

No examples provided.

a11y_audit_dom ~399

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.

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to audit behind login — local file, never uploaded
browserstring–Browser engine (auto = detect the first available)
color_schemestring–Emulate prefers-color-scheme: run the contrast pass in dark mode too — dark themes fail where light passes (nobody audits both)
langstring–Output language for findings and remediation (default en)
standardstring–add the EN 301 549 V4.1.1 (2026) clause to every finding plus a standard block
targetstring–EN 301 549 target: web=9.x clauses (default), documents=10.x, software=11.x
timeoutnumber–page load timeout seconds (45 default)
urlstringyesPage URL to load in Chromium (http/https or file:// for local fixtures)

No output schema declared.

No examples provided.

a11y_audit_pdf ~206

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

NameTypeReqDescription
langstring–output language
pathstringyeslocal PDF file path (never fetched remotely — download it yourself first)

No output schema declared.

No examples provided.

a11y_audit_url ~562

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

NameTypeReqDescription
htmlstring–raw HTML to audit directly (overrides url)
langstring–output language (en default)
pagesinteger–light same-domain crawl: audit up to N pages, aggregated by score and recurring signals (default 1, max 20)
standardstring–add the EN 301 549 V4.1.1 (2026) clause to every finding plus a standard block (EAA procurement, Canada ICT standard)
targetstring–EN 301 549 target: web=9.x clauses (default), documents=10.x, software=11.x
timeoutnumber–fetch timeout seconds (30 default)
urlstring–URL to fetch and audit

No output schema declared.

No examples provided.

a11y_autofix ~253

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}]} — writes a file only when output_path is given.

NameTypeReqDescription
form_errorsboolean–inject the accessible form-error layer into forms without their own handling (default true)
htmlstringyesraw HTML to fix
langstring–only if provided and <html> lacks lang
titlestring–only if provided and <title> is empty
urlstring–URL context for the report metadata (default: "(html)")

No output schema declared.

No examples provided.

a11y_badge ~148

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; writes a file only when output_path is given.

NameTypeReqDescription
datestring–ISO date (today by default)
langstring–Badge language (default en)
scorenumberyes0-100 (from an audit result)

No output schema declared.

No examples provided.

a11y_contrast_dom ~317

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

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON to measure behind login — stays local
browserstring–Browser engine (auto = detect the first available)
langstring–Output language (default en)
sampleinteger–Pixel step (default 4)
selectorstringyesCSS selector of the text element to measure
text_colorstring–Text color (default: computed from the element)
timeoutnumber–Page load timeout seconds (default 45)
urlstringyesPage URL where the element lives (http/https or file://)

No output schema declared.

No examples provided.

a11y_contrast_image ~236

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

NameTypeReqDescription
langstring–Output language (default en)
pathstringyesLocal path to the screenshot/image the text sits on (PNG/JPG/PPM)
regionstring–Text bounding box as "x,y,width,height" in pixels (strongly recommended: defines what to sample)
sampleinteger–Pixel step: 4 samples every 4px (auto-raised for huge regions)
text_colorstringyesThe text color as rendered over the image (must be opaque)

No output schema declared.

No examples provided.

a11y_contrast_pair ~192

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?}.

NameTypeReqDescription
bgstringyesBackground color: same formats; alpha composites over white
fgstringyesForeground/text color: #hex, rgb(), hsl() or a CSS color name; alpha composites over bg
langstring–output language (en default)

No output schema declared.

No examples provided.

a11y_criterion ~288

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.

NameTypeReqDescription
codestring–criterion number, e.g. 1.4.3 (or give signal)
langstring–Explanation language (default en)
signalstring–engine signal id from a finding (e.g. img_no_alt, kbd_trap) — resolves criterion + ACT rules with w3.org links

No output schema declared.

No examples provided.

a11y_diff ~132

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.

NameTypeReqDescription
astringyesBEFORE snapshot (inline JSON or path)
bstringyesAFTER snapshot (inline JSON or path)

No output schema declared.

No examples provided.

a11y_diff_urls ~122

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.

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to audit behind login — stays local
url_astringyesFirst URL (usually staging)
url_bstringyesSecond URL (usually production)

No output schema declared.

No examples provided.

a11y_disprove ~162

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.

NameTypeReqDescription
langstring–Output language (en default)
reportobject–existing audit report (optional; if absent, audits first)
timeoutnumber–Timeout seconds (30 default)
urlstringyesURL to re-verify against

No output schema declared.

No examples provided.

a11y_docx_screen ~133

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

NameTypeReqDescription
langstring–output language
pathstringyeslocal .docx file path

No output schema declared.

No examples provided.

a11y_evidence ~372

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); writes a file only when output_path is given. Run after the audits you trust, and pass verified codes from the manual checklist — agent-verified never erases an automated-fail.

NameTypeReqDescription
reportsarrayyesaudit report objects (any mode)
reviewerobject–{"name":…, "credential":…, "review_date":…} to prefill the signature block
scopeobject–a11y_scope output: human-confirmed exclusions become not-applicable rows with their reason (machine proposals never exclude)
snapshotobject–a11y_snapshot output (optional)
verifiedarray–Criterion codes an agent/human verified against this sample (manual checklist protocol) — they become agent-verified in the matrix; automated-fail stays fail

No output schema declared.

No examples provided.

a11y_forced_colors ~187

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

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to test behind login — stays local
browserstring–Browser engine (auto = detect the first available)
langstring–output language
timeoutnumber–page load timeout seconds (45 default)
urlstringyesPage URL to test

No output schema declared.

No examples provided.

a11y_forms ~261

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.

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON to test forms behind login
langstring–Output language (en default)
timeoutnumber–Page load timeout seconds (45 default)
urlstringyesPage URL with the form(s) to test

No output schema declared.

No examples provided.

a11y_generate_declaration ~415

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.

NameTypeReqDescription
alternative_formatstring–Where to get the content in an alternative accessible format
complaintsstring–Claim/complaint procedure URL or address (legally required in several jurisdictions)
entitystringyesLegal entity name as it should appear in the statement
evaluation_datestring–ISO date of the last evaluation (YYYY-MM-DD)
feedbackstring–Contact channel for accessibility feedback (email or URL)
frameworkstring–rd1112 (Spanish public sector, art. 10) or eaa (European Accessibility Act / private sector)
inaccessible_contentarray–Non-accessible content list: one string per item, ideally criterion + reason + alternative
langstring–Statement language (default en; es uses the Spanish legal wording)
methodstring–How conformance was evaluated (e.g. "self-evaluation: a11y-toolkit screening + manual review")
output_pathstring–save the HTML here (optional)
review_datestring–ISO date of the next scheduled review
statusstringyesCompliance state: full | partial | not_conformant (plena | parcial | no_conforme, pre-5.11, still accepted as aliases)
urlstringyesWebsite URL the statement covers

No output schema declared.

No examples provided.

a11y_generate_openacr ~593

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

NameTypeReqDescription
authorobject–{"name":…, "company":…, "email":…, "website":…} — the ACR author block
contactstring–Contact email (author.email fallback)
langstring–Document language (default en)
methodsstring–Evaluation methods used (default: honest automated-screening note)
notesstring–Additional notes to include
output_pathstring–save the OpenACR YAML here (optional)
overridesobject–Criterion → adherence level set by a qualified human: {"1.1.1": "supports", "1.2.2": "not_applicable", …} (hyphenated forms accepted)
packobject–a11y_evidence output (evidence pack); alternative to reports
productstringyesProduct name as it must appear in the OpenACR
product_descriptionstring–Product description paragraph
product_versionstring–Product version
report_datestring–ACR report date ISO (default: today)
reportsarray–Audit report objects to bundle (when pack is not given, the pack is built here first)
scopeobject–a11y_scope output: human-confirmed exclusions become not-applicable with their reason (machine proposals never); overrides still win

No output schema declared.

No examples provided.

a11y_generate_vpat ~550

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 and a qualified human sets the final level 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.

NameTypeReqDescription
contactstring–Contact information for questions about this VPAT
langstring–Document language (default en)
methodsstring–Evaluation methods used (default: honest automated-screening note)
notesstring–Additional notes to include
output_pathstring–save the VPAT HTML here (optional)
overridesobject–Criterion → conformance level set by a qualified human: {"1.1.1": "supports", "1.2.2": "not_applicable", …}
packobject–a11y_evidence output (evidence pack); alternative to reports
productstringyesProduct name as it must appear in the VPAT
product_descriptionstring–Product description paragraph
report_datestring–VPAT report date ISO (default: today)
reportsarray–Audit report objects to bundle (when pack is not given, the pack is built here first)
reviewerobject–{"name":…, "credential":…, "review_date":…} to prefill the signature block
scopeobject–a11y_scope output: human-confirmed exclusions become Not Applicable with their reason (machine proposals never); overrides still win

No output schema declared.

No examples provided.

a11y_hover ~157

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

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to audit behind login — stays local
langstring–Output language (en default)
timeoutnumber–Page load timeout (45 default)
urlstringyesPage URL to test

No output schema declared.

No examples provided.

a11y_html_validate ~235

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.

NameTypeReqDescription
base_urlstring–Base URL of a self-hosted vnu instance (docker ghcr.io/validator/validator) instead of the public W3C service
htmlstring–Raw HTML to validate — POSTs the content to validator.w3.org/nu; use url or a self-hosted instance for sensitive pages
langstring–Output language (en default)
urlstring–Page URL to validate (shares the URL with the W3C service)

No output schema declared.

No examples provided.

a11y_journey_verdict ~355

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.

NameTypeReqDescription
langstring–output language
outcomeobjectyes{"completed": bool, "gave_up": bool, "workaround_used": bool, "notes"}
output_pathstring–write the full verdict JSON here instead of returning it inline
stepsarrayyesjourney steps: {action, target (accessible name), perceived, friction?} — friction is {pattern: journey_* key} or {criterion, severity, issue, remediation?}
taskobjectyes{"goal": what the agent attempted, "kind": sign-up|checkout|password-reset|search|custom}
urlstring–page(s) where the journey ran

No output schema declared.

No examples provided.

a11y_keyboard ~247

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.

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to Tab-walk behind login
browserstring–Browser engine (auto = detect the first available)
langstring–Output language (default en)
max_stepsinteger–max real Tab presses (60 default)
urlstringyesPage URL to Tab-walk (http/https or file://)

No output schema declared.

No examples provided.

a11y_ledger ~186

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.

NameTypeReqDescription
actionstringyesWhat to do
ledger_pathstring–ledger file path (default: a11y-ledger.json)
reportobject–audit report object (for record)
urlstring–URL (for record/gaps)

No output schema declared.

No examples provided.

a11y_reduced_motion ~209

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

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to test behind login — stays local
browserstring–Browser engine (auto = detect the first available)
langstring–output language
timeoutnumber–page load timeout seconds (45 default)
urlstringyesPage URL to test

No output schema declared.

No examples provided.

a11y_reflow ~273

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.

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to test behind login
browserstring–Browser engine (auto = detect the first available)
langstring–Output language (default en)
timeoutnumber–Page load timeout in seconds (default 45)
urlstringyesPage URL to test at 320px (http/https or file://)

No output schema declared.

No examples provided.

a11y_route ~324

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.

NameTypeReqDescription
goalstring–the task in plain language (es or en)
htmlstring–optional diagnosis mode: inline HTML instead of a URL
langstring–Output language (en default)
urlstring–optional diagnosis mode: page URL — its cheap signals (static pass) order the next exams by expected yield

No output schema declared.

No examples provided.

a11y_scope ~565

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.

NameTypeReqDescription
answersobject–human confirmations keyed by criterion code: {"1.2.4": {"status": "excluded", "reason": "no live media"}} — status in-scope|proposed-excluded|excluded
langstring–output language (en default)
reportsarrayyesaudit report objects (any mode; reports carrying the features block power the machine proposals)
standardstring–wcag22 (default) or en301549: adds clause refs + EN families
targetstring–ICT target: web=9.x clauses (default), documents=10.x, software=11.x

No output schema declared.

No examples provided.

a11y_scroll ~278

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.

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to audit an authenticated feed
langstring–Output language (default en)
max_batchesinteger–scroll batches (5 default)
urlstringyesFeed URL to audit (best on feeds you own or can authenticate into)

No output schema declared.

No examples provided.

a11y_snapshot ~173

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

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to snapshot behind login
urlstringyesPage URL to snapshot (http/https or file://)

No output schema declared.

No examples provided.

a11y_sr_transcript ~200

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

NameTypeReqDescription
auth_statestring–Path to a Playwright storage_state JSON (exported session) to audit behind login — stays local
browserstring–Browser engine (auto = detect the first available)
langstring–Output language (en default)
timeoutnumber–Page load timeout (45 default)
urlstringyesPage URL to transcribe

No output schema declared.

No examples provided.

a11y_suggest_color ~145

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.

NameTypeReqDescription
bgstringyesThe background it must pass against
fgstringyesThe failing foreground color to fix
targetnumber–Ratio to reach: 4.5 normal text, 3.0 large text/UI, 7.0 AAA (default 4.5)

No output schema declared.

No examples provided.

a11y_vtt_check ~196

WebVTT caption QUALITY (1.2.2) — the substance, not the presence. Everyone stops at "<track> 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}.

NameTypeReqDescription
durationnumber–media duration in seconds — enables the coverage check (1.2.2 completeness)
langstring–output language
urlstringyesURL of the .vtt caption file

No output schema declared.

No examples provided.

a11y_wcag3_preview ~279

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

NameTypeReqDescription
langstring–Output language (en default)
reportobjectyesaudit report object with a findings list (from a11y_audit_url, a11y_audit_dom, a11y_disprove, …)

No output schema declared.

No examples provided.

Install

How do I install the A11Y Toolkit MCP server?

A11Y Toolkit runs locally as a PyPI package, launched with uvx a11y-toolkit. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · a11y-toolkit

# add to Claude Code
claude mcp add kinti-a11y-toolkit -- uvx a11y-toolkit
Common questions

What is the A11Y Toolkit MCP server?

A11Y Toolkit is an MCP server listed in the public MCP registry as io.github.kinti/a11y-toolkit. The accessibility layer for AI coding agents: audit, fix, document and watch - WCAG 2.2. This page covers its PyPI package (a11y-toolkit).

Is the A11Y Toolkit MCP server safe to use?

A11Y Toolkit scores 96 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the A11Y Toolkit MCP server expose?

A11Y Toolkit exposes 35 tools: a11y_audit_url, a11y_audit_dom, a11y_contrast_pair, a11y_contrast_image, a11y_suggest_color, and 30 more. Their descriptions and schemas cost roughly 9,449 tokens of context every time the server is loaded.

Is the A11Y Toolkit MCP server still maintained?

A11Y Toolkit is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the A11Y Toolkit MCP server under?

A11Y Toolkit declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.