Private beta documentation
Add a human checkpoint to an MCP action.
GoodRoom.verify pauses a tool call, opens a 120-second approval request, and returns a signed proof only after Touch ID or another passkey verifies the operator.
Quickstart
- 1
Request your setup package
Start from the private alpha setup page. We provision the account and deliver the passkey enrollment link and hosted API key separately. Keep the key in your agent runtime environment, never in prompts or tool arguments. - 2
Build the MCP server
git clone https://github.com/kairosgoodroom/goodroomverify.git cd goodroomverify npm install npm run build -w @goodroom/mcpThe npm installer is not public yet; the repository build is the supported beta path.
- 3
Add the server to your MCP client
Use the configuration below in your client's MCP settings. Replace the absolute path and API key.
Configure MCP
The same stdio server works with Claude Code, Claude Desktop, Cursor, and other MCP-compatible runtimes.
{
"mcpServers": {
"goodroom-verify": {
"command": "node",
"args": ["/absolute/path/to/goodroom/apps/mcp/dist/index.js"],
"env": {
"GOODROOM_API_URL": "https://goodroom-verify-api.goodroom-verify-0f0ce791.workers.dev",
"GOODROOM_API_KEY": "gr_live_your_private_beta_key",
"GOODROOM_PROOF_ISSUER": "https://api.goodroom.in"
}
}
}
}The MCP server opens approval links automatically on macOS, Windows, and Linux. It verifies the returned Ed25519 proof locally before reporting approval.
Tool contract
Call goodroom_verify before the protected operation. Compute the action hash locally from a canonical representation of the exact action.
{
"action_summary": "Deploy migration to production",
"action_hash": "sha256:<64 lowercase hex characters>",
"risk_level": "CRITICAL",
"audience": "tool:db_migrate"
}Treat the returned proof as authorization evidence, not proof that the protected tool already ran. The wrapper executing that tool must reject a mismatched hash, audience, expiry, or reused proof ID.
Enforce before execution
executeWithExecutionProof hashes the exact structured action using canonical JSON, verifies the proof, reserves its unique ID, and only then calls the protected operation.
import { executeWithExecutionProof } from "@goodroom/proof";
const result = await executeWithExecutionProof(
proof,
exactAction,
{
issuer: "https://api.goodroom.in",
audience: "tool:payment.send",
publicKey,
replayStore, // reserve(jti, exp) must be atomic
},
async (verifiedAction) => paymentProvider.send(verifiedAction),
);The replay store is supplied by the protected system and must reserve a proof ID atomically. For payments, also pass a provider idempotency key and enforce beneficiary, amount, fraud, and compliance policy independently.
Security model
- Approval and polling use separate high-entropy capabilities stored only as hashes.
- WebAuthn requires user verification and is bound to the goodroom.in relying-party ID.
- Proofs expire after 30 seconds and bind account, challenge, action hash, risk, and audience.
- Audit records exclude prompts, tool arguments, source code, and action summaries.
Enforcement boundary: GoodRoom.verify does not sandbox a tool. Your agent runtime or tool wrapper must require a valid proof before it executes the protected operation.