bitwarden-mcp
Manage Bitwarden organization members and vault groups, focused on inviting members and assigning them to vault groups.
List organization members and get individual member details.
Invite members by email with role/type, access_all, and external_id; resend invitations; remove members.
List vault groups and create new vault groups.
View the groups a member currently belongs to.
Replace a member's full vault group assignment (not append), supporting the core "vault group invitation" workflow.
Provides tools for managing Bitwarden organization members and vault groups, including inviting members, listing members/groups, and assigning members to groups.
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., "@bitwarden-mcp Invite alice@company.com to the Sales group"
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-mcp
Bitwarden MCP server for Claude — exposes the Bitwarden Public API's organization member and vault group management as MCP tools, focused on inviting members and assigning them to vault groups ("vault group invitation").
Tech stack: Python 3.12 + uv + FastMCP (Starlette/uvicorn)
Related requirement: PRD-15544 ([Self-built MCP] MSPbots Integration - Bitwarden). See the full research in
vendor-mcp-template/prd/Bitwarden.md.
Out of scope: Bitwarden Send (temporary secure credential links) is intentionally not
implemented. The Public API does not allow management of individual vault items, and Send
requires a stateful, unlocked local bw CLI vault — incompatible with this service's
stateless, multi-tenant gateway model.
MSPbots Connector
The MCP Gateway built for MSPs: visible, controlled, and your data stays where it belongs.
Get started at connect.mspbots.ai →
MSPbots Connector gives your AI clients one MCP URL to reach your entire MSP stack (RMM, PSA, documentation, security, finance), and gives you control over who can call which tool and a record of everything that was called.
Hosted service: connect.mspbots.ai · Free to use.
Why Connector

Visible | Every tool call is logged: who, which vendor, when. Usage dashboard, CSV export, SIEM streaming. |
Controlled | Role-based, per-tool allowlist. Deny by default. |
Protected | Credentials encrypted per record. AI clients never see your vendor passwords or tokens. |
MSP-native | Built for the MSP stack only: RMM, PSA, documentation, security, finance. |
Quick start
Sign up at connect.mspbots.ai.
Connect your vendors. Pick from 150+ connectors and authorize each one on the vendor's own page, or bring your own API keys. No extra vendor accounts needed.
Set access. Create roles and decide which tools each role may call. Nothing is allowed until you allow it.
Add your MCP URL to your AI client. Copy the URL from your Connector dashboard into Claude, ChatGPT, Cursor, VS Code, Gemini, Codex, or any MCP-capable client.
Ask your AI to do real work, and watch every call appear in the audit log.
Features
Unified gateway
One MCP URL for all your AI clients
150+ connectors across the MSP stack
Custom MCP servers supported, free
Authorization happens on each vendor's own page; the AI never sees passwords or tokens
Bring your own credentials: use the vendor API keys you already have
Multiple accounts per app; connect once, reuse across AI clients
Tool search: finds the right action for the task
One sign-in; vendor credentials are injected behind the scenes and OAuth tokens refresh automatically
Visibility
Audit log for every tool call (who, which vendor, when)
Usage dashboard: call volume, top vendors, error rate, per-user activity
Export audit logs to CSV, or stream to Loki, Graylog, or LogScale (SIEM)
Optional recording of tool arguments and result summaries (off by default, enabled per organization)
Control
Per-role, per-tool allowlist, deny by default
owner / admin / member roles
SCIM provisioning with Entra ID, Okta, JumpCloud, and Google Workspace
Security
Credentials encrypted one record at a time (AES-256-GCM, per-record key)
AI clients authenticate with OAuth 2.1 + PKCE
Vendor responses are scanned for prompt-injection patterns and returned as structured data. This is one layer of defense, not a guarantee against every attack.
Static egress IP for customer firewall and API allowlisting
Pricing
Free.
Links: connect.mspbots.ai · mspbots.ai
Related MCP server: rbw-mcp
Quick Start
cd bitwarden-mcp
uv sync
# stdio mode (for Claude Desktop / CLI), single shared credential set from env
BITWARDEN_CLIENT_ID=organization.xxxx BITWARDEN_CLIENT_SECRET=xxxx uv run bitwarden-mcpAuthentication
This service is stateless: it never stores or persists Bitwarden credentials.
Credentials are either supplied once via environment variables (local dev, AUTH_MODE=env),
or per-request via HTTP headers (AUTH_MODE=gateway, production).
Bitwarden's Public API uses OAuth2 Client Credentials (grant_type=client_credentials,
scope=api.organization). On every tool call, this service exchanges the caller's
client_id + client_secret for a short-lived access_token (~1h TTL) and uses it
immediately — the token is not cached across requests, in order to fully comply with the
"no persisted credentials" requirement. This adds one extra Identity round trip per call.
Gateway mode HTTP headers (AUTH_MODE=gateway)
Header | Type | Required | Default | Allowed values | Description | Example |
| string | Yes | None | None | Client ID of the organization API Key (Admin Console → Settings → Organization info) |
|
| string | Yes | None | None | The corresponding Client Secret, used only within this request to exchange for an access_token; not persisted and not logged |
|
| string | Optional |
| None | Identity Token Endpoint; for EU Cloud pass |
|
| string | Optional |
| None | Public API Base URL; for EU Cloud pass |
|
Missing either of the two required headers on a /mcp request returns 401 with a
required_headers list.
Env mode variables (AUTH_MODE=env, local dev only)
Variable | Default | Description |
| — | Organization API Key Client ID |
| — | Organization API Key Client Secret |
|
| Public API base URL |
|
| Identity token endpoint base URL |
|
|
|
|
|
|
|
| HTTP server port |
|
| HTTP server bind address |
Get credentials: as an organization Owner, go to Admin Console → Settings → Organization info → API Key. Requires a paid organization plan (Teams/Enterprise) — free personal Bitwarden accounts have no organization and cannot use the Public API.
Claude Desktop Setup
{
"mcpServers": {
"bitwarden": {
"command": "uv",
"args": ["run", "--directory", "/path/to/bitwarden-mcp", "bitwarden-mcp"],
"env": {
"BITWARDEN_CLIENT_ID": "organization.xxxx",
"BITWARDEN_CLIENT_SECRET": "xxxx"
}
}
}
}Transport Modes
stdio (Claude Desktop / CLI)
BITWARDEN_CLIENT_ID=organization.xxxx BITWARDEN_CLIENT_SECRET=xxxx uv run bitwarden-mcpHTTP — single-tenant (env mode)
BITWARDEN_CLIENT_ID=organization.xxxx BITWARDEN_CLIENT_SECRET=xxxx \
MCP_TRANSPORT=http AUTH_MODE=env uv run bitwarden-mcp
curl http://localhost:8080/healthHTTP — gateway / multi-tenant (production)
MCP_TRANSPORT=http AUTH_MODE=gateway uv run bitwarden-mcpTool List
Base URL: https://api.bitwarden.com (default; overridable per-request, see Authentication).
Tool | Description | Parameters |
| List all members of the organization | None |
| Get details of the specified member |
|
| Invite a new member to join the organization |
|
| Resend the invitation email |
|
| Remove a member from the organization |
|
| List all vault groups of the organization | None |
| Create a new vault group |
|
| View the groups the specified member currently belongs to |
|
| Core operation: assign the member to the specified set of vault groups (full overwrite, not incremental append) |
|
Member type (role) enum: 0=Owner, 1=Admin, 2=User (default/regular Member), 3=Manager, 4=Custom.
Member status enum (read-only): 0=Invited, 1=Accepted, 2=Confirmed.
Rate limits: Bitwarden does not publish specific Public API rate-limit numbers (unlike
some other vendors). This service passes through 429 responses as-is if Bitwarden throttles
a request.
Test Examples
tools/list (gateway mode)
curl -X POST http://localhost:8080/mcp \
-H "x-bitwarden-client-id: organization.your_client_id" \
-H "x-bitwarden-client-secret: your_client_secret" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'tools/call — invite a member
curl -X POST http://localhost:8080/mcp \
-H "x-bitwarden-client-id: organization.your_client_id" \
-H "x-bitwarden-client-secret: your_client_secret" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 2,
"params": {
"name": "bitwarden_invite_member",
"arguments": {"email": "user@example.com", "type": 2}
}
}'tools/call — assign a member to vault groups
curl -X POST http://localhost:8080/mcp \
-H "x-bitwarden-client-id: organization.your_client_id" \
-H "x-bitwarden-client-secret: your_client_secret" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 3,
"params": {
"name": "bitwarden_update_member_groups",
"arguments": {"member_id": "<member-uuid>", "group_ids": ["<group-uuid>"]}
}
}'Missing headers → 401
curl -i -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
# HTTP/1.1 401 Unauthorized
# {"error":"Missing credentials","required_headers":["x-bitwarden-client-id","x-bitwarden-client-secret"]}API Reference
Known Limitations
No Bitwarden Send support — out of scope by design (see top of this README).
bitwarden_update_member_groupsis a full replace, not an append — it mirrors the underlyingPUT /public/members/{id}/group-idssemantics exactly. To add a member to one more group without removing existing ones, callbitwarden_list_member_groupsfirst, merge in the new group id, then pass the full list.No documented Public API rate limits from Bitwarden — errors are passed through as-is.
Token exchange happens on every tool call (no caching), which adds latency but keeps the service fully stateless per the SOP requirement.
Requires a paid organization plan (Teams/Enterprise) with an organization API key generated; free personal accounts cannot use this service.
Available Tools
9 toolsbitwarden_create_groupA
Create a new vault group in the Bitwarden organization.
Use the returned group "id" with bitwarden_update_member_groups to invite
members into it.
Args:
name: Name of the group to create.
access_all: Whether the group gets access to all collections (default: False).
external_id: Optional external identifier (e.g. from an HR/IdP system) for syncing.
Inputs: name (required), access_all, external_id. Returns: result
bitwarden_get_memberA
Get a single organization member's details.
Args:
member_id: The member's UUID (see bitwarden_list_members).
Inputs: member_id (required). Returns: result
bitwarden_invite_memberA
Invite a new member to the Bitwarden organization by email.
The invited member receives an email invitation; their "status" starts
at 0 (Invited) until they accept it. To grant access to specific vault
groups, follow up with bitwarden_update_member_groups once the invite
succeeds (the returned member "id" is needed for that call).
Args:
email: Email address to invite.
type: Organization role — 0=Owner, 1=Admin, 2=User (default, i.e. regular
Member), 3=Manager, 4=Custom (requires the organization to have
custom permissions enabled).
access_all: Whether the member gets access to all collections (default: False).
external_id: Optional external identifier (e.g. from an HR/IdP system) for syncing.
Inputs: email (required), type, access_all, external_id. Returns: result
bitwarden_list_groupsA
List all vault groups in the Bitwarden organization.
Inputs: no named parameters. Returns: result
bitwarden_list_member_groupsA
List the vault group IDs a member currently belongs to.
Args:
member_id: The member's UUID (see bitwarden_list_members).
Inputs: member_id (required). Returns: result
bitwarden_list_membersA
List all members of the Bitwarden organization.
Each member's "status" field is 0=Invited, 1=Accepted, 2=Confirmed.
Inputs: no named parameters. Returns: result
bitwarden_reinvite_memberA
Resend the invitation email to a member who hasn't accepted it yet.
Args:
member_id: The member's UUID (see bitwarden_list_members).
Inputs: member_id (required). Returns: result
bitwarden_remove_memberA
Remove a member from the Bitwarden organization.
Args:
member_id: The member's UUID (see bitwarden_list_members).
Inputs: member_id (required). Returns: result
bitwarden_update_member_groupsA
Set which vault groups a member belongs to — this is the "group invitation" action.
IMPORTANT: this REPLACES the member's entire group list, it does not append.
To add the member to a group without losing existing memberships, first call
bitwarden_list_member_groups, merge the new group id(s) into that list, then
pass the full merged list here.
Args:
member_id: The member's UUID (see bitwarden_list_members).
group_ids: Full list of vault group UUIDs the member should belong to
after this call (see bitwarden_list_groups for available group IDs).
Inputs: group_ids (required), member_id (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 9 tools
Each tool targets a distinct resource and action: group listing/creation, member listing/retrieval/invitation/removal, and member-group membership operations. There is no overlap that could cause misselection; list vs. get and list vs. update are clearly read vs. write.
All tool names follow a consistent 'bitwarden_verb_noun' pattern, using snake_case throughout. The verbs (list, get, invite, reinvite, remove, update, create) are clear and aligned with the noun, making the pattern predictable and easy to follow.
Nine tools is well within the ideal range for a focused server. Each tool covers a meaningful operation for Bitwarden organization member and group management, with no redundant or extraneous utilities.
The core workflows for managing members and their group memberships are covered, including invite, remove, list, get, and group assignment. Minor gaps exist: no update or delete for groups, and no separate tool to update a member's role/access_all after creation, but these are workaroundable and do not severely hinder the primary use case.
Maintenance
Related MCP Connectors
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Managed MCP gateway with OAuth, per-agent permissions, shared accounts and activity logs.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP Gateway: wrap any MCP server with cold-start retries, uptime SLA, and per-execution MPP billing.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP 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.531,933 npm26MIT
- AlicenseBqualityDmaintenanceMCP server that enables AI models to securely interact with a Bitwarden password manager vault via the rbw CLI.111MIT
- AlicenseAqualityAmaintenanceMCP server for secure AI agent access to Bitwarden/Vaultwarden vaults with BYOK, exposing tools to list items, reveal secrets via encrypted Sends, get TOTP codes, and save credentials.7274 npmMIT
- AlicenseBqualityDmaintenanceMCP server for JumpCloud APIs with full OpenAPI-driven coverage, enabling endpoint discovery, operation invocation, and direct API requests while managing multi-tenant user tokens in Vault and guarding mutating tools.20MIT