isError: true.
HTTP-Level
These are outside the MCP envelope; an MCP client library typically raises them as transport errors.
Tool Errors
A failed tool call is a normal JSON-RPC success whose result hasisError: true, a single text block and no structuredContent:
Nothing else from the underlying failure is exposed: no stack traces, SQL, upstream responses or internal IDs. Every request is logged server-side with the
x-request-id echoed on the HTTP response; quote it when contacting support.
Codes
Retrying
Reads (readOnlyHint: true) are safe to retry after TIMEOUT, UPSTREAM_UNAVAILABLE or INTERNAL_ERROR, with backoff.
Writes are different. create-discount-code and create-payment-link are marked idempotentHint: false and have no idempotency key. A TIMEOUT is returned when the 30-second budget runs out, which can happen after the row has been committed — the code or link may already exist. Before retrying a write:
list-discount-codesand look for the code, orlist-payment-linksfiltered by venue and look for the title/reference.- Only call the write again if it is absent.
retryable is false on every code today: the server does not know whether your write landed, so it does not tell you to retry.
Validation Errors From Your Client
Because errors carry nostructuredContent, spec-compliant clients (including the official TypeScript SDK) skip output-schema validation on them and surface the envelope. If your client instead reports a -32602 or “structured content does not match schema” error, it is validating the text against the tool’s outputSchema; read the text block directly.