npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

mya11yreport-mcp

v1.0.4

Published

Offline MCP server: axe-core accessibility audits + agentic browser interaction (Playwright) over stdio.

Readme

MyA11yReport MCP server

What continuous accessibility monitoring? Check out MyA11yReport MyA11yReport is an automated accessibility scanner that uses AI to filter out false positives and explain genuine WCAG issues in plain English, featuring a centralized dashboard to track active issue counts, severities, and site progress over time.

Try it for free today

About this MCP

An open-source Model Context Protocol server that gives AI agents real accessibility-auditing abilities. It runs axe-core audits and drives a real browser through Playwright (navigate, click, type, check/uncheck, scroll, screenshots, aria snapshots, page JavaScript), plus page reviews for alt text, structure and tab order, and a session-free WCAG 2.2 color-contrast checker.

Built for agents: sessions are explicit, every action is logged, and audit history is keyed by URL. It speaks MCP over stdio and needs no account, no API key and no network service of its own.

What you get

  • Automated audits — run_a11y_audit runs axe-core on the current page and accumulates results per URL.
  • Browser control — navigate, click, type, press_key, check, uncheck, select_option, scroll_by, screenshot, get_page_snapshot, evaluate, get_viewport_size, get_scroll_position.
  • Page reviews — list_images (alt text), get_structure (landmarks, headings, lists, frames), get_tab_order (focus order).
  • Contrast maths — check_color_contrast computes the WCAG 2.2 ratio for any two colors, with no session or browser.
  • Audit guide — get_audit_guide returns the full step-by-step audit workflow as markdown, including which checks must be done by a human.

Requirements

  • Node.js 20 or newer (node --version)
  • Chromium, installed once with one command (see below). It is ~150 MB.
  • For headless: false sessions, a machine with a real display.

Install

From npm (recommended)

npm i -g mya11yreport-mcp
mya11yreport-mcp install chromium

The second step downloads the Chromium build that matches the server's Playwright version. It is a separate step rather than a post-install script because some machines block npm lifecycle scripts. If you skip it, the server still starts and simply tells you to run the command the first time a browser tool is used.

Prefer not to install globally? Use npx:

npx -y mya11yreport-mcp install chromium

To confirm the server starts on your machine:

echo '{}' | mya11yreport-mcp

It should exit cleanly; EOF on stdin closes the server.

From source

Clone the repository and build it locally:

git clone <repository-url> mya11yreport-mcp
cd mya11yreport-mcp
npm install
npm run build
node dist/index.js install chromium

Then run the server from the checkout:

node /path/to/mya11yreport-mcp/dist/index.js

Optionally put the mya11yreport-mcp command on your PATH with npm link, so you can use it anywhere:

npm link
mya11yreport-mcp install chromium

Connect it to your MCP client

Point your MCP client at the server over stdio. In opencode, add it to your project opencode.json or your global ~/.config/opencode/opencode.json.

After a global install or npm link:

{
  "mcp": {
    "mya11y-audit": {
      "type": "local",
      "command": [
        "mya11yreport-mcp"
      ],
      "enabled": true
    }
  }
}

Without a global install, use npx:

"command": [
  "npx",
  "-y",
  "mya11yreport-mcp"
]

When running from a local checkout, point at the built entry file directly:

"command": [
  "node",
  "/path/to/mya11yreport-mcp/dist/index.js"
]

Other MCP clients use the same idea — run the server executable with no arguments over stdio. Restart the client after changing its configuration.

Using the server

You do not call tools yourself: once the server is connected, your agent does. The typical flow is:

  1. get_audit_guide — needs no session: returns the full step-by-step audit workflow as markdown (sitemap enumeration, the automated pass, the structure/tab-order/images/contrast reviews, report format, and the human-only checks). Call it before a full audit. The same guide is published at https://mya11y.report/mcp/auditor-skill.
  2. start_session — returns a sessionId (pass an optional free-form alias, max 225 chars, sanitized to [A-Za-z0-9_-]; omit for a hex id). Also picks headless: true|false.
  3. Pass sessionId to every call: navigate, click, type, press_key, check, uncheck, scroll_by, screenshot, get_page_snapshot, evaluate, get_viewport_size, get_scroll_position, run_a11y_audit, list_images, get_structure, get_tab_order.
  4. Targets are {"selector": "#id"} or {"fn": {"name": "getByRole", "args": ["button", {"name": "Sign in"}]}} (getByRole | getByText | getByLabel | getByPlaceholder | getByAltText | getByTitle).
  5. run_a11y_audit audits the current session page (or navigates to url first) and returns the session's audit history: {pages: string[], audits: [{pageId, audit}]} — one hex pageId per URL, audits accumulate per page.
  6. evaluate runs a JavaScript expression or function in the page via page.evaluate and returns the serialized value (non-serializable or undefined results come back as null with serializable: false). Use it to read computed styles, geometry or custom element state.
  7. check_color_contrast needs no session and no browser: pass two colors (hex or rgb()/rgba()) and optionally fontSizePx/fontWeight, and it returns the WCAG 2.2 ratio, the AA/AAA grades, and whether the pair counts as large text.
  8. list_images returns every <img> / inline <svg> with its accessible name and source, src/currentSrc, sanitized SVG markup, a decorative flag and derived missingAlt/longAlt flags plus counts. Filter with filter: all | decorative | missing-alt | has-alt.
  9. get_structure returns landmark regions, headings, nested lists and iframes, plus a heading outline grouped by region with skipped-level / repeated-H1 flags. Regions and headings also carry their raw ariaLabel / ariaLabelledby attributes. Narrow with include: [...].
  10. get_tab_order returns the Tab order (positive tabindex first, then document order) with each stop's tag, accessible name (text), effective tabindex, shadow-piercing selector, raw ariaLabel / ariaLabelledby, nameSource, hasLabel and outOfOrder flags.
  11. close_session when done.

The three review tools (list_images, get_structure, get_tab_order) inspect the top frame and open shadow roots only. get_tab_order uses the same tabbable engine, vendored into the build.

Sessions and logs

  • Sessions auto-close after 5 minutes of inactivity.
  • Every session writes an action history to .mya11yreport-mcp/logs/<sessionId>/<sessionId>.json. Screenshots land in the same directory as <actionId>.png.
  • Nothing is sent off your machine; the logs are plain local files you can inspect or delete at any time.

Configuration

| Variable | Default | Purpose | |----------------------------|--------------------------------|-----------------------------------------| | MYA11Y_MCP_IDLE_CLOSE_MS | 300000 (5 min) | Idle auto-close delay (min 1000) | | MYA11Y_MCP_LOG_DIR | <cwd>/.mya11yreport-mcp/logs | Session log directory | | PLAYWRIGHT_HEADLESS | true | Default headless mode (param overrides) |

headless: false needs a real display on the host machine.

Troubleshooting

  • "Run mya11yreport-mcp install chromium" — you have not installed the browser yet. Run that command once.
  • Timeouts or "element not found" — the target was not actionable in time. Ask the agent to call get_page_snapshot to discover targets, or retry with a larger timeoutMs.
  • Server exits immediately — that is expected when stdin closes (for example in the smoke test above). It is not an error.