The output is a keystroke count plus the path that produces it, per target, attached to a selector, the penalties that raised the score and candidate fixes. A saved baseline and `diff_results` then make a fix verifiable rather than asserted. It is an announcement simulator calibrated against the W3C ARIA-AT assertions, which the project is explicit about — critical journeys still want a real screen reader.
A screen-reader navigation-cost analyzer with an MCP server built in. Conformance scanners answer whether the ARIA is correct; this answers a different question — how expensive is it for someone on NVDA, JAWS or VoiceOver to reach the checkout button. It drives a real browser through Playwright, builds a navigation graph from landmarks, headings and linear Tab, and scores every interactive target.
- A scored analysis of one page, SARIF by default, with optional exploration of menus, dialogs, tabs and disclosures and opt-in keyboard and form probes — `analyze_url`
- The step-by-step path to a single target, with the announcements a screen reader would make along the way — `trace_path`
- Predicted paths checked against `@guidepup/virtual-screen-reader`, returning reachability and mean accuracy per strategy — `validate_url`
- Site-level triage across several routes, with aggregated stats and navigation costs that repeat from page to page — `analyze_pages`
- Before-and-after comparison of two runs: improvements, regressions and severity changes — `diff_results`
- Ranked fix suggestions by impact, and the AT profiles available to run under — `suggest_remediations`, `list_profiles`
- Sign-in state saved once so protected pages can be analyzed — `save_auth`
- Observed calibration datasets run against saved analysis JSON, returning structured scoring signals — `calibration_report`
Node.js 20 or later and `npm install tactual`. Playwright and the MCP SDK ship as runtime dependencies, so the installed `tactual-mcp` binary starts the stdio server with nothing else to install; the README's client entry resolves `tactual-mcp` through npm, which does not have that name. `tactual-mcp --http` serves `http://127.0.0.1:8787/mcp` instead, which the project asks you to put behind an authenticated TLS proxy. The URL-taking MCP tools accept only `http:` and `https:`, never local files, and private IP ranges are not filtered — treat the URL an agent supplies as trusted input.
One command — npm install tactual
