Sume MCP rate limit: one write per run created, none per status poll
Over Sume's hosted MCP, a tool call spends one write for the run it creates, and a jobs_status poll spends none. The numbers per plan and a Python budget check.

An agent that calls Sume over MCP uses the same per-minute budget as one that calls the REST API, but it counts differently. The docs say that an MCP tool call spends the write budget one time, for the run it creates. It does not also spend a write for the JSON-RPC request that carried it. A jobs_status poll over MCP spends no write budget at all.
Why the transport request is a read
The MCP endpoint is one of the two POST routes that submit nothing. Like /v1/generation/admission-preview, it counts as a read. The tool inside it then spends a write only when it creates a run. This keeps an agent that lists options and checks status from burning the submit budget that the plan sells.
| Action | Bucket | Count |
|---|---|---|
| JSON-RPC request to the MCP endpoint | read | 1 |
| Tool call that creates a run | write | 1 |
| jobs_status poll | read only | 0 writes |
| Tool call that creates 20 runs | write | 20 |
The budget in numbers
On Free, 120 writes a minute means about 120 runs created each minute across all keys of the workspace owner. Reads are 4800 a minute. An agent that creates 10 runs and polls each of them every 2 seconds uses 10 writes and about 300 reads in a minute, which is far from either limit.
Check it yourself
A short loop makes the claim visible. It reads ratelimit-remaining before and after a read-only call and prints the difference. Run it against a key that nothing else is using. The numbers belong to the bucket that the request spent from.
import os, urllib.request
def remaining(path):
req = urllib.request.Request("https://api.sume.com" + path, headers={"x-api-key": os.environ["SUME_API_KEY"]})
with urllib.request.urlopen(req, timeout=15) as resp:
return int(resp.headers["ratelimit-remaining"])
a = remaining("/v1/me")
b = remaining("/v1/me")
print("reads spent between two calls:", a - b) # 1 when nothing else shares the keyWhen a 429 appears
An MCP client that gets rate_limited should read error.details.scope. A write scope means too many runs were created in the window, so reduce the fan-out. A read scope means the polling is too tight, so lengthen the interval.
Sources
Related posts
More in Developers
- Sume SDK: try/catch misses a 402, generated calls return { error }
Generated @sume-com/sdk operations return { data, error, response } instead of throwing, so a 402 or 429 slips past try/catch. Check error on every call.
- Sume SDK error.retryable: server flag first, status only as fallback
SumeApiError.retryable uses the error envelope's retryable flag when present and falls back to 408, 429 or 5xx otherwise. A 409 is never retried by status.
- Sume STT language_code: set a hint or omit it for auto-detect?
language_code is optional on Sume STT. Omit it to auto-detect, pass a BCP-47 hint like en or ko when you know the language. A quick way to choose.
- Sume STT takes 10 minutes per request: a 90-minute file is 9 jobs
Sume speech-to-text caps a request at 600 seconds of audio, so a 90-minute recording is nine requests at up to $0.10 each, $0.90 in total.
Written by Sume