secrets-mcp
Detects and stores Discord bot tokens, allowing the agent to reference them as handles and make authenticated HTTP requests to the Discord API without exposing the token in the transcript.
Detects and stores GitHub personal access tokens (PATs), allowing the agent to reference them as handles and make authenticated HTTP requests to the GitHub API without exposing the token in the transcript.
Detects and stores Google API keys, allowing the agent to reference them as handles and make authenticated HTTP requests to Google APIs without exposing the key in the transcript.
Detects and stores OpenAI API keys, allowing the agent to reference them as handles and make authenticated HTTP requests to the OpenAI API without exposing the key in the transcript.
Detects and stores Resend API keys, allowing the agent to reference them as handles and make authenticated HTTP requests to the Resend API without exposing the key in the transcript.
Detects and stores SendGrid API keys, allowing the agent to reference them as handles and make authenticated HTTP requests to the SendGrid API without exposing the key in the transcript.
Detects and stores Slack tokens, allowing the agent to reference them as handles and make authenticated HTTP requests to the Slack API without exposing the token in the transcript.
Detects and stores Stripe API keys, allowing the agent to reference them as handles and make authenticated HTTP requests to the Stripe API without exposing the key in the transcript.
Detects and stores Twilio API keys, allowing the agent to reference them as handles and make authenticated HTTP requests to the Twilio API without exposing the key in the transcript.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@secrets-mcpstore this stripe key as a handle, then call the balance endpoint"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 | iexIt 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.00One 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 |
| finds keys in text, stores them, returns the text with |
| handles + last-4 fingerprint + use count. Never values. |
| HTTP call with |
| deletes a handle |
| 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 ( |
Linux / macOS | AES-GCM, key at |
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_secretagainst 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 |
|
OpenWork |
|
Claude Desktop |
|
Claude Code |
|
Cursor |
|
Windsurf |
|
VS Code |
|
Gemini CLI |
|
Codex CLI |
|
Zed |
|
OpenClaw |
|
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 -vLicense
MIT
Available Tools
5 toolslist_secretsA
List stored handles with fingerprints. Never returns secret values.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| body | No | ||
| method | Yes | ||
| headers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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}}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
list_secrets - First observed
request_with_secret - First observed
revoke_secret - First observed
stage_secret - First observed
vault_info
TDQS
Scored across 5 tools
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.
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.
Five tools is well-scoped for a secrets vault: create, list, use, delete, and inspect. Each tool earns its place without redundancy.
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
Related MCP Connectors
Give your AI hands. Identity, credential vault, and API gateway for autonomous agents.
Secrets for developers and agents—secure context and workflows without exposing secret values.
A secret store for AI agents: the agent never sees the plaintext.
- FullmaktOAuthai.fullmakt
Credential broker for AI agents: scoped, revocable API access with policy enforcement and audit.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceEnables AI agents to securely manage API credentials and make proxied API calls through AgentKeys, keeping secrets hidden from the agent.6 npmMIT- AlicenseNot gradedqualityDmaintenanceAgent 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.4MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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.1MIT
- AlicenseAqualityBmaintenanceEnables 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.6MIT