overlayrisk-witness-mcp
# OverlayRiskWitness MCP server
A [Model Context Protocol](https://modelcontextprotocol.io) server that runs the
**free, independent before/after accessibility-overlay witness** from
[OverlayRiskWitness](https://overlayrisk.com) on any public URL.
Accessibility overlay widgets (accessiBe, UserWay, and similar) are sold as one-line
ADA/WCAG compliance fixes, but independent testing routinely shows the underlying page is
unchanged for real assistive-technology users. This server lets an AI agent run the
witness: it loads a page with the overlay **on**, then **off**, captures both states, and
returns one documented finding where the page's public accessibility/compliance claims
don't hold up — with a UTC timestamp.
> Findings are **evidence, not a legal compliance ruling.** This server is independent of
> accessiBe and UserWay; it tests their effect, it does not sell or defend an overlay.
## What this server is (and isn't)
This is a **thin client**. It contains no scanning logic and **no secrets**. Its single
tool POSTs to the hosted API at `https://overlayrisk.com/api/witness`, which does the real
work (overlay detection, headless before/after capture, claim extraction). The full
timestamped **Risk Packet** is a paid checkout on the website — see
[overlayrisk.com/pricing](https://overlayrisk.com/pricing). The MCP server is a free
funnel; it never handles payment.
## Tool
### `witness_page`
| | |
|---|---|
| Input | `{ "url": "https://example.com/checkout" }` — a public HTTP/HTTPS page URL |
| Success | The free-witness JSON: `runId`, `siteUrl`, `overlayVendor` (`accessibe`/`userway`), `pagesTested`, `claimsTested`, `didNotHoldUp`, `freeFinding`, `lockedFindingCount` — plus a note linking to the paid Risk Packet |
| Error | `{ status, code, error }` (e.g. `overlay_no_effect`, `page_fetch_failed`, `witness_timeout`) |
A single witness run can take up to ~3 minutes on cold/heavy sites. That exceeds many
MCP clients' default 60s request timeout. The server emits periodic progress
notifications, so clients that honor `resetTimeoutOnProgress` stay connected
automatically; clients that don't should raise their per-request timeout.
## Install
Run directly with `npx` (no global install):
```bash
npx overlayrisk-witness-mcp
```
The process speaks MCP over stdio.
### Claude Desktop / Cursor / other MCP clients
Add to your client's MCP config:
```json
{
"mcpServers": {
"overlayrisk-witness": {
"command": "npx",
"args": ["-y", "overlayrisk-witness-mcp"]
}
}
}
```
## Configuration
| Env var | Default | Purpose |
|---|---|---|
| `OVERLAYRISK_API_URL` | `https://overlayrisk.com/api/witness` | Override the witness endpoint (e.g. for local dev) |
| `OVERLAYRISK_TIMEOUT_MS` | `200000` | Request timeout in ms |
No API key is required — the free one-page witness is public.
## Develop
```bash
npm install
npm run smoke # offline handshake test (lists tools, no network)
npm start # run the server on stdio
```
## License
MIT © Mert Can Vural
TDQS
Scored across 1 tool
Only one tool exists, so there is no possibility of confusion between tools. The tool's purpose is clearly defined and distinct.
With only one tool, naming consistency is not fully testable, but the tool name 'witness_page' follows a logical verb_noun pattern and is descriptive of its function.
A single tool for a service that could reasonably include multiple related operations (e.g., different types of audits, history, or batch processing) feels extremely thin and insufficient for a cohesive server.
The tool performs one specific check and then directs to an external paid service for further results, leaving the agent with no ability to complete a full workflow or access additional features, making the surface severely incomplete.