@@ -399,6 +399,53 @@ async def run_server() -> None:
399399 tg .cancel_scope .cancel ()
400400
401401
402+ @pytest .mark .anyio
403+ async def test_default_task_handlers_require_session_id () -> None :
404+ """Test that default task handlers reject requests when session has no session_id."""
405+ server = Server ("test-no-session-id" )
406+ server .experimental .enable_tasks ()
407+
408+ server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
409+ client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
410+
411+ async def message_handler (
412+ message : RequestResponder [ServerRequest , ClientResult ] | ServerNotification | Exception ,
413+ ) -> None : ... # pragma: no branch
414+
415+ async def run_server () -> None :
416+ async with ServerSession (
417+ client_to_server_receive ,
418+ server_to_client_send ,
419+ InitializationOptions (
420+ server_name = "test-server" ,
421+ server_version = "1.0.0" ,
422+ capabilities = server .get_capabilities (
423+ notification_options = NotificationOptions (),
424+ experimental_capabilities = {},
425+ ),
426+ ),
427+ ) as server_session :
428+ # session_id is None (no session_id passed)
429+ async for message in server_session .incoming_messages :
430+ await server ._handle_message (message , server_session , {}, False )
431+
432+ async with anyio .create_task_group () as tg :
433+ tg .start_soon (run_server )
434+
435+ async with ClientSession (
436+ server_to_client_receive ,
437+ client_to_server_send ,
438+ message_handler = message_handler ,
439+ ) as client_session :
440+ await client_session .initialize ()
441+
442+ # All default task handlers should fail with "Session ID is required"
443+ with pytest .raises (MCPError , match = "Session ID is required" ):
444+ await client_session .experimental .list_tasks ()
445+
446+ tg .cancel_scope .cancel ()
447+
448+
402449@pytest .mark .anyio
403450async def test_build_elicit_form_request () -> None :
404451 """Test that _build_elicit_form_request builds a proper elicitation request."""
0 commit comments