mcp server
rigorrun
Acceptance testing for AI agents that take real actions. Show it a job once; it verifies your agent against the state of the system it changed.
Set up
Runs on your computer. Pick your agent and operating system.
Before you start
- Node.js 20 or newer
{
"mcpServers": {
"konuktor-rigorrun": {
"command": "npx",
"args": [
"-y",
"rigorrun"
]
}
}
}same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12
Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs
README
synced Oct 17, 2026RigorRun
Verify what your AI agents actually do.
RigorRun sends your agent tickets that tempt it across that line — somebody else's order, a decision that is not its to make, an instruction hidden in the customer's message — then reads the system itself and shows what actually happened beside what the agent said it did. It ships two packs: Larch Helpdesk, a multi-tenant helpdesk twin, and Stripe — your test mode, or a local twin with no keys. Open source, runs on your machine, no account.
rigorrun.xyz · Documentation · A recorded run, case by case · npm
npx rigorrun helpdesk try
Six support tickets on a helpdesk twin shared by two organisations, Alder Outdoor and Birch Home, worked by one built-in demo agent twice — with Alder's own token, then with the helpdesk's service token. Each verdict comes from what the twin recorded: its access log, its tables, its outbox. No keys; seconds.
A real model, recorded. Under a protocol written before any model saw a ticket, gpt-oss-120b
ran the same six tickets through the reference agent with each
token. With Alder's token it held all six. With the service token it found Birch Home's order,
refunded it in full and said "Refunded the $300.00 for order BIR-2001" — on another organisation's
order. Every case, with what the agent said and what the twin recorded:
rigorrun.xyz/replay/helpdesk
(pre-registration and evidence).
npx rigorrun demo
Replays the Stripe recording offline: what the agent said, beside what Stripe held afterwards. No keys, no account. The same run is at rigorrun.xyz/replay.
Your multi-tenant support agent
For the guided Agent Release Check, start npx rigorrun@0.6.1, create a
project, select Helpdesk twin, review every rule, and connect your own HTTP
agent. Read task and policy results alongside the twin's state, access log and
outbox, then repeat the saved project. Follow the
guided quickstart.
A PASS is limited to the checked scenarios; the twin is simulated, not your live
helpdesk. Use one writer per project and stop the local daemon before CLI writes.
npx rigorrun helpdesk twin # MCP at http://127.0.0.1:12113/mcp; leave it running
npx rigorrun helpdesk try --agent <agent URL> # your agent, connected to the twin with its token
Point your agent's helpdesk MCP URL at the twin with a token — tok_alder_support (Alder only) or
tok_service (every organisation) — and RigorRun sends it the six tickets as a black box. Start
with the helpdesk guide.
Your Stripe agent, no code changes
npx rigorrun stripe twin # a local Stripe twin; leave it running
npx rigorrun stripe init --twin --yes # the Stripe pack's tickets, as a project
npx rigorrun agent add --project <id> --name my-agent \
--black-box <agent URL> --claim-path message # your agent's endpoint, as it runs today
npx rigorrun gate --project <id> --report report.html # exit 1 when a case fails
No change to your agent's code: RigorRun sends each ticket to the endpoint your agent already
serves (map your request shape with --body-template; --claim-path names the field its answer's
sentence is in) and reads Stripe itself. Your agent keeps its own Stripe test key — or, for the
local twin, its Stripe base URL points at the twin. The verdict comes from what Stripe holds, never
from what the agent said. Every verdict is PARTIAL
and prints what was read. Against your Stripe test mode, stripe init takes a test key instead of
--twin — live keys are refused. Start with the Stripe guide
and the example agent; CI is one step
(uses: Konuktor/rigorrun@v0.6.1, see docs/CI.md).
Historical qualification evidence. For the recorded qualification trees, the Stripe pack was qualified against a protocol written before any code: 8 scripted agents (1 correct, 7 with one defect each) × 7 tickets × 3 attempts, each verdict checked against an independent oracle that reads Stripe directly. On the local twin and on Stripe test mode: 168 and 168 cells, no false pass and no false fail. Black-box mode on its own system: 36 cells, none either. The Larch Helpdesk pack the same way on its twin: 8 scripted agents × 6 tickets × 3 attempts, 144 cells, none either. Both packs were qualified again at the 0.6.0 release tree, with the same result. (Helpdesk evidence · Stripe evidence · black-box evidence)
The 0.6.1 tree changes review handling, readiness, guided onboarding and report rendering. Those historical qualifications do not cover this changed tree. Current regression and installed-package checks are not a new qualification.
Not on Stripe? This opens a local interface for any system RigorRun can reach and read back — an MCP server, an HTTP API, or a web application:
npx rigorrun
This is the development repository. If you want to use RigorRun, the commands above are the whole install and the documentation is the place to start. What follows is for people working on it.
Why it is public
rigorrun is published to npm by a GitHub Actions workflow that holds no npm token, using npm
trusted publishing, and carries a SLSA build provenance attestation. That attestation names this
repository and the commit it was built from. Provenance pointing at a source nobody can read proves
very little, so this stays public and the internal material lives elsewhere. See
docs/REPOSITORY_ARCHITECTURE.md.
Layout
apps/site rigorrun.xyz — Astro, static, one document per route
apps/app the interface the runner serves; ships inside the npm package
apps/docs docs.rigorrun.xyz — Astro Starlight
apps/demo-crm Northstar Support: a synthetic system for the bundled example
apps/demo-ops four synthetic schema-driven systems
apps/extension the Chrome recorder
packages/design design tokens, type system and logo, shared by all three sites
packages/cli the published `rigorrun` package
packages/daemon the local runner: HTTP API, pairing, project store
packages/core the domain types — contracts, cases, runs, assertions, records
packages/env-* how RigorRun reaches a system: MCP, OpenAPI, browser
packages/sandbox `rigorrun verify` — container isolation and conformance
... compiler, generator, runner, verifier, scoring, quality, report
fixtures/external a system and an agent that import nothing from RigorRun
apps/site and apps/app were one bundle until 0.3. That meant every visitor to the website
downloaded the entire product UI and every person running npx rigorrun downloaded the landing
page. They share packages/design and nothing else.
Working on it
pnpm install && pnpm start # build the interface, then run the runner
pnpm dev # the interface and both demo systems, watching
pnpm rigorrun alone would leave you with a working API and no interface, which is why the first
line builds before it serves.
Gates
pnpm release:verify # everything below, in order, on this machine
pnpm lint · pnpm typecheck | the usual |
pnpm test | unit and integration tests |
pnpm contrast | every token pair against its WCAG requirement |
pnpm domain | no business noun in generic code, across 26 directories |
pnpm e2e · pnpm a11y · pnpm visual · pnpm cross | the interface |
pnpm e2e:external | a stranger connects their own system and their own agent |
pnpm e2e:restart | SIGKILL survival, and a damaged file reported rather than dropped |
pnpm verify:package | clean-room install of the tarball, then the full journey against it |
pnpm gate1 | clean machine → a verification record, one command, no browser |
pnpm contact | whether the addresses the site publishes can receive mail |
Two of these matter more than the rest. e2e:external and verify:package measure whether somebody
who has never seen this source can use RigorRun; everything else measures whether RigorRun works on
material that ships inside RigorRun. A release where only the second kind is green is not a
release.
Three rules
The product's argument is that you should check claims rather than believe them, so it does not get to make unverifiable ones about itself.
- No user-visible number is a literal. Counts come from generated JSON, regenerated by a script and checked in CI. The site once claimed 18 events, 17 cases and 10 categories while the pipeline produced 7, 22 and 9.
- Nothing claims a check that did not run.
DECLAREDisolation exists becauseRESETused to mean "a reset was configured" rather than "the reset was observed to work". - A limitation is documented, not omitted.
untestedis a required field on a verification record: a record that omits what it could not reach is not a cleaner record, it is a false one.
Releasing
Tag v* and the Release workflow publishes with provenance. It verifies the tag matches the
manifest and runs verify:package first. See docs/RELEASING.md.
Contributing
CONTRIBUTING.md. Security reports: .github/SECURITY.md — not through issues.
MIT · Built by Erbol Tahirov