Skip to content

Commit 9a1a3c4

Browse files
kxbnbclaude
andcommitted
fix: handle EndOfStream and ClosedResourceError in send_request
Fixes #1717 The `send_request` method only catches `TimeoutError` from the `response_stream_reader.receive()` call. If `receive()` raises `EndOfStream` or `ClosedResourceError` (e.g., when the connection closes unexpectedly), these exceptions propagate without being caught, potentially leaving `response_or_error` unassigned and causing an `UnboundLocalError` at the subsequent isinstance check. This adds explicit handling for these stream closure exceptions, converting them to `McpError` with `CONNECTION_CLOSED` error code. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 239d682 commit 9a1a3c4

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

src/mcp/shared/session.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,10 @@ async def send_request(
274274
class_name = request.__class__.__name__
275275
message = f"Timed out while waiting for response to {class_name}. Waited {timeout} seconds."
276276
raise MCPError(code=REQUEST_TIMEOUT, message=message)
277+
except (anyio.EndOfStream, anyio.ClosedResourceError) as e:
278+
class_name = request.__class__.__name__
279+
message = f"Connection closed while waiting for response to {class_name}: {e}"
280+
raise MCPError(code=CONNECTION_CLOSED, message=message)
277281

278282
if isinstance(response_or_error, JSONRPCError):
279283
raise MCPError.from_jsonrpc_error(response_or_error)

0 commit comments

Comments
 (0)