@@ -688,3 +688,53 @@ async def mock_server():
688688 await session .initialize ()
689689
690690 await session .call_tool (name = mocked_tool .name , arguments = {"foo" : "bar" }, meta = meta )
691+
692+
693+ @pytest .mark .anyio
694+ async def test_default_message_handler_raises_exception (caplog : pytest .LogCaptureFixture ):
695+ """Test that default message handler raises exceptions it receives"""
696+ client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
697+ server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage | Exception ](1 )
698+
699+ async def mock_server ():
700+ session_message = await client_to_server_receive .receive ()
701+ jsonrpc_request = session_message .message
702+ assert isinstance (jsonrpc_request .root , JSONRPCRequest )
703+
704+ result = ServerResult (
705+ InitializeResult (
706+ protocolVersion = LATEST_PROTOCOL_VERSION ,
707+ capabilities = ServerCapabilities (),
708+ serverInfo = Implementation (name = "mock-server" , version = "0.1.0" ),
709+ )
710+ )
711+
712+ await server_to_client_send .send (
713+ SessionMessage (
714+ JSONRPCMessage (
715+ JSONRPCResponse (
716+ jsonrpc = "2.0" ,
717+ id = jsonrpc_request .root .id ,
718+ result = result .model_dump (by_alias = True , mode = "json" , exclude_none = True ),
719+ )
720+ )
721+ )
722+ )
723+
724+ await client_to_server_receive .receive ()
725+ await server_to_client_send .send (ValueError ("Test error from transport" ))
726+
727+ async with (
728+ ClientSession (server_to_client_receive , client_to_server_send ) as session ,
729+ anyio .create_task_group () as tg ,
730+ client_to_server_send ,
731+ client_to_server_receive ,
732+ server_to_client_send ,
733+ server_to_client_receive ,
734+ ):
735+ tg .start_soon (mock_server )
736+ await session .initialize ()
737+ await anyio .sleep (0.1 )
738+
739+ assert "Exception in MCP client message handler" in caplog .text
740+ assert "Unhandled exception in receive loop" in caplog .text
0 commit comments