@@ -383,3 +383,173 @@ async def test_delete_task_not_found():
383383 assert "Failed to delete task" in str (e ) or str (types .INVALID_PARAMS ) in str (e )
384384 finally :
385385 tg .cancel_scope .cancel ()
386+
387+
388+ @pytest .mark .anyio
389+ async def test_get_task_without_capability ():
390+ """Test GetTaskRequest fails when client hasn't announced tasks capability."""
391+ task_store = InMemoryTaskStore ()
392+ server = Server ("test" , task_store = task_store )
393+
394+ # Create a task in the store
395+ task_id = "test-task-999"
396+ task_meta = types .TaskMetadata (taskId = task_id )
397+ request = types .ClientRequest (types .PingRequest ())
398+ await task_store .create_task (task_meta , "req-1" , request .root )
399+
400+ async with create_client_server_memory_streams () as (client_streams , server_streams ):
401+ client_read , client_write = client_streams
402+ server_read , server_write = server_streams
403+
404+ async with anyio .create_task_group () as tg :
405+ tg .start_soon (
406+ lambda : server .run (
407+ server_read ,
408+ server_write ,
409+ server .create_initialization_options (),
410+ )
411+ )
412+
413+ try :
414+ async with ClientSession (
415+ read_stream = client_read ,
416+ write_stream = client_write ,
417+ # No task_store - client won't announce tasks capability
418+ ) as client_session :
419+ await client_session .initialize ()
420+
421+ # Try to send GetTaskRequest
422+ try :
423+ await client_session .send_request (
424+ types .ClientRequest (types .GetTaskRequest (params = types .GetTaskParams (taskId = task_id ))),
425+ types .GetTaskResult ,
426+ )
427+ assert False , "Should have raised McpError"
428+ except Exception as e :
429+ assert "not announced tasks capability" in str (e ) or str (types .INVALID_REQUEST ) in str (e )
430+ finally :
431+ tg .cancel_scope .cancel ()
432+
433+
434+ @pytest .mark .anyio
435+ async def test_get_task_payload_without_capability ():
436+ """Test GetTaskPayloadRequest fails when client hasn't announced tasks capability."""
437+ task_store = InMemoryTaskStore ()
438+ server = Server ("test" , task_store = task_store )
439+
440+ async with create_client_server_memory_streams () as (client_streams , server_streams ):
441+ client_read , client_write = client_streams
442+ server_read , server_write = server_streams
443+
444+ async with anyio .create_task_group () as tg :
445+ tg .start_soon (
446+ lambda : server .run (
447+ server_read ,
448+ server_write ,
449+ server .create_initialization_options (),
450+ )
451+ )
452+
453+ try :
454+ async with ClientSession (
455+ read_stream = client_read ,
456+ write_stream = client_write ,
457+ # No task_store - client won't announce tasks capability
458+ ) as client_session :
459+ await client_session .initialize ()
460+
461+ # Try to send GetTaskPayloadRequest
462+ try :
463+ await client_session .send_request (
464+ types .ClientRequest (
465+ types .GetTaskPayloadRequest (params = types .GetTaskPayloadParams (taskId = "some-task" ))
466+ ),
467+ types .ServerResult ,
468+ )
469+ assert False , "Should have raised McpError"
470+ except Exception as e :
471+ assert "not announced tasks capability" in str (e ) or str (types .INVALID_REQUEST ) in str (e )
472+ finally :
473+ tg .cancel_scope .cancel ()
474+
475+
476+ @pytest .mark .anyio
477+ async def test_list_tasks_without_capability ():
478+ """Test ListTasksRequest fails when client hasn't announced tasks capability."""
479+ task_store = InMemoryTaskStore ()
480+ server = Server ("test" , task_store = task_store )
481+
482+ async with create_client_server_memory_streams () as (client_streams , server_streams ):
483+ client_read , client_write = client_streams
484+ server_read , server_write = server_streams
485+
486+ async with anyio .create_task_group () as tg :
487+ tg .start_soon (
488+ lambda : server .run (
489+ server_read ,
490+ server_write ,
491+ server .create_initialization_options (),
492+ )
493+ )
494+
495+ try :
496+ async with ClientSession (
497+ read_stream = client_read ,
498+ write_stream = client_write ,
499+ # No task_store - client won't announce tasks capability
500+ ) as client_session :
501+ await client_session .initialize ()
502+
503+ # Try to send ListTasksRequest
504+ try :
505+ await client_session .send_request (
506+ types .ClientRequest (types .ListTasksRequest ()),
507+ types .ListTasksResult ,
508+ )
509+ assert False , "Should have raised McpError"
510+ except Exception as e :
511+ assert "not announced tasks capability" in str (e ) or str (types .INVALID_REQUEST ) in str (e )
512+ finally :
513+ tg .cancel_scope .cancel ()
514+
515+
516+ @pytest .mark .anyio
517+ async def test_delete_task_without_capability ():
518+ """Test DeleteTaskRequest fails when client hasn't announced tasks capability."""
519+ task_store = InMemoryTaskStore ()
520+ server = Server ("test" , task_store = task_store )
521+
522+ async with create_client_server_memory_streams () as (client_streams , server_streams ):
523+ client_read , client_write = client_streams
524+ server_read , server_write = server_streams
525+
526+ async with anyio .create_task_group () as tg :
527+ tg .start_soon (
528+ lambda : server .run (
529+ server_read ,
530+ server_write ,
531+ server .create_initialization_options (),
532+ )
533+ )
534+
535+ try :
536+ async with ClientSession (
537+ read_stream = client_read ,
538+ write_stream = client_write ,
539+ # No task_store - client won't announce tasks capability
540+ ) as client_session :
541+ await client_session .initialize ()
542+
543+ # Try to send DeleteTaskRequest
544+ try :
545+ await client_session .send_request (
546+ types .ClientRequest (
547+ types .DeleteTaskRequest (params = types .DeleteTaskParams (taskId = "some-task" ))
548+ ),
549+ types .EmptyResult ,
550+ )
551+ assert False , "Should have raised McpError"
552+ except Exception as e :
553+ assert "not announced tasks capability" in str (e ) or str (types .INVALID_REQUEST ) in str (e )
554+ finally :
555+ tg .cancel_scope .cancel ()
0 commit comments