enigmagent-mcp
enigmagent-mcp
Local encrypted vault MCP server. Your LLM types
{{OPENAI_KEY}}. The real value never reaches the model — not in prompts, not in logs, not in conversation history.
npx enigmagent-mcp --vault ./my.vault.jsonThat's the entire install. Works with Claude Desktop, Cursor, Continue.dev, Cline, Open WebUI, AnythingLLM, LM Studio, Zed, and anything else that speaks MCP.
⭐ Star this repo if you've ever pasted a token you regretted.
The 30-second pitch
You ask Claude to call your GitHub API. Claude needs GITHUB_TOKEN. Three options that all suck:
Paste it in the chat → it lives in the provider's logs forever
Put it in env vars → it leaks the moment Claude reads
.envwhile debuggingSkip the agent → you lose the whole point
Option 4: type {{GITHUB_TOKEN}} in the prompt. EnigmAgent intercepts at the MCP boundary, decrypts locally with AES-256-GCM, and returns the real token only when the requesting origin matches the secret's bound domain. The model literally never has the value.
Related MCP server: mcp-keyward
Setup per client
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"enigmagent": {
"command": "npx",
"args": ["-y", "enigmagent-mcp", "--vault", "/absolute/path/to/my.vault.json"]
}
}
}Restart Claude. Two new tools appear: enigmagent_resolve and enigmagent_list.
Cursor
~/.cursor/mcp.json:
{
"mcpServers": {
"enigmagent": {
"command": "npx",
"args": ["-y", "enigmagent-mcp", "--vault", "/abs/path/my.vault.json"]
}
}
}Continue.dev
~/.continue/config.yaml:
mcpServers:
- name: enigmagent
command: npx
args: ["-y", "enigmagent-mcp", "--vault", "/abs/path/my.vault.json"]Cline (VS Code)
cline_mcp_settings.json:
{
"mcpServers": {
"enigmagent": {
"command": "npx",
"args": ["-y", "enigmagent-mcp", "--vault", "/abs/path/my.vault.json"]
}
}
}Open WebUI
# uses mcpo (https://github.com/open-webui/mcpo) as bridge
mcpo --port 8000 -- npx enigmagent-mcp --vault /abs/path/my.vault.jsonCustom REST integration
npx enigmagent-mcp --mode rest --port 3737 --vault /abs/path/my.vault.jsonThen POST /resolve with {"placeholder": "OPENAI_KEY", "origin": "https://api.openai.com"} returns the decrypted value (only when the origin matches the secret's bound domain).
CI / headless mode
Skip the interactive password prompt with env vars (only do this in trusted environments):
ENIGMAGENT_USER=alice ENIGMAGENT_PASS=… npx enigmagent-mcp --vault ./my.vault.jsonWithout these, the server starts in locked mode if there's no TTY — useful behind mcp-proxy and similar wrappers.
MCP tools exposed
Tool | Description |
| Resolve a placeholder to its vault value. Domain binding enforced — the requesting |
| List secret names + their bound domains. Never returns values |
// example tool call
{
"name": "enigmagent_resolve",
"arguments": {
"placeholder": "GITHUB_TOKEN",
"origin": "https://api.github.com"
}
}
// → returns the decrypted token stringHow it works
LLM emits tool call: fetch({headers: {Authorization: "Bearer {{OPENAI_KEY}}"}})
│
┌───────────────▼───────────────┐
│ enigmagent-mcp (this server) │
│ • match placeholder name │
│ • check origin == bound dom. │
│ • decrypt with AES-256-GCM │
└───────────────┬───────────────┘
│ real token
▼
HTTPS to api.openai.comThe plaintext value exists in process memory for one event-loop tick. Never logged, never in stdout, never visible to the model.
Security model
Layer | Implementation |
KDF | Argon2id (m=64 MiB, t=3, p=1) — |
Encryption | AES-256-GCM, 96-bit nonce per entry |
Domain binding | Every secret pinned to a domain; resolver rejects mismatched origins |
Master key | Lives in process memory only — never written to disk |
Vault file | Encrypted JSON, plaintext never persisted |
What it does not protect against: a compromised process reading session memory, a malicious MCP server you've connected to with permission to call enigmagent_resolve, side-channels (timing, swap, core dumps). Full threat model: docs/THREAT_MODEL.md.
Full ecosystem
This repo is the MCP server alone. The full EnigmAgent project includes:
Browser extension (Chrome/Firefox/Edge) for credentials inside web forms
Python SDK for LangChain / LlamaIndex / CrewAI
REST + stdio dual-mode API
Domain-bound document injection (
{{DOC:filename}})
Main repository: https://github.com/Agnuxo1/EnigmAgent
EnigmAgent is part of the OpenCLAW / P2PCLAW ecosystem of privacy-preserving local AI tooling — a multi-agent scientific research network where dozens of LLM agents need credentials and none of them should have them.
License
MIT — see LICENSE.
Contributing
Pull requests welcome. Security disclosures: see SECURITY.md in the main repo.
Available Tools
2 toolsenigmagent_listA
List all secret names and their bound domains. Never returns actual secret values.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses a key behavioral trait: it never returns secret values, which informs the agent about safety and limits.
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?
Extremely concise with two sentences, front-loaded with the core purpose, and no superfluous text.
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 simple list tool with no parameters and no output schema, the description covers the essential purpose and a critical behavioral constraint, though pagination or ordering details are absent.
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?
No parameters exist, so baseline 4 is appropriate as per instructions; no additional param info needed.
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?
Description clearly states it lists secret names and bound domains, and explicitly distinguishes from a value-returning tool by stating 'Never returns actual secret values.'
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 explicit guidance on when to use this tool versus the sibling 'enigmagent_resolve', but the description's emphasis on listing metadata implies usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enigmagent_resolveA
Resolve a secret placeholder from the EnigmAgent vault. Returns the decrypted value. Domain binding is enforced: the origin must match the secret's bound domain.
| Name | Required | Description | Default |
|---|---|---|---|
| placeholder | Yes | The secret name to resolve. Supports {{NAME}}, {{LOGIN:domain}}, {{DOC:filename}} syntax (pass without the braces). | |
| origin | Yes | The requesting origin URL (e.g. https://api.example.com). Must match the secret's domain binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description correctly notes returns decrypted value and domain enforcement, but lacks details on error conditions (e.g., mismatch) or side effects.
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 purpose, no wasted words.
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 no output schema, the description mentions return value but omits error handling or detailed result format. Adequate for a simple tool but could be more complete.
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 description adds valuable context to both parameters: placeholder syntax variants and origin requirement, going beyond 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?
The description clearly states the verb 'Resolve' and the resource 'secret placeholder from the EnigmAgent vault', and distinguishes from sibling 'enigmagent_list' by specifying it returns the decrypted value.
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 description explains the domain binding and placeholder syntax, but does not explicitly state when to use this tool versus alternatives or when not to use it.
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.
2 tool updates
v0.1.0- First observed
enigmagent_list - First observed
enigmagent_resolve
TDQS
Scored across 2 tools
The two tools have completely distinct purposes: one lists secret names and domains, the other resolves placeholder values. There is no ambiguity between them.
Both tools share a consistent 'enigmagent_' prefix followed by a verb ('list', 'resolve'), following a predictable verb_noun pattern.
With only 2 tools, the set is on the low end of what is reasonable. While each tool is distinct, the total number feels minimal for a secret management server.
The tool surface lacks basic CRUD operations like create, update, or delete secrets. Agents can only list and resolve, which is insufficient for comprehensive secret management.
Maintenance
Related MCP Connectors
A secret store for AI agents: the agent never sees the plaintext.
Encrypted secret store and rotation for autonomous agent credentials
Secrets for developers and agents—secure context and workflows without exposing secret values.
Give your AI hands. Identity, credential vault, and API gateway for autonomous agents.
Related MCP Servers
- AlicenseAqualityBmaintenanceOS keychain secrets for AI coding agents, over MCP. Anchors credentials to the native vault (macOS Keychain, Linux Secret Service, Windows Credential Vault) and exposes them through 44 policy-governed tools: per-environment values, TTL, linked rotation, encrypted transfer bundles, redacted exec, and a tamper-evident audit log. Local-first, no cloud account.44486 npm5AGPL 3.0
- FlicenseNot gradedqualityDmaintenanceLocal encrypted vault for API keys. LLMs never see your real keys — the server injects them transparently into HTTP requests.-
- AlicenseAqualityDmaintenanceShare encrypted, self-destructing secrets from your AI agent. Zero-knowledge E2E encryption. Agent-blind input sources (env:, file:, dotenv:) keep secrets out of LLM context.4351 npm1MIT
- AlicenseAqualityDmaintenanceEncrypted secrets vault that blinds AI agents to API keys. Stores secrets in AES-256-GCM encrypted SQLite vault, resolves them at runtime via MCP values never appear in LLM conversation transcripts. Sandbox .env files with deterministic fakes.739 npm3MIT