MCP server
Connect Claude Code, Cursor, Claude Desktop or any MCP client to Dev Bench and ask about your errors in plain language: “what is the most common error this month?”, “who was affected by issue 412?”. The tools are the HTTP API's routes, with the same scopes and limits.
Connect
You need an API key (dbk_…): an owner creates one on the account page. Replace Bearer dbk_… below with it. The server is https://api.developerbench.com/mcp (Streamable HTTP); the key goes in the Authorization header.
Claude Code
claude mcp add --transport http devbench https://api.developerbench.com/mcp \
--header "Authorization: Bearer dbk_…"Cursor
In ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"devbench": {
"url": "https://api.developerbench.com/mcp",
"headers": {
"Authorization": "Bearer dbk_…"
}
}
}
}Claude Desktop
Claude Desktop reaches a remote server that takes a header through the mcp-remote bridge (it needs Node.js). In claude_desktop_config.json (Settings → Developer → Edit Config), then restart Claude Desktop:
{
"mcpServers": {
"devbench": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.developerbench.com/mcp",
"--header",
"Authorization:${DEVBENCH_AUTH}"
],
"env": {
"DEVBENCH_AUTH": "Bearer dbk_…"
}
}
}
}Tools
Endpoint: https://api.developerbench.com/mcp, MCP Streamable HTTP
transport, authenticated with the same Authorization: Bearer dbk_…
header on every request. No OAuth. Stateless: no session state is needed
beyond the key.
- A missing or bad key is HTTP 401 (as for
/v1), before any JSON-RPC. - 503 (disabled) and 429 (rate limited,
Retry-After) are HTTP statuses too. - Inside a valid session, a tool that fails (402, 403, 404, 400, 409, 502
above) returns a tool result with
isError: trueand the sameerrorsentence as its text, so the client's AI can read and act on it.
Tools map one-to-one onto routes and call the same handler code with
the same scope, edition, entitlement and audit rules. Arguments are the
route's path and query parameters (and body fields for writes), with the
same names, types and limits. Results are the route's JSON as
structuredContent, plus one text block: a one-line summary followed by
the JSON.
| Tool | Route | Scope |
|---|---|---|
list_issues |
GET /v1/issues |
issues:read |
get_issue |
GET /v1/issues/{id} |
issues:read |
top_errors |
GET /v1/errors/top |
sensors:read |
error_trend |
GET /v1/fingerprints/{id}/trend (argument fingerprint_id) |
sensors:read |
release_impact |
GET /v1/releases/{release}/impact |
sensors:read |
find_user |
GET /v1/users |
users:read |
issue_users |
GET /v1/issues/{id}/users |
users:read |
issue_logs |
GET /v1/issues/{id}/logs |
logs:read |
issue_evidence |
GET /v1/issues/{id}/evidence |
logs:read |
resolve_issue |
POST /v1/issues/{id}/resolve |
issues:write (V2) |
dismiss_issue |
POST /v1/issues/{id}/dismiss |
issues:write (V2) |
reopen_issue |
POST /v1/issues/{id}/reopen |
issues:write (V2) |
comment_on_issue |
POST /v1/issues/{id}/comments |
issues:write (V2) |
Path ids are the argument id (an integer), except error_trend
(fingerprint_id) and release_impact (release). GET /v1/me has no
tool; a client that needs it calls the route.
tools/listreturns only the tools the key can use (its usable scopes): a V1 read key never sees a write tool. While billing has lapsed the list is unchanged and calls return the 402 error.- Tool descriptions are written for an AI reader: what the tool returns,
units (counts are occurrences;
per_day_*are occurrences per day), and that every time is UTC. - The test suite fails if a
/v1route has no tool or a tool has no route (other than/v1/me).
Generated from the API contract when the site is built.