Skip to content

Commit e240577

Browse files
author
Yassine Lassoued
committed
Fixed typing issues. Reverted Context generic type parameters.
1 parent 5553f22 commit e240577

File tree

6 files changed

+28
-17
lines changed

6 files changed

+28
-17
lines changed

src/mcp/server/fastmcp/server.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from mcp.server.session import ServerSession, ServerSessionT
3737
from mcp.server.sse import SseServerTransport
3838
from mcp.server.stdio import stdio_server
39-
from mcp.shared.context import LifespanContextT, RequestContext, RequestT
39+
from mcp.shared.context import LifespanContextT, RequestContext
4040
from mcp.types import (
4141
AnyFunction,
4242
EmbeddedResource,
@@ -98,9 +98,11 @@ class Settings(BaseSettings, Generic[LifespanResultT]):
9898
def lifespan_wrapper(
9999
app: FastMCP,
100100
lifespan: Callable[[FastMCP], AbstractAsyncContextManager[LifespanResultT]],
101-
) -> Callable[[MCPServer[LifespanResultT]], AbstractAsyncContextManager[object]]:
101+
) -> Callable[
102+
[MCPServer[LifespanResultT, Request]], AbstractAsyncContextManager[object]
103+
]:
102104
@asynccontextmanager
103-
async def wrap(s: MCPServer[LifespanResultT]) -> AsyncIterator[object]:
105+
async def wrap(s: MCPServer[LifespanResultT, Request]) -> AsyncIterator[object]:
104106
async with lifespan(app) as context:
105107
yield context
106108

@@ -182,7 +184,7 @@ async def list_tools(self) -> list[MCPTool]:
182184
for info in tools
183185
]
184186

185-
def get_context(self) -> Context[ServerSession, object, Request]:
187+
def get_context(self) -> Context[ServerSession, object]:
186188
"""
187189
Returns a Context object. Note that the context will only be valid
188190
during a request; outside a request, most methods will error.
@@ -559,7 +561,7 @@ def _convert_to_content(
559561
return [TextContent(type="text", text=result)]
560562

561563

562-
class Context(BaseModel, Generic[ServerSessionT, LifespanContextT, RequestT]):
564+
class Context(BaseModel, Generic[ServerSessionT, LifespanContextT]):
563565
"""Context object providing access to MCP capabilities.
564566
565567
This provides a cleaner interface to MCP's RequestContext functionality.
@@ -593,13 +595,14 @@ def my_tool(x: int, ctx: Context) -> str:
593595
The context is optional - tools that don't need it can omit the parameter.
594596
"""
595597

596-
_request_context: RequestContext[ServerSessionT, LifespanContextT, RequestT] | None
598+
_request_context: RequestContext[ServerSessionT, LifespanContextT, Request] | None
597599
_fastmcp: FastMCP | None
598600

599601
def __init__(
600602
self,
601603
*,
602-
request_context: RequestContext[ServerSessionT, LifespanContextT, RequestT] | None = None,
604+
request_context: RequestContext[ServerSessionT, LifespanContextT, Request]
605+
| None = None,
603606
fastmcp: FastMCP | None = None,
604607
**kwargs: Any,
605608
):
@@ -615,7 +618,9 @@ def fastmcp(self) -> FastMCP:
615618
return self._fastmcp
616619

617620
@property
618-
def request_context(self) -> RequestContext[ServerSessionT, LifespanContextT]:
621+
def request_context(
622+
self,
623+
) -> RequestContext[ServerSessionT, LifespanContextT, Request]:
619624
"""Access to the underlying request context."""
620625
if self._request_context is None:
621626
raise ValueError("Context is not available outside of a request")

src/mcp/server/fastmcp/tools/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def from_function(
7676
async def run(
7777
self,
7878
arguments: dict[str, Any],
79-
context: Context[ServerSessionT, LifespanContextT, Any] | None = None,
79+
context: Context[ServerSessionT, LifespanContextT] | None = None,
8080
) -> Any:
8181
"""Run the tool with arguments."""
8282
try:

src/mcp/server/fastmcp/tools/tool_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ async def call_tool(
5050
self,
5151
name: str,
5252
arguments: dict[str, Any],
53-
context: Context[ServerSessionT, LifespanContextT, Any] | None = None,
53+
context: Context[ServerSessionT, LifespanContextT] | None = None,
5454
) -> Any:
5555
"""Call a tool by name with arguments."""
5656
tool = self.get_tool(name)

src/mcp/server/lowlevel/server.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ async def main():
9191
LifespanResultT = TypeVar("LifespanResultT")
9292

9393
# This will be properly typed in each Server instance's context
94-
request_ctx: contextvars.ContextVar[RequestContext[ServerSession, Any, RequestT]] = (
94+
request_ctx: contextvars.ContextVar[RequestContext[ServerSession, Any, Any]] = (
9595
contextvars.ContextVar("request_ctx")
9696
)
9797

@@ -128,7 +128,8 @@ def __init__(
128128
version: str | None = None,
129129
instructions: str | None = None,
130130
lifespan: Callable[
131-
[Server[LifespanResultT, RequestT]], AbstractAsyncContextManager[LifespanResultT]
131+
[Server[LifespanResultT, RequestT]],
132+
AbstractAsyncContextManager[LifespanResultT],
132133
] = lifespan,
133134
):
134135
self.name = name
@@ -213,7 +214,9 @@ def get_capabilities(
213214
)
214215

215216
@property
216-
def request_context(self) -> RequestContext[ServerSession, LifespanResultT, RequestT]:
217+
def request_context(
218+
self,
219+
) -> RequestContext[ServerSession, LifespanResultT, RequestT]:
217220
"""If called outside of a request context, this will raise a LookupError."""
218221
return request_ctx.get()
219222

@@ -518,7 +521,12 @@ async def _handle_message(
518521
):
519522
with responder:
520523
await self._handle_request(
521-
message, req, session, lifespan_context, raise_exceptions, request
524+
message,
525+
req,
526+
session,
527+
lifespan_context,
528+
raise_exceptions,
529+
request,
522530
)
523531
case types.ClientNotification(root=notify):
524532
await self._handle_notification(notify)

src/mcp/shared/progress.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections.abc import Generator
22
from contextlib import contextmanager
33
from dataclasses import dataclass, field
4-
from typing import Generic, Any
4+
from typing import Any, Generic
55

66
from pydantic import BaseModel
77

tests/client/test_list_roots_callback.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from types import NoneType
2-
31
import pytest
42
from pydantic import FileUrl
53

0 commit comments

Comments
 (0)