Skip to main content
Glama

axe-devtools-mcp

An MCP server that runs axe-core accessibility audits and returns the results to any MCP client — including Claude Code, Claude Desktop, and Cursor.

It renders pages in headless Chromium (via Playwright), injects axe-core, and reports WCAG violations with impact levels, affected elements, and fix guidance.

Tools

Tool

Description

scan_url

Load a URL (live site or local dev server) in headless Chromium and run an axe-core audit.

scan_html

Run an axe-core audit against a raw HTML string.

scan_file

Scan a local .html file on disk (loaded via file:// so linked CSS/assets resolve). Good for static-site build output.

scan_site

Crawl a running site breadth-first from a start URL, following same-origin links, and audit every page (up to maxPages). Returns an aggregated report plus per-page detail.

Both tools accept:

  • tags — WCAG / rule tags to run, e.g. ["wcag2a", "wcag2aa", "wcag21aa", "best-practice"]

  • rules — only run these axe rule ids, e.g. ["color-contrast", "image-alt"]

  • excludeRules — axe rule ids to skip

  • detail"full" (default; lists offending elements + fixes) or "summary" (rule + counts only)

  • maxNodes — max offending elements to list per rule when detail="full" (default 5)

  • includeIncomplete — also report axe "incomplete" items: checks that need manual review (e.g. color-contrast over background images, aria-hidden focus). Off by default; set true to surface likely issues that automated rules could not confirm.

scan_url and scan_file also accept include (CSS selector to scope the scan) and timeoutMs. scan_file takes a path (absolute, or relative to the server's working directory). scan_site additionally takes maxPages (default 5, max 50) and sameOriginOnly (default true).

Scanning your own site / codebase

axe-core is a runtime engine — it audits the rendered DOM, not your source files. To audit code you're building:

  • Running app (best): start your dev server (npm run dev), then scan_url http://localhost:3000/..., or scan_site http://localhost:3000 to crawl every route in one call. This tests exactly what users get after your framework renders.

  • Static build output: scan_file ./dist/index.html. Note single-page-app builds are usually empty shells hydrated by JS, so scan the running server instead.

  • Source-level linting (a different, complementary tool): eslint-plugin-jsx-a11y, eslint-plugin-vuejs-accessibility, etc.

Related MCP server: A11y MCP Server

Requirements

  • Node.js >= 18

  • A Chromium browser managed by Playwright. npm install runs npx playwright install chromium automatically; if that was skipped, run it manually:

    npx playwright install chromium

Use with Claude Code

Register the server with the Claude Code CLI:

# From npm (once published)
claude mcp add axe-devtools -- npx -y axe-devtools-mcp

# Or from a local clone
claude mcp add axe-devtools -- node /absolute/path/to/axe-devtool-mcp/dist/index.js

Then in Claude Code:

Scan https://example.com for accessibility issues.

Use with other MCP clients

This is a standard stdio MCP server, so it works in any MCP-capable client. Once published to npm, every client uses the same npx invocation; before publishing, replace it with node /absolute/path/to/axe-devtool-mcp/dist/index.js.

Claude Desktop

Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json), then restart the app:

{
  "mcpServers": {
    "axe-devtools": {
      "command": "npx",
      "args": ["-y", "axe-devtools-mcp"]
    }
  }
}

VS Code / GitHub Copilot (Agent mode)

Add a .vscode/mcp.json in your workspace (note the servers key), then enable it from the Copilot Chat "Tools" picker in Agent mode:

{
  "servers": {
    "axe-devtools": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "axe-devtools-mcp"]
    }
  }
}

Cursor

Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

{
  "mcpServers": {
    "axe-devtools": {
      "command": "npx",
      "args": ["-y", "axe-devtools-mcp"]
    }
  }
}

Tip: some clients (e.g. background/headless runners) don't run npm lifecycle scripts, so the Chromium auto-install won't fire. If a scan fails to launch a browser, run npx playwright install chromium once on that machine.

Run from source

git clone https://github.com/Ravindrabisht12/axe-devtool-mcp.git
cd axe-devtool-mcp
npm install
npm run build
node dist/index.js   # speaks MCP over stdio

Publish to npm

npm login
npm publish --access public

After publishing, anyone can run it with npx -y axe-devtools-mcp — no clone required.

How it works

MCP client (Claude Code)
   │  stdio (JSON-RPC)
   ▼
axe-devtools-mcp  ──►  Playwright (headless Chromium)  ──►  axe-core injected into the page
   ▲                                                              │
   └──────────────  formatted violations + fixes  ◄──────────────┘

License

MIT

Available Tools

4 tools
scan_fileScan a local HTML file for accessibility issuesA

Runs an axe-core accessibility audit against a local .html file on disk (loaded via file:// so linked CSS/assets resolve). Use for static-site build output. Note: single-page-app build files are usually empty shells hydrated by JS — scan the running dev server with scan_url instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to a local .html file (absolute, or relative to the server's cwd).
tagsNoWCAG / rule tags to run, e.g. ["wcag2a","wcag2aa","wcag21aa","best-practice"]. Omit to run the default rule set.
rulesNoOnly run these axe rule ids, e.g. ["color-contrast","image-alt"].
detailNo"summary" lists violated rules and counts only; "full" (default) also lists offending elements and fix guidance.full
includeNoOptional CSS selector to scope the scan to one region of the page.
maxNodesNoMax offending elements to list per rule when detail=full.
timeoutMsNoLoad timeout in ms (default 30000).
excludeRulesNoAxe rule ids to skip.
includeIncompleteNoAlso report axe "incomplete" items — checks that need manual review (e.g. color-contrast over images, aria-hidden focus). Off by default; set true to surface likely issues automated rules could not confirm.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses the file:// loading behavior but does not mention side effects, error handling, or whether the file is modified. While safe to assume read-only, more detail on outcomes would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences are front-loaded with purpose and usage guidance. Every sentence adds value, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having 9 parameters and no output schema, the description covers purpose and key context. However, it lacks explanation of the output format, which is needed since no output schema exists. This gap prevents a higher score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description does not mention any parameters or add meaning beyond the schema, so it does not exceed baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs an axe-core audit against a local .html file, specifying the file:// loading mechanism. It distinguishes itself from sibling tools by advising against scanning SPAs and directing to scan_url instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (static-site build output) and when not to (single-page app build files), providing a clear alternative (scan_url). This gives an agent actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_htmlScan raw HTML for accessibility issuesA

Runs an axe-core accessibility audit against a raw HTML string (rendered in headless Chromium). Use for markup snippets or generated HTML that isn't served at a URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
htmlYesThe HTML markup to scan.
tagsNoWCAG / rule tags to run, e.g. ["wcag2a","wcag2aa","wcag21aa","best-practice"]. Omit to run the default rule set.
rulesNoOnly run these axe rule ids, e.g. ["color-contrast","image-alt"].
detailNo"summary" lists violated rules and counts only; "full" (default) also lists offending elements and fix guidance.full
maxNodesNoMax offending elements to list per rule when detail=full.
excludeRulesNoAxe rule ids to skip.
includeIncompleteNoAlso report axe "incomplete" items — checks that need manual review (e.g. color-contrast over images, aria-hidden focus). Off by default; set true to surface likely issues automated rules could not confirm.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It discloses that the scan runs axe-core in headless Chromium, which is transparent for a read-only scan. However, it does not mention potential limitations (e.g., handling of external resources) or return value details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—two sentences with no extraneous text. It front-loads the core purpose and follows with a clear usage statement, earning high marks for efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 7 parameters and no output schema, the description is minimally adequate. It covers purpose and use case but omits any description of return values or output structure, leaving agents without expectations for what the tool returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds no parameter-specific information beyond what the schema already provides, meeting the baseline but not exceeding it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: running an axe-core accessibility audit on a raw HTML string. It distinguishes itself from siblings by specifying usage for markup snippets or generated HTML not served at a URL.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance on when to use: 'Use for markup snippets or generated HTML that isn\'t served at a URL.' This clearly defines the use case and implicitly excludes URL-based scans, differentiating from siblings like scan_url.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_siteCrawl a running site and scan multiple pagesA

Crawls a running site breadth-first starting from a URL, following same-origin links, and runs an axe-core audit on each page (up to maxPages). Returns an aggregated report plus per-page detail. Use to audit a whole site/app in one call instead of scanning routes one by one.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe start URL to crawl from (http:// or https://).
tagsNoWCAG / rule tags to run, e.g. ["wcag2a","wcag2aa","wcag21aa","best-practice"]. Omit to run the default rule set.
rulesNoOnly run these axe rule ids, e.g. ["color-contrast","image-alt"].
detailNo"summary" lists violated rules and counts only; "full" (default) also lists offending elements and fix guidance.full
maxNodesNoMax offending elements to list per rule when detail=full.
maxPagesNoMaximum number of pages to crawl and scan (default 5, max 50).
timeoutMsNoPer-page navigation timeout in ms (default 30000).
excludeRulesNoAxe rule ids to skip.
sameOriginOnlyNoOnly follow links on the same origin as the start URL (default true).
includeIncompleteNoAlso report axe "incomplete" items — checks that need manual review (e.g. color-contrast over images, aria-hidden focus). Off by default; set true to surface likely issues automated rules could not confirm.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes crawling strategy (breadth-first, same-origin links, max pages) and audit behavior. With no annotations, the description covers key behavioral traits, though it omits potential error conditions or performance implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, no redundant words, and key information is front-loaded. Every sentence contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 10 parameters and no output schema, the description adequately explains what it does and when to use it, but lacks details about the return format (e.g., structure of the aggregated report). Sibling tools are noted but not directly compared.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; each parameter already has a description. The overall description adds minimal extra meaning (e.g., 'breadth-first') beyond what the schema provides, so baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it crawls a site breadth-first, runs axe-core audits on each page, and returns aggregated plus per-page results. Distinguishes from siblings by focusing on whole-site scanning.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use to audit a whole site/app in one call instead of scanning routes one by one,' providing a clear when-to-use scenario. Could be improved by explicitly contrasting with single-page tools like scan_url.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_urlScan a URL for accessibility issuesA

Loads a URL in headless Chromium, runs an axe-core accessibility audit, and returns WCAG violations with fix guidance. Use for live pages (http/https) or local dev servers.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to scan (http:// or https://).
tagsNoWCAG / rule tags to run, e.g. ["wcag2a","wcag2aa","wcag21aa","best-practice"]. Omit to run the default rule set.
rulesNoOnly run these axe rule ids, e.g. ["color-contrast","image-alt"].
detailNo"summary" lists violated rules and counts only; "full" (default) also lists offending elements and fix guidance.full
includeNoOptional CSS selector to scope the scan to one region of the page.
maxNodesNoMax offending elements to list per rule when detail=full.
timeoutMsNoNavigation timeout in milliseconds (default 30000).
excludeRulesNoAxe rule ids to skip.
includeIncompleteNoAlso report axe "incomplete" items — checks that need manual review (e.g. color-contrast over images, aria-hidden focus). Off by default; set true to surface likely issues automated rules could not confirm.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses loading in headless Chromium and running axe-core, but does not mention side effects (likely read-only), permissions, or security considerations. Behavior is adequately, not thoroughly, described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: two sentences with no wasted words. It front-loads the primary action and context, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lacks details about return value structure (e.g., output schema), error handling, or pagination. With no output schema, a more complete description of the response format would be beneficial. For a tool with 9 parameters and no output schema, the description is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with all parameters described in the schema. The description adds no additional parameter semantics beyond the schema. Baseline of 3 is appropriate as the schema already provides sufficient detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: scanning a URL for accessibility issues using axe-core. It specifies the target (live pages or local dev servers), distinguishing it from sibling tools like scan_file or scan_html.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for use: 'Use for live pages (http/https) or local dev servers.' It implicitly excludes non-live content (files, HTML strings, site maps), but does not explicitly mention when not to use it or name alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv0.4.0
    • First observedscan_file
    • First observedscan_html
    • First observedscan_site
    • First observedscan_url

TDQS

A4.3/5.0
Disambiguation5/5

Each tool targets a distinct input type (file, HTML string, live URL, whole site crawl), leaving no ambiguity about which to use.

Naming Consistency5/5

All tools follow a consistent 'scan_<target>' pattern, making the naming predictable and intuitive.

Tool Count5/5

With 4 tools, the set covers the main use cases for accessibility auditing without being excessive or insufficient.

Completeness5/5

The tools provide a complete workflow for auditing static files, HTML snippets, single pages, and entire sites, with no obvious gaps.

Maintenance

ActivityStale
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An MCP (Model Context Protocol) server for performing accessibility audits on webpages using axe-core. Use the results in an agentic loop with your favorite AI assistants (Cline/Cursor/GH Copilot) and let them fix a11y issues for you!
    2
    228
    52
    Mozilla Public 2.0
  • A
    license
    A
    quality
    C
    maintenance
    A lightweight local MCP server that runs axe-core accessibility audits via Playwright and returns compressed, actionable results optimized for Claude's context window.
    5
    105
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Ravindrabisht12/axe-devtool-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server