Start here
Almost every “it doesn’t work” resolves to one of three questions, and they’re worth asking in this order:1
Does the handshake report say anything?
transport/content-type and
transport/accept-sse. Rule these out before
touching anything else.2
Did the request reach the inspector?
Open your session’s timeline and try the client again.
- Nothing appears → the client never reached the edge. It’s the URL, or the tunnel isn’t running.
- Rows appear → the client got through. The problem is between the edge and your server, or in your server, and the timeline will show you which.
3
What does the error code say?
Every edge failure carries a JSON-RPC code. The table below decodes them.
Edge error codes
Every failure at the edge answers with a real HTTP status and a JSON-RPC error object, because an HTML error page is an unretryable, confusing failure inside an agent client.The 404-vs-503 split is deliberate. An unknown hostname gets 404; a known
hostname with no live tunnel gets 503. That’s so clients retry rather than
concluding the connector is gone and quietly forgetting it.
The connector doesn’t appear
Nothing in the inspector at all
Nothing in the inspector at all
The client never reached the edge.
- Check the URL character by character. It must end in
/mcp. - Confirm
heymcp shareis still running in your terminal. curl -i https://your-slug.t.heymcp.dev/mcp— a 503 means the tunnel is down, a 404 means the hostname or path is wrong, and a JSON-RPC response means the tunnel is fine and the problem is client-side.
INIT arrives, then nothing
INIT arrives, then nothing
Your server accepted
initialize and then something went wrong. Expand the
INIT← row to see exactly what it answered.An OPAQUE row here usually means an HTML error page where JSON was
expected — a framework exception page, most often.Claude.ai in particular
Claude.ai in particular
Claude.ai fails silently, with nothing in the UI. Work through the
Claude.ai troubleshooting list,
which is ordered by how often each cause is the answer.
The tools are never called
The client connected and can see your tools, and is choosing not to use them. This is a schema problem, not a transport one.The tool is called, and fails
Expand the row in the inspector. You can see the arguments the agent actually sent, which is usually the surprise.
Fix your server, then hit Try it again on the row to replay that exact call
without waiting for the agent to reproduce it.
Streaming problems
A streaming response arrives all at once
A streaming response arrives all at once
Not HeyMCP — the edge forwards each chunk the instant it arrives and never
buffers. Something in your own stack is buffering: output buffering in PHP,
a reverse proxy in front of your dev server, or a framework helper that
collects the whole body before sending.
The connection times out on a long tool call
The connection times out on a long tool call
The edge allows 30 seconds to the first byte and 300 seconds of idle time
after that. A tool that takes minutes needs to send something —
a keep-alive SSE comment is enough — rather than going silent.
A DROP marker in the timeline
A DROP marker in the timeline
More than 2,000 events buffered for one session, so the oldest were dropped.
The marker is there so a gap in the timeline is never silent. Nothing was
lost on the wire — this only affects what the inspector kept.
Tunnel and CLI problems
Too many tunnels open
Too many tunnels open
3 on Hobby, 10 on Pro.
heymcp sessions shows what’s live; closing the
terminal frees the slot.The tunnel keeps reconnecting
The tunnel keeps reconnecting
Normal on a flaky network — the CLI backs off and retries, quietly for the
first 30 seconds. Reconnecting within 15 minutes resumes the same session,
so your timeline isn’t forked.
command not found: heymcp
command not found: heymcp
The install directory isn’t on your
PATH. The installer names the file it
edited; open a new terminal, or source it. See
Installation.A protocol version warning against a server you know is fine
A protocol version warning against a server you know is fine
Your CLI is older than your server. Update it:
--slug or --domain refused
--slug or --domain refused
Both are Pro. Check with
heymcp whoami. For a domain, also confirm it’s
verified and active on the Domains page.