Errors i límits de peticions
Formes d'error JSON-RPC mapejades des del contracte v1, la taula completa de codis i throttling per token / per pla amb Retry-After.
El servidor MCP parla JSON-RPC 2.0 estricte. Els errors tornen com un
objecte error, mai com un cos d'error HTTP a l'estil de l'API REST — però la
semàntica és idèntica: la mateixa violació de regla de negoci que retorna
422 sobre REST retorna aquí l'error JSON-RPC equivalent, amb el code i
l'http_status de v1 conservats a data.
Aquesta pàgina cobreix el mapatge JSON-RPC específic d'MCP i els buckets de
throttling d'MCP. Per al contracte REST canònic — l'embolcall d'error per code
i les quotes per tier — consulta Errors i
Límits de peticions.
Forma de l'error
{
"jsonrpc": "2.0",
"id": "<request id>",
"error": {
"code": -32008,
"message": "invoice_cannot_be_modified",
"data": {
"http_status": 422,
"code": "invoice_cannot_be_modified",
"hint": "La factura ya emitida no puede modificarse.",
"param": "status"
}
}
}error.code— el codi numèric JSON-RPC (sempre dins del rang-32099..-32000definit per la implementació, o-32603per a errors interns).error.message— un identificador de cadena estable (p. ex.insufficient_scope,invoice_cannot_be_modified).error.data.code— el mateixcodecanònic de v1 que retorna l'API REST, de manera que puguis ramificar segons un únic valor a totes dues superfícies.error.data.http_status— l'estat HTTP que retornaria la crida REST equivalent (422 / 404 / 409 / …), per a clients que prefereixen raonar en termes HTTP.error.data.hint— un missatge llegible per a persones (en castellà, d'acord amb l'idioma de l'app). Altres camps (param,subcode,required_scope, …) apareixen quan són rellevants.
Taula de codis
| JSON-RPC code | message / data.code | HTTP equiv. | Significat |
|---|---|---|---|
-32001 | invalid_token | 401 | Credencial absent, malformada o desconeguda; o l'usuari ja no és membre de l'empresa. |
-32002 | client_revoked | 403 | El client OAuth va ser revocat. |
-32003 | invalid_token_type | 403 | Tipus de credencial incorrecte per a aquesta superfície. |
-32004 | plan_limit_exceeded / plan_upgrade_required | 402 | S'ha assolit un límit d'ús del pla, o l'acció requereix un pla superior. data inclou resource, current, limit. |
-32005 | insufficient_scope / module_not_in_plan / feature_flag_disabled | 403 | La credencial no té el scope requerit, el mòdul no és al pla, o un feature flag està desactivat. data inclou required_scope / module / flag. |
-32006 | rate_limit_exceeded | 429 | S'ha superat un bucket de throttling. data inclou retry_after i bucket; la resposta també estableix la capçalera Retry-After. |
-32007 | addon_not_active | 403 | L'add-on de developer API de l'empresa està inactiu (fora del seu període de gràcia). |
-32008 | (codi v1) | 422 / 404 / 409 / … | Una violació de regla de negoci, recurs inexistent o conflicte. message i data.code són el codi d'error canònic de v1; data.http_status t'indica la categoria. |
-32603 | internal_error | 500 | Error inesperat del servidor. |
-32005 i -32008 cobreixen cadascun diverses subcauses. Ramifica sempre
segons data.code (la cadena), no només segons el code numèric, quan
necessitis distingir-les — p. ex. insufficient_scope i module_not_in_plan
afloren tots dos com a -32005.
Scope insuficient
Quan una tool necessita un scope que la credencial no té:
{
"jsonrpc": "2.0",
"id": "req-42",
"error": {
"code": -32005,
"message": "insufficient_scope",
"data": {
"http_status": 403,
"code": "insufficient_scope",
"required_scope": "invoices:write",
"provided_scopes": ["invoices:read", "clients:read"],
"hint": "La credencial no tiene el scope requerido para esta operación."
}
}
}Les tools que la teva credencial no pot assolir també queden ocultes a
tools/list, de manera que un agent ben comportat normalment no les intentarà —
aquest error és la xarxa de seguretat.
Límits de peticions
Les peticions es limiten en tres buckets independents. Superar-ne qualsevol
retorna -32006 amb una capçalera Retry-After (segons).
Per token, per categoria de tool
Cada credencial té comptadors per minut separats per categoria de tool, de manera que un ús destructiu intensiu no pugui esgotar les teves lectures:
| Categoria | Límit per defecte | Tools d'exemple |
|---|---|---|
read / write | 60 / min | search_invoices, create_invoice |
send | 20 / min | send_invoice, send_quote |
generate | 30 / min | get_invoice_facturae_link |
destructive | 10 / min | delete_invoice, bulk_delete_clients |
El bucket es resol a partir de la categoria de la tool. El comptador s'incrementa abans que la tool s'executi, així que les crides rebutjades (scope incorrecte, error de validació) també consumeixen quota — això és anti-abús deliberat, d'acord amb el patró estàndard OAuth/REST.
Per pla, cada hora
Un sostre horari a nivell d'empresa per slug de pla. El pla Enterprise se salta aquest bucket completament.
Per client OAuth, global
Les apps OAuth comparteixen a més un bucket global per client de 1000 / min, de manera que una sola app que es comporti malament no pugui saturar el servidor a través de tots els seus usuaris.
Capçaleres de límit de peticions
Les respostes correctes porten el pressupost restant perquè puguis afluixar el ritme de manera proactiva:
| Header | Significat |
|---|---|
X-RateLimit-Limit-Token / X-RateLimit-Remaining-Token | El bucket per token (per categoria). |
X-RateLimit-Limit-Hour / X-RateLimit-Remaining-Hour | El bucket per pla horari (absent a Enterprise). |
Retry-After | En un 429, segons a esperar abans de reintentar. |
Límits dels endpoints d'auth
Els endpoints OAuth tenen els seus propis límits, independents dels buckets d'MCP:
| Endpoint | Límit |
|---|---|
POST /api/oauth/register | 10 / hora per IP |
POST /api/oauth/token | 60 / min per (client, IP) |
Respecta sempre Retry-After. Reintentar abans que transcorri manté el bucket
ple i només retarda la teva recuperació. Combina'l amb idempotència a les
escriptures perquè un reintent retardat mai no dupliqui un document.