You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Initialize call hangs forever if MCP server does not return a Content-Type: text/plain #2432
We had some timeouts on our server while using MCP client from the SDK.
When users try to integrate our client with their MCP server, we do an initialize call to the server and we are waiting infinitely to the following:
sync with self:
...
After investigation, it seems the error happens when the MCP server is misconfigured, and returns something different than Content-Type: text/event-stream as a response from the initialize call.
Although it is on the server side, the client should be able to fail immediately with a understandable error to warn the user something went wrong with the server's initialize output.
Example Code
# server.pyfromhttp.serverimportBaseHTTPRequestHandler, HTTPServerclassPlainTextHandler(BaseHTTPRequestHandler):
defdo_POST(self):
length=int(self.headers.get("Content-Length", 0))
self.rfile.read(length)
body=b"this is not json"self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
deflog_message(self, format, *args):
print(f"[server] {format%args}")
server=HTTPServer(("localhost", 9000), PlainTextHandler)
print("[server] listening on http://localhost:9000")
server.serve_forever()
# client.pyimportasyncioimportmcpfrommcp.client.streamable_httpimportstreamable_http_clientasyncdefmain():
print("connecting…")
asyncwithstreamable_http_client("http://localhost:9000/mcp") as (
read_stream, write_stream, _,
):
asyncwithmcp.ClientSession(read_stream, write_stream) assession:
awaitsession.initialize() # ← hangs here foreverprint("done (you should never see this)")
Opened a fix in #2472 -- adds a regression test verifying that initialize() raises MCPError immediately when a misconfigured server returns an unexpected content type (e.g. text/plain) instead of text/event-stream, rather than hanging forever.
Fixed on main (2.x): a non-JSON/SSE content type now resolves the request with a JSON-RPC error instead of hanging. v1.x only takes critical and security fixes.
Activity
vishal-vanam commentedon Apr 13, 2026
I'd like to work on this. Will submit a PR shortly.
fix: consume response body on unexpected content type to prevent clie…
test: add regression test for initialize hang on unexpected content-t…
Christian-Sidak commentedon Apr 19, 2026
Opened a fix in #2472 -- adds a regression test verifying that
initialize()raisesMCPErrorimmediately when a misconfigured server returns an unexpected content type (e.g.text/plain) instead oftext/event-stream, rather than hanging forever.Kludex commentedon Oct 14, 2026
Fixed on main (2.x): a non-JSON/SSE content type now resolves the request with a JSON-RPC error instead of hanging. v1.x only takes critical and security fixes.