Provider REST API
SecurityConnect Claude to Bitwarden
Manage an organisation's members, groups, collections, and policies. Toolspoke puts 26 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.
- Connection
- Provider REST API
- Authentication
- OAuth 2.0 client credentials
- Actions exposed
- 26
- Cost per call (typical)
- 1 credit
- Adapter
- Maintained by Toolspoke
Connected in three steps
- 1
Install Bitwarden
Open the marketplace in your workspace, add Bitwarden to the project your agents work in, and it appears on the gateway immediately.
- 2
Connect the credential
Authenticate with oauth 2.0 client credentials. Where to get one, and what it has to be able to reach, is the next section.
- 3
Point your agent at the gateway
Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.
.mcp.json{
"mcpServers": {
"toolspoke": {
"type": "http",
"url": "https://toolspoke.com/mcp"
}
}
}One block covers every tool you have installed. Bitwarden shows up in the client as soon as your policy allows it, and so does everything else you install later.
Where the address goes, per client
- Claude Code
Run it in your project, then /mcp to sign in
claude mcp add --transport http toolspoke https://toolspoke.com/mcp- Claude and Claude Desktop
Settings, then Connectors, then Add custom connector
https://toolspoke.com/mcp- Cursor
~/.cursor/mcp.json, or .cursor/mcp.json for one project
{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }- Codex
~/.codex/config.toml
[mcp_servers.toolspoke] url = "https://toolspoke.com/mcp"- VS Code
.vscode/mcp.json, or the MCP: Add Server command
{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }
What Bitwarden asks for
OAuth 2.0 client credentials. You provide it once, when you install the connector. Toolspoke encrypts it at rest and decrypts it only for the length of a single call, and the gateway attaches it to the outbound request itself, so it is never part of the arguments an agent sends.
- Client IDRequired
- Bitwarden → Settings → Organization info → View API key. It must be the organisation key, which starts with organization. - a user. key cannot reach these endpoints.
- organization.xxxxxxxx-…
- Client secretRequired
- Shown beside the client ID on the same screen. Regenerating it there revokes this connection.
- Paste the secret
- API URLOptional
- Leave blank for Bitwarden Cloud (US). A self-hosted instance serves this API at your root URL plus /api - for example https://vault.example.com/api. For the EU cloud use https://api.bitwarden.eu.
- https://vault.example.com/api
- Identity URLOptional
- Where the client credentials are exchanged for a token. Leave blank for Bitwarden Cloud (US). Self-hosted instances serve it at your root URL plus /identity; the EU cloud uses https://identity.bitwarden.eu. It is separate from the API URL because Bitwarden runs the two on different hosts.
- https://vault.example.com/identity
What Claude can do in Bitwarden
26 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.
- Reads
- 12Reads
- Writes
- 3Writes
- Destructive
- 11Destructive
Reads
12Fetches data and changes nothing.
list_membersList everyone in the organisation with their email, role, two-factor status, invitation status, and the collections they can reach. Call this first - every other member action takes the member id from here. Status is 0 invited, 1 accepted, 2 confirmed, 3 staged, -1 revoked; type is 0 owner, 1 admin, 2 user, 4 custom.
get_memberFetch one member by id, with their role, permissions, and collection access.
list_member_groupsList the group ids one member belongs to. Read this before update_member_groups, which replaces the whole list rather than adding to it.
list_groupsList the organisation's groups with the collections each one grants. Groups are how collection access is handed out in bulk, so this is the map of who can reach what.
get_groupFetch one group by id, with the collections it grants. Read this before update_group, which replaces the whole record.
list_group_membersList the member ids in one group. Read this before update_group_members, which replaces the whole list rather than adding to it.
list_collectionsList the organisation's collections. Only names and ids - the groups attached to each one are not included here, so use get_collection for that. Collections hold vault items; this API never returns the items themselves.
get_collectionFetch one collection by id, including the groups that can reach it. Read this before update_collection, which replaces the whole group list.
list_policiesList the organisation's security policies and whether each is switched on. The cheapest call that proves the API key works, and the way to check settings such as required two-factor or single organisation. Each policy is identified by an integer type - see update_policy for the list.
get_policyFetch one policy by its integer type, with its current settings. Read this before update_policy, which replaces the settings wholesale.
list_eventsRead the organisation's event log - who signed in, who viewed or changed which vault item, and who altered a group or policy. With no filters it returns the last 30 days. Pass the continuationToken from a previous response to page through more than one batch.
get_subscriptionRead the organisation's seat counts and storage, for Password Manager and Secrets Manager. Use it to check how many seats are left before inviting anybody.
Writes
3Creates or updates something on the other side.
reinvite_memberSend the invitation email again to a member who has not accepted yet. Grants nothing new - the invitation and its access were already decided by invite_member.
revoke_memberSuspend a member's access without removing them from the organisation. This is the safe direction - it takes access away and restore_member puts it back - so it is the right first move when an account may be compromised.
create_groupCreate a group. A new group has no members, so it grants nobody anything until update_group_members adds people to it - that call is the one that hands out access.
Destructive
11Deletes or permanently alters something. Worth granting on purpose.
invite_memberInvite somebody to the organisation, which emails them and begins granting them access to the collections named here. Classified destructive rather than write because it hands a person outside the workspace a route into shared credentials, and the email cannot be recalled. Type is 0 owner, 1 admin, 2 user, 4 custom.
update_memberReplace a member's role, permissions, groups, and collection access. This is a full replacement: anything left out is reset, so read get_member first and send back everything that should survive. Destructive because it can promote somebody to owner, or widen which shared credentials they can read.
update_member_groupsReplace the set of groups a member belongs to. Groups carry collection access, so this changes which shared credentials the person can read. Sending a shorter list removes them from the groups left out - read list_member_groups first.
restore_memberGive a revoked member their access back. Destructive because it re-opens somebody's route into shared credentials, which is the half of the revoke/restore pair that grants rather than removes.
delete_memberRemove a member from the organisation. Bitwarden's own documentation says this cannot be undone; their personal account survives but their membership, and anything only they could reach through it, does not. Use revoke_member when the intent is to suspend somebody rather than to erase the membership.
update_groupReplace a group's name and the collections it grants. Every member of the group gains or loses access accordingly, and anything left out is reset - read get_group first and send back what should survive.
update_group_membersReplace the set of members in a group, which is how collection access is granted or taken away in bulk. Sending a shorter list removes everybody left out - read list_group_members first.
delete_groupDelete a group. Everyone in it loses whatever access the group granted, and the grouping itself is gone - rebuilding it means naming every member and collection again.
update_collectionReplace which groups can reach a collection. This decides who can read the credentials inside it, and anything left out is removed - read get_collection first. The Public API cannot create or read collection contents, only re-point access at them.
delete_collectionDelete a collection and every vault item inside it. This is the most damaging call in the connector: the credentials it holds go with it, and the Public API offers no way to read them first or put them back.
update_policySwitch a security policy on or off. Destructive because switching one off weakens the organisation for everybody at once - turning off type 0 stops requiring two-factor authentication on an account that holds shared credentials. Types: 0 two-factor authentication, 1 master password, 2 password generator, 3 single organisation, 4 require SSO, 5 organisation data ownership, 6 disable Send, 7 Send options, 8 account recovery, 9 maximum vault timeout, 10 disable personal vault export, 11 activate autofill, 12 automatic app log-in, 13 free families sponsorship, 14 remove unlock with PIN, 15 restricted item types, 16 URI match defaults, 17 autotype default, 18 automatic user confirmation, 19 block claimed-domain account creation, 20 organisation user notification, 21 Send controls, 22 fill assist.
What it will not do
Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.
- It cannot call anything else
- The 26 actions above are the whole of it. A call to any other name is refused before it reaches Bitwarden rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
- It reaches no further than your credential
- Toolspoke holds no access to Bitwarden of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
- It never hears from Bitwarden
- Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Bitwarden. An agent has to ask.
- It does not smooth over provider limits
- Toolspoke does not retry, queue or back off around Bitwarden's own rate limits. A call that Bitwarden refuses comes back to the agent as a failed call.
Before you connect it
What can Claude do in Bitwarden?
26 named actions: 12 that only read, 3 that write and 11 that delete or permanently alter something. They include list_members, get_member and list_member_groups. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.
What credentials does the Bitwarden connector need?
OAuth 2.0 client credentials. The connector asks for client id and client secret, and optionally api url and identity url. Values are encrypted at rest and attached to the outbound request by the gateway, so they are never part of the arguments an agent sends and never reach the audit log.
Does the Bitwarden connector work with Cursor and Codex, or only Claude?
Any client that speaks MCP, and every one of them gets the same 26 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.
What does the Bitwarden connector not do?
The 26 actions above are the whole of it. A call to any other name is refused before it reaches Bitwarden rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. Toolspoke holds no access to Bitwarden of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Bitwarden. An agent has to ask. Toolspoke does not retry, queue or back off around Bitwarden's own rate limits. A call that Bitwarden refuses comes back to the agent as a failed call.
Can I limit which actions an agent can call?
Yes, in two places. The project switches Bitwarden's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.
What gets recorded when an agent calls Bitwarden?
Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and the credits spent. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.