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. 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. 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/mcp

    Requires Node.js 22 or later. The npm installer is not public yet; build from the public integration repository.

  3. 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.