Skip to main content
Glama
zallkyre

secrets-mcp

by zallkyre

secrets-mcp

Give the agent a handle, not the key.

An MCP server that takes an API key out of the conversation the moment it appears. The agent keeps {{stripe}} and calls your APIs through the server, which fills in the real key outside the transcript.

Install

irm https://raw.githubusercontent.com/zallkyre/secrets-mcp/main/install.ps1 | iex

It finds the agents on your PC, lists them, and wires up the one you pick:

  Detected agents:
    [1] OpenCode
    [2] OpenWork
    [3] Claude Desktop
    [4] Cursor
    [5] VS Code

  Connect secrets-mcp to which agent(s)?
  Enter numbers separated by commas, 'a' for all, or Ctrl+C to abort.
  >

Every config it touches is backed up first. Re-running is safe — it replaces its own entry instead of duplicating it.

MIT · Python 3.10+ · Windows first · 11 agents


Related MCP server: agent-vault

What it looks like

you:    here's my stripe key sk_live_4eC39Hq…
agent:  stored as {{stripe}} — I won't repeat it.
agent:  calling the API with {{stripe}}
        ↑ filled in locally, after the model stops writing

agent:  200 OK  balance: $1,204.00

One tool call at the paste. After that the key is out of the model's reach.

Why

Every time you paste a key into chat, that key lives in:

  • the model provider's request logs

  • your local transcript

  • every later tool call the agent writes (curl, shell, files)

  • any screenshot or code block it prints

secrets-mcp closes everything after the paste. It cannot close the paste itself — see Threat model.

Tools

tool

what it does

stage_secret

finds keys in text, stores them, returns the text with {{handles}}

list_secrets

handles + last-4 fingerprint + use count. Never values.

request_with_secret

HTTP call with {{handle}} resolved server-side

revoke_secret

deletes a handle

vault_info

vault path, backend, count

No tool returns a raw secret. That is the entire design constraint — a single get would make the whole thing pointless, so it does not exist.

Detected formats: Anthropic · OpenAI · GitHub PAT · AWS access key · Stripe · Slack · Google API · SendGrid · Resend · Discord bot · Twilio · Groq · JWTs · PEM private keys · high-entropy strings with nearby api_key/token context.

Storage

platform

backend

Windows

DPAPI (CryptProtectData) — bound to your Windows user, no password

Linux / macOS

AES-GCM, key at ~/.secrets-mcp/key (0600), requires cryptography

Vault: %APPDATA%\secrets-mcp\vault.json. Override with SECRETS_MCP_VAULT.

Threat model

Protects against

  • the key being written into shell commands, curl, files, or later prompts

  • the key leaking through agent logs of tool arguments

  • API error responses that echo your key back (the proxy scrubs responses too)

  • plaintext secrets sitting on disk

Does not protect against

  • the paste itself. Once you send a key, it reached the model provider on that request. No tool can undo that. Revoke and rotate if it was live.

  • a compromised local account — DPAPI decrypts for your user by design

  • a malicious MCP server you installed alongside this one

  • prompt injection that persuades the agent to call request_with_secret against an attacker's URL — review the tool calls, and use scoped keys

Honest framing: this reduces blast radius. It is not a vault you can safely paste anything into.


Supported agents

agent

config

OpenCode

~/.config/opencode/opencode.jsonc

OpenWork

%APPDATA%\openwork\runtime-opencode-config.json

Claude Desktop

%APPDATA%\Claude\claude_desktop_config.json

Claude Code

~/.claude.json

Cursor

~/.cursor/mcp.json

Windsurf

~/.codeium/windsurf/mcp_config.json

VS Code

%APPDATA%\Code\User\mcp.json

Gemini CLI

~/.gemini/settings.json

Codex CLI

~/.codex/config.toml

Zed

%APPDATA%\Zed\settings.json

OpenClaw

~/.openclaw/config.json

Only the ones actually installed are offered.

Manual install

OpenCode / OpenWork:

{
  "mcp": {
    "secrets": {
      "type": "local",
      "command": ["python", "-m", "secrets_mcp"],
      "enabled": true
    }
  }
}

Everything else:

{
  "mcpServers": {
    "secrets": { "command": "python", "args": ["-m", "secrets_mcp"] }
  }
}

Development

python -m pip install -e .
python -m unittest discover -s tests -v

License

MIT

Available Tools

5 tools
list_secretsA

List stored handles with fingerprints. Never returns secret values.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/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 delivers the single most important behavioral fact: it never returns secret values, which is critical for a secrets tool. It also notes fingerprints are returned, though read-only/rate-limit behavior is left implicit.

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 short sentences, front-loaded with the action and immediately followed by the key safety constraint. Nothing is wasted.

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?

An output schema exists so return values need no explanation, and the critical non-disclosure property is stated. For a zero-param read tool this is nearly complete, missing only explicit routing versus sibling tools.

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?

The tool takes zero parameters, so per the baseline there is no parameter semantics burden to compensate for. The description correctly adds no parameter detail since none exist.

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?

States a specific verb+resource ('list stored handles') and clarifies the returned shape ('with fingerprints'). It does not explicitly differentiate from siblings like vault_info or revoke_secret, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no mention of alternatives such as vault_info or request_with_secret. Usage is only weakly implied by the verb 'list'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_with_secretA

Call an API, substituting {{handle}} with the real secret server-side.

Use this instead of writing the key into a shell command or curl. The key is injected here, outside the conversation, and the response is scrubbed before it comes back.

Args: method: GET, POST, PUT, PATCH, DELETE. url: full URL; {{handle}} is allowed in the path or query. headers: e.g. {"Authorization": "Bearer {{stripe}}"}. body: request body; {{handle}} is substituted.

NameRequiredDescriptionDefault
urlYes
bodyNo
methodYes
headersNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden and mostly succeeds: it discloses that substitution happens server-side, the key is injected outside the conversation, and the response is scrubbed before returning. It does not cover failure modes, rate limits, or what happens if a handle is unknown or was never staged.

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?

Front-loaded with the core mechanism, then the usage rule, then the security guarantee, then args. No sentence is redundant and each adds information the schema does not already contain.

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?

An output schema exists, so return format need not be explained, and the description still notes response scrubbing. The main gap is operational context: it never states that a handle must first be staged (a sibling tool) or what error behavior to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry all parameter meaning, and it does: method values enumerated, url accepts {{handle}} in path or query, headers shown with a concrete Bearer {{stripe}} example, and body accepts substitution. This fully compensates for the undocumented 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 (call an API) plus the distinguishing mechanism: server-side substitution of {{handle}} for the real secret. This clearly separates it from siblings like list_secrets, stage_secret, revoke_secret, and vault_info, which manage secrets rather than consume them.

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?

"Use this instead of writing the key into a shell command or curl" gives an explicit when-to-use rule with a concrete alternative. It stops short of naming sibling tools or stating when-not to use it (e.g., for non-secreted requests).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_secretB

Delete a stored handle. The real secret is destroyed locally.

NameRequiredDescriptionDefault
nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose one valuable trait, that the real secret is destroyed locally, hinting at irreversibility. However, it omits permissions required, whether the operation is idempotent, and what happens if the name doesn't exist.

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 short sentences, zero filler, with the action stated first and the destruction side-effect immediately after. Appropriately sized and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. Still, for a destructive mutation with no annotations, the description should cover authorization and irreversibility more fully; the local-destruction note is a good start but leaves the agent under-informed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the sole parameter `name` is undocumented in both the schema and the description. The description never explains what value `name` should hold or how it relates to handles produced by stage_secret.

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?

States a specific verb (Delete/revoke) and resource (a stored handle), which is clear enough to distinguish from list_secrets and stage_secret. It doesn't explicitly name a sibling or clarify the revoke-vs-delete relationship, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no statement of prerequisites, and no reference to alternatives such as stage_secret or request_with_secret. The agent must infer that this is the cleanup step after a handle is no longer needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stage_secretA

Store any secrets in text and return it with handles substituted.

Use this the moment a user pastes an API key, token, or private key. The returned text is safe to repeat; the original was written to an encrypted local vault and is not returned.

Args: text: the raw text containing the secret(s). name: optional handle to force, e.g. "stripe" -> {{stripe}}.

NameRequiredDescriptionDefault
nameNo
textYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/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 substantial work: it states the original is written to an encrypted local vault and is not returned, and that the output text is safe to repeat. That is meaningful disclosure beyond the schema. It omits persistence/lifetime of the staged secret and what happens if the same secret is staged twice with colliding handles.

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?

Front-loaded with the core action and result, followed by the trigger condition, the safety property, and a compact Args block. Every sentence carries information and there is no filler.

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?

An output schema exists, so return values need not be explained, and the description is nonetheless solid on input, side effects, and safety. For a security-sensitive mutation with zero annotation coverage it could say more about handle collisions and how the staged value is later used by request_with_secret, but nothing critical is missing for a correct invocation.

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 0%, so the description must supply the meaning, and it does for both parameters: text is "the raw text containing the secret(s)" and name is an optional forced handle with a concrete example ("stripe" -> {{stripe}}). The explicit handle syntax is the kind of detail the schema cannot convey. The `text` gloss remains close to a restatement, keeping it below 5.

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 description gives a concrete verb (store) and resource (secrets), and adds the distinctive transformation: the returned text has handles substituted for the raw secret. That clearly separates it from revoke_secret or list_secrets by implication. It stops short of a 5 because it never names or contrasts itself with the actual siblings.

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?

"Use this the moment a user pastes an API key, token, or private key" is an explicit, unambiguous trigger condition. However, it offers no when-not guidance and never points to the sibling that consumes the staged secret (request_with_secret), so the agent must infer the workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vault_infoB

Where the vault lives and how many handles it holds. No values.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose one genuinely useful behavioral trait: this read returns metadata only and exposes no secret values. Beyond that it says nothing about permissions, whether the count is scoped to a workspace, or cost.

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?

Two short sentences, front-loaded with the return content and closed by the 'No values' caveat, with no filler. The brevity edges into under-specification ('handles') rather than waste, which is why it is not a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the zero-parameter surface is trivial. Still, the description leaves the core nouns ('vault', 'handles') vague enough that an agent cannot fully predict what the response means in a multi-tenant context.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No parameter-level guidance is needed or missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description conveys that this returns vault location plus a count of 'handles', and the terse 'No values' does distinguish it from list_secrets. However, there is no explicit verb (get/report) and 'handles' is unexplained jargon, so an agent must guess what the count actually represents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus the four secret-oriented siblings. 'No values' implicitly signals that list_secrets is the place to look for secret contents, but this routing is left for the agent to infer rather than stated.

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. 5 tool updatesv0.1.0
    • First observedlist_secrets
    • First observedrequest_with_secret
    • First observedrevoke_secret
    • First observedstage_secret
    • First observedvault_info

TDQS

A3.8/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: store, list, use, delete, or inspect metadata. There is no overlap between staging, listing, requesting, revoking, and vault info.

Naming Consistency4/5

Most tools follow a verb_noun pattern (stage_secret, list_secrets, revoke_secret), but request_with_secret includes an extra preposition and vault_info is noun-only. The deviations are minor and readability remains high.

Tool Count5/5

Five tools is well-scoped for a secrets vault: create, list, use, delete, and inspect. Each tool earns its place without redundancy.

Completeness4/5

The surface covers the core lifecycle: stage, list, use in requests, revoke, and vault info. A minor gap is the lack of an explicit update or rotate operation, though stage_secret may overwrite handles implicitly.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to securely manage API credentials and make proxied API calls through AgentKeys, keeping secrets hidden from the agent.
    6 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Agent Vault is a local credential vault for AI agents. It enables agents to use secrets by name without ever seeing their values, with host allowlists, output scrubbing, and audit logging.
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to securely use API keys by storing them in an encrypted vault and injecting them on demand with user approval, without exposing the key values to the model.
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to make authenticated API calls and run commands with secrets injected, while keeping credentials completely hidden from the model, with policy enforcement, grants, and audit logging.
    6
    MIT