@@ -553,3 +553,63 @@ async def test_delete_task_without_capability():
553553 assert "not announced tasks capability" in str (e ) or str (types .INVALID_REQUEST ) in str (e )
554554 finally :
555555 tg .cancel_scope .cancel ()
556+
557+
558+ @pytest .mark .anyio
559+ async def test_server_receives_request_with_task_metadata ():
560+ """Test server creates task when receiving request with task metadata."""
561+ task_store = InMemoryTaskStore ()
562+ client_task_store = InMemoryTaskStore ()
563+ server = Server ("test" , task_store = task_store )
564+
565+ # Register a simple tool handler
566+ @server .call_tool ()
567+ async def handle_tool (name : str , arguments : dict [str , str ]) -> list [types .TextContent ]:
568+ return [types .TextContent (type = "text" , text = f"Tool { name } called" )]
569+
570+ async with create_client_server_memory_streams () as (client_streams , server_streams ):
571+ client_read , client_write = client_streams
572+ server_read , server_write = server_streams
573+
574+ async with anyio .create_task_group () as tg :
575+ tg .start_soon (
576+ lambda : server .run (
577+ server_read ,
578+ server_write ,
579+ server .create_initialization_options (),
580+ )
581+ )
582+
583+ try :
584+ async with ClientSession (
585+ read_stream = client_read ,
586+ write_stream = client_write ,
587+ task_store = client_task_store ,
588+ ) as client_session :
589+ await client_session .initialize ()
590+
591+ # Send a request with task metadata
592+ task_id = "test-task-with-metadata"
593+ task_meta = types .TaskMetadata (taskId = task_id , keepAlive = 60000 )
594+
595+ # Use send_request with task parameter to inject task metadata
596+ result = await client_session .send_request (
597+ types .ClientRequest (
598+ types .CallToolRequest (
599+ params = types .CallToolRequestParams (name = "test_tool" , arguments = {"arg" : "value" })
600+ )
601+ ),
602+ types .CallToolResult ,
603+ task = task_meta ,
604+ )
605+
606+ # Verify the tool was called
607+ assert len (result .content ) > 0
608+
609+ # Verify the task was created in the server's task store
610+ server_task = await task_store .get_task (task_id )
611+ assert server_task is not None
612+ assert server_task .taskId == task_id
613+ assert server_task .status == "submitted"
614+ finally :
615+ tg .cancel_scope .cancel ()
0 commit comments