Skip to content

Commit 03aa9c1

Browse files
committed
fix: address PR review comments on migration docs and type hints
- Fix all migration.md examples to use ServerRequestContext instead of RequestContext - Fix all imports to use 'from mcp.server import Server, ServerRequestContext' - Apply ruff formatting to code examples - Add Server constructor calls to examples that were missing them - Re-export ServerRequestContext from mcp.server.__init__ - Add type hints to TaskResultHandler docstring example
1 parent c5a5fb2 commit 03aa9c1

File tree

4 files changed

+28
-37
lines changed

4 files changed

+28
-37
lines changed

docs/migration.md

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -363,12 +363,12 @@ async def handle_tool(name: str, arguments: dict) -> list[TextContent]:
363363
await ctx.session.send_progress_notification(ctx.meta.progress_token, 0.5, 100)
364364

365365
# After (v2)
366-
async def handle_call_tool(
367-
ctx: RequestContext, params: CallToolRequestParams
368-
) -> CallToolResult:
366+
async def handle_call_tool(ctx: ServerRequestContext, params: CallToolRequestParams) -> CallToolResult:
369367
if ctx.meta and "progress_token" in ctx.meta:
370368
await ctx.session.send_progress_notification(ctx.meta["progress_token"], 0.5, 100)
371369
...
370+
371+
server = Server("my-server", on_call_tool=handle_call_tool)
372372
```
373373

374374
### `RequestContext` and `ProgressContext` type parameters simplified
@@ -494,8 +494,7 @@ async def handle_call_tool(name: str, arguments: dict):
494494
**After (v2):**
495495

496496
```python
497-
from mcp.server.lowlevel import Server
498-
from mcp.shared.context import RequestContext
497+
from mcp.server import Server, ServerRequestContext
499498
from mcp.types import (
500499
CallToolRequestParams,
501500
CallToolResult,
@@ -505,16 +504,11 @@ from mcp.types import (
505504
Tool,
506505
)
507506

508-
async def handle_list_tools(
509-
ctx: RequestContext, params: PaginatedRequestParams | None
510-
) -> ListToolsResult:
511-
return ListToolsResult(tools=[
512-
Tool(name="my_tool", description="A tool", inputSchema={})
513-
])
507+
async def handle_list_tools(ctx: ServerRequestContext, params: PaginatedRequestParams | None) -> ListToolsResult:
508+
return ListToolsResult(tools=[Tool(name="my_tool", description="A tool", inputSchema={})])
509+
514510

515-
async def handle_call_tool(
516-
ctx: RequestContext, params: CallToolRequestParams
517-
) -> CallToolResult:
511+
async def handle_call_tool(ctx: ServerRequestContext, params: CallToolRequestParams) -> CallToolResult:
518512
return CallToolResult(
519513
content=[TextContent(type="text", text=f"Called {params.name}")],
520514
is_error=False,
@@ -536,13 +530,11 @@ server = Server(
536530
**Notification handlers:**
537531

538532
```python
539-
from mcp.server.lowlevel import Server
540-
from mcp.shared.context import RequestContext
533+
from mcp.server import Server, ServerRequestContext
541534
from mcp.types import ProgressNotificationParams
542535

543-
async def handle_progress(
544-
ctx: RequestContext, params: ProgressNotificationParams
545-
) -> None:
536+
537+
async def handle_progress(ctx: ServerRequestContext, params: ProgressNotificationParams) -> None:
546538
print(f"Progress: {params.progress}/{params.total}")
547539

548540
server = Server(
@@ -570,12 +562,11 @@ async def handle_call_tool(name: str, arguments: dict):
570562
**After (v2):**
571563

572564
```python
573-
from mcp.shared.context import RequestContext
565+
from mcp.server import ServerRequestContext
574566
from mcp.types import CallToolRequestParams, CallToolResult, TextContent
575567

576-
async def handle_call_tool(
577-
ctx: RequestContext, params: CallToolRequestParams
578-
) -> CallToolResult:
568+
569+
async def handle_call_tool(ctx: ServerRequestContext, params: CallToolRequestParams) -> CallToolResult:
579570
await ctx.session.send_log_message(level="info", data="Processing...")
580571
return CallToolResult(
581572
content=[TextContent(type="text", text="Done")],
@@ -588,7 +579,7 @@ async def handle_call_tool(
588579
The `RequestContext` class now uses optional fields for request-specific data (`request_id`, `meta`, etc.) so it can be used for both request and notification handlers. In notification handlers, these fields are `None`.
589580

590581
```python
591-
from mcp.shared.context import RequestContext
582+
from mcp.server import ServerRequestContext
592583

593584
# request_id, meta, etc. are available in request handlers
594585
# but None in notification handlers
@@ -658,15 +649,14 @@ params = CallToolRequestParams(
658649
The `streamable_http_app()` method is now available directly on the lowlevel `Server` class, not just `MCPServer`. This allows using the streamable HTTP transport without the MCPServer wrapper.
659650

660651
```python
661-
from mcp.server.lowlevel import Server
662-
from mcp.shared.context import RequestContext
652+
from mcp.server import Server, ServerRequestContext
663653
from mcp.types import ListToolsResult, PaginatedRequestParams
664654

665-
async def handle_list_tools(
666-
ctx: RequestContext, params: PaginatedRequestParams | None
667-
) -> ListToolsResult:
655+
656+
async def handle_list_tools(ctx: ServerRequestContext, params: PaginatedRequestParams | None) -> ListToolsResult:
668657
return ListToolsResult(tools=[...])
669658

659+
670660
server = Server(
671661
"my-server",
672662
on_list_tools=handle_list_tools,

src/mcp/server/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
from .context import ServerRequestContext
12
from .lowlevel import NotificationOptions, Server
23
from .mcpserver import MCPServer
34
from .models import InitializationOptions
45

5-
__all__ = ["Server", "MCPServer", "NotificationOptions", "InitializationOptions"]
6+
__all__ = ["Server", "ServerRequestContext", "MCPServer", "NotificationOptions", "InitializationOptions"]

src/mcp/server/experimental/task_result_handler.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,17 @@ class TaskResultHandler:
4444
5. Returns the final result
4545
4646
Usage:
47-
# Create handler with store and queue
4847
handler = TaskResultHandler(task_store, message_queue)
4948
50-
# Register as a handler with the lowlevel server
51-
async def handle_task_result(ctx, params):
49+
async def handle_task_result(
50+
ctx: ServerRequestContext, params: GetTaskPayloadRequestParams
51+
) -> GetTaskPayloadResult:
52+
assert ctx.request_id is not None
5253
return await handler.handle(
5354
GetTaskPayloadRequest(params=params), ctx.session, ctx.request_id
5455
)
55-
server = Server(on_call_tool=..., on_list_tools=...)
56+
57+
server._add_request_handler("tasks/result", handle_task_result)
5658
"""
5759

5860
def __init__(

src/mcp/server/lowlevel/experimental.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@ class ExperimentalHandlers:
4747

4848
def __init__(
4949
self,
50-
add_request_handler: Callable[
51-
[str, Callable[[ServerRequestContext[Any, Any], Any], Awaitable[Any]]], None
52-
],
50+
add_request_handler: Callable[[str, Callable[[ServerRequestContext[Any, Any], Any], Awaitable[Any]]], None],
5351
has_handler: Callable[[str], bool],
5452
) -> None:
5553
self._add_request_handler = add_request_handler

0 commit comments

Comments
 (0)