@@ -768,3 +768,110 @@ async def mock_server():
768768 await session .initialize ()
769769
770770 await session .call_tool (name = mocked_tool .name , arguments = {"foo" : "bar" }, meta = meta )
771+
772+
773+ @pytest .mark .anyio
774+ async def test_session_id_extracted_from_meta ():
775+ """session_id is set when InitializeResult._meta contains a string session_id."""
776+ client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
777+ server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
778+
779+ async def mock_server ():
780+ session_message = await client_to_server_receive .receive ()
781+ jsonrpc_request = session_message .message
782+ assert isinstance (jsonrpc_request .root , JSONRPCRequest )
783+
784+ result = ServerResult (
785+ InitializeResult (
786+ protocolVersion = LATEST_PROTOCOL_VERSION ,
787+ capabilities = ServerCapabilities (),
788+ serverInfo = Implementation (name = "mock-server" , version = "0.1.0" ),
789+ )
790+ )
791+ result_dict = result .model_dump (by_alias = True , mode = "json" , exclude_none = True )
792+ # Inject session_id into _meta as a FastMCP server would
793+ result_dict ["_meta" ] = {"session_id" : "test-session-abc" }
794+
795+ async with server_to_client_send :
796+ await server_to_client_send .send (
797+ SessionMessage (
798+ JSONRPCMessage (
799+ JSONRPCResponse (
800+ jsonrpc = "2.0" ,
801+ id = jsonrpc_request .root .id ,
802+ result = result_dict ,
803+ )
804+ )
805+ )
806+ )
807+ await client_to_server_receive .receive ()
808+
809+ async with (
810+ ClientSession (
811+ server_to_client_receive ,
812+ client_to_server_send ,
813+ ) as session ,
814+ anyio .create_task_group () as tg ,
815+ client_to_server_send ,
816+ client_to_server_receive ,
817+ server_to_client_send ,
818+ server_to_client_receive ,
819+ ):
820+ assert session .session_id is None
821+ tg .start_soon (mock_server )
822+ await session .initialize ()
823+
824+ assert session .session_id == "test-session-abc"
825+
826+
827+ @pytest .mark .anyio
828+ async def test_session_id_not_set_when_meta_has_non_string_value ():
829+ """session_id stays None when _meta is present but session_id is not a string."""
830+ client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
831+ server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
832+
833+ async def mock_server ():
834+ session_message = await client_to_server_receive .receive ()
835+ jsonrpc_request = session_message .message
836+ assert isinstance (jsonrpc_request .root , JSONRPCRequest )
837+
838+ result = ServerResult (
839+ InitializeResult (
840+ protocolVersion = LATEST_PROTOCOL_VERSION ,
841+ capabilities = ServerCapabilities (),
842+ serverInfo = Implementation (name = "mock-server" , version = "0.1.0" ),
843+ )
844+ )
845+ result_dict = result .model_dump (by_alias = True , mode = "json" , exclude_none = True )
846+ # _meta present but session_id is an integer, not a string
847+ result_dict ["_meta" ] = {"session_id" : 42 }
848+
849+ async with server_to_client_send :
850+ await server_to_client_send .send (
851+ SessionMessage (
852+ JSONRPCMessage (
853+ JSONRPCResponse (
854+ jsonrpc = "2.0" ,
855+ id = jsonrpc_request .root .id ,
856+ result = result_dict ,
857+ )
858+ )
859+ )
860+ )
861+ await client_to_server_receive .receive ()
862+
863+ async with (
864+ ClientSession (
865+ server_to_client_receive ,
866+ client_to_server_send ,
867+ ) as session ,
868+ anyio .create_task_group () as tg ,
869+ client_to_server_send ,
870+ client_to_server_receive ,
871+ server_to_client_send ,
872+ server_to_client_receive ,
873+ ):
874+ tg .start_soon (mock_server )
875+ await session .initialize ()
876+
877+ assert session .session_id is None
0 commit comments