loading…
Search for a command to run...
loading…
Provides conversational, actionable accessibility testing for AI agents, including auditing, prioritization, and code-level fixes.
Provides conversational, actionable accessibility testing for AI agents, including auditing, prioritization, and code-level fixes.
A Model Context Protocol (MCP) server that provides conversational, actionable accessibility testing. This server exposes accessibility auditing tools that can be used by AI agents and chat interfaces.
npx command)Add this server to your MCP client configuration (e.g., Claude Desktop, Cursor):
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"accessibility-audit": {
"command": "npx",
"args": ["-y", "@dallask/a11y-mcp-srv"]
}
}
}
Add to your Cursor MCP settings (~/.cursor/mcp.json or Cursor Settings → MCP):
{
"mcpServers": {
"accessibility-audit": {
"command": "npx",
"args": ["-y", "@dallask/a11y-mcp-srv"]
}
}
}
Restart Claude Desktop or Cursor to load the new MCP server configuration.
That's it! You're ready to use all 25+ accessibility tools. The package will be automatically downloaded and cached by npx on first use.
How it works:
npx automatically downloads and runs the package if needed-y flag answers "yes" to prompts (non-interactive)You can configure the server via your MCP client’s env section (e.g. Cursor MCP settings or Claude Desktop config). These options follow the same style as joe-watkins/accessibility-testing-mcp.
| Variable | Values | Default | Description |
|---|---|---|---|
A11Y_ENGINE |
axe, ace |
axe |
Testing engine: axe-core (Deque) or IBM Equal Access (ACE). |
WCAG_LEVEL |
2.0_A, 2.0_AA, 2.0_AAA, 2.1_A, 2.1_AA, 2.1_AAA, 2.2_A, 2.2_AA, 2.2_AAA |
2.1_AA |
WCAG version and level used when the tool does not specify tags. |
BEST_PRACTICES |
true, false |
true |
Include best-practice rules (adds best-practice tag when no tags are provided). |
SCREEN_SIZES |
Comma-separated WIDTHxHEIGHT |
1280x1024 |
Viewport size(s) for the browser (e.g. 1280x1024,320x640). The first size is used for audits. |
HEADLESS_BROWSER |
true, false |
true |
Run the browser in headless mode; set to false to show the browser window. |
Cursor (~/.cursor/mcp.json or Settings → MCP):
{
"mcpServers": {
"accessibility-audit": {
"command": "npx",
"args": ["-y", "@dallask/a11y-mcp-srv"],
"env": {
"A11Y_ENGINE": "axe",
"WCAG_LEVEL": "2.2_AA",
"BEST_PRACTICES": "true",
"SCREEN_SIZES": "1280x1024,320x640",
"HEADLESS_BROWSER": "true"
}
}
}
}
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"accessibility-audit": {
"command": "npx",
"args": ["-y", "@dallask/a11y-mcp-srv"],
"env": {
"A11Y_ENGINE": "axe",
"WCAG_LEVEL": "2.2_AA",
"BEST_PRACTICES": "true",
"HEADLESS_BROWSER": "true"
}
}
}
}
Tool parameters (e.g. engine, tags) override these defaults when provided in a request.
Once configured, you can immediately start using the accessibility tools in your AI assistant:
Example: Audit a website
"Audit https://example.com for accessibility issues"
Example: Get quick fixes
"Show me quick fixes for the accessibility issues on cursor.com"
Example: Generate compliance report
"Generate a VPAT report for docs.atlan.com"
Example: Compare before/after
"Compare the accessibility of example.com before and after the redesign"
The AI assistant will automatically use the appropriate tools to fulfill your requests!
audit_url - Single URL AuditTest a single URL for accessibility issues with conversational, actionable results.
Inputs:
url (required): Full URL or relative pathdomain (optional): Base domain if URL is relativetags (optional): Array of accessibility tags to check (e.g., ["wcag2a", "wcag2aa", "wcag21a", "best-practice"]). If not provided, all tags are checked.waitForLoad (optional): Wait strategy - "networkidle" (default) | "load" | "domcontentloaded"timeout (optional): Timeout in seconds (default: 30)Example:
{
"url": "https://example.com",
"tags": ["wcag21aa"],
"timeout": 45
}
Output: Structured JSON with summary, prioritized violations, WCAG compliance breakdown, quick fix suggestions, and conversational explanation.
audit_multiple_urls - Batch AuditTest multiple URLs efficiently with progress updates.
Inputs:
urls (required): Array of URLs or comma-separated stringdomain (optional): Base domaintags (optional): Array of accessibility tagsparallel (optional): Number of parallel tests (default: 1)continueOnError (optional): Continue if one fails (default: true)Example:
{
"urls": ["/home", "/about", "/contact"],
"domain": "https://example.com",
"tags": ["wcag2aa"],
"parallel": 2
}
Output: Per-URL results, aggregated summary, and progress updates (streaming).
audit_site - Smart Site AuditIntelligent site-wide audit with prioritization.
Inputs:
domain (required): Base domaintags (optional): Array of accessibility tags. Applied to all pages.strategy (optional): "critical" | "comprehensive" | "custom" (default: "comprehensive")maxPages (optional): Maximum pages to test (default: 50)priorityPaths (optional): Array of high-priority paths to test firstExample:
{
"domain": "https://example.com",
"strategy": "critical",
"priorityPaths": ["/", "/login", "/checkout"],
"tags": ["wcag21aa"],
"maxPages": 20
}
Output: Prioritized results (critical pages first), site-wide score, and trend analysis if previous audits exist.
create_session - Authenticated SessionCreate a reusable authenticated session for testing protected pages.
Inputs:
domain (required): Base domainusername (required): Login usernamepassword (required): Login passwordloginUrl (optional): Custom login URL (default: {domain}/login)loginSelectors (optional): Custom selectors for login form:usernameSelector (default: "input[type='email'], input[name='username'], input[id='username']")passwordSelector (default: "input[type='password']")submitSelector (default: "button[type='submit'], input[type='submit']")sessionId (optional): Custom session identifier (auto-generated if not provided)Example:
{
"domain": "https://app.example.com",
"username": "[email protected]",
"password": "password123",
"loginUrl": "https://app.example.com/auth/login"
}
Output:
sessionId: Reusable session identifierexpiresAt: Session expiration time (ISO 8601)testUrl: Test URL to verify sessionDifferentiator: Only MCP with reusable session management for authenticated pages.
audit_with_session - Authenticated AuditRun an audit using an existing authenticated session.
Inputs:
sessionId (required): Session from create_sessionurl (required): URL to test (can be relative)domain (optional): Base domaintags (optional): Array of accessibility tagswaitForLoad (optional): Wait strategy (default: "networkidle")timeout (optional): Timeout in seconds (default: 30)Example:
{
"sessionId": "session-abc123",
"url": "/dashboard",
"domain": "https://app.example.com",
"tags": ["wcag21aa"]
}
Output: Same as audit_url but for authenticated pages.
get_accessibility_score - Calculate ScoreCalculate accessibility score (0-100) with detailed breakdowns.
Inputs:
results (required): Audit result object or URL stringweights (optional): Custom weights for different issue types:errors (default: 10)contrast (default: 8)alerts (default: 5)features (default: 3)structural (default: 6)Example:
{
"results": "https://example.com",
"weights": {
"errors": 15,
"contrast": 10
}
}
Output:
prioritize_issues - Smart PrioritizationIntelligently prioritize issues, identifying quick wins and critical blockers.
Inputs:
results (required): Audit result objectcriteria (optional): "impact" | "wcag" | "fixability" | "user-impact" (default: "impact")limit (optional): Top N issues to return (default: 10)Example:
{
"results": { /* audit result object */ },
"criteria": "fixability",
"limit": 5
}
Output:
explain_issue - Educational ToolExplain what an accessibility issue means in plain language.
Inputs:
ruleId (required): Accessibility rule ID (e.g., "alt_missing", "contrast", "label_missing")context (optional): Additional context about the issue (HTML element, page URL, etc.)Example:
{
"ruleId": "alt_missing",
"context": "Image on homepage hero section"
}
Output:
Differentiator: Educational focus - helps users learn accessibility.
get_quick_fixes - Actionable FixesGet specific fix suggestions with before/after code examples.
Inputs:
results (required): Audit result object or URL stringformat (optional): "markdown" | "html" | "json" (default: "json")includeCode (optional): Include code examples (default: true)Example:
{
"results": "https://example.com",
"format": "markdown",
"includeCode": true
}
Output:
Differentiator: Code-level fixes, not just descriptions.
generate_compliance_report - Compliance DocumentationGenerate compliance reports in various formats.
Inputs:
results (required): Audit result objectformat (optional): "VPAT" | "WCAG" | "ADA" | "Section508" (default: "WCAG")level (optional): "A" | "AA" | "AAA" (default: "AA")includeRemediation (optional): Include fix suggestions (default: true)Example:
{
"results": { /* audit result object */ },
"format": "VPAT",
"level": "AA",
"includeRemediation": true
}
Output:
get_wcag_compliance - WCAG StatusCheck WCAG compliance status with per-criterion breakdown.
Inputs:
results (required): Audit result object or URL stringlevel (optional): "A" | "AA" | "AAA" (default: "AA")Example:
{
"results": "https://example.com",
"level": "AA"
}
Output:
compare_accessibility - Before/After ComparisonCompare two audits to track improvements.
Inputs:
before (required): Previous audit result or URLafter (required): Current audit result or URLformat (optional): "summary" | "detailed" | "diff" (default: "summary")Example:
{
"before": "https://example.com/v1",
"after": "https://example.com/v2",
"format": "detailed"
}
Output:
track_accessibility - Historical TrackingTrack accessibility over time with trend analysis.
Inputs:
url (required): URL to tracktimeframe (optional): "7d" | "30d" | "90d" | "all" (default: "30d")metric (optional): "score" | "issues" | "wcag-compliance" (default: "score")Example:
{
"url": "https://example.com",
"timeframe": "90d",
"metric": "score"
}
Output:
export_to_csv - Export to CSVExport audit results to CSV format for spreadsheet analysis, including metadata and violation rows.
Inputs:
results (required): Audit result object or URL stringincludeMetadata (optional): Include test information and environment data (default: true)includeViolations (optional): Include detailed violation rows (default: true)format (optional): "standard" | "detailed" | "minimal" (default: "standard")Example:
{
"results": "https://example.com",
"format": "detailed",
"includeMetadata": true,
"includeViolations": true
}
Output:
Use case: Import into Excel, share with stakeholders, data analysis
export_to_excel - Export to ExcelExport audit results to Excel/XLSX format with formatting. Requires xlsx package.
Inputs:
results (required): Audit result object or URL stringincludeCharts (optional): Generate charts for score trends and category breakdown (default: false)formatting (optional): Apply colors, headers, and styling (default: true)Example:
{
"results": { /* audit result object */ },
"includeCharts": true,
"formatting": true
}
Output:
xlsx)Use case: Professional reports, presentations, stakeholder sharing
Note: Requires xlsx package. Install with npm install xlsx.
export_to_json - Export to JSONExport audit results as structured JSON with optional raw results.
Inputs:
results (required): Audit result object or URL stringpretty (optional): Pretty-print JSON (default: true)includeRaw (optional): Include raw accessibility engine results (default: false)Example:
{
"results": "https://example.com",
"pretty": true,
"includeRaw": false
}
Output:
Use case: API integration, data processing, backup
export_to_html_report - Generate HTML ReportGenerate standalone HTML report with styling and optional visual charts.
Inputs:
results (required): Audit result object or URL stringtemplate (optional): "default" | "minimal" | "detailed" (default: "default")includeCharts (optional): Include visual charts (default: true)Example:
{
"results": "https://example.com",
"template": "detailed",
"includeCharts": true
}
Output:
Use case: Web sharing, email reports, documentation
filter_issues - Filter IssuesFilter issues from audit results by various criteria (rule IDs, categories, impact levels, WCAG levels, etc.). Supports include/exclude modes.
Inputs:
results (required): Audit result objectfilters (required): Object with filter criteria:ruleIds (optional): Array of rule IDs to include/excludecategories (optional): Array of categories (error, contrast, etc.)impactLevels (optional): Array of impact levels ("critical", "serious", "moderate", "minor")wcagLevels (optional): Array of WCAG levels ("A", "AA", "AAA")minCount (optional): Minimum occurrence countelementTypes (optional): Filter by HTML element types (e.g., ["img", "input", "button"])mode (optional): "include" | "exclude" (default: "include")Example:
{
"results": { /* audit result object */ },
"filters": {
"impactLevels": ["critical", "serious"],
"wcagLevels": ["A", "AA"]
},
"mode": "include"
}
Output:
Use case: Focus on specific issue types, exclude false positives
search_issues - Search IssuesSearch issues by text content, selector, XPath, or description. Supports case-sensitive and case-insensitive search.
Inputs:
results (required): Audit result objectquery (required): Search query stringfields (optional): Array of fields to search ("description", "element", "xpath", "selector", "ruleId", "userImpact", "fix", "all") (default: ["all"])caseSensitive (optional): Case-sensitive search (default: false)Example:
{
"results": { /* audit result object */ },
"query": "missing alt",
"fields": ["description", "userImpact"],
"caseSensitive": false
}
Output:
Use case: Find specific issues, locate elements
aggregate_audit_results - Aggregate ResultsCombine and aggregate multiple audit results. Groups issues by URL, category, rule, or none, and provides aggregated summary statistics.
Inputs:
results (required): Array of audit result objectsgroupBy (optional): "url" | "category" | "rule" | "none" (default: "url")includeSummary (optional): Include aggregated summary statistics (default: true)Example:
{
"results": [
{ /* audit result 1 */ },
{ /* audit result 2 */ }
],
"groupBy": "category",
"includeSummary": true
}
Output:
Use case: Site-wide reports, batch analysis, trend identification
get_statistics - Generate StatisticsGenerate detailed statistics from audit results with breakdowns by category, impact, WCAG level, or rule ID. Supports single or multiple audit results.
Inputs:
results (required): Audit result object or array of audit resultsbreakdown (optional): Array of breakdown dimensions ("category", "impact", "wcag", "rule") (default: all dimensions)Example:
{
"results": [
{ /* audit result 1 */ },
{ /* audit result 2 */ }
],
"breakdown": ["category", "impact", "wcag"]
}
Output:
Use case: Dashboard data, reporting, analysis
generate_dashboard - Generate DashboardCreate a visual dashboard summary of audit results with key metrics, charts, and summaries. Supports multiple formats and optional charts.
Inputs:
results (required): Audit result object, array of audit results, URL string, or array of URL stringsformat (optional): "text" | "markdown" | "html" | "json" (default: "markdown")includeCharts (optional): Include ASCII/text charts (default: true)Example:
{
"results": ["https://example.com/page1", "https://example.com/page2"],
"format": "markdown",
"includeCharts": true
}
Output:
Use case: Quick overview, presentations, status reports
generate_summary_report - Generate Summary ReportGenerate executive summary report with key findings and recommendations. Supports multiple formats and detail levels.
Inputs:
results (required): Audit result object, array of audit results, URL string, or array of URL stringsformat (optional): "text" | "markdown" | "html" (default: "markdown")level (optional): "executive" | "detailed" | "technical" (default: "executive")Example:
{
"results": "https://example.com",
"format": "markdown",
"level": "executive"
}
Output:
Use case: Stakeholder communication, documentation
Filter results by specific WCAG levels or best practices:
wcag2a - WCAG 2.0 Level Awcag2aa - WCAG 2.0 Level AAwcag2aaa - WCAG 2.0 Level AAAwcag21a - WCAG 2.1 Level Awcag21aa - WCAG 2.1 Level AA (most common requirement)wcag21aaa - WCAG 2.1 Level AAAbest-practice - Best practice recommendationsExample Usage:
// Only check WCAG 2.1 AA compliance
{
"url": "https://example.com",
"tags": ["wcag21aa"]
}
// Check multiple WCAG levels
{
"url": "https://example.com",
"tags": ["wcag2a", "wcag2aa", "best-practice"]
}
All audit tools return structured results in the following format:
{
summary: {
totalIssues: number
score: number
wcagCompliance: { A: number, AA: number, AAA: number }
byCategory: Record<string, number>
byImpact: Record<string, number>
}
prioritizedIssues: Array<{
ruleId: string
impact: 'critical' | 'serious' | 'moderate' | 'minor'
description: string
wcagLevel: string
tags: string[] // Array of tags this violation matches
element: string
xpath: string
fix: {
current: string
suggested: string
explanation: string
}
userImpact: string
priority: number
}>
conversationalSummary: string
quickWins: Array<{
ruleId: string
description: string
impact: string
fix: string
}>
criticalBlockers: Array<{
ruleId: string
description: string
impact: string
}>
appliedFilters?: {
tags?: string[]
originalIssueCount?: number
}
}
{
"tool": "audit_url",
"arguments": {
"url": "https://example.com",
"tags": ["wcag21aa"]
}
}
Step 1: Create Session
{
"tool": "create_session",
"arguments": {
"domain": "https://app.example.com",
"username": "[email protected]",
"password": "password123"
}
}
Step 2: Audit Protected Page
{
"tool": "audit_with_session",
"arguments": {
"sessionId": "<session-id-from-step-1>",
"url": "/dashboard",
"tags": ["wcag21aa"]
}
}
{
"tool": "audit_multiple_urls",
"arguments": {
"urls": ["/home", "/about", "/contact", "/products"],
"domain": "https://example.com",
"parallel": 2,
"tags": ["wcag2aa"]
}
}
{
"tool": "get_quick_fixes",
"arguments": {
"results": "https://example.com",
"format": "markdown",
"includeCode": true
}
}
{
"tool": "compare_accessibility",
"arguments": {
"before": "https://example.com/v1",
"after": "https://example.com/v2",
"format": "detailed"
}
}
{
"tool": "generate_compliance_report",
"arguments": {
"results": { /* audit result object */ },
"format": "VPAT",
"level": "AA",
"includeRemediation": true
}
}
{
"tool": "export_to_csv",
"arguments": {
"results": "https://example.com",
"format": "detailed",
"includeMetadata": true,
"includeViolations": true
}
}
{
"tool": "export_to_excel",
"arguments": {
"results": { /* audit result object */ },
"includeCharts": true,
"formatting": true
}
}
{
"tool": "export_to_json",
"arguments": {
"results": "https://example.com",
"pretty": true,
"includeRaw": false
}
}
{
"tool": "export_to_html_report",
"arguments": {
"results": "https://example.com",
"template": "detailed",
"includeCharts": true
}
}
{
"tool": "filter_issues",
"arguments": {
"results": { /* audit result object */ },
"filters": {
"impactLevels": ["critical", "serious"],
"wcagLevels": ["A", "AA"]
},
"mode": "include"
}
}
{
"tool": "search_issues",
"arguments": {
"results": { /* audit result object */ },
"query": "missing alt",
"fields": ["description", "userImpact"],
"caseSensitive": false
}
}
{
"tool": "aggregate_audit_results",
"arguments": {
"results": [
{ /* audit result 1 */ },
{ /* audit result 2 */ }
],
"groupBy": "category",
"includeSummary": true
}
}
{
"tool": "get_statistics",
"arguments": {
"results": [
{ /* audit result 1 */ },
{ /* audit result 2 */ }
],
"breakdown": ["category", "impact", "wcag"]
}
}
{
"tool": "generate_dashboard",
"arguments": {
"results": ["https://example.com/page1", "https://example.com/page2"],
"format": "markdown",
"includeCharts": true
}
}
{
"tool": "generate_summary_report",
"arguments": {
"results": "https://example.com",
"format": "markdown",
"level": "executive"
}
}
The server includes comprehensive error handling:
Common error scenarios:
a11y-mcp-srv/
├── src/
│ ├── server.ts # Main MCP server entry point
│ ├── tools/ # Tool implementations
│ │ ├── audit.ts # Core audit tools
│ │ ├── session.ts # Session management
│ │ ├── analysis.ts # Analysis & reporting
│ │ ├── comparison.ts # Comparison tools
│ │ ├── export.ts # Export tools (CSV, Excel, JSON, HTML)
│ │ ├── filter.ts # Filtering and search tools
│ │ ├── aggregate.ts # Aggregation and statistics tools
│ │ └── visualize.ts # Visualization and dashboard tools
│ ├── core/ # Core accessibility functionality
│ │ ├── accessibility-runner.ts # Accessibility execution
│ │ ├── session-manager.ts # Session handling
│ │ ├── result-processor.ts # Result formatting
│ │ ├── error-handler.ts # Error handling
│ │ └── progress-streamer.ts # Progress updates
│ └── types/ # TypeScript types
├── dist/ # Compiled JavaScript
├── wave.min.js # Accessibility engine script (required)
├── package.json
├── tsconfig.json
└── README.md
If you want to contribute or modify the code, you can set up a local development environment:
Clone the repository
git clone <repository-url>
cd a11y-mcp-srv
Install dependencies
npm install
Install Playwright browsers
npx playwright install --with-deps chromium
Build the project
npm run build
Verify accessibility script
wave.min.js is present in the project rootDevelopment Mode (with watch)
npm run dev
Production Mode
npm start
If you want to use the local version instead of the published package:
{
"mcpServers": {
"accessibility-audit": {
"command": "node",
"args": ["/absolute/path/to/a11y-mcp-srv/dist/server.js"]
}
}
}
Note: Use absolute paths in your configuration.
explain_issue teaches accessibility concepts, not just reports problemsThis project is derived from alii13/accessibility-mcp-server, which is licensed under the MIT License. The original copyright notice and license are preserved in this distribution. See the NOTICE file for details.
MIT License - feel free to use in your projects!
Contributions are welcome! Please ensure all code follows the existing style and includes appropriate tests.
For issues, questions, or contributions, please open an issue on the repository.
Happy accessibility testing! ♿✨
Run in your terminal:
claude mcp add accessibility-mcp-server -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.