Skip to content

Commit bc9aaef

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 6c8abd3 commit bc9aaef

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
@@ -493,8 +493,7 @@ async def handle_call_tool(name: str, arguments: dict):
493493
**After (v2):**
494494

495495
```python
496-
from mcp.server.lowlevel import Server
497-
from mcp.shared.context import RequestContext
496+
from mcp.server import Server, ServerRequestContext
498497
from mcp.types import (
499498
CallToolRequestParams,
500499
CallToolResult,
@@ -504,16 +503,11 @@ from mcp.types import (
504503
Tool,
505504
)
506505

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

514-
async def handle_call_tool(
515-
ctx: RequestContext, params: CallToolRequestParams
516-
) -> CallToolResult:
510+
async def handle_call_tool(ctx: ServerRequestContext, params: CallToolRequestParams) -> CallToolResult:
517511
return CallToolResult(
518512
content=[TextContent(type="text", text=f"Called {params.name}")],
519513
is_error=False,
@@ -535,13 +529,11 @@ server = Server(
535529
**Notification handlers:**
536530

537531
```python
538-
from mcp.server.lowlevel import Server
539-
from mcp.shared.context import RequestContext
532+
from mcp.server import Server, ServerRequestContext
540533
from mcp.types import ProgressNotificationParams
541534

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

547539
server = Server(
@@ -569,12 +561,11 @@ async def handle_call_tool(name: str, arguments: dict):
569561
**After (v2):**
570562

571563
```python
572-
from mcp.shared.context import RequestContext
564+
from mcp.server import ServerRequestContext
573565
from mcp.types import CallToolRequestParams, CallToolResult, TextContent
574566

575-
async def handle_call_tool(
576-
ctx: RequestContext, params: CallToolRequestParams
577-
) -> CallToolResult:
567+
568+
async def handle_call_tool(ctx: ServerRequestContext, params: CallToolRequestParams) -> CallToolResult:
578569
await ctx.session.send_log_message(level="info", data="Processing...")
579570
return CallToolResult(
580571
content=[TextContent(type="text", text="Done")],
@@ -587,7 +578,7 @@ async def handle_call_tool(
587578
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`.
588579

589580
```python
590-
from mcp.shared.context import RequestContext
581+
from mcp.server import ServerRequestContext
591582

592583
# request_id, meta, etc. are available in request handlers
593584
# but None in notification handlers
@@ -657,15 +648,14 @@ params = CallToolRequestParams(
657648
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.
658649

659650
```python
660-
from mcp.server.lowlevel import Server
661-
from mcp.shared.context import RequestContext
651+
from mcp.server import Server, ServerRequestContext
662652
from mcp.types import ListToolsResult, PaginatedRequestParams
663653

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

658+
669659
server = Server(
670660
"my-server",
671661
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)