Skip to content

Commit 606e4c8

Browse files
fix: guard cleanup logic with shield=True
A cleanup logic should not be cancelled via CancelScope. Therefore 'shield=True' parameter is required.
1 parent 5809089 commit 606e4c8

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

src/mcp/shared/session.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -444,15 +444,16 @@ async def _receive_loop(self) -> None:
444444
finally:
445445
# after the read stream is closed, we need to send errors
446446
# to any pending requests
447-
for id, stream in self._response_streams.items():
448-
error = ErrorData(code=CONNECTION_CLOSED, message="Connection closed")
449-
try:
450-
await stream.send(JSONRPCError(jsonrpc="2.0", id=id, error=error))
451-
await stream.aclose()
452-
except Exception: # pragma: no cover
453-
# Stream might already be closed
454-
pass
455-
self._response_streams.clear()
447+
with anyio.CancelScope(shield=True):
448+
for id, stream in self._response_streams.items():
449+
error = ErrorData(code=CONNECTION_CLOSED, message="Connection closed")
450+
try:
451+
await stream.send(JSONRPCError(jsonrpc="2.0", id=id, error=error))
452+
await stream.aclose()
453+
except Exception: # pragma: no cover
454+
# Stream might already be closed
455+
pass
456+
self._response_streams.clear()
456457

457458
def _normalize_request_id(self, response_id: RequestId) -> RequestId:
458459
"""

0 commit comments

Comments
 (0)