isError: true.
Niveau HTTP
Ces réponses sont en dehors de l’enveloppe MCP ; une bibliothèque client MCP les remonte généralement comme des erreurs de transport.
Erreurs d’outil
Un appel d’outil qui échoue est un succès JSON-RPC normal dont le résultat porteisError: true, un unique bloc texte et pas de structuredContent :
Rien d’autre issu de l’échec sous-jacent n’est exposé : ni traces de pile, ni SQL, ni réponses upstream, ni identifiants internes. Chaque requête est journalisée côté serveur avec le
x-request-id renvoyé dans la réponse HTTP ; cite-le quand tu contactes le support.
Codes
Reprise
Les lectures (readOnlyHint: true) peuvent être réessayées sans risque après TIMEOUT, UPSTREAM_UNAVAILABLE ou INTERNAL_ERROR, avec backoff.
Les écritures, c’est différent. create-discount-code et create-payment-link sont marqués idempotentHint: false et n’ont pas de clé d’idempotence. Un TIMEOUT est renvoyé lorsque le budget de 30 secondes est épuisé, ce qui peut se produire après que la ligne a été committée : le code ou le lien peut déjà exister. Avant de réessayer une écriture :
- Appelle
list-discount-codeset cherche le code, oulist-payment-linksfiltré par établissement et cherche le titre/la référence. - N’appelle l’écriture à nouveau que si elle est absente.
retryable est false sur chaque code aujourd’hui : le serveur ne sait pas si ton écriture a abouti, donc il ne te dit pas de réessayer.
Erreurs de validation venant de ton client
Comme les erreurs ne portent pas destructuredContent, les clients conformes à la spec (dont le SDK TypeScript officiel) sautent la validation d’output-schema sur ces réponses et remontent l’enveloppe. Si ton client rapporte plutôt une erreur -32602 ou « structured content does not match schema », c’est qu’il valide le texte contre l’outputSchema de l’outil ; lis directement le bloc texte.