Aether WCAG Scanner
An MCP server for Claude Code, Cursor, Codex and other coding agents that finds
WCAG 2.1 AA accessibility violations and returns ready-to-apply fixes —
not just a list of problems.
It drives a real browser (Playwright + axe-core) across desktop, tablet, and
mobile viewports, then pairs each violation with a concrete fix: corrected
HTML, the relevant WCAG success criteria, and technique code examples.
It works free without a key. For higher quality, contextual fixes, get a beta
key at beta.allchemylabs.ai (sign in with GitHub).
Why it's different
An AI coding agent working from markup alone has to infer what a page does. Aether runs
the page in a real browser, measures it with axe-core, and grounds every suggested fix in
the WCAG spec, so the agent is working from measurements rather than inference.
Install
Once the official Claude Code marketplace listing is live, you can also install
it directly from there.
Installing with /plugin install inside Claude Code prompts for your
Allchemy Labs API key; paste the key you got from
beta.allchemylabs.ai. Installing from the
terminal (claude plugin install …), or letting Claude run the install for
you, does not prompt, so set the key afterwards with the command below. Run
the same command to change the key later:
The first start installs the plugin's dependencies (about a minute) and the
first scan downloads Chromium for Playwright. If /mcp shows the server as not
connected right after install, wait a moment and run /reload-plugins.
Running without a key
The plugin asks for a key at install because the cloud fixes need one. The
scanner itself runs locally and still works without a key (for example after a
terminal install, or via npx): you get local template fixes for every
violation. A beta key adds higher quality, contextual fixes
from the hosted insights engine; get one at
beta.allchemylabs.ai (sign in with GitHub).
Set it via the prompt above, or put ALLCHEMY_API_KEY=<key> in the .env of
the project you are scanning.
Use it outside Claude Code (any MCP client)
The same server is published to npm and the MCP Registry as
@allchemylabs/aether-wcag-scanner. Any MCP client that speaks stdio can run it:
The first scan downloads Playwright's Chromium once (about 500 MB on disk:
the browser plus its headless shell). Without ALLCHEMY_API_KEY
the scanner still runs fully offline and returns template fixes.
Claude Code gets the /wcag-scan skill, which drives the scan → review → fix → verify
loop. Other agents only see the tool descriptions and the instructions the server sends at
connect time, so for the same behaviour copy AGENTS.md into your project
(Codex reads it natively; Cursor and Windsurf accept it as a rules file). Without it an agent
may fetch the page HTML and guess instead of running the browser scan.
The 5 tools
Just ask Claude naturally, e.g. "check localhost:3000 for accessibility
issues and fix them" — it will pick the right tool.
The /wcag-scan skill
Run /wcag-scan <url> for a guided workflow: scan → review violations → apply
fixes → re-scan to verify → summarize. The skill orchestrates the tools above
and edits your files in place.
Hooks
The plugin adds two hooks to Claude Code:
- Session start: checks that the plugin's dependencies and Chromium are
installed, and installs them on the first run.
- After each edit: when Claude edits an HTML, JSX, TSX, Vue or Svelte file, a
quick heuristic check (no browser) reports possible accessibility issues to
Claude. It never blocks an edit, and its findings can be false positives.
To turn the post-edit check off in every project, run
/plugin configure aether-wcag-scanner@allchemylabs and set Post-edit
accessibility check to false. To turn it off (or back on) for one project, add
this to that project's .claude/settings.local.json:
Use "1" to turn it back on for that project. Restart Claude Code after either
change.
Scanning single-page apps
Pass a spa block to aether_scan_and_fix instead of url:
entryUrl — where the app boots. Routes are discovered by crawling client-side links
unless you list them in routes: [{ "path": "/settings", "name": "Settings" }].
framework — angular, react, vue, or omit to auto-detect.
maxRoutes — cap on discovered routes.
Navigation is client-side (the browser context and app state are kept between routes),
and readiness is decided by a layered stability cascade — DOM quiet, framework hooks such
as Angular testability, pending-request drain — never by Playwright's networkidle,
which deadlocks on apps with long-polling or websockets. A config that sets
networkIdle is rejected for that reason.
Requirements
- Node.js >= 20
- Chromium (installed automatically on first run)
Disclaimer
Aether is an accessibility analysis and guidance tool. Using the platform does not, by
itself, make your website, application, or digital service conformant with WCAG, the ADA
(including Title II), the European Accessibility Act, Section 508, EN 301 549, or any other
accessibility law or standard.
Automated scans detect only a subset of accessibility barriers. A "zero issues" result means
the scanner did not flag anything in its detection range — not that the property is legally
compliant.
You remain responsible for:
- reviewing findings with qualified people
- fixing issues in the underlying code and content
- conducting or commissioning manual testing and audits as needed
- maintaining accessibility as the product changes
- obtaining legal advice for your specific obligations
Aether does not provide legal advice and does not replace an accessibility audit or a
VPAT/ACR prepared by a qualified auditor.
License
MIT for the client (this plugin). The hosted insights engine and related
Allchemy Labs services are proprietary — see LICENSE and NOTICE.