AI & MCPLimits and errors
Limits and errors
The MCP server's HTTP statuses, tool error codes, rate limits and per-call limits, and where they differ from the REST API.
Answer
The MCP server answers 401 for a missing or expired token, 403 when the token lacks a scope, 422 for invalid input and 429 with Retry-After at a rate limit. It limits bursts per token and sustained use per space; the thresholds are not published. A 429 is plain HTTP, so an agent may report it as a transport failure.
HTTP statuses
The MCP server's troubleshooting section lists the same statuses.
| Status | Meaning | What to do |
|---|---|---|
401 |
The token is missing, expired or malformed. | Sign in again. |
403 |
The token lacks a required scope. | Sign in again and approve all scopes. |
406 |
The request has no supported Accept header. |
Send Accept: application/. |
422 |
Invalid input: bad filter syntax, an unknown field, a missing parameter. | Fix the arguments; meta_ lists the valid fields. |
429 |
A rate limit was hit. | Wait for the Retry-After seconds, then retry. |
500 |
An unexpected server error. | Retry later. |
503 |
Coevera could not be reached, or answered unexpectedly. The server has already retried 5 times, 30 seconds apart. | Retry later. |
A 429 is not a tool error
The 429 is sent as a plain HTTP response before the MCP layer, not as a tool result. Some
agents and clients report it as a transport or connection failure. If an agent stops with a
connection error during a burst of calls, check for a rate limit before anything else.
Tool errors
A tool that runs but cannot do its job returns an error result with one of these codes:
invalid_input, permission_denied, api_error, server_error, read_only_field_violation,
missing_id, invalid_id.
Write tools report per record. create_records returns one result per input, in input order.
update_records skips the invalid records and still submits the valid ones, so read every
result, not only the first.
- Writes are validated as in Coevera itself. A record that breaks a rule (a required field, a field value, a relation, a step checklist or a custom validation rule) comes back as an error for that record and is not stored, so the assistant can correct it.
picture_idon accounts, contacts and products cannot be written withcreate_recordsorupdate_records: they answerread_only_field_violationfor that record and nameset_record_picture.- A tool rejects an argument name it does not know, with an error that lists the valid names.
Rate limits
The server limits requests in two stages: a short burst limit per token and a longer sustained
limit per space. Either answers 429 with Retry-After. The thresholds are not published.
The API calls a space can make each month depend on its plan; see coevera.com/crm/pricing.
Per-call limits
| Tool or endpoint | Limit |
|---|---|
search_ |
limit up to 100 records per call |
global_ |
A text of 2 to 200 characters; limit from 1 to 50, 20 by default |
run_ |
Up to 10 metrics and 3 group-by fields; up to 500 groups (limit_, 50 by default). It reads at most scan_ records (10,000 by default) within a time budget; truncated and truncated_ say when the result covers only part of the matching records. |
export_ |
Up to 100 fields, and at most max_ rows per file (10,000 by default). The download link works once and expires after expires_ (10 minutes by default). |
delete_ |
Up to 100 IDs per call. Leads and opportunities cannot be deleted; archive them. |
bulk_, bulk_, bulk_ |
Batches of 20 or more run asynchronously. |
bulk_ |
Runs synchronously at any batch size. |
File upload (upload_, set_) |
50 MiB per file, given in max_. The upload URL works once and expires after five minutes. A picture must be a PNG, JPEG, GIF or WebP image. |
Long calls send progress notifications while they run, when the client accepts a stream.
run_report and export_records share a few scan slots on each server worker. When all of them
are busy, a call waits for a while and then gets a server-busy error; retry it later.
Upload and download links
The single-use links that the upload tools and export_records return answer with their own
statuses. The two-step flow is in the file upload reference.
| Status | Upload link (/) |
Download link (/) |
|---|---|---|
200 |
The file is stored; the body describes the document, or the record and its new picture. | The CSV file. |
400 |
The body could not be read. The link is used up. | Not returned |
403 |
Not returned | The user's role no longer allows exporting. |
410 |
The link expired or was already used. Call the tool again. | The link expired or was already used. Call the tool again. |
413 |
The file is larger than max_. The link is used up. |
Not returned |
415 |
set_ only: the file is not a PNG, JPEG, GIF or WebP image. The link is used up. |
Not returned |
500 |
Coevera refused the upload, for example a wrong folder or no write permission on documents. | Not returned |
502 |
Not returned | Coevera refused the request. |
503 |
All upload slots are busy: retry the same link after Retry-After. |
All download slots are busy: retry the same link after Retry-After. |
If Coevera fails partway through a download, the connection is cut off, so the download fails instead of ending as a short file.
Compared with the REST API
| Situation | MCP server | REST API |
|---|---|---|
| Missing permission | 403 |
400 with code 50, ERROR_ |
| Rate limit | 429 with Retry-After |
429, ERROR_ (code 182), with Retry-After when available |
| Invalid input | 422 |
400 or 422, depending on the error |
| Error body | MCP error result with a tool error code | JSON with success, http_, code, name and message |
The REST API's side is in errors, the error codes and rate limits and retries.