bitwarden-agent-vault-mcp
Provides tools for storing, retrieving, listing, and rotating secrets in Bitwarden Secrets Manager, including injecting secrets into allowlisted executables.
Click on "Install 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., "@bitwarden-agent-vault-mcpStore my AWS secret key as 'aws_secret'"
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.
Bitwarden Agent Vault MCP
An unofficial, open-source Codex plugin and local MCP server for using Bitwarden Secrets Manager as durable credential storage for agent workflows.
The server runs locally over MCP stdio. It does not open a network port and it does not contain a Bitwarden token, organization ID, project ID, password, or API key. Every installation must supply its own Bitwarden machine account and private configuration.
This community project is not affiliated with or endorsed by Bitwarden, Inc.
What it does
Stores and rotates stable agent credentials in Bitwarden Secrets Manager.
Lists projects and secret metadata without returning values.
Retrieves a secret when plaintext is explicitly required.
Injects selected secrets into an allowlisted executable without placing them in the normal command output.
Opens the Bitwarden Secrets Manager web vault on macOS.
Includes a Codex skill for automatically saving durable credentials that Codex creates, receives, or discovers.
Related MCP server: VaultBridge
Security model
Codex MCP client
| local JSON-RPC over stdin/stdout
v
Bitwarden Agent Vault MCP server
| machine token from macOS Keychain or BWS_ACCESS_TOKEN
v
Bitwarden Secrets Manager API via bwsThe MCP server uses stdio and has no HTTP listener.
The machine token is read from macOS Keychain by default. On other platforms, it must be supplied to the MCP process as
BWS_ACCESS_TOKEN.Bitwarden project and secret permissions remain the authoritative access boundary. Use a least-privilege machine account.
store_secretrefuses to overwrite an existing key unlessoverwrite: trueis explicitly supplied.get_secretis disabled by default and requires an explicit privateallowPlaintextRevealopt-in.run_with_secretsis disabled by default. When enabled, it requires an absolute executable allowlist and injects only the requested secret keys.Command output is redacted for exact secret values. Redaction cannot prevent an executable from encoding, transforming, writing, or transmitting a secret. Only allowlist purpose-built programs you trust.
get_secretintentionally returns plaintext to the MCP client. Do not expose this server to untrusted clients or untrusted prompt sources.
See SECURITY.md for reporting and operational guidance.
Requirements
Node.js 20 or later
A Bitwarden Secrets Manager organization, project, and machine account
Bitwarden Secrets Manager CLI (
bws)Codex with local plugin/MCP support
macOS for the included Keychain helper; Linux can use an MCP-process environment variable
The server may work on Windows when bws is installed and
BWS_ACCESS_TOKEN is provided, but the helper scripts are currently tested for
macOS and Linux shells only.
Install
Clone the repository into the conventional personal plugin source location:
git clone https://github.com/ceweldy/bitwarden-agent-vault-mcp.git \
"$HOME/plugins/bitwarden-agent-vault"
cd "$HOME/plugins/bitwarden-agent-vault"
npm ciInstall bws with the checksum-verifying helper, or install it from Bitwarden's
official release process:
./scripts/install-bws.shCreate a Bitwarden Secrets Manager project and a machine account with only the required project permissions. Copy the machine access token once.
On macOS, store the token in Keychain without placing it in a file or shell history:
./scripts/store-machine-token.shOn non-macOS systems, configure BWS_ACCESS_TOKEN only in the MCP host's
private process environment. Do not commit it or place it in a shared shell
profile.
Create the private configuration:
mkdir -p "$HOME/.config/bitwarden-agent-vault"
cp config.example.json "$HOME/.config/bitwarden-agent-vault/config.json"
chmod 600 "$HOME/.config/bitwarden-agent-vault/config.json"Replace defaultProjectId with your Bitwarden project UUID. The UUID is not a
secret, but keeping deployment metadata outside the repository avoids leaking
your vault structure.
Check the live connection:
./scripts/doctor.shAdd the Codex plugin
Add this entry to the plugins array in your personal Codex marketplace at
~/.agents/plugins/marketplace.json. Preserve any entries already in that
file.
{
"name": "bitwarden-agent-vault",
"source": {
"source": "local",
"path": "./plugins/bitwarden-agent-vault"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}Then install it:
codex plugin add bitwarden-agent-vault@personalStart a new Codex task so the MCP tools and skill are loaded.
Configuration
The server reads ~/.config/bitwarden-agent-vault/config.json unless
BITWARDEN_AGENT_CONFIG points to another file.
Field | Required | Meaning |
| No | Bitwarden API server; defaults to Bitwarden cloud. |
| Recommended | Project used when a tool call omits |
| No | Must be exactly |
| No | Must be exactly |
| When enabled | Absolute paths to trusted executable files. |
To opt into command execution, use a private configuration such as:
{
"serverUrl": "https://vault.bitwarden.com",
"defaultProjectId": "replace-with-your-bitwarden-project-id",
"allowPlaintextReveal": false,
"allowCommandExecution": true,
"allowedExecutables": [
"/absolute/path/to/a-purpose-built-tool"
]
}Avoid allowlisting shells, general-purpose interpreters, download tools, or network clients. They defeat the purpose of an executable allowlist.
MCP tools
Tool | Behavior |
| Checks local token, CLI, optional remote access, and command-execution state. |
| Returns accessible project metadata. |
| Returns secret names and metadata, never values. |
| Returns one exact secret value when privately enabled. |
| Creates a secret or explicitly rotates an exact-key match. |
| Runs an enabled, allowlisted executable with selected secret keys. |
| Opens the Bitwarden Secrets Manager web UI on macOS. |
Development
npm ci
npm run check
npm audit --omit=devTests use a fake bws fixture and contain no real credentials. Never add live
tokens, vault exports, .env files, personal configuration, or customer data
to tests or issue reports.
License
Available Tools
7 toolsget_secretReveal a Bitwarden secretARead-only
Return one secret value in plaintext by UUID or exact key when private configuration explicitly enables plaintext reveal.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the readOnlyHint annotation by revealing that the tool returns plaintext and that a configuration gate exists. It does not cover error behavior or rate limits, but for a simple read operation the transparency is good.
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?
A single sentence of 18 words that is front-loaded and contains no redundancy. Every word serves a purpose.
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?
The tool is simple with no output schema. The description explains the core action and a critical condition. Missing details on error responses or return format, but overall adequate for the tool's simplicity.
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?
With 0% schema description coverage, the description provides crucial meaning for the identifier parameter (UUID or exact key). However, it fails to explain the purpose of the project_id parameter, leaving a gap.
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 tool returns a secret value in plaintext by UUID or exact key, with a conditional on configuration. This specific verb-resource pairing distinguishes it from siblings like list_secrets (metadata) and store_secret (write).
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 includes a key prerequisite (configuration must allow plaintext reveal) and specifies how to identify the secret (UUID or exact key). However, it does not explicitly advise when not to use or mention alternatives like run_with_secrets for cases where plaintext reveal is not enabled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList Bitwarden projectsARead-only
List Bitwarden Secrets Manager projects accessible to this machine identity. Returns metadata only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, openWorldHint), the description adds that the tool 'Returns metadata only' and clarifies the scope limitation ('accessible to this machine identity'), providing useful behavioral context.
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 concise sentences with no wasted words, front-loaded with the purpose. Every sentence adds value.
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 sufficiently covers scope, return type, and access constraints. Sibling tool names provide additional 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?
Schema coverage is 100% with no parameters, so the description does not need to add parameter details. The mention of 'metadata only' provides additional return value context beyond the 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?
The description clearly specifies the action ('List'), the resource ('Bitwarden Secrets Manager projects'), and the scope ('accessible to this machine identity'). It distinguishes from siblings like list_secrets which list a different resource.
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 implies usage context by stating the identity-based access scope, but does not explicitly state when to use this tool over alternatives or provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_secretsFind Bitwarden secretsARead-only
List secret names and metadata, optionally filtered by project or search text. Values are never returned by this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and open-world hints. The description adds that secret values are never returned, a crucial behavioral trait. It does not address pagination or result completeness, but annotations cover the safety profile.
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, immediate action verb, no fluff. Perfectly concise for its purpose.
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?
The description lacks explanation of what 'metadata' includes, how filters combine, and implications of openWorldHint. No output schema exists to clarify return structure. Overall, leaves some information gaps.
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 provides no descriptions for the two optional parameters. The description mentions they enable filtering by project or search text, adding high-level meaning but lacking details on format or combination behavior.
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 it lists secret names and metadata, differentiating from get_secret which returns values. The verb 'list' and resource 'secrets' are explicit, and sibling tools provide context.
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 optional filters by project or search text, implying use for metadata browsing rather than retrieving secret values. However, it does not explicitly name alternatives like get_secret for when values are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_bitwardenOpen Bitwarden Secrets ManagerARead-only
Open the Bitwarden Secrets Manager web vault, narrowed to a project when a project UUID is supplied.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true (safe, no mutations) and openWorldHint=true (navigates externally). The description adds that the vault can be narrowed to a specific project, which is a useful behavioral nuance beyond what annotations provide.
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?
A single, direct sentence that is front-loaded with the action and resource, with no extraneous information. Every word earns its place.
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 tool with one optional parameter and strong annotations, the description covers the key purpose and parameter effect. It could be improved by clarifying what 'open' means (e.g., returns a URL) but is largely 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?
Schema coverage is 0%, but the description mentions 'project UUID' for project_id, adding meaning. However, it does not specify the format or source of the UUID, leaving some ambiguity.
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 specific action ('Open the Bitwarden Secrets Manager web vault') and the optional narrowing by project UUID. It effectively distinguishes from sibling tools like get_secret and list_projects which perform different operations.
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 implies when to use (to access the vault UI) but does not explicitly mention when to avoid or provide alternatives. No exclusion criteria or context about prerequisites (e.g., needing a project UUID from list_projects).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_with_secretsRun a trusted command with Bitwarden secretsADestructive
Run one privately allowlisted executable with only the selected project secrets injected as environment variables. Command execution is disabled by default. Exact secret values are redacted from returned output.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| executable | Yes | ||
| project_id | No | ||
| secret_keys | Yes | ||
| timeout_seconds | No | ||
| working_directory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: redaction of secret values from output and that execution is disabled by default. This adds value beyond annotations, which already indicate destructiveness and non-read-only. No contradictions.
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, no fluff, front-loaded with the core action. Every word serves a purpose.
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?
No output schema exists, and the description only mentions redaction. It fails to describe return values, error behavior, or success indicators, which is insufficient for a command execution tool.
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?
With 0% schema description coverage, the description should explain parameters, but it only indirectly mentions 'secret_keys' and 'executable'. Parameters like 'args', 'timeout_seconds', 'working_directory', and 'project_id' are not explained, leaving agents guessing.
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 action ('Run'), the resource ('executable'), and the context ('with Bitwarden secrets'). It distinguishes from sibling tools like get_secret or list_secrets by focusing on execution rather than retrieval.
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?
It mentions command execution is disabled by default, hinting at a prerequisite, but does not explicitly state when to use this tool over alternatives or provide selection criteria. No mention of 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.
statusCheck Bitwarden Agent Vault MCPARead-only
Check local CLI installation, machine-token availability, and optional live Bitwarden access without exposing credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| verify_remote | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=true, signaling a safe read operation. The description adds value by specifying exactly what is checked (installation, token, live access) and reassures that credentials are not exposed, providing behavioral context beyond annotations.
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?
The description is a single, concise sentence that front-loads the main purpose with no unnecessary words. Every part earns its place.
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 the tool's simplicity (one boolean parameter, no output schema, strong annotations), the description covers the core functionality and safety. It lacks return format details, but for a low-complexity tool, it is sufficiently 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?
Schema description coverage is 0%, so the description must compensate. The description implies the 'verify_remote' boolean parameter controls optional live access, but it does not explicitly link the parameter name or its effect. The added meaning is moderate.
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 tool checks local CLI installation, machine-token availability, and optional live Bitwarden access, using a specific verb and distinct resources. It differentiates from sibling tools like get_secret or list_secrets by focusing on environment readiness rather than data retrieval.
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 implies this tool is for verifying setup before using other tools, but it does not explicitly state when to use it or provide alternatives. Without explicit when-not or usage context, the guidance is adequate but not strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_secretStore or rotate a Bitwarden secretADestructiveIdempotent
Create a stable secret or update the existing exact-key match in one project. The returned result omits the secret value.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| note | No | ||
| value | Yes | ||
| overwrite | No | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and destructiveHint=true, and the description adds context: it states that the returned result omits the secret value, which is a behavioral trait beyond annotations. It also implies idempotent update when key matches, but doesn't detail what gets destroyed or authentication needs.
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?
The description is only two sentences, with no wasted words. It front-loads the critical operation (create/update) and concludes with a notable behavioral fact (omission of secret value).
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 five parameters with zero schema descriptions, no output schema, and the tool being a mutation with destructive hint, the description is insufficient. It fails to explain the behavior of 'overwrite', what happens on key collision, how 'project_id' affects scoping, or error states. The omission note is helpful but not enough.
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 description adds no meaning to any of the five parameters. Required parameters 'key' and 'value' are unexplained, and optional parameters 'note', 'overwrite', and 'project_id' receive no guidance on semantics or constraints.
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 action: 'Create a stable secret or update the existing exact-key match in one project.' It specifies the verb (create/update) and the resource (secret), and implicitly distinguishes from sibling tools like get_secret or list_secrets by focusing on write operations.
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 implies usage for both creation and exact-key update, but provides no explicit guidance on when to use store_secret versus alternatives like rotate or update through other means. No exclusions or context for when not to use this tool.
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.
7 tool updates
v0.2.0- First observed
get_secret - First observed
list_projects - First observed
list_secrets - First observed
open_bitwarden - First observed
run_with_secrets - First observed
status - First observed
store_secret
TDQS
Scored across 7 tools
Each tool serves a distinct purpose: retrieving plaintext secrets, listing metadata, running commands with injected secrets, opening the vault, checking status, and storing secrets. No overlapping functionality.
Most tool names follow a verb_noun pattern (e.g., get_secret, list_projects). The use of 'status' (a noun) and 'run_with_secrets' (verb plus preposition) are minor deviations but still clear.
With 7 tools covering key operations (list, get, store, execute, navigate, check), the count is well-scoped for the server's purpose without superfluous tools.
Core CRUD and lifecycle operations are present, including read, create/update, and execution. Missing a dedicated delete tool, but store_secret can update, so only a minor gap.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
The MCP server for Azure DevOps, bringing the power of Azure DevOps directly to your agents.
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
MCP Server for an Agent Task Marketplace
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server for Vaultwarden/Bitwarden vault management. Enables AI agents to securely create, search, read, and update vault items via the official Bitwarden CLI, with safe-by-default redaction and support for both stdio and SSE transports.5336815MIT
- AlicenseNot gradedqualityDmaintenanceSecret management MCP server for AI coding agents that prevents secrets from entering the LLM context window by returning metadata only and using side-channel injection. Integrates with Bitwarden and offers hooks for auto-capture and leak prevention.1MIT
- FlicenseBqualityDmaintenanceMCP server that enables AI models to securely interact with a Bitwarden password manager vault via the rbw CLI.111-
- AlicenseNot gradedqualityDmaintenanceMCP server for agent-native secrets management that stores encrypted secrets with AES-256-GCM, issues short-lived scoped tokens, and injects secrets into requests server-side so agents never handle plaintext credentials.49MIT