diff --git a/src/mcp/shared/session.py b/src/mcp/shared/session.py index 11daedc98..278d4563c 100644 --- a/src/mcp/shared/session.py +++ b/src/mcp/shared/session.py @@ -311,27 +311,36 @@ async def _receive_loop(self) -> None: if isinstance(message, Exception): await self._handle_incoming(message) elif isinstance(message.root, JSONRPCRequest): - validated_request = self._receive_request_type.model_validate( - message.root.model_dump( - by_alias=True, mode="json", exclude_none=True + try: + validated_request = self._receive_request_type.model_validate( + message.root.model_dump( + by_alias=True, mode="json", exclude_none=True + ) ) - ) - responder = RequestResponder( - request_id=message.root.id, - request_meta=validated_request.root.params.meta - if validated_request.root.params - else None, - request=validated_request, - session=self, - on_complete=lambda r: self._in_flight.pop(r.request_id, None), - ) + responder = RequestResponder( + request_id=message.root.id, + request_meta=validated_request.root.params.meta + if validated_request.root.params + else None, + request=validated_request, + session=self, + on_complete=lambda r: self._in_flight.pop( + r.request_id, None + ), + ) - self._in_flight[responder.request_id] = responder - await self._received_request(responder) + self._in_flight[responder.request_id] = responder + await self._received_request(responder) - if not responder._completed: # type: ignore[reportPrivateUsage] - await self._handle_incoming(responder) + if not responder._completed: # type: ignore[reportPrivateUsage] + await self._handle_incoming(responder) + except Exception as e: + # Log validation errors and continue + logging.warning( + f"Failed to validate request: {e}. " + f"Message was: {message.root}" + ) elif isinstance(message.root, JSONRPCNotification): try: