KeyHalve - verify sealed documents

Free, no-account verification of KeyHalve-sealed documents. Read-only; never receives keys.

OtherTypeScriptv1.0.1

KeyHalve verify-MCP

Free, public, no-account MCP server that lets any AI verify KeyHalve-sealed documents — from any platform on the rail (ValidPay, CheckBooks, …). Seal = the door (a platform's paid MCP). Verify = the room (this one, free forever).

  • Endpoint: https://mcp.keyhalve.com/mcp (Streamable HTTP, stateless)
  • Tools: keyhalve_verify · keyhalve_status · keyhalve_explain — all read-only, no auth

The blindness rule

This server never receives decryption keys. A verify URL carries the holder's key share in the #key= fragment; parseInput discards any fragment before any other logic runs, and the response says so. Verification here covers everything provable without the key:

CheckMeaning
statusactive / revoked (with reason) on the issuing platform
ciphertext integritySHA-256 of the served ciphertext = commitment recorded at issuance (v2)
rail attestationEd25519-verified against the pinned rail key; dual-sign content binding when present
time lockvalidity window judged client-side (Patent D semantics)
issuer trustfail-closed: declared at best, never proof

Reading the sealed contents still happens only in the holder's browser — exactly like the web verifier. The overall verdict fails closed: any failed check → FAILED — DO NOT TRUST.

Design notes

  • Zero runtime dependencies. WebCrypto only; the whole protocol layer is hand-auditable. Same reasoning as the pinned-key rail client in keyhalve-website.
  • Stateless. No sessions, no SSE, no KV, no cookies; every POST gets application/json. Request bodies are never logged.
  • Tenant-neutral. Platforms come from the same manifest data as the web verifier (TENANT_MANIFEST in src/verifier.ts); onboarding a platform = one data entry.
  • Fail closed. Unreachable rail, malformed share, partial dual-sign binding, unknown id prefix — all report NOT verified, never a soft pass.

Develop / deploy

npm ci
npm run typecheck && npm test   # 32 tests
npm run dev                      # wrangler dev

Deploys are manual (deploy.yml via workflow_dispatch, same discipline as rail/console). Needs the CLOUDFLARE_API_TOKEN repo secret; the route mcp.keyhalve.com is a custom domain on the business CF account (same account as the watchdog scheduler).

Directory submissions (Mike-gated)

Submitting to the Claude Connectors Directory / ChatGPT App Directory is an outward-facing step — prepared separately, goes out only on Mike's go.

Listings

Directory-listing assets live in this repo — reuse them, don't invent copy:

  • llms-install.md — AI-agent install steps (Cline's AI-driven install; also the canonical per-client snippets).
  • glama.json — Glama claim file (maintainers; their live schema is maintainers-only).
  • assets/icon-400.png — 400×400 icon (white split-circle glyph on Ink #0E1116, from the brand kit).
  • Descriptions must stay byte-consistent with src/tools.ts and pass the approved-claims register (no "split key", no "tamper-proof", no issuer-identity claims).

Installation

Source-derived launch command. Check the maintainer’s required arguments and credentials before running:

bash
npx -y @keyhalve/verify-mcp

Set up in your AI client

Merge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.

json
{
  "mcpServers": {
    "com-keyhalve-verify": {
      "command": "npx",
      "args": [
        "-y",
        "@keyhalve/verify-mcp"
      ]
    }
  }
}

Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.

Claude Desktop setup reference

Package

@keyhalve/verify-mcpnpm

Compatible MCP Clients

KeyHalve - verify sealed documents works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.

  • Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.
  • Cursor~/.cursor/mcp.jsonRestart Cursor for changes to take effect.
  • VS Code.vscode/mcp.jsonReload VS Code window for changes to take effect.
  • Windsurf~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect.
  • Claude Code.mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.

Learn More