docs/errors/MCPX_HTTP_LEGACY_SSE.md
MCPX_HTTP_LEGACY_SSESeverity: error Domain: HTTP
mcpproxy opened the connection with a streamable-HTTP initialize POST and the
endpoint answered with a 4xx. That combination is the signature of a server
implementing only the older SSE transport, which expects a GET to open an
event stream and a separate POST endpoint for messages — so it rejects the
streamable-HTTP handshake outright.
This is a transport mismatch, not an authentication or routing failure. It
is reported separately from MCPX_HTTP_403 / MCPX_HTTP_404 precisely because
those send you looking for a credential or URL problem that does not exist.
{
"name": "my-server",
"protocol": "sse", // was "http" or "streamable-http"
"url": "https://example.com/sse"
}
Legacy SSE servers usually publish the stream on a distinct path. If the
endpoint documents /sse and the config points at /mcp (or the bare origin),
correct the URL as well as the protocol.
Omitting protocol, or setting it to auto, makes mcpproxy negotiate — useful
when the server supports both and you do not want to pin a choice:
{ "name": "my-server", "protocol": "auto", "url": "https://example.com/mcp" }
mcpproxy upstream restart <server>
mcpproxy upstream logs <server> --follow
MCPX_HTTP_404 — the endpoint genuinely does not existMCPX_HTTP_403 — the endpoint exists but refuses the callerMCPX_HTTP_CONN_REFUSED — nothing is listening at all