Skip to content

Commit 3630026

Browse files
fix: handle BrokenResourceError in stdio_client
1 parent 89ff338 commit 3630026

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

src/mcp/client/session.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ def __init__(
144144
self._task_handlers = experimental_task_handlers or ExperimentalTaskHandlers()
145145

146146
async def initialize(self) -> types.InitializeResult:
147+
if not getattr(self, "_entered", False):
148+
raise RuntimeError(
149+
"ClientSession must be used inside `async with` before calling initialize()"
150+
)
151+
147152
sampling = types.SamplingCapability() if self._sampling_callback is not _default_sampling_callback else None
148153
elicitation = (
149154
types.ElicitationCapability(

src/mcp/client/stdio/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,17 @@ async def stdout_reader():
155155
message = types.JSONRPCMessage.model_validate_json(line)
156156
except Exception as exc: # pragma: no cover
157157
logger.exception("Failed to parse JSONRPC message from server")
158-
await read_stream_writer.send(exc)
158+
try:
159+
await read_stream_writer.send(exc)
160+
except (anyio.BrokenResourceError, anyio.ClosedResourceError):
161+
return
159162
continue
160163

161164
session_message = SessionMessage(message)
162-
await read_stream_writer.send(session_message)
165+
try:
166+
await read_stream_writer.send(session_message)
167+
except (anyio.BrokenResourceError, anyio.ClosedResourceError):
168+
return
163169
except anyio.ClosedResourceError: # pragma: no cover
164170
await anyio.lowlevel.checkpoint()
165171

src/mcp/shared/session.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ def add_response_router(self, router: ResponseRouter) -> None:
219219
self._response_routers.append(router)
220220

221221
async def __aenter__(self) -> Self:
222+
self._entered = True
222223
self._task_group = anyio.create_task_group()
223224
await self._task_group.__aenter__()
224225
self._task_group.start_soon(self._receive_loop)

0 commit comments

Comments
 (0)