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 equivalent —un error JSON-RPC, o un resultat
isError quan es produeix dins d'una tool— amb el code i l'http_status de v1 conservats.
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.
Errors mentre s'executa una tool
Un error de domini que es produeix mentre una tool s'executa —una regla de negoci (422), un recurs inexistent (404), un conflicte (409)— no torna com un error JSON-RPC. El protocol reserva aquest per als errors de protocol, així que la tool respon amb un resultat normal marcat isError: true, que el model pot llegir i corregir:
{
"jsonrpc": "2.0",
"id": "<request id>",
"result": {
"isError": true,
"content": [{ "type": "text", "text": "La factura ya emitida no puede modificarse." }],
"_meta": {
"com.factuarea/error": {
"http_status": 422,
"code": "invoice_cannot_be_modified",
"hint": "La factura ya emitida no puede modificarse.",
"param": "status"
}
}
}
}content[0].textés el missatge del domini (el mateixhintque retorna la REST API), també en producció._meta["com.factuarea/error"]porta el contracte de l'error REST:http_status,code,hinti, quan s'apliquen,param,subcodeidetails(per exempleexisting_resource_idd'un duplicat). Ramifica percode, com fas per REST.- Només un
5xxes reporta com una fallada nostra; un rebuig és ús normal.
Les guardes que corren abans de la tool —autenticació, scopes i pla, límits de peticions, guardrails fiscals, idempotència i els noms de tool retirats— continuen responent amb un error JSON-RPC, com descriu la resta d'aquesta pàgina.
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 (les correspondències de negoci fan servir-32099..-32000; els errors de protocol inclouen-32602i els interns fan servir-32603).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 el límit anual de documents del pla. Per a plan_limit_exceeded, data inclou resource, current, limit i period_end (timestamp ISO 8601 complet amb desplaçament), a més de http_status, code i hint. plan_upgrade_required conserva el seu significat: l’acció requereix un pla superior. |
-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'empresa no té un pla de Factuarea actiu que inclogui accés a l'API pública (p. ex. un trial caducat o una subscripció vençuda fora del seu període de gràcia). |
-32008 | (codi v1) | 422 / 404 / 409 / … | Una guarda prèvia a la tool (permisos, guardrail fiscal, idempotència, noms de tool retirats, selecció d'empresa) que rebutja per regla de negoci, recurs inexistent o conflicte. Els errors que es produeixen dins d'una tool arriben com a resultat (vegeu més amunt). 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", "contacts: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 | bulk_invoices_pdf_link, generate_tax_report_303 |
destructive | 10 / min | delete_invoice, bulk_archive_contacts |
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.
Errors de protocol i regles fiscals
Una cerca del protocol pot retornar -32602 quan no es resol el nom de l’eina; revisa el descobriment i els scopes de la credencial abans de reintentar. mcp_guardrail_violation és un rebuig de negoci 422 amb rule_id, guardrail_uri i subcodi. Llegeix el recurs fiscal indicat, corregeix els arguments i segueix la política d’idempotència de l’eina.