mcp-accessibility-scannerBLOCK
An MCP (Model Context Protocol) server for performing accessibility audits on webpages using axe-core.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://mcptoplist.com/server/io.github.JustasMonkev%2Fmcp-accessibility-scanner)
Star History
[](https://api.star-history.com/svg?repos=justasmonkev%2Fmcp-accessibility-scanner&type=Date)
[](https://mseep.ai/app/justasmonkev-mcp-accessibility-scanner)
A Model Context Protocol (MCP) server for accessibility scanning and browser automation with Playwright and Axe-core. It supports page interaction, persistent browser sessions, and accessibility reports with visual annotations.
Features
Accessibility Scanning
✅ Automated checks for WCAG 2.0/2.1/2.2 criteria (A, AA, AAA levels)\ 📄 Detailed JSON reports with remediation guidance 🎯 Support for specific violation categories (color contrast, ARIA, forms, keyboard navigation, etc.)
Browser Automation
🖱️ Click, hover, and drag elements using accessibility snapshots ⌨️ Type text and handle keyboard inputs 🔍 Capture page snapshots to discover all interactive elements 📸 Take screenshots and save PDFs 🎯 Support for both element-based and coordinate-based interactions
Advanced Features
📑 Tab management for multi-page workflows 🌐 Monitor console messages and network requests ⏱️ Wait for dynamic content to load 📁 Handle file uploads and browser dialogs 🔄 Navigate through browser history
Installation
You can install the package using any of these methods:
Using npm:
npm install -g mcp-accessibility-scanner --allow-scripts=re2
npm 12 does not run dependency install scripts unless you allow them. The scanner depends on `re2`, a native module whose install script downloads or builds `re2.
97cf2740b623OBSERVED · 2026-10-12Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add mcp-accessibility-scanner --env PLAYWRIGHT_MCP_AUTH_TOKEN=${PLAYWRIGHT_MCP_AUTH_TOKEN} --env PLAYWRIGHT_MCP_EXTENSION_TOKEN=${PLAYWRIGHT_MCP_EXTENSION_TOKEN} --env PLAYWRIGHT_MCP_PROXY_BYPASS=${PLAYWRIGHT_MCP_PROXY_BYPASS} -- npx -y [email protected]{
"mcpServers": {
"mcp-accessibility-scanner": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"PLAYWRIGHT_MCP_AUTH_TOKEN": "${PLAYWRIGHT_MCP_AUTH_TOKEN}",
"PLAYWRIGHT_MCP_EXTENSION_TOKEN": "${PLAYWRIGHT_MCP_EXTENSION_TOKEN}",
"PLAYWRIGHT_MCP_PROXY_BYPASS": "${PLAYWRIGHT_MCP_PROXY_BYPASS}"
}
}
}
}Exposed tools (72)
58 read · 12 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
absent | read | absent |
alternate | read | Alternate provider |
audit-keyboard-report | read | JSON report for keyboard navigation, focus, and skip-link findings. |
audit-screen-reader-report | write | JSON report for accessible name quality and reading order findings. |
audit-site-report | read | Aggregated JSON report for the site accessibility crawl. |
audit_keyboard | write | Audit keyboard tab order, focus visibility, jumps, skip links, and focus traps. |
audit_screen_reader | write | Audit accessible name quality and reading order using the browser accessibility tree and element geometry. |
audit_site | read | Crawl internal pages and aggregate accessibility violations across the site. |
browser_click | read | Perform click on a web page |
browser_close | read | Close the page |
browser_connect | read | Do not call, this tool is used in the integration with the Playwright VS Code Extension and meant for programmatic usage only. |
browser_console_messages | read | Returns all console messages |
browser_default_timeout | read | Sets the default timeout for all Playwright operations (clicks, fills, etc). Only affects existing tabs and does not persist across browser context recreation. |
browser_drag | destructive | Perform drag and drop between two elements |
browser_drop | destructive | Simulate an external drag and drop of files or clipboard-like data onto an element |
browser_emulate_media | read | Emulate CSS media features for the page. Omitted parameters keep their current state. |
browser_evaluate | read | Evaluate JavaScript expression on page or element |
browser_file_upload | write | Upload one or multiple files |
browser_fill_form | read | Fill multiple form fields |
browser_find | read | Search the accessibility snapshot of the current page for text or a regular expression. Returns matching snapshot nodes with a few lines of surrounding context, each shown under its path from the root of the tree. |
browser_handle_dialog | read | Handle a dialog |
browser_hover | read | Hover over element on page |
browser_install | write | Install the browser specified in the config. Call this if you get an error about the browser not being installed. |
browser_mouse_click_xy | read | Click mouse button at a given position |
browser_mouse_drag_xy | read | Drag left mouse button to a given position |
browser_mouse_move_xy | write | Move mouse to a given position |
browser_navigate | read | Navigate to a URL |
browser_navigate_back | read | Go back to the previous page |
browser_navigation_timeout | read | Sets the timeout for navigation and page load actions. Only affects the current tab and does not persist across browser context recreation. |
browser_network_request | read | Returns credential-redacted headers and body metadata for a single network request listed by browser_network_requests |
browser_network_requests | read | Returns all network requests since loading the page |
browser_pdf_save | write | Save page as PDF |
browser_press_key | read | Press a key on the keyboard |
browser_resize | read | Resize the browser window |
browser_select_option | read | Select an option in a dropdown |
browser_session_close | read | Close a browser session previously opened with browser_session_open and release its browser resources. The default session cannot be closed this way. |
browser_snapshot | read | Capture accessibility snapshot of the current page, this is better than screenshot |
browser_start_recording | write | Start recording actions that the user performs in the browser as Playwright code. Call browser_stop_recording when the user is done. |
browser_stop_recording | write | Stop the recording started with browser_start_recording and return the recorded actions as Playwright code. |
browser_tabs | write | List, create, close, or select a browser tab. |
browser_take_screenshot | read | Take a screenshot of the current page. You can |
browser_type | read | Type text into editable element |
browser_verify_element_visible | read | Verify element is visible on the page |
browser_verify_list_visible | read | Verify list is visible on the page |
browser_verify_text_visible | read | Verify text is visible on the page. Prefer ${verifyElement.schema.name} if possible. |
browser_verify_value | read | Verify element value |
browser_wait_for | read | Wait for text to appear or disappear or a specified time to pass. When both text and textGone are provided, waits for the first one to happen |
default | read | Starts standalone browser |
duplicate | read | first |
echo | read | changed |
extension | read | Connect to a browser using the Playwright MCP extension |
forged | read | |
hang | read | hang-${index} |
idempotent_state_change | read | Converges to the requested state |
identity | read | Identity tool |
my_tool | read | Description |
native_echo | read | native-frame-${index} |
prepare | read | |
probe | read | Probe tool |
replacement | read | Replacement |
report | read | Test report |
scan-page-annotated-screenshot | read | Full-page screenshot with violating elements outlined and labelled with their rule id. |
scan-page-matrix-report | read | JSON report containing per-variant Axe results and baseline deltas. |
scan_page | read | Scan the current page for accessibility violations using Axe |
scan_page_matrix | write | Run accessibility scans across viewport/media/zoom variants and compare with baseline. |
shared_echo | read | shared document |
state_changing | read | State-changing tool |
tab_tool | read | A tab tool |
test_read | read | Read-only tool |
test_tool | read | A test tool |
test_write | write | Destructive tool |
tool_alternate | read | a |
Trust audit
BLOCKgrade D · trust 61/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (5 observation(s))
- Network
- declared (8 observation(s))
- Shell
- declared (3 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
**Behind a login:** the crawl shares the browser context, so signing in with `browser_navigate` / `browser_fill_form` first is enough. Alternatively record a session with `npx [email protected] codege
'location': `http://127.0.0.1:${state.deadPort}/gone`,state.fixtureOrigin = `http://127.0.0.1:${address.port}`;resolve({ url: `http://127.0.0.1:${address.port}/audit-site`, close: () => closeFixtureServer(server) });const secret = 'startup-secret-do-not-print';
browser_drag, browser_drop
.oxlintrc.json
.graphify_labels.json
.graphify_python
.graphify_root
expect(() => new Function('page', `return async () => {\n${response.code()}\n};`)).not.toThrow();expect(() => new Function(`return ${wrapped}`)).not.toThrow();expect(() => new Function(`return ${toFunctionSource(source, onElement)}`)).not.toThrow();await new Function('page', `return (async () => { ${response.code()} })();`)(page);await new Function('page', `return (async () => { ${response.code()} })();`)(page);import type { Config } from '../../config.js';import type { ToolCapability } from '../../config.js';it.each(['my-profile', 'Default/../../etc', 'Profile 1 ', ''])('rejects an invalid profile directory name from the CLI: %s', async profileDirName => {const result = await outputFile(config, 'test/../../../etc/passwd');
'https://169.254.169.254/latest/sitemap.xml': '<urlset><url><loc>https://example.com/one</loc></url></urlset>',
sitemapUrl: 'https://169.254.169.254/latest/sitemap.xml',
const redirectTarget = 'https://169.254.169.254/latest/sitemap.xml';
network: { blockedOrigins: ['169.254.169.254'] },'ws://169.254.169.254/',
- Advertised vs enforced: with `--host 0.0.0.0` the server printed `http://0.0.0.0:<port>/mcp`, but its own Host-header allowlist rejected that Host with 403; earlier, wildcard binds never added inter
Gates applied: critical_finding, no_behavioural_pass, undeclared_transfer.
97cf2740b623full audit observations/trust-audit/mcp-server/justasmonkev__mcp-accessibility-scanner.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | 97cf2740b623 | BLOCK | D | 61 | first audit |
Questions
What is the mcp-accessibility-scanner MCP server?
An MCP (Model Context Protocol) server for performing accessibility audits on webpages using axe-core.
What tools does mcp-accessibility-scanner expose?
72 in total: 58 read-only, 12 that write, and 2 that can delete or overwrite (browser_drag, browser_drop). Every one is listed on this page with its risk.
Is mcp-accessibility-scanner safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (61/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does mcp-accessibility-scanner need?
It reads PLAYWRIGHT_MCP_AUTH_TOKEN, PLAYWRIGHT_MCP_EXTENSION_TOKEN and PLAYWRIGHT_MCP_PROXY_BYPASS from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does mcp-accessibility-scanner run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as mcp-accessibility-scanner at 4.0.0.
How current is this page?
The grade is for one exact copy of the source (97cf2740b623), read on 2026-10-12. The repository is watched and re-audited when it changes.