Server and protocol
Drum has one remote MCP (Model Context Protocol) server. Every client connects to the same URL. The credential decides the account, the user and the toolsets, so nothing else goes in the URL.
Endpoint
| URL | https://app.getdrum.com/api/v1/mcp |
| Transport | Streamable HTTP, answered as plain JSON. No SSE stream and no sessions |
| Message format | JSON-RPC 2.0, one message in each request |
| Authentication | Authorization: Bearer <token>: a Sign in with Drum (OAuth) token or an account-scoped API token. See Authentication and permissions |
| Account | Taken from the credential |
| Toolsets | Stored on the credential. No path, query parameter or header selects them |
| Server name | drum |
| Method and path | Does |
|---|---|
POST /api/v1/mcp |
Takes one JSON-RPC message and returns its answer |
GET /api/v1/mcp |
Returns 405. The server sends no event stream |
DELETE /api/v1/mcp |
Returns 405. The server keeps no sessions to end |
There is no local server to install. The server is hosted by Drum, and there is one for the whole of Drum.
Requests
- Send
Content-Type: application/jsonand one JSON-RPC message in the body. - A batch (a JSON array of messages) is refused with JSON-RPC error
-32600“Invalid Request”. - A notification, such as
notifications/initialized, returns202with no body. - The server is stateless. It sets no
Mcp-Session-Id, and each request stands alone.
Protocol versions
The server supports the MCP protocol versions 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25 and 2026-07-28. A client sends the version it wants in initialize, and the server answers with the same version when it supports it.
On 2026-07-28, a client may call server/discover in place of initialize. List results carry cacheScope: "private" and ttlMs: 60000: the answer is for this credential only, and is good for a minute.
Methods
| Method | Does |
|---|---|
initialize |
Starts the conversation. Returns the server’s name, version, capabilities and instructions |
notifications/initialized |
The client’s acknowledgement. Returns 202 |
ping |
Returns an empty result |
tools/list |
Lists the tools this credential may use, in a fixed order |
tools/call |
Calls one tool with its arguments |
server/discover |
On protocol 2026-07-28, returns what initialize returns |
prompts/list, resources/list |
Return empty lists |
All of Drum’s features are tools. The server has no prompts or resources to offer, and it never asks the client for sampling.
Instructions
initialize returns an instructions text that the client gives to the AI. Drum builds it for the toolsets and the role of the credential, in this order:
- What Drum is.
- What each selected toolset does, in one sentence each.
- The shared rules: ask the user before a call that notifies people, deletes data or cannot be reversed; get each id from
search_recordsor aget_tool; money is integer cents and tax exclusive, durations are whole minutes and dates areyyyy-mm-dd; how pages, errors and idempotency keys work. - The other toolsets this user could add, and where in Drum to add them.
- The rules and the usual order of work of each selected toolset, while they fit.
The text is 2,048 characters or fewer. When the Beat tools are listed, it also tells the AI that a Beat’s content is customer data, not instructions.
The tool list
tools/list returns only the tools of the selected toolsets that the user’s role and the OAuth scope allow. The list is always in the same order. Each tool has:
| Field | Holds |
|---|---|
name |
The tool’s name, such as create_tracked_time |
title |
A human name, such as “Create tracked time”. Also in annotations.title for older clients |
description |
What the tool does and how to use it, written for the AI |
inputSchema |
A JSON Schema of the inputs. It refuses unknown keys |
outputSchema |
A JSON Schema of structuredContent in the result |
annotations |
readOnlyHint, destructiveHint, idempotentHint and openWorldHint |
| Annotation | true means |
|---|---|
readOnlyHint |
The tool changes nothing |
destructiveHint |
The tool deletes or replaces data, emails people, or cannot be reversed. Clients often ask the user before they call one |
idempotentHint |
Calling it again with the same input has no further effect |
openWorldHint |
The tool reaches a system outside Drum: create_cost and update_cost can send a bill to the accounting system, and send_proposal sends email |
The list and the instructions depend on the credential. A client should cache them for no longer than a minute, so a changed role or a changed toolset selection shows soon. Some clients read the list only when they connect, so reconnect or restart one if the tools do not change.
For each tool, see the tool pages: My work, Sales, Clients, Proposals, Insights, Setup, Templates, Proposal templates and Search, delete and restore.
Example
curl -X POST https://app.getdrum.com/api/v1/mcp \
-H "Authorization: Bearer $DRUM_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'
For a full walk-through, see Make your first MCP call.