Find the layer that failed
Check these in order. A client that attempts to parse every response as a
successful tool payload will misreport normal notifications and hide useful
authentication or permission failures.
Tool failures
The connector returns these machine-readable tool codes. Read the accompanying message for the specific next step.
A tool failure is represented inside the JSON-RPC result. This example uses a
fictional message; branch on the stable code, not its exact prose:
Protocol and authentication
HTTP 401 requires an authentication or reconnect step. Malformed JSON and invalid JSON-RPC requests are different from a valid tool call that returns a failure. Standard JSON-RPC framing errors include parse error-32700, invalid request -32600, unknown method -32601 and invalid parameters -32602.
Tool results can carry isError; handle that field as well as the top-level JSON-RPC error. Keep the request ID so the client can associate a response with the correct request.
An unknown tool and an unknown JSON-RPC method are separate mistakes. Use the
names returned by tools/list, then supply arguments matching that tool’s
schema. Rewriting an invalid call in a retry loop will not repair a stale
schema unless the client re-discovers and validates the contract.
Notifications have no request ID. The connector answers an accepted
notification with HTTP 202 and an empty body. GET and DELETE on the MCP
transport return HTTP 405; this connector does not require an event stream or
session deletion as part of normal operation.
Limits
A JSON-RPC batch can contain at most 20 requests. Batching is a transport convenience, not a bulk-store-write permission. Connector rate controls and plan allowances are separate from the general BYOM subscription. Read the active allowance through the connection and account surfaces rather than treating a documentation figure as a permanent entitlement. An empty batch or a batch above the size limit is invalid. Keep a unique request ID for every call that expects a response and match results by that ID. A batch containing a set of requests does not make them an atomic transaction across Shopify records. Tools that list business records can have pagination and input limits. Use the returned schema and paging fields. When a long field is shortened in a list response, retrieve the specific record before using the missing text in a decision. Do not silently treat a truncated list as the entire catalogue.about_this_connection reports monthly read/write usage and reset dates.
That context helps explain limit_reached; a lower-level provider limit or
temporary rate restriction may still need its own recovery step. The account’s
active allowance is authoritative, not an example number in a guide.
Retry safely
Back off read requests when a transient provider or rate condition warrants it. Do not retry revoked consent, invalid arguments or drift unchanged. For any uncertain consequential result, inspect the receipt and provider state first. A timeout may follow a successful provider change. Blind retries can duplicate effects.
For example, a product-title update may have reached Shopify before the client
lost its response. First establish whether that exact change happened. A successful read-back or receipt can resolve
that uncertainty; a second mutation can make it worse.
Do not manufacture an idempotency header or reuse an expired proposal token
for a store write. Use the connector’s supported proposal and recovery flow; no arbitrary client-selected idempotency-key contract is documented here.

