@@ -829,3 +829,74 @@ async def test_client_session_from_state():
829829 pass
830830
831831
832+ @pytest .mark .anyio
833+ async def test_client_session_state_roundtrip ():
834+ """Test that session state can be serialized and restored."""
835+ from mcp .shared .session_state import SessionState
836+
837+ client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
838+ server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
839+
840+ async def mock_server ():
841+ session_message = await client_to_server_receive .receive ()
842+ jsonrpc_request = session_message .message
843+ assert isinstance (jsonrpc_request , JSONRPCRequest )
844+
845+ result = InitializeResult (
846+ protocol_version = LATEST_PROTOCOL_VERSION ,
847+ capabilities = ServerCapabilities (
848+ logging = None ,
849+ resources = None ,
850+ tools = None ,
851+ experimental = None ,
852+ prompts = None ,
853+ ),
854+ server_info = Implementation (name = "mock-server" , version = "0.1.0" ),
855+ )
856+
857+ async with server_to_client_send :
858+ await server_to_client_send .send (
859+ SessionMessage (
860+ JSONRPCResponse (
861+ jsonrpc = "2.0" ,
862+ id = jsonrpc_request .id ,
863+ result = result .model_dump (by_alias = True , mode = "json" , exclude_none = True ),
864+ )
865+ )
866+ )
867+ await client_to_server_receive .receive ()
868+
869+ async with (
870+ ClientSession (
871+ server_to_client_receive ,
872+ client_to_server_send ,
873+ ) as original_session ,
874+ anyio .create_task_group () as tg ,
875+ client_to_server_send ,
876+ client_to_server_receive ,
877+ server_to_client_send ,
878+ server_to_client_receive ,
879+ ):
880+ tg .start_soon (mock_server )
881+
882+ # Initialize the session
883+ await original_session .initialize ()
884+
885+ # Extract state
886+ original_state = original_session .get_session_state ()
887+
888+ # Verify it can be serialized to JSON
889+ json_str = original_state .model_dump_json ()
890+
891+ # Verify it can be deserialized from JSON
892+ restored_state = SessionState .model_validate_json (json_str )
893+
894+ # Verify all fields match
895+ assert restored_state .session_id == original_state .session_id
896+ assert restored_state .protocol_version == original_state .protocol_version
897+ assert restored_state .next_request_id == original_state .next_request_id
898+ assert restored_state .server_capabilities == original_state .server_capabilities
899+ assert restored_state .server_info == original_state .server_info
900+ assert restored_state .initialized_sent == original_state .initialized_sent
901+
902+
0 commit comments