Skip to main content
Glama
wundervault

wundervault

Official

@wundervault/mcp-server

npm version MCP Registry License: AGPL-3.0 Follow @wundervault1

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

vault_call

Calls a web service with a secret attached, and returns the answer with the secret removed.

vault_ssh_exec

Runs a command on a server you listed, or rsyncs files to it. The broker signs the SSH login; the key never leaves it.

vault_pay

Pays an x402 "402 Payment Required" in USDC on Base or Solana, inside the limits you set.

vault_sign

Signs data with a signing key. You approve every signature.

vault_entries_list

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
                              └──────────────────────┘
  1. Your agent asks for work: "call this API", "deploy to this server".

  2. The MCP server passes the request to the broker over a local socket. It holds no secrets.

  3. For an "ask me first" secret, the broker waits for you to approve that call.

  4. 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 --pair

Use 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 --enrol

Then 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:

  1. npm install -g @wundervault/mcp-server@2

  2. Install the broker and pair it (steps 2 and 3 above).

  3. For each agent: open Agents in your vault, choose Repair, choose this computer, then run wundervault-agent --enrol and enter the claim code.

  4. When every agent has moved: wundervault-agent --migrate --finish removes the old credential store.

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

wundervault system user, systemd unit with extra sandboxing

Supported

Windows

wundervault local account, scheduled task

Supported

macOS

_wundervault system account, LaunchDaemon

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 with systemd-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.ps1 checks 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 --destinations opens 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 secret

vault_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 sources

vault_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 text

USDC 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 text

The 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 output

Building from source

git clone https://github.com/wundervault/wundervault-mcp.git
cd wundervault-mcp
npm install
npm run build   # compiles TypeScript to dist/
npm test

Stay 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 tools
vault_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.

NameRequiredDescriptionDefault
argsNoTyped arguments for operation_id, checked against its schema.
purposeYesWhy this is needed (audit log).
requestNoDescribe 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_idYesVault entry holding the credential.
operation_idNoA signed operation on the entry. Use this OR request, not both.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
purposeYesWhy this payment is needed. The owner sees it if they are asked.
entry_idYesVault entry holding the wallet.
accept_indexNoWhich offer in accepts[] to pay, when the merchant makes more than one.
payment_requiredYesThe PAYMENT-REQUIRED header value (base64), or the decoded object.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dataYesThe bytes to sign, as text or encoded.
purposeYesWhat this signature is for. The owner sees it.
encodingNoHow data is written. Default utf8.
entry_idYesVault entry holding the signing key.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
purposeYesWhy this is needed (audit log).
entry_idYesVault entry holding the SSH private key (ed25519, unencrypted).
rsync_argsNorsync arguments instead of a remote command. Every [user@]host:path argument is checked against the same allowlist.
destinationYesRemote destination, [user@]host. The host part must be in the entry's ssh_hosts.
remote_argvNoCommand and arguments to run on the remote host. An array, run without a shell. Omit when using rsync_args.
working_dirNoLocal working directory for rsync source paths.
timeout_secondsNoDefault 120.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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. 1 tool updatev2.1.0
    • Changedvault_call1 field changed
      • changedInput schema / properties / request / description
        Previous 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."
  2. 6 tool updatesv2.0.2
    • Addedvault_call
    • Addedvault_entries_list
    • Addedvault_pay
    • Addedvault_sign
    • Addedvault_ssh_exec
    • Removedvault_status
  3. 7 tool updatesv1.7.1
    • Removedvault_entries_list
    • Removedvault_entry_forget
    • Removedvault_entry_get
    • Removedvault_entry_inject_env
    • Removedvault_exec
    • Removedvault_rsync
    • Addedvault_status
  4. 6 tool updatesv0.1.0
    • First observedvault_entries_list
    • First observedvault_entry_forget
    • First observedvault_entry_get
    • First observedvault_entry_inject_env
    • First observedvault_exec
    • First observedvault_rsync

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessLimited data

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    MCP 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.
    53
    1,769 npm
    26
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP 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.
    1
    AGPL 3.0
  • A
    license
    A
    quality
    B
    maintenance
    Identity 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.
    7
    2
    MIT