Accessibility Scanner
STDIOWeb accessibility scanner for WCAG compliance checks with visual reporting
Web accessibility scanner for WCAG compliance checks with visual reporting
A Model Context Protocol (MCP) server that provides automated web accessibility scanning using Playwright and Axe-core. This server enables LLMs to perform WCAG compliance checks, capture annotated screenshots, and generate detailed accessibility reports. A powerful Model Context Protocol (MCP) server that provides automated web accessibility scanning and browser automation using Playwright and Axe-core. This server enables LLMs to perform WCAG compliance checks, interact with web pages, manage persistent browser sessions, and generate detailed accessibility reports with visual annotations.
✅ Full WCAG 2.0/2.1/2.2 compliance checking (A, AA, AAA levels)
🖼️ Automatic screenshot capture with violation highlighting
📄 Detailed JSON reports with remediation guidance
🎯 Support for specific violation categories (color contrast, ARIA, forms, keyboard navigation, etc.)
🖱️ 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
📑 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
You can install the package using any of these methods:
Using npm:
npm install -g mcp-accessibility-scanner
Install the Accessibility Scanner in VS Code using the VS Code CLI:
For VS Code:
code --add-mcp '{"name":"accessibility-scanner","command":"npx","args":["mcp-accessibility-scanner"]}'
For VS Code Insiders:
code-insiders --add-mcp '{"name":"accessibility-scanner","command":"npx","args":["mcp-accessibility-scanner"]}'
Here's the Claude Desktop configuration:
{ "mcpServers": { "accessibility-scanner": { "command": "npx", "args": ["-y", "mcp-accessibility-scanner"] } } }
You can pass a configuration file to customize Playwright behavior:
{ "mcpServers": { "accessibility-scanner": { "command": "npx", "args": ["-y", "mcp-accessibility-scanner", "--config", "/path/to/config.json"] } } }
Create a config.json file with the following options:
{ "browser": { "browserName": "chromium", "launchOptions": { "headless": true, "channel": "chrome" } }, "timeouts": { "navigationTimeout": 60000, "defaultTimeout": 5000 }, "network": { "allowedOrigins": ["example.com", "trusted-site.com"], "blockedOrigins": ["ads.example.com"] } }
Available Options:
browser.browserName: Browser to use (chromium, firefox, webkit)browser.launchOptions.headless: Run browser in headless mode (default: true on Linux without display, false otherwise)browser.launchOptions.channel: Browser channel (chrome, chrome-beta, msedge, etc.)timeouts.navigationTimeout: Maximum time for page navigation in milliseconds (default: 60000)timeouts.defaultTimeout: Default timeout for Playwright operations in milliseconds (default: 5000)network.allowedOrigins: List of origins to allow (blocks all others if specified)network.blockedOrigins: List of origins to blockThe MCP server provides comprehensive browser automation and accessibility scanning tools:
scan_pagePerforms a comprehensive accessibility scan on the current page using Axe-core.
Parameters:
violationsTag: Array of WCAG/violation tags to checkSupported Violation Tags:
wcag2a, wcag2aa, wcag2aaa, wcag21a, wcag21aa, wcag21aaa, wcag22a, wcag22aa, wcag22aaasection508cat.aria, cat.color, cat.forms, cat.keyboard, cat.language, cat.name-role-value, cat.parsing, cat.semantics, cat.sensory-and-visual-cues, cat.structure, cat.tables, cat.text-alternatives, cat.time-and-mediabrowser_navigateNavigate to a URL.
url (string)browser_navigate_backGo back to the previous page.
browser_navigate_forwardGo forward to the next page.
browser_snapshotCapture accessibility snapshot of the current page (better than screenshot for analysis).
browser_clickPerform click on a web page element.
element (description), ref (element reference), doubleClick (optional)browser_typeType text into editable element.
element, ref, text, submit (optional), slowly (optional)browser_hoverHover over element on page.
element, refbrowser_dragPerform drag and drop between two elements.
startElement, startRef, endElement, endRefbrowser_select_optionSelect an option in a dropdown.
element, ref, values (array)browser_press_keyPress a key on the keyboard.
key (e.g., 'ArrowLeft' or 'a')browser_take_screenshotTake a screenshot of the current page.
raw (optional), filename (optional), element (optional), ref (optional)browser_pdf_saveSave page as PDF.
filename (optional, defaults to page-{timestamp}.pdf)browser_closeClose the page.
browser_resizeResize the browser window.
width, heightbrowser_tab_listList all open browser tabs.
browser_tab_newOpen a new tab.
url (optional)browser_tab_selectSelect a tab by index.
indexbrowser_tab_closeClose a tab.
index (optional, closes current tab if not provided)browser_console_messagesReturns all console messages from the page.
browser_network_requestsReturns all network requests since loading the page.
browser_wait_forWait for text to appear/disappear or time to pass.
time (optional), text (optional), textGone (optional)browser_handle_dialogHandle browser dialogs (alerts, confirms, prompts).
accept (boolean), promptText (optional)browser_file_uploadUpload files to the page.
paths (array of absolute file paths)browser_screen_captureTake a screenshot for coordinate-based interaction.
browser_screen_move_mouseMove mouse to specific coordinates.
element, x, ybrowser_screen_clickClick at specific coordinates.
element, x, ybrowser_screen_dragDrag from one coordinate to another.
element, startX, startY, endX, endYbrowser_screen_typeType text (coordinate-independent).
text, submit (optional)1. Navigate to example.com using browser_navigate
2. Run scan_page with violationsTag: ["wcag21aa"]
1. Use browser_navigate to go to example.com
2. Run scan_page with violationsTag: ["cat.color"]
1. Navigate to example.com with browser_navigate
2. Take a browser_snapshot to see available elements
3. Click the "Sign In" button using browser_click
4. Type "[email protected]" using browser_type
5. Run scan_page on the login page
6. Take a browser_take_screenshot to capture the final state
1. Navigate to example.com
2. Use browser_snapshot to capture all interactive elements
3. Review console messages with browser_console_messages
4. Check network activity with browser_network_requests
1. Open a new tab with browser_tab_new
2. Navigate to different pages in each tab
3. Switch between tabs using browser_tab_select
4. List all tabs with browser_tab_list
1. Navigate to a page
2. Use browser_wait_for to wait for specific text to appear
3. Interact with the dynamically loaded content
Note: Most interaction tools require element references from browser_snapshot. Always capture a snapshot before attempting to interact with page elements.
Clone and set up the project:
git clone https://github.com/JustasMonkev/mcp-accessibility-scanner.git cd mcp-accessibility-scanner npm install
MIT