wundervault
OfficialWundervault lets an AI agent use your secrets through a local broker — calling web APIs, running remote commands, paying x402 invoices and signing data — without the agent ever receiving a secret value.
vault_entries_list— lists the secrets this agent may use (id, name, tier, kind, defined operations); never values.vault_call— calls a web service with a vaulted secret attached by the broker; either describe the request (origin, method, path, query, body, your own headers) or run a signed owner-definedoperation_idwith typedargs. Supports stamped keys (AWS SigV4, OAuth 1.0a, custom HMAC recipes). Tier 2 secrets require owner approval of the exact origin/method/path.vault_ssh_exec— runs a command (argv, no shell) or rsyncs files to a host on the key's allowlist; the ed25519 key stays in the broker via a private ssh-agent socket.vault_pay— settles an x402402 Payment Requiredin USDC on Base, Base Sepolia, Solana or Solana devnet, within the owner's payee/daily-limit rules; returns the header to retry with.vault_sign— signs up to 256 KiB of data with a vaulted signing key (owner approves every signature); returns signature, public key and algorithm.Returns results with the secret stripped out; no tool ever returns a secret's value.
Allows injecting secrets into Docker configuration by writing to ~/.docker/config.json, enabling agents to manage Docker registry credentials securely.
Allows injecting secrets into .env files for environment variable configuration, enabling agents to manage application secrets without exposing them.
Allows injecting secrets into npm configuration by writing to ~/.npmrc, enabling agents to manage npm authentication tokens securely.
@wundervault/mcp-server
Your AI agent uses your secrets. It never holds them.
A secret you paste into a chat with an AI agent, or leave in a settings file it can read, gets copied into its memory, its transcripts and its logs. With Wundervault the agent never receives the secret at all. A small program on your own computer, the broker, keeps your secrets in an account of its own. Your agent asks it to call a web service, run a command on a server, pay for something or sign something; the broker does it with the secret and hands back the result, with the secret removed.
Your vault is encrypted in your browser, so our server stores it but can't read it. Secrets you mark "ask me first" wait for your approval, with your passkey, on your phone or computer.
This package is the MCP server your agent talks to, and the broker beside it. It works with any Model Context Protocol client: Claude Code, Codex, Cursor, Cline, OpenClaw and others.
Don't take our word for it: check the encryption claim on your own network, and verify the installer, at wundervault.com/verify.
What your agent can do
Tool | What it does |
| Calls a web service with a secret attached, and returns the answer with the secret removed. |
| Runs a command on a server you listed, or rsyncs files to it. The broker signs the SSH login; the key never leaves it. |
| Pays an x402 "402 Payment Required" in USDC on Base or Solana, inside the limits you set. |
| Signs data with a signing key. You approve every signature. |
| Lists the secrets this agent may use, and what kind each is. Never their values. |
No tool returns a secret's value. Version 1's hand-over tools (vault_exec, vault_entry_get,
vault_entry_inject_env, vault_rsync) are gone; see Upgrading from version 1.
Related MCP server: Warden MCP Server
How it works
┌──────────────┐ MCP (stdio) ┌──────────────────┐
│ AI agent │──────────────▶│ wundervault-mcp │ runs as you, holds no secrets
│ (Claude, …) │◀──────────────│ │
└──────────────┘ result └────────┬─────────┘
(secret removed) │ local socket
▼
┌──────────────────────┐ HTTPS / SSH ┌─────────────┐
│ broker │──────────────▶│ the service │
│ its own OS account, │◀──────────────│ │
│ holds the secrets, │ └─────────────┘
│ each call on this box│
└──────────┬───────────┘
│ signed requests, ciphertext only
▼
┌──────────────────────┐
│ wundervault.com │ stores your encrypted vault,
│ │ relays your approvals
└──────────────────────┘Your agent asks for work: "call this API", "deploy to this server".
The MCP server passes the request to the broker over a local socket. It holds no secrets.
For an "ask me first" secret, the broker waits for you to approve that call.
The broker makes the call with the secret, records it in a log on your computer, and returns the result. For web calls the secret goes to the service it belongs to, as it must; for SSH it never leaves the broker at all.
Install
You need Node.js 22.23.4, 24.22.1 or 26.12.1 or newer (the October 21, 2026 security release: the broker refuses to start on an older Node), and administrator rights on the computer your agents run on. Every step: wundervault.com/help/computer.
1. Create a vault at wundervault.com. It's free.
2. Install the package and the broker on the computer your agents use:
sudo npm install -g @wundervault/mcp-server@2
sudo sh "$(npm root -g)/@wundervault/mcp-server/packaging/install-daemon.sh"That is Linux: sudo, because the broker only runs a copy installed in a system folder, never
one inside your home folder.
Windows and macOS have their own installers; see wundervault.com/install. The installer downloads nothing and is short enough to read first.
3. Pair the broker with your account. Run the pairing command the installer printed last. It names node and the broker by their full paths, for example:
sudo /usr/bin/node /usr/bin/wundervault-agent --pairUse full paths with sudo, not bare names: sudo may look a name up on your own PATH, and a folder
on it that you (and so your agents) can write could hold another program by that name. That goes for
node too, because the broker's launcher starts with #!/usr/bin/env node.
Check that the fingerprint it shows matches the one in your vault, then confirm.
4. Add an agent. In your vault, add an agent and choose this computer. You get a claim code. Run this and enter it:
wundervault-agent --enrolThen add Wundervault to your agent's MCP settings:
{
"mcpServers": {
"wundervault": {
"command": "wundervault-mcp",
"env": { "WUNDERVAULT_AGENT_NAME": "<your agent's name>" }
}
}
}The config holds no secrets, and none go in command-line flags. Configs for other clients: README-AGENTS.md. If you're an AI agent installing this for someone: llms-install.md.
Upgrading from version 1
Version 2 moves your secrets into the broker. Your account, vault and passkeys carry over. Agents still on version 1 can't use your secrets, so move each one:
npm install -g @wundervault/mcp-server@2Install the broker and pair it (steps 2 and 3 above).
For each agent: open Agents in your vault, choose Repair, choose this computer, then run
wundervault-agent --enroland enter the claim code.When every agent has moved:
wundervault-agent --migrate --finishremoves the old credential store.Your vault marks each secret your agents could read before version 2 with Replace it at the service. Replace those secrets at the services that issued them: treat them as seen.
Your agent can't do this for you. It needs an administrator command and your approval in the vault, by design. Details: wundervault.com/install#upgrade-to-2.
Supported platforms
Broker's own account | Status | |
Linux |
| Supported |
Windows |
| Supported |
macOS |
| Supported |
On all three the broker runs under its own account, with its secrets in a folder your agents can't open. What differs is what surrounds that boundary:
Linux adds
ProtectSystem=strict,ProtectHome,ProtectProc, a system-call filter and an empty capability set. The store key is sealed withsystemd-creds, to a TPM where there is one; without a TPM it is sealed to a host key on the same disk.macOS has no launchd equivalent of that sandboxing, so the account split is very nearly the whole defence. The store key is a random key in a file only the broker's account can read: not sealed. FileVault is what protects a stolen disk.
Windows has the same account split and none of the extra sandboxing. An elevated administrator process can read the broker's files, as root can on Linux, and Windows OpenSSH gives an administrator an elevated session. The store key is a random key in a file only the broker's account can read; BitLocker protects a stolen disk.
packaging\verify-windows.ps1checks the boundary on your own machine.
If something on Windows or macOS fails, tell us what it printed: wundervault.com/contact.
Security model
The agent never gets a secret. No tool returns a value. The broker attaches the secret to the request itself, the way you set for that secret (a header, a query parameter, a username and password, or part of the web address), and removes it from the answer. Secrets marked "stamped" (AWS, X and other OAuth 1.0a services, exchanges) never travel: the broker signs each request with them.
A separate account. Your agents run as you; the broker doesn't. They can't read its files or its memory.
End-to-end encrypted vault. Secrets are encrypted in your browser with AES-256-GCM. The vault key comes from your passphrase, mixed with an Account Key that never leaves your device, through Argon2id (PBKDF2 for a vault made where WebAssembly is off, such as iPhone Lockdown Mode). We store ciphertext only.
Signed requests. The broker is paired to your account with a P-256 key whose fingerprint you confirm. The server serves a secret's ciphertext only to requests that broker signed, so a copied credential alone gets nothing.
Approvals with your passkey. An "ask me first" web call waits until you approve that exact destination, method and path, once or for a short window. Every payment outside your rules and every signature is sealed by your browser to exactly what you saw, so a server that only says "approved" can't spend your money.
A log on your computer. Every call is recorded by the broker, signed, and checked against a copy of its chain we hold, so a changed log is detected. For "run without asking" secrets, where the secret went and why stays on your computer; we never see it.
sudo /usr/bin/node /usr/bin/wundervault-agent --destinationsopens it (full paths, as for pairing).HTTPS only, with real certificate checks; redirects are not followed; private network addresses are refused unless you allowed one for that secret.
Honest limitations
A "run without asking" secret goes where your agent sends it. A tricked agent could send it to a server someone else controls, because the request carries the secret. For secrets that matter, choose "ask me first".
"Ask me first" approves a destination, method and path, not what the request says. Within an approval window, calls to the same place go ahead whatever they contain.
The broker removes your secret from the answer as it was sent. A service that sends it back in another form, such as encoded, could get it past; and anything the call creates, such as a new API token, is your agent's.
Agents that run under the same user account can use each other's access to the broker. Run an agent you trust less under another account.
The broker must run on the same computer as the agent; fully air-gapped setups don't fit.
The platform is open-core: this package and the browser crypto are AGPL-3.0, so you can audit everything that touches your secrets; the hosted service is not open source.
Every known limit, kept with the code: wundervault.com/limitations.
Tool reference
The full reference, with every argument: wundervault.com/mcp.
vault_call
entry_id: string which secret
purpose: string why; kept in the broker's log on the owner's computer
request?: { describe the call (or operation_id + args instead)
origin: { scheme: "https", host, port }, method, path,
query?, body?, headers?, # your own headers; never the one carrying the secret
stamp? # for stamped keys: how the service signs requests
}
operation_id?, args? run an operation the owner defined for this secretvault_ssh_exec
entry_id: string an ed25519 SSH key
destination: string [user@]host; the host must be on the key's allowed list
purpose: string
remote_argv?: string[] command and arguments, run without a shell
rsync_args?: string[] instead of a command; every host:path is checked too
timeout_seconds?: number default 120
working_dir?: string local folder for rsync sourcesvault_pay
entry_id: string a wallet
payment_required the 402 reply's PAYMENT-REQUIRED header, or its decoded JSON
accept_index?: number which offer, when there is more than one
purpose: string the owner sees it if they're asked
→ the header to send when you retry the request, in the reply textUSDC on Base, Base Sepolia, Solana and Solana devnet. Inside the owner's rules (trusted payees, a daily limit, allowed networks) it signs at once; anything else waits for the owner.
vault_sign
entry_id: string a signing key
data: string at most 256 KB
encoding?: "utf8" | "base64" | "hex"
purpose: string the owner sees it
→ the signature (base64), the public key and the algorithm, in the reply textThe owner approves every signature and is shown the data in full when it is text up to 64 KB.
vault_entries_list
No arguments. Each secret's id, name, tier and kind (web service, SSH, wallet or signing key), and any operations the owner defined. Never a value.
Sandbox / demo mode
Set WUNDERVAULT_MOCK=1 to run the server without a broker or any credentials. Every
tool call then returns a representative response clearly labelled [DEMO MODE] instead of
contacting the vault — no real secret is ever involved. It exists so you can try the tool
surface without an account, and so MCP directory scanners and CI (e.g.
Glama) can start the server and exercise each tool. It is off by
default.
"env": { "WUNDERVAULT_MOCK": "1" } // demo/CI only — returns fake, labelled outputBuilding from source
git clone https://github.com/wundervault/wundervault-mcp.git
cd wundervault-mcp
npm install
npm run build # compiles TypeScript to dist/
npm testStay updated
Releases and security notes go out on X as @wundervault1. Full release history: wundervault.com/changelog.
License
Licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later).
See LICENSE.
Wundervault is open-core: this MCP server, the broker and the browser crypto are open source; the hosted service at wundervault.com is a commercial offering. For commercial or hosting inquiries: wundervault.com/contact.
Available Tools
5 toolsvault_callA
Call a web service with a vaulted secret that is never returned to you: the broker attaches the secret, sends the request and gives you the answer with the secret removed.
Two ways to call. Describe the request yourself with request (origin, method, path, and optional query, body and your own headers). Or run a named operation the owner defined, with operation_id and typed args: the operation fixes the origin and route, returns only the fields it permits, and is signed with a key derived from the secret itself, so a definition altered in transit is refused. vault_entries_list shows which operations an entry offers.
Either way the entry decides how the secret is attached (a header, a query parameter, a username and password, or part of the web address) — you never choose that, and never see the secret.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Typed arguments for operation_id, checked against its schema. | |
| purpose | Yes | Why this is needed (audit log). | |
| request | No | Describe the call yourself: {origin:{scheme,host,port}, method, path, body?, query?, headers?}. body: an object or array is sent as JSON; a string is sent as written (set content-type in headers, e.g. application/x-www-form-urlencoded). headers: your own, such as user-agent or an API version; the header that carries the secret, and framing headers, are refused. If the entry keeps its secret in the web address (Telegram, webhooks), path is only what comes AFTER the secret, e.g. /sendMessage, or / for the stored address as is. Tier 1 secrets proceed and are logged. Tier 2 secrets are refused until the owner approves this exact origin, method and path; the approval covers whatever headers and body it carries. STAMPED keys (AWS, X, SnapTrade, exchanges) never travel: add request.stamp describing how the service signs requests, either {builtin:"aws-sigv4", region, service}, {builtin:"oauth1"} for OAuth 1.0a (X, Tumblr, Flickr; optional signature_method:"HMAC-SHA256" and realm for NetSuite; nonce, timestamp and the Authorization header are written for you; the owner stores the four values as {"api_key","api_secret","access_token","access_token_secret"}), or {mac:"hmac-sha256"|"hmac-sha384"|"hmac-sha512", key:"utf8"|"base64"|"hex", message:[parts], encoding:"hex"|"base64"|"base64url", place:[{in:"header"|"query", name, value:"…{stamp}…"}]}. Parts: {text}, {var: method|path|query|path_and_query|body|host|key_id|body_json}, {header: name}, {body_field: name}, {sha256:[parts]}, {sha512:[parts]}, {sha256_hex:[parts]}, {json:{name: part}} (sorted keys, no spaces). Parts read the request before the stamp is placed; put timestamps and nonces in the request yourself. place values may use {stamp} and {key_id}. The owner approves each recipe once per address; the first call waits for that. | |
| entry_id | Yes | Vault entry holding the credential. | |
| operation_id | No | A signed operation on the entry. Use this OR request, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it explains that secrets are never returned, the broker attaches and strips them, the entry controls attachment, and Tier 1/Tier 2 approval behavior is described. It also discloses signed operations and complex stamped-key signing behavior, including owner approval for recipes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then structured around the two calling modes. It is long and dense, but the length is largely justified by the tool's complexity and security-sensitive behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, the description provides enough context to invoke the tool correctly: it covers secret handling, two call modes, approval tiers, operation signing, and secret placement. Nothing critical for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents parameters extensively. The description still adds meaningful semantics beyond the schema by explaining the request-vs-operation_id choice and that the entry, not the caller, decides how the secret is attached.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: call a web service using a vaulted secret that is never exposed. It clearly scopes the tool to brokered HTTP calls, but it does not explicitly differentiate from siblings like vault_sign, vault_pay, or vault_ssh_exec beyond naming vault_entries_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the two invocation modes: a self-described request or a named operation with typed args. It also points to vault_entries_list for discovering operations, giving useful context, but it does not explicitly state when to use this tool instead of the specialized sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_entries_listA
List the vault entries this agent may use. For each: its ID, name, tier, what kind of secret it is — web-service (vault_call), SSH (vault_ssh_exec), wallet (vault_pay) or signing key (vault_sign) — and any signed operations it offers. Never a secret's value — no tool returns one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does real work: it discloses the returned fields and an important security invariant ("Never a secret's value — no tool returns one"), which preempts an agent hunting for values elsewhere. It omits auth/permission requirements and whether the listing is complete or paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and scope, followed by the returned-field taxonomy. The em-dash list of tool mappings is dense but each element is necessary for routing to the correct sibling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must describe the return shape—which it does, covering ID, name, tier, secret kind, and signed operations. It does not address pagination, ordering, or empty-result behavior, a minor gap for a discovery tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero-parameter tool, so the baseline applies; the description correctly conveys that no filtering input is accepted. The optional nature of the inline filter parameters is assumed to be captured in the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ("List the vault entries") with a stated scope ("this agent may use") that cleanly separates it from the four action siblings. It also enumerates the fields returned, so an agent knows exactly what discovery yields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
By mapping secret kinds to their consumer tools (web-service → vault_call, SSH → vault_ssh_exec, wallet → vault_pay, signing key → vault_sign), it implicitly tells the agent this is the discovery step before invoking those tools. It never states the exclusion explicitly (e.g. "call this before X"), so guidance is strong but inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_payA
Pay an x402 "402 Payment Required" from a vaulted wallet whose key is never returned to you. Pass the 402 reply's PAYMENT-REQUIRED header (or the decoded JSON, or a v1 402 body) as payment_required; you get back the header to send when you retry the same request. USDC only, on Base, Base Sepolia, Solana and Solana devnet. Payments inside the owner's rules (allowed payees, a daily limit) are signed at once; anything else waits for the owner to approve, and if they have not answered yet, call again with the same payment to keep waiting.
| Name | Required | Description | Default |
|---|---|---|---|
| purpose | Yes | Why this payment is needed. The owner sees it if they are asked. | |
| entry_id | Yes | Vault entry holding the wallet. | |
| accept_index | No | Which offer in accepts[] to pay, when the merchant makes more than one. | |
| payment_required | Yes | The PAYMENT-REQUIRED header value (base64), or the decoded object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: the key is never returned, USDC only on four named chains, payments inside owner rules are signed immediately, and anything outside allowed payees or the daily limit waits for owner approval. It also discloses the polling pattern: call again with the same payment to keep waiting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and stays dense with no filler. The opening phrase is slightly awkward and the approval-waiting clause is packed into the same paragraph, but every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four parameters, no output schema, and no annotations, the description covers the critical gaps: what the tool returns (the header to send on retry), chain and currency restrictions, the approval flow, and the retry behavior when approval is pending. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by saying payment_required can also be a v1 402 body, and that purpose is shown to the owner if approval is requested. accept_index is not elaborated in the description but is adequately covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: pay an x402 402 Payment Required from a vaulted wallet whose key is never exposed. This is clearly distinct from sibling tools like vault_sign or vault_call, which do not handle x402 payment flows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains exactly what to pass (the PAYMENT-REQUIRED header, decoded JSON, or v1 402 body) and what to do with the result: retry with the returned header. Also tells the agent how to keep waiting when owner approval is pending. It does not explicitly name alternatives or exclusions versus vault_sign, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_signA
Sign data with a vaulted signing key whose value is never returned to you. Every signature is approved by the owner, who is shown the data (in full when it is text up to 64 KiB) and its sha256. Returns the signature (base64), the public key and the algorithm. At most 256 KiB.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The bytes to sign, as text or encoded. | |
| purpose | Yes | What this signature is for. The owner sees it. | |
| encoding | No | How data is written. Default utf8. | |
| entry_id | Yes | Vault entry holding the signing key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that the key is never returned, that every signature requires owner approval, that the owner sees the data plus its sha256, the 256 KiB ceiling, and exactly what is returned (signature, public key, algorithm). It stops short of describing rejection/failure behavior or what happens when the size limit is exceeded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, zero waste, with the core action and the strongest constraint (key never returned) front-loaded. Every sentence carries a distinct fact: action, approval model, return values, size limit.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-destructive-looking signing tool with no output schema and no annotations, the description supplies return fields, the approval model, and size constraints — enough to call it correctly. The remaining gap is error/rejection behavior and whether signing is deterministic, which an agent would want for retry logic.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics on top: the 256 KiB cap on data and the 64 KiB threshold at which text is shown to the owner in full. `purpose` is reinforced as owner-visible, though its operational effect is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Sign data with a vaulted signing key") and immediately scopes it with the constraint that the key is never returned. That is clearly distinct from sibling operations like vault_call, vault_pay, and vault_ssh_exec, so an agent can select it without reading further.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose (sign a payload held by the vault) rather than explicitly stated; there is no guidance on when to prefer this over vault_call or the other siblings, and no exclusions. The approval flow is described, which gives the agent context on cost/latency, but it is not framed as a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_ssh_execA
Run a command on a remote host, or rsync files to it, using a vaulted SSH key that is never written to disk and never returned to you.
The key stays inside the broker, which answers signature requests over a private ssh-agent socket that exists only for the duration of this call. You choose the remote command; you do not get the key.
The destination is checked against the ssh_hosts allowlist on the entry, and the ssh command line is constructed here — naming a different host inside remote_argv does not change where it connects. An entry with no ssh_hosts authorises nothing.
Every signature is audited with the key fingerprint and the authorised host.
| Name | Required | Description | Default |
|---|---|---|---|
| purpose | Yes | Why this is needed (audit log). | |
| entry_id | Yes | Vault entry holding the SSH private key (ed25519, unencrypted). | |
| rsync_args | No | rsync arguments instead of a remote command. Every [user@]host:path argument is checked against the same allowlist. | |
| destination | Yes | Remote destination, [user@]host. The host part must be in the entry's ssh_hosts. | |
| remote_argv | No | Command and arguments to run on the remote host. An array, run without a shell. Omit when using rsync_args. | |
| working_dir | No | Local working directory for rsync source paths. | |
| timeout_seconds | No | Default 120. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does so thoroughly: the key is never written to disk nor returned, the agent socket lives only for the call, every signature is audited with fingerprint and host, and the host is validated server-side so remote_argv cannot redirect the connection. It also pre-empts the obvious injection attempt explicitly, which is exactly the kind of behavior an agent cannot infer from schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then layered security constraints; every sentence adds new information. It runs four short paragraphs where three would suffice, but there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the security and authorization model completely for a 7-parameter mutation-adjacent tool with no annotations. The remaining gap is the return shape — with no output schema, the description never says whether the caller gets stdout, stderr, and exit status, which matters for a command-execution tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each of the 7 parameters is already documented in the schema. The description only adds that remote_argv and rsync_args are mutually exclusive paths and that destination must match the entry's ssh_hosts — useful reinforcement but largely a restatement, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — run a command on a remote host or rsync files — and pins the mechanism: a vaulted SSH key that never leaves the broker. This clearly separates it from siblings like vault_sign and vault_pay, which do not execute remote commands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope of use is explicit (remote exec or rsync against an allowlisted host) and it states a hard when-not: 'An entry with no ssh_hosts authorises nothing.' It never names a sibling as the alternative path, so the routing guidance is clear but not fully comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v2.1.0- Changed
vault_call1 field changed- changed
Input schema / properties / request / descriptionPrevious value: -"Describe the call yourself: {origin:{scheme,host,port}, method, path, body?, query?, headers?}. body: an object or array is sent as JSON; a string is sent as written (set content-type in headers, e.g. application/x-www-form-urlencoded). headers: your own, such as user-agent or an API version; the header that carries the secret, and framing headers, are refused. If the entry keeps its secret in the web address (Telegram, webhooks), path is only what comes AFTER the secret, e.g. /sendMessage, or / for the stored address as is. Tier 1 secrets proceed and are logged. Tier 2 secrets are refused until the owner approves this exact origin, method and path; the approval covers whatever headers and body it carries. STAMPED keys (AWS, SnapTrade, exchanges) never travel: add request.stamp describing how the service signs requests, either {builtin:\"aws-sigv4\", region, service} or {mac:\"hmac-sha256\"|\"hmac-sha384\"|\"hmac-sha512\", key:\"utf8\"|\"base64\"|\"hex\", message:[parts], encoding:\"hex\"|\"base64\"|\"base64url\", place:[{in:\"header\"|\"query\", name, value:\"…{stamp}…\"}]}. Parts: {text}, {var: method|path|query|path_and_query|body|host|key_id|body_json}, {header: name}, {body_field: name}, {sha256:[parts]}, {sha512:[parts]}, {sha256_hex:[parts]}, {json:{name: part}} (sorted keys, no spaces). Parts read the request before the stamp is placed; put timestamps and nonces in the request yourself. place values may use {stamp} and {key_id}. The owner approves each recipe once per address; the first call waits for that."New value: +"Describe the call yourself: {origin:{scheme,host,port}, method, path, body?, query?, headers?}. body: an object or array is sent as JSON; a string is sent as written (set content-type in headers, e.g. application/x-www-form-urlencoded). headers: your own, such as user-agent or an API version; the header that carries the secret, and framing headers, are refused. If the entry keeps its secret in the web address (Telegram, webhooks), path is only what comes AFTER the secret, e.g. /sendMessage, or / for the stored address as is. Tier 1 secrets proceed and are logged. Tier 2 secrets are refused until the owner approves this exact origin, method and path; the approval covers whatever headers and body it carries. STAMPED keys (AWS, X, SnapTrade, exchanges) never travel: add request.stamp describing how the service signs requests, either {builtin:\"aws-sigv4\", region, service}, {builtin:\"oauth1\"} for OAuth 1.0a (X, Tumblr, Flickr; optional signature_method:\"HMAC-SHA256\" and realm for NetSuite; nonce, timestamp and the Authorization header are written for you; the owner stores the four values as {\"api_key\",\"api_secret\",\"access_token\",\"access_token_secret\"}), or {mac:\"hmac-sha256\"|\"hmac-sha384\"|\"hmac-sha512\", key:\"utf8\"|\"base64\"|\"hex\", message:[parts], encoding:\"hex\"|\"base64\"|\"base64url\", place:[{in:\"header\"|\"query\", name, value:\"…{stamp}…\"}]}. Parts: {text}, {var: method|path|query|path_and_query|body|host|key_id|body_json}, {header: name}, {body_field: name}, {sha256:[parts]}, {sha512:[parts]}, {sha256_hex:[parts]}, {json:{name: part}} (sorted keys, no spaces). Parts read the request before the stamp is placed; put timestamps and nonces in the request yourself. place values may use {stamp} and {key_id}. The owner approves each recipe once per address; the first call waits for that."
6 tool updates
v2.0.2- Added
vault_call - Added
vault_entries_list - Added
vault_pay - Added
vault_sign - Added
vault_ssh_exec - Removed
vault_status
7 tool updates
v1.7.1- Removed
vault_entries_list - Removed
vault_entry_forget - Removed
vault_entry_get - Removed
vault_entry_inject_env - Removed
vault_exec - Removed
vault_rsync - Added
vault_status
6 tool updates
v0.1.0- First observed
vault_entries_list - First observed
vault_entry_forget - First observed
vault_entry_get - First observed
vault_entry_inject_env - First observed
vault_exec - First observed
vault_rsync
TDQS
Scored across 5 tools
Each tool maps to a distinct capability: discovery (vault_entries_list), generic web calls (vault_call), x402 payments (vault_pay), signing (vault_sign), and SSH/rsync (vault_ssh_exec). The only mild overlap is vault_call vs vault_pay, since both issue HTTP requests with a secret attached, but the descriptions clearly separate generic service calls from 402 payment flows.
All tools share a strong 'vault_' namespace prefix and use lowercase snake_case. The one deviation is ordering: vault_entries_list is noun-first while vault_call, vault_pay, vault_sign, and vault_ssh_exec are verb-oriented, but this is minor and still readable.
Five tools is well-scoped for a secrets broker: one discovery tool plus one executor per supported secret type (web-service, wallet, signing key, SSH). No tool feels redundant or padded.
The surface maps cleanly onto the declared secret types enumerated by vault_entries_list, giving lifecycle coverage for discovery and use of each. Minor gaps exist around inspecting an entry's operation schema/args in detail and checking pending owner approvals without re-calling, but agents can work around both.
Maintenance
Related MCP Connectors
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server for the Z1N Protocol - on-chain identity for AI agents on Polygon
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables interaction with HashiCorp Vault to read, write, list, and delete secrets through a containerized MCP server with secure token-based authentication.44 npmMIT
- AlicenseAqualityBmaintenanceMCP server for Vaultwarden/Bitwarden vault management. Enables AI agents to securely create, search, read, and update vault items via the official Bitwarden CLI, with safe-by-default redaction and support for both stdio and SSE transports.531,769 npm26MIT
- AlicenseNot gradedqualityCmaintenanceMCP server that lets AI agents call APIs without ever seeing the credentials, using a local encrypted vault and per-secret allowlist policies for HTTP requests and subprocess environment variables.1AGPL 3.0

AgentValetofficial
AlicenseAqualityBmaintenanceIdentity and credential governance for AI agents. Every agent gets its own cryptographic identity, scoped short-lived credentials per platform, human approval on sensitive actions, and an immutable audit log.72MIT