The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Prufa MCP listing page.
Vibe-coded apps ship faster than anyone can review them. In June 2026 we audited 49 fresh Show HN launches — 38 had a critical bug on day one: a broken signup, a silent console error, analytics that never fired, a consent banner that did nothing.
Prufa is the agent that catches those before your users do. Point it at a URL and it audits the things humans skip when they're moving fast — broken flows, JS console errors, missing tracking, consent violations, security headers, mobile tap targets, accessibility — and hands back machine-verified findings, graded A–F. This repo is the open-source MCP server that wires that audit straight into your coding agent.

Ask your agent to audit https://yourapp.com and prufa_run_audit returns one
JSON report. Findings are grouped into graded sections, each finding carries a
severity, the impact (why it matters), and a fix hint. Real output,
trimmed:
report_url is a shareable HTML version of the same report. The full payload
also includes tracking, consent, seo/aeo, a11y, forms, and detected
user flows — see the OSS surface below.
The package is on PyPI. Install it
globally with pipx (recommended — isolated venv, exposes the prufa-mcp
binary on your PATH) or into a project venv with pip:
You also need a free Prufa API key. The first audit is free, no card required.
The MCP server runs as a stdio subprocess, spawned by your agent on first use.
The cleanest way to register it is claude mcp add (Claude Code's built-in
command — it writes the config to ~/.claude.json correctly, which the
~/.claude/mcp.json path does NOT).
Restart Claude Code (config is read at startup), then verify:
You should see prufa listed as Connected, with prufa_run_audit and
prufa_get_report as available tools.
.mcp.json)In your project root or in ~/.config/Claude/ etc.:
Restart the host app. The command path must be the absolute binary path
(not ~, not $()) — those don't expand in MCP config.
Prefer config files to env vars? Drop your token in
~/.config/prufa/mcp.jsoninstead — see ADVANCED.md.
In your agent:
prufa_run_audit with wait=true (the default) blocks until the audit
completes and returns the JSON report directly — typically 25–60s for a public
page. If you set wait=false, the call returns immediately with the queued
state plus a share_token you can poll with prufa_get_report.
prufa-mcp exposes the whole product over MCP (44 tools). Point your agent
at Prufa and it can audit pages, drive multi-step flows, watch for regressions,
run chaos tests, run full-auto discovery, and manage the workspace + billing —
no dashboard round-trip. Free/anonymous tools need no card; Pro tools return the
API's 402 with a checkout link when you're not on a plan (the tool is visible,
the paywall is server-side).
| Tool | What it does |
|---|---|
prufa_run_audit(url, wait=true) | One-shot public-page audit; blocks and returns findings JSON. |
prufa_get_report(run_id?, share_token?) | Fetch a report by UUID or /r/ slug. |
prufa_get_run(run_id) | Poll a run's status. |
prufa_list_runs(limit) | Recent runs in the workspace. |
prufa_get_finding(run_id, finding_key?) | Persisted findings, machine-readable. |
prufa_list_alerts() | Alert ledger (newest first, incl. suppressions). |
| Tool | What it does |
|---|---|
prufa_setup_workspace(owner_email, name?) | Create a free, no-card agent_temp workspace (7-day trial) and return an API token once. If a token is already set, returns the real workspace + trial state. |
prufa_get_workspace() | Current workspace + inlined usage + a trial block. |
prufa_get_usage() | Usage object + trial/upsell blocks — call before metered actions. |
prufa_workspace_settings(...) | Usage webhook, auto-recharge, email/Slack switches. |
prufa_set_notifications(cells) | The 9-event × {email, slack} routing matrix. |
| Tool | What it does |
|---|---|
prufa_upgrade_plan(tier) | Stripe checkout URL for a paid plan (starter/pro/team). |
prufa_buy_credits(credits) | Stripe checkout URL for a one-time credit pack. |
prufa_billing_portal() | Stripe customer portal URL (card, invoices, cancel). |
| Tool | What it does |
|---|---|
prufa_create_flow(url, test_case, name?) | Compile a plain-text test case to a draft spec. |
prufa_confirm_flow(flow_id, spec?) | Approve a draft — only confirmed flows run. |
prufa_run_flow(flow_id, credentials?) | Execute a confirmed flow. |
prufa_set_flow_credentials(flow_id, credentials) | Store {{VAR}} values (write-only). |
prufa_edit_flow(flow_id, spec) | Edit the spec (returns it to draft). |
prufa_get_flow · prufa_list_flows · prufa_delete_flow | Read · list · remove. |
| Tool | What it does |
|---|---|
prufa_start_monitor(url, cadence?, flow_id?) | 1-click monitor; returns a deploy-hook secret once. |
prufa_trigger_monitor(monitor_id) | Run now (rate-capped). |
prufa_pause_monitor · prufa_resume_monitor · prufa_get_monitor · prufa_list_monitors · prufa_delete_monitor | Lifecycle. |
prufa_rotate_monitor_webhook(monitor_id) | Rotate the deploy-hook secret. |
prufa_list_monitor_deliveries(monitor_id) | Deploy-hook delivery log + CI snippets. |
| Tool | What it does |
|---|---|
prufa_run_gremlin(url, persona?, direction?, credentials?) | Imitate a difficult user; detectors verify what breaks. Mutations dry-run unless authorized; payments never execute. |
prufa_rerun_gremlin(run_id) | Re-run a past gremlin with the same intent + saved login. |
prufa_authorize_domain(host, allow_mutation?) | Allow real (non-payment) writes on a host you own. |
prufa_list_gremlin_domains() | List mutation authorizations. |
prufa_gremlin_saved_logins() | Reuse a prior login (owning workspace only — sensitive). |
prufa_promote_gremlin_path(share_token, path_index) | Turn a reproduced bug path into a draft flow. |
| Tool | What it does |
|---|---|
prufa_register_discovery_domain(domain) | Register a domain, get the DNS TXT record to publish. |
prufa_verify_discovery_domain(domain_id) | Verify the DNS proof. |
prufa_list_discovery_domains · prufa_revoke_discovery_domain | Manage authorized domains. |
prufa_run_discovery(url) | Crawl a verified site and draft its meaningful flows. |
prufa_get_discovery(discovery_id) | Run status + the flows it surfaced. |
Plus prufa_health_check() (probe the server/API).
prufa_setup_workspace mints a free agent_temp workspace: no card, a 7-day
trial, and an included credit budget. Monitors, discovery, and full-length
gremlin runs work during the trial, then need a paid plan.
The MCP makes this legible to your agent: prufa_get_usage, prufa_setup_workspace,
and every metered result carry a trial block (days + credits remaining) and,
when you're low on credits or near the trial's end, an upsell block with a
message_for_human your agent can relay plus the exact tool to call
(prufa_upgrade_plan / prufa_buy_credits). When a Pro tool is called off-plan,
the 402 passes through with a checkout_url — no silent failures, no surprise
charges.
Three runnable scripts in examples/:
examples/nextjs-app/ — audit a deployed Next.js appexamples/vite-spa/ — audit a Vite SPA (focuses on client-side routing audits)examples/stripe-checkout/ — audit a Stripe-checkout page (payment-flow verification)Each is a copy-pasteable demo:
Fail a PR when Prufa finds a critical regression:
See examples/prufa-scan.yml for the full template.
Apache-2.0. See LICENSE. Contributions welcome — see CONTRIBUTING.md.