Request secrets over MCP with a passkey approval
Your vault comes with three tools on the Raq.com MCP server. An agent you connect can list your secret names and ask for one. You approve on your phone, and the agent receives the value sealed to a key only it holds.
Updated 7 November 2026
The three tools
| Tool | What it does | What comes back |
|---|---|---|
| key_guard_list_secrets | Lists the secrets in your vault on the account | Names, frozen state, last use and your agent access setting. Never values |
| key_guard_request_secret | Asks for one secret by name, with a 32-byte X25519 public key in base64, a name for the agent and a reason | A request ID to poll |
| key_guard_check_request | Checks the request | Its status, then sealed_secret, once, after you approve |
The exchange
-
Make a key pair for this request
An X25519 key pair from libsodium. Keep the private key in memory and send the public key as agent_public_key.
-
Request the secret
Call key_guard_request_secret with the name, agent_public_key, an agent_name you will recognise and a note saying why.
-
Wait for your decision
Poll key_guard_check_request. A request expires if you don't decide within 10 minutes.
-
Open the sealed value
After you approve, the response carries sealed_secret once. Open it with crypto_box_seal_open and the key pair, then throw the private key away.
import sodium from "libsodium-wrappers"
await sodium.ready
const b64 = sodium.base64_variants.ORIGINAL
const { publicKey, privateKey } = sodium.crypto_box_keypair()
// Send as agent_public_key to key_guard_request_secret
const agentPublicKey = sodium.to_base64(publicKey, b64)
// sealedSecret: from key_guard_check_request after approval
const value = sodium.to_string(sodium.crypto_box_seal_open(
sodium.from_base64(sealedSecret, b64), publicKey, privateKey,
))
sodium.memzero(privateKey)
What changes outside Nature Work
Once your code opens the sealed value, the plain key is in that process. Nothing scrubs output or limits it to one command, so keeping it out of logs, prompts and the model's context is up to your code.
If the agent itself shouldn't see the key, run it in Nature Work. There the local agent holds the private key and runs the command, and the coding agent never has the plain value.
What Raq.com enforces
- A request only reaches the vault of the person the agent signed in as, on the account it names.
- Up to 10 new requests a minute and 5 waiting at once, per person and account.
- An approved value can be collected once, within 10 minutes, and is then destroyed.
- A frozen secret or vault refuses new requests and approved values that have not been collected.
- Requests, approvals, denials, releases and refused releases are written to the account's audit log.
Questions
Which MCP clients can use this?
Any client connected to the Raq.com MCP server with the vault module switched on can call the tools. Opening the sealed value needs code that holds the private key, so it suits agents and scripts you run yourself.
Is the agent's name checked?
No. agent_name is a label the agent chooses so you can tell your sessions apart. The approval page also shows the IP address the request came from.
Why seal the value rather than send it over HTTPS?
Your browser encrypts it to the agent's public key before it leaves your device, so Raq.com relays a copy it can't open. Only the holder of the private key can read it.
Set up your vault
Create a Raq.com account, register a passkey and save the recovery code before adding your first secret. It's free, with no charge per secret or per release.
- Store API keys, tokens and other secrets
- Approve or deny each agent request
- Register passkeys on more than one device
- Freeze one secret or the whole vault
- Add it to your phone's home screen