This solves a different problem from a password manager or a .env file: the secret is not being kept from a repository, it is being kept from the transcript, the provider's logs and the model's memory, which is why the listing call is built to return names and domains and never values. Domain binding is the part that limits the damage — a secret bound to one host cannot be resolved for another. The threat model is stated plainly: it does not defend against a compromised process on your machine, or against an MCP server you have already given permission to call the resolver.
A local encrypted vault that resolves placeholders. Secrets live in an encrypted file on your machine, each pinned to a domain; a placeholder travels through the conversation, and the plaintext appears only when the call is actually made.
- A placeholder resolved to its real value only when the calling origin matches the domain that secret is bound to — a mismatch is refused, not resolved
- The vault's contents listed as names and bound domains, with no values ever returned by that call
- Placeholder forms beyond the plain name: the first secret bound to a domain, a stored document's contents, and personal-data entries under any name you choose
- Secrets encrypted with AES-256-GCM under a key derived by Argon2id (m=64 MiB, t=3, p=1), with the username mixed into the derivation so the same password under a different user yields a different key
- Key material held in process memory only and never written to disk, and no cloud sync — the vault is a local file
- A REST mode on a local port for integrations that are not MCP clients
A vault file, passed on the launch command: npx enigmagent-mcp --vault /absolute/path/my.vault.json. Unlocking is interactive by default; ENIGMAGENT_USER and ENIGMAGENT_PASS skip the prompt for headless and CI use. Every secret must be bound to a domain at the time you add it, because that binding is what the resolver enforces. Placeholder names take letters, digits and _ : - . @ and are case-insensitive. --mode rest --port 3737 runs it as a local REST API instead of over stdio. The vault is local only, with no sync, so it is yours to back up. MIT.
One command — npx enigmagent-mcp --vault ./my.vault.json
