Skip to content

Commit ab9c9ed

Browse files
committed
fix: catch validation error of bad rpc request
1 parent 42163b0 commit ab9c9ed

File tree

2 files changed

+25
-18
lines changed

2 files changed

+25
-18
lines changed

src/mcp/client/session_group.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@ async def __aexit__(
154154
for exit_stack in self._session_exit_stacks.values():
155155
tg.start_soon(exit_stack.aclose)
156156

157-
158157
@property
159158
def sessions(self) -> list[mcp.ClientSession]:
160159
"""Returns the list of sessions being managed."""

src/mcp/shared/session.py

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -351,26 +351,34 @@ async def _receive_loop(self) -> None:
351351
if isinstance(message, Exception):
352352
await self._handle_incoming(message)
353353
elif isinstance(message.message.root, JSONRPCRequest):
354-
validated_request = self._receive_request_type.model_validate(
355-
message.message.root.model_dump(
356-
by_alias=True, mode="json", exclude_none=True
354+
try:
355+
validated_request = self._receive_request_type.model_validate(
356+
message.message.root.model_dump(
357+
by_alias=True, mode="json", exclude_none=True
358+
)
359+
)
360+
responder = RequestResponder(
361+
request_id=message.message.root.id,
362+
request_meta=validated_request.root.params.meta
363+
if validated_request.root.params
364+
else None,
365+
request=validated_request,
366+
session=self,
367+
on_complete=lambda r: self._in_flight.pop(
368+
r.request_id, None
369+
),
357370
)
358-
)
359-
responder = RequestResponder(
360-
request_id=message.message.root.id,
361-
request_meta=validated_request.root.params.meta
362-
if validated_request.root.params
363-
else None,
364-
request=validated_request,
365-
session=self,
366-
on_complete=lambda r: self._in_flight.pop(r.request_id, None),
367-
)
368371

369-
self._in_flight[responder.request_id] = responder
370-
await self._received_request(responder)
372+
self._in_flight[responder.request_id] = responder
373+
await self._received_request(responder)
371374

372-
if not responder._completed: # type: ignore[reportPrivateUsage]
373-
await self._handle_incoming(responder)
375+
if not responder._completed: # type: ignore[reportPrivateUsage]
376+
await self._handle_incoming(responder)
377+
except Exception as e:
378+
logging.warning(
379+
f"Failed to validate request: {e}. "
380+
f"Message was: {message.message.root}"
381+
)
374382

375383
elif isinstance(message.message.root, JSONRPCNotification):
376384
try:

0 commit comments

Comments
 (0)