Six tools, one stdio server
Each tool reuses the web app's crypto core directly, no reimplementation, no network I/O, no telemetry. Everything runs locally over stdio.
| Tool | What it does |
|---|---|
| kvant_encrypt_file | Seal bytes into a .kvant blob + Quantum Seal |
| kvant_decrypt_file | Recover plaintext and verify the signer |
| kvant_send_message | Wrap text into a shareable, signed URL |
| kvant_decrypt_message | Read a message URL and return the key that signed it |
| kvant_verify_seal | Parse a Quantum Seal and return its metadata |
| kvant_sign_x402 | Sign an x402 payment payload with ML-DSA-65 |
The wallet is the identity
An agent signs one fixed message with its EOA wallet and derives the same post-quantum keypair the browser would, provided the wallet signs deterministically. The result is a portable identity:
- Encrypt a file in the browser, decrypt it from the agent, no key file passed between them.
- Two agents exchange .kvant message URLs, each signed by a post-quantum key derived from its wallet.
- Sign any x402 receipt with ML-DSA-65 under its own context (pqenv-v1-x402), so anyone with the agent’s public key and the payload can check which key signed it. /mcp documents the exact bytes that are signed.
Trust boundary
A wallet signature reconstructs the full keypair: it is root key material. Pass it only over the local stdio transport the server is built for; for anything networked, use a passphrase-protected key file. EOA wallets only: smart-contract wallets are rejected at derivation. A wallet signature always travels with the address that made it, and the server refuses one that does not recover to that address. MPC and threshold signers sign differently every time: the browser catches them with a two-signature check the first time an address derives keys on a device, and the server runs the same check when you pass a second signature as signature_hex_repeat. Keep a keyfile backup of the keypair; /app exports one from the same wallet. A wallet-derived identity rests on the wallet's curve: for files that must outlast it, use a freshly generated key file, whose keys are random.
Install
The server is built and tested; the npm release is next. It ships under the @kvant scope, which only Kvant can publish to, so this command can never run someone else's upload. Node.js 20 or later runs it over stdio.
{"mcpServers": {"kvant": {"command": "npx","args": ["-y", "@kvant/mcp"]}}}
This config runs once the package is on npm: drop it into your config and restart the client, and Kvant tools appear in the tools picker.
Full MCP guide, Cursor config, and examples →