Private alpha 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
Enroll your passkey and receive your API key
Start with the guided alpha setup. Your host sends a one-time enrollment link and delivers your API key separately. Enroll before requesting approval. Keep the key in your 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/contracts -w @goodroom/proof -w @goodroom/mcpRequires Node.js 22 or later. The npm installer is not public yet; build from the public integration repository.
- 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/goodroomverify/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_alpha_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 protected wrapper owns the policy: it must decide whether this operation requires approval, derive the trusted risk and audience, and reject a mismatched hash, audience, expiry, or reused proof ID. Never let an agent choose a lower risk level to skip protection.
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. The alpha deployment policy marks every deployment CRITICAL and binds staging and production to different audiences. 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.