# A11Y Toolkit (pypi · a11y-toolkit)

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

- Trust score: 78/100 (medium)
- Change this week: +20
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- pypi · `a11y-toolkit`: 78/100 (this document), [markdown](https://verifymcp.io/servers/kinti-a11y-toolkit/a11y-toolkit.md), [page](https://verifymcp.io/servers/kinti-a11y-toolkit/a11y-toolkit)

## Channel facts

- Registry: `pypi`
- Package: `a11y-toolkit`
- Version: `3.20.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 81/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4517 tokens (~196/item across 23 items; 23 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 43/100
  - Stability observed for 13 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 23 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

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

### Claude

```bash
claude mcp add kinti-a11y-toolkit -- uvx a11y-toolkit
```

### Cursor

```json
{
  "mcpServers": {
    "kinti-a11y-toolkit": {
      "command": "uvx",
      "args": [
        "a11y-toolkit"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "kinti-a11y-toolkit": {
      "command": "uvx",
      "args": [
        "a11y-toolkit"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add kinti-a11y-toolkit -- uvx a11y-toolkit
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "kinti-a11y-toolkit": {
      "type": "local",
      "command": [
        "uvx",
        "a11y-toolkit"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add kinti-a11y-toolkit --command uvx --arg a11y-toolkit
```

### Hermes

```yaml
mcp_servers:
  kinti-a11y-toolkit:
    command: "uvx"
    args: ["a11y-toolkit"]
```

### Netclaw

```json
{
  "McpServers": {
    "kinti-a11y-toolkit": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "a11y-toolkit"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add kinti-a11y-toolkit -t stdio -c uvx -a a11y-toolkit
```

### Other

```json
{
  "mcpServers": {
    "kinti-a11y-toolkit": {
      "command": "uvx",
      "args": [
        "a11y-toolkit"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-19 (score 78, +16)

- [security regression] Stability: 0.37 → unverified
- [security regression] Tool safety: pass → unverified
- [security improvement] Malware scan: unverified → pass
- [functional regression] Schema quality: 3565 → 4517
- [functional regression] Schema quality: 3565 → 4243
- [functional regression] Schema quality: 3565 → 3997
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional] Package version: 3.13.2 → 3.20.0
- [functional] Package version: 3.13.2 → 3.19.0
- [functional] Package version: 3.13.2 → 3.18.0
- [functional] Package version: 3.13.2 → 3.17.0
- [functional] Package version: 3.13.2 → 3.16.0

### 2026-09-18 (score 62, −15)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 3.12.1 → 3.13.2
- [functional] Package version: 3.12.1 → 3.13.0

### 2026-09-17 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-16 (score 76, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-09-15 (score 61, −12)

- [security regression] Malware scan: pass → unverified
- [security regression] Stability: 0.23 → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Schema quality: 146 → 196
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional improvement] Tool coverage: 35% → 100%
- [functional] Schema quality: good → excellent
- [functional] Package version: 3.10.0 → 3.12.1
- [functional] Package version: 3.10.0 → 3.12.0

### 2026-09-14 (score 73, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-09-13 (score 58, −15)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 3.8.0 → 3.10.0
- [functional] Package version: 3.8.0 → 3.9.0

### 2026-09-12 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (23)

### `a11y_audit_url` (~394 tokens)

a11y-toolkit: Express WCAG audit

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.

Input parameters:

- `html` (string): raw HTML to audit directly (overrides url)
- `lang` (string): output language (en default)
- `pages` (integer): light same-domain crawl: audit up to N pages, aggregated by score and recurring signals (default 1, max 20)
- `timeout` (number): fetch timeout seconds (30 default)
- `url` (string): URL to fetch and audit

### `a11y_audit_dom` (~227 tokens)

a11y-toolkit: Rendered WCAG audit

Deep RENDERED WCAG audit via local Playwright/Chromium: real computed text contrast against effective backgrounds with alpha compositing (1.4.3), minimum target size 24×24 (2.5.8, new in WCAG 2.2), visible focus indicator heuristic (2.4.7), plus rendered versions of the static checks (alt, accessible names, labels, headings, lang/title, tabindex, aria-hidden, captions, tables). Findings include remediation. Requires playwright: pip install playwright && playwright install chromium. — Use instead of a11y_audit_url on JS-heavy pages; needs local Playwright.

Input parameters:

- `auth_state` (string): Path to a Playwright storage_state JSON (exported session) to audit behind login — local file, never uploaded
- `lang` (string): Output language for findings and remediation (default en)
- `timeout` (number): page load timeout seconds (45 default)
- `url` (string, required): Page URL to load in Chromium (http/https or file:// for local fixtures)

### `a11y_contrast_pair` (~166 tokens)

a11y-toolkit: Contrast ratio + verdicts

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.

Input parameters:

- `bg` (string, required): Background color: same formats; alpha composites over white
- `fg` (string, required): Foreground/text color: #hex, rgb(), hsl() or a CSS color name; alpha composites over bg
- `lang` (string): output language (en default)

### `a11y_contrast_image` (~203 tokens)

a11y-toolkit: Text-over-image contrast

TEXT OVER IMAGE contrast: pixel-level sampling of the real background behind the text box → worst/median/p95 ratio, % of area passing AA, and automatic hostile-zone detection on a 3×3 grid (zona_peor). What pair-only checkers cannot do. region="x,y,w,h" recommended. — Use instead of a11y_contrast_pair whenever the background is a photo/gradient.

Input parameters:

- `lang` (string): Output language (default en)
- `path` (string, required): Local path to the screenshot/image the text sits on (PNG/JPG/PPM)
- `region` (string): Text bounding box as "x,y,width,height" in pixels (strongly recommended: defines what to sample)
- `sample` (integer): Pixel step: 4 samples every 4px (auto-raised for huge regions)
- `text_color` (string, required): The text color as rendered over the image (must be opaque)

### `a11y_suggest_color` (~126 tokens)

a11y-toolkit: Nearest passing color

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.

Input parameters:

- `bg` (string, required): The background it must pass against
- `fg` (string, required): The failing foreground color to fix
- `target` (number): Ratio to reach: 4.5 normal text, 3.0 large text/UI, 7.0 AAA (default 4.5)

### `a11y_generate_declaration` (~401 tokens)

a11y-toolkit: Accessibility statement (EAA/RD 1112)

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

Input parameters:

- `contenido_no_accesible` (array): Non-accessible content list: one string per item, ideally criterion + reason + alternative
- `disponibilidad_alternativa` (string): Where to get the content in an alternative accessible format
- `entidad` (string, required): Legal entity name as it should appear in the statement (company, body…)
- `estado` (string, required): Compliance state: plena | parcial | no_conforme (parcial is the honest default when findings exist)
- `fecha_evaluacion` (string): ISO date of the last evaluation (YYYY-MM-DD)
- `fecha_revision` (string): ISO date of the next scheduled review
- `feedback` (string): Contact channel for accessibility feedback (email or URL)
- `lang` (string): Statement language (default en; es uses the Spanish legal wording)
- `marco` (string): Legal framework: rd1112 (Spanish public sector, art. 10) or eaa (European Accessibility Act / private sector)
- `metodo` (string): How conformance was evaluated (e.g. "self-evaluation: a11y-toolkit screening + manual review")
- `output_path` (string): save the HTML here (optional)
- `reclamacion` (string): Claim/complaint procedure URL or address (legally required in several jurisdictions)
- `url` (string, required): Website URL the statement covers

### `a11y_snapshot` (~151 tokens)

a11y-toolkit: A11y snapshot + tab order

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

Input parameters:

- `auth_state` (string): Path to a Playwright storage_state JSON (exported session) to snapshot behind login
- `url` (string, required): Page URL to snapshot (http/https or file://)

### `a11y_diff` (~102 tokens)

a11y-toolkit: Snapshot regression diff

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.

Input parameters:

- `a` (string, required): BEFORE snapshot (inline JSON or path)
- `b` (string, required): AFTER snapshot (inline JSON or path)

### `a11y_diff_urls` (~78 tokens)

a11y-toolkit: Staging vs production diff

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.

Input parameters:

- `url_a` (string, required): First URL (usually staging)
- `url_b` (string, required): Second URL (usually production)

### `a11y_aria_live_snippet` (~85 tokens)

a11y-toolkit: aria-live monitor snippet

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.

Input parameters:

- `lang` (string): monitor panel language (en default)

### `a11y_badge` (~132 tokens)

a11y-toolkit: Honest SVG badge

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.

Input parameters:

- `fecha` (string): ISO date (today by default)
- `lang` (string): Badge language (default en)
- `score` (number, required): 0-100 (from an audit result)

### `a11y_autofix` (~183 tokens)

a11y-toolkit: Deterministic safe auto-fixes

DETERMINISTIC safe auto-fixes applied to HTML — the honest anti-overlay: a short closed list of fixes where the correct answer is unique (unblock viewport zoom 1.4.4, add the exact autocomplete token 1.3.5, fill missing html lang and empty title when provided). Everything requiring judgment (alt text, contrast, accessible names) is NOT touched — it returns no_aplicados with the reason and remediation instead. Returns fixed_html + aplicados + no_aplicados. — Only the closed allowlist of provably safe fixes; judgment fixes come back as no_aplicados with remediation.

Input parameters:

- `html` (string, required): raw HTML to fix
- `lang` (string): only if provided and <html> lacks lang
- `title` (string): only if provided and <title> is empty

### `a11y_reflow` (~220 tokens)

a11y-toolkit: 320px reflow check

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.

Input parameters:

- `auth_state` (string): Path to a Playwright storage_state JSON (exported session) to test behind login
- `lang` (string): Output language (default en)
- `timeout` (number): Page load timeout in seconds (default 45)
- `url` (string, required): Page URL to test at 320px (http/https or file://)

### `a11y_keyboard` (~193 tokens)

a11y-toolkit: Keyboard-trap detector

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.

Input parameters:

- `auth_state` (string): Path to a Playwright storage_state JSON (exported session) to Tab-walk behind login
- `lang` (string): Output language (default en)
- `max_pasos` (integer): max real Tab presses (60 default)
- `url` (string, required): Page URL to Tab-walk (http/https or file://)

### `a11y_scroll` (~248 tokens)

a11y-toolkit: Infinite-scroll audit

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.

Input parameters:

- `auth_state` (string): Path to a Playwright storage_state JSON (exported session) to audit an authenticated feed
- `lang` (string): Output language (default en)
- `max_tandas` (integer): scroll batches (5 default)
- `url` (string, required): Feed URL to audit (best on feeds you own or can authenticate into)

### `a11y_evidence` (~272 tokens)

a11y-toolkit: Evidence pack (countersignature-ready)

Builds the COUNTERSIGNATURE-READY 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: a full criteria matrix (automated-fail / automated-review / not-flagged — NOT pass / manual-only), the list of A/AA criteria with no automated signal anywhere (the human reviewer homework list), 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 countersign it. Evidence, never conformance. — The tier-3 handoff object; feed it every audit report you have.

Input parameters:

- `evaluador` (object): {"nombre":…, "credencial":…, "fecha_revision":…} to prefill the signature block
- `informes` (array, required): audit report objects (any mode)
- `snapshot` (object): a11y_snapshot output (optional)
- `verificados` (array): Criterion codes an agent/human verified against this sample (manual checklist protocol) — they become agent-verified in the matrix; automated-fail stays fail

### `a11y_forms` (~188 tokens)

a11y-toolkit: Form error testing

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.

Input parameters:

- `auth_state` (string): Path to a Playwright storage_state JSON to test forms behind login
- `lang` (string): Output language (en default)
- `timeout` (number): Page load timeout seconds (45 default)
- `url` (string, required): Page URL with the form(s) to test

### `a11y_html_validate` (~220 tokens)

a11y-toolkit: W3C Nu validation

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.

Input parameters:

- `base_url` (string): Base URL of a self-hosted vnu instance (docker ghcr.io/validator/validator) instead of the public W3C service
- `html` (string): Raw HTML to validate — POSTs the content to validator.w3.org/nu; use url or a self-hosted instance for sensitive pages
- `lang` (string): Output language (en default)
- `url` (string): Page URL to validate (shares the URL with the W3C service)

### `a11y_hover` (~116 tokens)

a11y-toolkit: Hover dismissibility (1.4.13)

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.

Input parameters:

- `lang` (string): Output language (en default)
- `timeout` (number): Page load timeout (45 default)
- `url` (string, required): Page URL to test

### `a11y_sr_transcript` (~130 tokens)

a11y-toolkit: Screen reader transcript

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.

Input parameters:

- `lang` (string): Output language (en default)
- `timeout` (number): Page load timeout (45 default)
- `url` (string, required): Page URL to transcribe

### `a11y_disprove` (~143 tokens)

a11y-toolkit: Disprover: re-verify findings

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.

Input parameters:

- `informe` (object): existing audit report (optional; if absent, audits first)
- `lang` (string): Output language (en default)
- `timeout` (number): Timeout seconds (30 default)
- `url` (string, required): URL to re-verify against

### `a11y_ledger` (~131 tokens)

a11y-toolkit: Coverage ledger (persistent)

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.

Input parameters:

- `action` (string, required): What to do
- `informe` (object): audit report object (for record)
- `ledger_path` (string): ledger file path (default: a11y-ledger.json)
- `url` (string): URL (for record/gaps)

### `a11y_criterion` (~135 tokens)

a11y-toolkit: WCAG criterion explained

Explains a WCAG 2.2 success criterion in plain language (es/en): what it requires, typical failures, and how to verify it with this toolkit (which tool automates which part). Codes like "1.4.3", "2.5.8", "4.1.2". Use it whenever you need to explain WHY a finding matters or what the criterion actually says. — Knowledge lookup; does not fetch or audit anything.

Input parameters:

- `code` (string, required): criterion number, e.g. 1.4.3
- `lang` (string): Explanation language (default en)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/kinti-a11y-toolkit/a11y-toolkit#diagnostics

## Score history

- 2026-09-20: 78
- 2026-09-19: 78
- 2026-09-18: 62
- 2026-09-17: 77
- 2026-09-16: 76
- 2026-09-15: 61
- 2026-09-14: 73
- 2026-09-13: 58
- 2026-09-12: 73
- 2026-09-11: 72
- 2026-09-10: 72
- 2026-09-09: 71
- 2026-09-08: 56
- 2026-09-07: 71

## 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 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. 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 23 tools: a11y_audit_url, a11y_audit_dom, a11y_contrast_pair, a11y_contrast_image, a11y_suggest_color, and 18 more. Their descriptions and schemas cost roughly 4,244 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 20 September 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.

## Links

- PyPI project: https://pypi.org/project/a11y-toolkit/
- Socket report: https://socket.dev/pypi/package/a11y-toolkit
- Repository: https://github.com/kinti/a11y-toolkit
- Website: https://jquin.net/lab/
- Changelog RSS feed: https://verifymcp.io/servers/kinti-a11y-toolkit/a11y-toolkit.xml
- Changelog JSON feed: https://verifymcp.io/servers/kinti-a11y-toolkit/a11y-toolkit.json
- HTML version of this page: https://verifymcp.io/servers/kinti-a11y-toolkit/a11y-toolkit
