Skip to content

Commit ed5721c

Browse files
committed
fix(session): harden propagate handler with try/except, better error msg
- Guard stream.aclose() in propagate handler with try/except to handle already-closed streams (mirrors existing connection-close cleanup pattern) - Include exception class name and message in the INTERNAL_ERROR response sent to the peer for better debuggability - Add explanatory comment on why the receive loop exits after propagation
1 parent 5c3ad03 commit ed5721c

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

src/mcp/shared/session.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,13 +387,24 @@ async def _handle_session_message(message: SessionMessage) -> None:
387387
error_response = JSONRPCError(
388388
jsonrpc="2.0",
389389
id=message.message.id,
390-
error=ErrorData(code=INTERNAL_ERROR, message="Handler raised", data=""),
390+
error=ErrorData(
391+
code=INTERNAL_ERROR,
392+
message=f"Client callback raised: {type(e).__name__}: {e}",
393+
data="",
394+
),
391395
)
392396
await self._write_stream.send(SessionMessage(message=error_response))
393397
self._in_flight.pop(message.message.id, None)
394398
for in_flight_id, stream in list(self._response_streams.items()):
395399
self._propagate_errors[in_flight_id] = e
396-
await stream.aclose()
400+
try:
401+
await stream.aclose()
402+
except Exception:
403+
# Stream might already be closed
404+
pass
405+
# Exit the receive loop: closing all response
406+
# streams above wakes each send_request waiter,
407+
# which will re-raise the propagated exception.
397408
return
398409

399410
# For request validation errors, send a proper JSON-RPC error

0 commit comments

Comments
 (0)