DocsErrors and troubleshooting

Errors and troubleshooting

What each failure means and which side needs to change: your config, your plan, or the call itself.

Two error shapes

Transport errors are JSON-RPC errors: the request was malformed, the version is unsupported, the method does not exist, or the credential is wrong. These need a change in your client.

Tool errors come back as a normal result with isError: true and a readable message. The model is meant to read them and correct its next call, which is why a quota problem does not look like a protocol failure.

Transport errors

CodeNameMeaning
-32700Parse errorBody was not valid JSON, or a batch was sent. Send one message per POST.
-32601Method not foundUnknown RPC method or unknown tool name. Re-read tools/list.
-32602Invalid paramsMissing required _meta field, or arguments that are not an object.
-32020HeaderMismatchThe Mcp-Method or Mcp-Name header does not match the body, or a required header is missing (2026-07-28 only).
-32022UnsupportedProtocolVersionThe requested revision is not implemented. The data.supported array lists what is.

Tool errors

CodeMeaningFix
4003Plan does not include MCPUpgrade to Pro or Ultra. The message carries the upgrade link.
4004Quota exhaustedThe named allowance (B2B, scrape or email) is spent for this period.
4029Rate limitedWait. The message names which ceiling was hit: per minute, per day, or the hourly sending guard.
-32602Bad argumentsMissing required argument, a ceiling exceeded, or a missing confirm on a destructive tool.
Ownership failures look like input errors
Asking for a list or campaign that belongs to another workspace returns a not-found tool error rather than a permission error, so nothing leaks about what exists elsewhere.

HTTP statuses

StatusWhen
200Success, including tool errors.
202A notification was accepted; there is no body.
400Malformed request, header mismatch, unsupported version.
401Missing, unknown, expired or revoked credential. Carries WWW-Authenticate.
403Valid credential without the required scope, or a blocked Origin.
404Unknown method or tool on a 2026-07-28 request.
405GET or DELETE on the MCP endpoint. It accepts POST only.
503MCP is disabled on the deployment, or OAuth is not configured.

Common failures

The client shows zero tools

Almost always the credential. Check the health endpoint (no auth needed), then run a real call with your key:

health
curl -s https://mcp.getle.ad/mcp/health
authenticated call
curl -s https://mcp.getle.ad/mcp \
  -H "Authorization: Bearer glm_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/call" \
  -H "Mcp-Name: get_account" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "get_account",
      "arguments": {},
      "_meta": {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientCapabilities": {}
      }
    }
  }'

“Method not allowed” on connect

The client opened a GET stream. That was removed in the 2026-07-28 revision and this server answers 405 for it. Configure the client for streamable HTTP, not the deprecated HTTP+SSE transport, and point it at https://mcp.getle.ad/mcp.

OAuth loops back to the consent screen

The redirect URI is not registered for that client, or the code expired. Codes live two minutes. Start the connection again from the client; if it still loops, disconnect the client in Settings, MCP and re-add it.

Everything returns a plan error

The workspace is not on Pro or Ultra. get_account keeps working precisely so the assistant can report this. See Limits and credits.

Writes fail with 403 while reads work

That key is read-only. Mint a second key with the write scope in Settings, MCP, or approve the write scope on the OAuth consent screen.

A legacy client cannot initialize

The handshake is still supported. Confirm the client posts to the endpoint with JSON:

legacy initialize
curl -s https://mcp.getle.ad/mcp \
  -H "Authorization: Bearer glm_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-06-18",
      "capabilities": {},
      "clientInfo": { "name": "my-client", "version": "1.0.0" }
    }
  }'
Something unclear? Ask in the app, or read the product overview.