Password Space
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., "@Password Spaceinject my GITHUB_TOKEN secret into the env file"
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.
Password Space
A local encrypted credential vault for developers and AI agents.
Store secrets once. Unlock them explicitly. Let agents access credentials through MCP without routinely exposing secret values in chat transcripts.
Encryption at rest and MCP inject handles reduce how often secrets appear in chat — they do not make secrets invisible to a compromised machine, a stolen unlock session, or every possible log/tool path. See Security model and SECURITY.md.
Why Password Space?
Anti-pattern | What goes wrong |
Paste secrets into chat | Persist in transcripts, screenshots, logs |
Commit | Leak via git and shared workspaces |
Plaintext MCP configs | Readable by anything with config access |
Password Space keeps ciphertext on disk, an explicit unlock gate, and an agent side channel (MCP + short-lived inject files + Skill + optional redaction hook).
Related MCP server: secrets-mcp-server
Features
Feature | What it does |
Encrypted local storage | Secrets in SQLite ( |
Explicit unlock |
|
Metadata-only listing |
|
Day-1 MCP setup |
|
Secret injection |
|
Session TTL | Unlock session expires (default 8 hours); expired sessions are rejected and cleared |
Redaction hook | Optional |
Bundled plugin MCP |
|
When the vault is locked, mutating/read tools fail until unlock again. Restarting the MCP process does not unlock the vault — it only re-reads an existing valid session file.
Security model
Designed to protect: vault database on disk while locked (ciphertext + wrapped key); chat/transcript plane when agents use inject_secret / tool-arg secrets and follow the Skill (handles like ps://NAME instead of values).
Does not protect against: an attacker on the same unlocked user account; theft of a live session file; plaintext while present in process memory, inject *.env files, or CLI get / resolve_secret results; hooks that are disabled, misconfigured, or incomplete.
Area | MVP behavior |
KDF / encryption | scrypt (N=2¹⁵, r=8, p=1) + AES-256-GCM via Node |
Unlock session |
|
Inject files |
|
Passphrase loss | No recovery — ciphertext is unrecoverable without the unlock passphrase |
Redaction | Only known values from inject files / explicit secret lists — not a universal DLP |
Full threat model, trust boundaries, and reporting: SECURITY.md. Architecture / key hierarchy: docs/architecture.md.
Requirements
Requirement | Notes |
Node.js | ≥ 20 (uses built-in |
Cursor plugin | Cursor with marketplace / MCP support |
Package manager | pnpm 9.x — optional; only for CLI / developing this repo |
OS | Developed and verified on macOS; should run anywhere Node 20 + |
Quickstart (Cursor plugin — primary)
Day-1 setup does not require git clone or pnpm.
Open Cursor Settings → Customize (or Dashboard → Plugins & MCPs for team marketplaces).
+ Add Marketplace → Import from GitHub.
Paste:
https://github.com/vishnutvm/password-spaceInstall the password-space plugin.
Optional custom vault path: set a real
PASSWORD_SPACE_HOME(absolute path) in the environment or a hand-written MCPenvblock. Leave it unset to use~/.password-space. Never leave an unresolved${PASSWORD_SPACE_HOME}(or other${…}) as the path — the server treats those as unset and falls back to the default.Ask the agent, for example:
Set up Password Space for me: check status, init the vault if needed, unlock it, then store my API token.
The Skill drives this MCP flow:
vault_status → vault_init (if needed) → vault_unlock → vault_set_secret → inject_secretPass the passphrase and secret values only as MCP tool arguments (or UI secret prompts / PASSWORD_SPACE_PASSPHRASE). Never paste them into chat.
Official public listing (later): cursor.com/marketplace/publish.
Layout: .cursor-plugin/marketplace.json → plugins/password-space/.
Quickstart (CLI — optional power-user)
git clone https://github.com/vishnutvm/password-space.git
cd password-space
pnpm install && pnpm build
pnpm password-space init # interactive passphrase (min 8 chars)
pnpm password-space unlock # writes session file
pnpm password-space set GITHUB_TOKEN --tags api,github # prompts for value on a TTY
pnpm password-space list # names / tags only
pnpm password-space status
pnpm password-space lockHow set reads the secret value
Input | When |
Interactive hidden prompt | TTY and no |
stdin (one value) | Non-TTY (pipes) |
| Explicit flag (avoid in shell history for real secrets) |
Prefer piping from a protected source rather than putting a real token on the command line:
printf '%s' "$GITHUB_TOKEN" | pnpm password-space set GITHUB_TOKEN --tags api,githubpnpm build also regenerates the marketplace MCP bundle at plugins/password-space/dist/index.js.
Throwaway demo
export PASSWORD_SPACE_HOME=/tmp/ps-demo
rm -rf "$PASSWORD_SPACE_HOME"
# WARNING: inline PASSWORD_SPACE_PASSPHRASE is for demos only — it can end up in shell history.
# Do not use this pattern with a real vault passphrase.
PASSWORD_SPACE_PASSPHRASE='demo-pass-ok' pnpm password-space init
PASSWORD_SPACE_PASSPHRASE='demo-pass-ok' pnpm password-space unlock
printf 'ghp_demo_secret_value' | pnpm password-space set DEMO_TOKEN --tags demo
pnpm password-space list
pnpm password-space status
pnpm password-space lockOr run pnpm demo (throwaway vault under /tmp/password-space-demo).
Manual MCP configuration
Without the marketplace, point Cursor (or another MCP client) at the bundled server (Node only — no monorepo install):
{
"mcpServers": {
"password-space": {
"command": "node",
"args": ["/absolute/path/to/password-space/plugins/password-space/dist/index.js"]
}
}
}PASSWORD_SPACE_HOME is optional — omit env for the default ~/.password-space. If you override, use a concrete absolute path only (never an unresolved ${PASSWORD_SPACE_HOME} placeholder).
Also see examples/mcp.cursor.json. Skill: plugins/password-space/skills/password-space/. Hooks: plugins/password-space/hooks/hooks.json.
MCP tools
Tool | Returns secret value? | Use |
| No | Initialized? Unlocked? Next step hint |
| No | Create vault (passphrase via arg or |
| No | Write unlock session |
| No | Clear unlock session |
| No (metadata only) | Store/update name + value + tags |
| No | Discover names / ids / tags |
| No | One secret’s metadata |
| No (writes env file) | Preferred agent access |
| Yes, if | Last resort only |
Secret-injection lifecycle
This is the intended agent path (conversation plane stays on refs; runtime plane reads a file).
1. Human/agent: vault_status → vault_init (once) → vault_unlock
2. Agent: vault_set_secret (values as tool args — not chat)
3. Agent: list_secrets / get_secret_metadata → names only
4. Agent: inject_secret({ name })
5. MCP: decrypt in-process → write inject/<token>.env (0600)
6. Tool result: handle + env_file path + env_var + expires_at (no value)
7. Runtime: source/read env file outside chat → use credential
8. Runtime: delete env file when done
9. Human/agent: vault_lock when finishedQuestion | Answer |
What does | JSON with |
Where is the file? |
|
Permissions? | Written with mode |
How to use without printing? | Read/source the file in a shell or tool runtime; do not |
When deleted? | Caller should delete after use; TTL metadata defaults to 5 minutes (file is not auto-swept by a daemon in MVP) |
Vault locked / missing secret? | Tool returns an error payload ( |
Avoid CLI get and MCP resolve_secret in agent workflows — both can put plaintext into the tool/CLI result stream.
Architecture
flowchart TB
Human[Human + agent prompts] -->|vault_init / unlock / set| MCP[Bundled MCP]
MCP --> Vault[(Encrypted SQLite vault.db)]
MCP -->|session 0600| Session[Unlock session]
Agent[Agent + Skill] -->|list / metadata / inject| MCP
MCP -->|ciphertext decrypt| Vault
MCP -->|env file handle| Inject[inject/*.env]
Agent -->|consume outside chat| Inject
Hook[redact.mjs hook] -->|strip known values| Chat[Chat transcript]
Agent -.->|prefer handles only| Chat
CLI[Optional CLI] -.->|same vault| VaultKey hierarchy: passphrase → scrypt(salt) → unwrap vault key → AES-256-GCM per secret.
Detail: docs/architecture.md.
Troubleshooting
Symptom | Likely cause | What to do |
| Node < 20 | Upgrade to Node 20+ ( |
| No | Ask the agent to call |
| Locked or expired session | Call |
| TTL elapsed (default 8h) | Unlock again; use |
| Typo or wrong vault | Confirm |
Plugin installed but MCP errors “locked” | Session missing/expired | Call |
Secret not found | Wrong name / empty vault |
|
Unexpected data dir | Env override or unresolved | Check |
MCP won’t start | Bad path to | Rebuild with |
Development
pnpm install && pnpm build && pnpm testPath | Role |
| Crypto, store, session, inject, redact |
| Optional human CLI |
| MCP server sources (bundled into the plugin) |
| Cursor plugin (bundled MCP + skill + hooks + logo) |
See CONTRIBUTING.md. License: MIT.
This server cannot be deployed
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.
One-time, end-to-end encrypted secrets for agents. 0.005 USDC per secret via x402.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEncrypts and stores API keys and environment variables locally, providing them to AI agents via MCP with tools for listing, describing, getting secrets, and running commands with secret values redacted.2MIT
- AlicenseCqualityCmaintenanceEnables AI agents to securely store and manage encrypted secrets locally while using them indirectly through environment-variable injection or file writes, so plaintext values never enter the agent's context.8MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI coding agents to securely inject API keys and secrets into environment files, configs, or commands without the agent ever seeing the secret values.2 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to scan and audit environment files for leaked secrets, sanitize them, encrypt/decrypt vaults, and run processes with zero-disk secret injection.MIT