Provider REST API

Security

Connect 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. 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. 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. 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

12

Fetches data and changes nothing.

  • list_members

    List 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_member

    Fetch one member by id, with their role, permissions, and collection access.

  • list_member_groups

    List the group ids one member belongs to. Read this before update_member_groups, which replaces the whole list rather than adding to it.

  • list_groups

    List 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_group

    Fetch one group by id, with the collections it grants. Read this before update_group, which replaces the whole record.

  • list_group_members

    List the member ids in one group. Read this before update_group_members, which replaces the whole list rather than adding to it.

  • list_collections

    List 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_collection

    Fetch one collection by id, including the groups that can reach it. Read this before update_collection, which replaces the whole group list.

  • list_policies

    List 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_policy

    Fetch one policy by its integer type, with its current settings. Read this before update_policy, which replaces the settings wholesale.

  • list_events

    Read 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_subscription

    Read 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

3

Creates or updates something on the other side.

  • reinvite_member

    Send 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_member

    Suspend 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_group

    Create 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

11

Deletes or permanently alters something. Worth granting on purpose.

  • invite_member

    Invite 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_member

    Replace 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_groups

    Replace 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_member

    Give 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_member

    Remove 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_group

    Replace 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_members

    Replace 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_group

    Delete 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_collection

    Replace 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_collection

    Delete 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_policy

    Switch 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.