# Errors and limits

## HTTP status codes

| Status | When | What to do |
| --- | --- | --- |
| `200` | The message was handled. A tool that itself failed still returns 200 with `isError: true` in the result. | Read the result. |
| `202` | The message was a notification (no `id`), so there is no response body. | Nothing. |
| `400` | Malformed JSON, a batch array, an unknown method, bad tool arguments, an unsupported protocol version, or routing headers that disagree with the body. | Fix the request. The JSON-RPC error code says which. |
| `401` | No credential, or one that is unknown, revoked or expired. Response carries `WWW-Authenticate: Bearer`. | Mint a new token. |
| `403` | The token is valid but lacks the required scope, or the request carried a browser `Origin` header. | Use a token with `read` scope; do not call this endpoint from a browser. |
| `405` | The request was not a POST. | MCP is POST-only. The GET event stream was removed in protocol revision 2026-07-28. |
| `429` | Rate limit exceeded. Response carries `Retry-After` in seconds. | Back off for the stated interval. |
| `500` | Server-side failure. The message is deliberately generic. | Retry; if it persists it is not something the caller can fix. |
| `503` | The data store could not be reached. | Retry with backoff. |

## JSON-RPC error codes

| Code | Meaning |
| --- | --- |
| `-32700` | Parse error — the body was not valid JSON. |
| `-32600` | Invalid request — not a JSON-RPC message, a batch, or an unsupported protocol version. |
| `-32601` | Method not found. |
| `-32602` | Invalid params — missing `params.name`, or a tool that is not exposed. |
| `-32603` | Internal error. |
| `-32020` | Header mismatch — `Mcp-Method` or `Mcp-Name` disagreed with the body, or was absent when the declared protocol version requires it. |

## Rate limits

The MCP endpoint allows **120 requests per 60 seconds**, counted per user rather than per token. Each JSON-RPC message is one HTTP request, so a multi-step agent run consumes calls quickly; the limit is set to accommodate that while still bounding a runaway loop.

Limits are held in memory per serverless instance, so the practical ceiling can be slightly higher across a cold start. Do not rely on that.

## Result size

A single tool result is capped at 100,000 characters, roughly 25k tokens. Beyond that the payload is truncated and an explicit `[TRUNCATED: ...]` marker is appended, so a clipped series can never read as a complete one. If you hit it, narrow the date window or name fewer metrics.

## Protocol versions

Send your revision in the `MCP-Protocol-Version` header. Supported, newest first:

- `2026-07-28`
- `2025-11-25`
- `2025-06-18`
- `2025-03-26`

An unrecognised version is refused with a `400` that carries the full supported list in `error.data.supported`, so a client can pick one instead of guessing. Omitting the header entirely is read as `2025-03-26`, the last revision that predates the header.

From `2026-07-28` onward, every request must also carry `Mcp-Method`, and `Mcp-Name` when the message addresses something (`tools/call`). The server checks them against the body and rejects disagreement, so an intermediary cannot route on one operation while the server performs another.

## Scopes

Tokens carry explicit scopes: `read`, `write`. They are not cumulative — a `write` token does not imply `read`. Every MCP method today requires `read`, including `initialize` and `ping`.
