MCP server for web accessibility remediation - audits pages against WCAG (axe-core, deterministic) and applies fixes.
mcp-a11y demonstrates solid domain-specific tool design with clear accessibility focus. All 7 tools have descriptions (194 - 392 chars, within baseline) and explicit input schemas with Zod validation. However, several tools lack output schema documentation, parameter descriptions are sometimes sparse, and error handling guidance is minimal. Tool naming is strong (verb_noun pattern: audit_page, fix_contrast, generate_alt_text). The open_pr tool includes a security guardrail comment but no formal permission-gate pattern. Most tools are READ_ONLY (safe), but open_pr is WRITE and lacks confirmation/dry-run support. Schemas are present but not all parameters are fully described (e.g., 'target' in fix_contrast lacks range/default clarity).
Audit a web page against WCAG rules with axe-core (Playwright headless Chromium). 100% deterministic detection - no LLM. Returns structured violations with selectors and colors.
Compute the closest WCAG-compliant foreground color for a fg/bg pair (AA 4.5:1 normal text). Deterministic - no LLM.
Describe an image for an HTML alt attribute using a vision model. The ONLY LLM-backed tool. Provide either `imageUrl`, or `selector` + `pageUrl` to locate an <img> on a page.
Build a self-contained before/after HTML accessibility report from an audit and applied fixes. No LLM. Returns the HTML string.
Open a mergeable PR with the remediated files. STRICT GUARDRAIL: only ever operates on the repo configured in A11Y_TARGET_REPO - never an arbitrary repo.
Health check. Returns 'pong', optionally echoing a message.
Output schemas not documented. Tools return JSON via structuredContent but LLMs cannot infer field names, types, or required fields. E.g., audit_page returns AuditResult but schema is not visible in tool registration.
open_pr (WRITE tool) lacks confirmation/dry-run pattern. No mechanism to preview PR before creation or require user approval. Agents can create PRs without safeguard.
Parameter descriptions incomplete. 'target' in fix_contrast lacks default value (4.5 mentioned in tool description, not param description). 'lang' in simple_fixes defaults to 'en' but not stated in schema. LLMs cannot infer defaults.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2025-06-18+ | v2 |
Apply deterministic structural fixes to HTML: missing lang, missing title, unlabeled form controls. Returns the patched HTML and the list of fixes. No LLM.
Error handling lacks recovery guidance. generate_alt_text and open_pr catch errors and return isError=true with message, but do not classify as retryable/user-fixable/fatal or suggest next steps.
generate_report parameter 'auditAfter' and array params lack detailed type descriptions. LLMs cannot determine structure of AuditResult, AppliedFix[], ContrastReinjection[] objects.