88
99from mcp .client .session import ClientSession
1010from mcp .server import Server
11+ from mcp .server .experimental .task_result_handler import TaskResultHandler
1112from mcp .server .lowlevel import NotificationOptions
1213from mcp .server .models import InitializationOptions
1314from mcp .server .session import ServerSession
14- from mcp .shared .message import SessionMessage
15+ from mcp .shared .exceptions import McpError
16+ from mcp .shared .experimental .tasks .in_memory_task_store import InMemoryTaskStore
17+ from mcp .shared .experimental .tasks .message_queue import InMemoryTaskMessageQueue
18+ from mcp .shared .message import ServerMessageMetadata , SessionMessage
19+ from mcp .shared .response_router import ResponseRouter
1520from mcp .shared .session import RequestResponder
1621from mcp .types import (
22+ INVALID_REQUEST ,
1723 TASK_FORBIDDEN ,
1824 TASK_OPTIONAL ,
1925 TASK_REQUIRED ,
5258 ToolExecution ,
5359)
5460
55- # --- Experimental handler tests ---
56-
5761
5862@pytest .mark .anyio
5963async def test_list_tasks_handler () -> None :
@@ -174,9 +178,6 @@ async def handle_cancel_task(request: CancelTaskRequest) -> CancelTaskResult:
174178 assert result .root .status == "cancelled"
175179
176180
177- # --- Server capabilities tests ---
178-
179-
180181@pytest .mark .anyio
181182async def test_server_capabilities_include_tasks () -> None :
182183 """Test that server capabilities include tasks when handlers are registered."""
@@ -223,9 +224,6 @@ async def handle_list_tasks(request: ListTasksRequest) -> ListTasksResult:
223224 assert capabilities .tasks .cancel is None # Not registered
224225
225226
226- # --- Tool annotation tests ---
227-
228-
229227@pytest .mark .anyio
230228async def test_tool_with_task_execution_metadata () -> None :
231229 """Test that tools can declare task execution mode."""
@@ -270,9 +268,6 @@ async def list_tools():
270268 assert tools [2 ].execution .taskSupport == TASK_OPTIONAL
271269
272270
273- # --- Integration tests ---
274-
275-
276271@pytest .mark .anyio
277272async def test_task_metadata_in_call_tool_request () -> None :
278273 """Test that task metadata is accessible via RequestContext when calling a tool."""
@@ -471,8 +466,6 @@ async def test_default_task_handlers_via_enable_tasks() -> None:
471466 - _default_list_tasks
472467 - _default_cancel_task
473468 """
474- from mcp .shared .exceptions import McpError
475-
476469 server = Server ("test-default-handlers" )
477470 # Enable tasks with default handlers (no custom handlers registered)
478471 task_support = server .experimental .enable_tasks ()
@@ -569,10 +562,6 @@ async def run_server() -> None:
569562@pytest .mark .anyio
570563async def test_set_task_result_handler () -> None :
571564 """Test that set_task_result_handler adds the handler as a response router."""
572- from mcp .server .experimental .task_result_handler import TaskResultHandler
573- from mcp .shared .experimental .tasks .in_memory_task_store import InMemoryTaskStore
574- from mcp .shared .experimental .tasks .message_queue import InMemoryTaskMessageQueue
575-
576565 server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
577566 client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
578567
@@ -751,8 +740,6 @@ async def test_build_create_message_request() -> None:
751740@pytest .mark .anyio
752741async def test_send_message () -> None :
753742 """Test that send_message sends a raw session message."""
754- from mcp .shared .message import ServerMessageMetadata
755-
756743 server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
757744 client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
758745
@@ -790,8 +777,6 @@ async def test_send_message() -> None:
790777@pytest .mark .anyio
791778async def test_response_routing_success () -> None :
792779 """Test that response routing works for success responses."""
793- from mcp .shared .session import ResponseRouter
794-
795780 server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
796781 client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
797782
@@ -846,8 +831,6 @@ def route_error(self, request_id: str | int, error: ErrorData) -> bool:
846831@pytest .mark .anyio
847832async def test_response_routing_error () -> None :
848833 """Test that error routing works for error responses."""
849- from mcp .shared .session import ResponseRouter
850-
851834 server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
852835 client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
853836
@@ -878,7 +861,7 @@ def route_error(self, request_id: str | int, error: ErrorData) -> bool:
878861 server_session .add_response_router (router )
879862
880863 # Simulate receiving an error response from client
881- error_data = ErrorData (code = - 32600 , message = "Test error" )
864+ error_data = ErrorData (code = INVALID_REQUEST , message = "Test error" )
882865 error_response = JSONRPCError (jsonrpc = "2.0" , id = "test-req-2" , error = error_data )
883866 message = SessionMessage (message = JSONRPCMessage (error_response ))
884867
@@ -903,8 +886,6 @@ def route_error(self, request_id: str | int, error: ErrorData) -> bool:
903886@pytest .mark .anyio
904887async def test_response_routing_skips_non_matching_routers () -> None :
905888 """Test that routing continues to next router when first doesn't match."""
906- from mcp .shared .session import ResponseRouter
907-
908889 server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
909890 client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
910891
@@ -963,8 +944,6 @@ def route_error(self, request_id: str | int, error: ErrorData) -> bool:
963944@pytest .mark .anyio
964945async def test_error_routing_skips_non_matching_routers () -> None :
965946 """Test that error routing continues to next router when first doesn't match."""
966- from mcp .shared .session import ResponseRouter
967-
968947 server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
969948 client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](10 )
970949
@@ -1004,7 +983,7 @@ def route_error(self, request_id: str | int, error: ErrorData) -> bool:
1004983 server_session .add_response_router (MatchingRouter ())
1005984
1006985 # Send an error - should skip first router and be handled by second
1007- error_data = ErrorData (code = - 32600 , message = "Test error" )
986+ error_data = ErrorData (code = INVALID_REQUEST , message = "Test error" )
1008987 error_response = JSONRPCError (jsonrpc = "2.0" , id = "test-req-2" , error = error_data )
1009988 message = SessionMessage (message = JSONRPCMessage (error_response ))
1010989 await client_to_server_send .send (message )
0 commit comments