Factuarea API
Servidor MCP

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..-32000 definit per la implementació, o -32603 per a errors interns).
  • error.message — un identificador de cadena estable (p. ex. insufficient_scope, invoice_cannot_be_modified).
  • error.data.code — el mateix code canò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 codemessage / data.codeHTTP equiv.Significat
-32001invalid_token401Credencial absent, malformada o desconeguda; o l'usuari ja no és membre de l'empresa.
-32002client_revoked403El client OAuth va ser revocat.
-32003invalid_token_type403Tipus de credencial incorrecte per a aquesta superfície.
-32004plan_limit_exceeded / plan_upgrade_required402S'ha assolit un límit d'ús del pla, o l'acció requereix un pla superior. data inclou resource, current, limit.
-32005insufficient_scope / module_not_in_plan / feature_flag_disabled403La 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.
-32006rate_limit_exceeded429S'ha superat un bucket de throttling. data inclou retry_after i bucket; la resposta també estableix la capçalera Retry-After.
-32007addon_not_active403L'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.
-32603internal_error500Error 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:

CategoriaLímit per defecteTools d'exemple
read / write60 / minsearch_invoices, create_invoice
send20 / minsend_invoice, send_quote
generate30 / minget_invoice_facturae_link
destructive10 / mindelete_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:

HeaderSignificat
X-RateLimit-Limit-Token / X-RateLimit-Remaining-TokenEl bucket per token (per categoria).
X-RateLimit-Limit-Hour / X-RateLimit-Remaining-HourEl bucket per pla horari (absent a Enterprise).
Retry-AfterEn 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:

EndpointLímit
POST /api/oauth/register10 / hora per IP
POST /api/oauth/token60 / 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.

En aquesta pàgina