49
49
from mcp .server .stdio import stdio_server
50
50
from mcp .server .streamable_http import EventStore
51
51
from mcp .server .streamable_http_manager import StreamableHTTPSessionManager
52
- from mcp .shared .context import LifespanContextT , RequestContext
52
+ from mcp .shared .context import LifespanContextT , RequestContext , RequestT
53
53
from mcp .types import (
54
54
AnyFunction ,
55
55
EmbeddedResource ,
@@ -124,9 +124,11 @@ class Settings(BaseSettings, Generic[LifespanResultT]):
124
124
def lifespan_wrapper (
125
125
app : FastMCP ,
126
126
lifespan : Callable [[FastMCP ], AbstractAsyncContextManager [LifespanResultT ]],
127
- ) -> Callable [[MCPServer [LifespanResultT ]], AbstractAsyncContextManager [object ]]:
127
+ ) -> Callable [
128
+ [MCPServer [LifespanResultT , Request ]], AbstractAsyncContextManager [object ]
129
+ ]:
128
130
@asynccontextmanager
129
- async def wrap (s : MCPServer [LifespanResultT ]) -> AsyncIterator [object ]:
131
+ async def wrap (s : MCPServer [LifespanResultT , Request ]) -> AsyncIterator [object ]:
130
132
async with lifespan (app ) as context :
131
133
yield context
132
134
@@ -147,7 +149,7 @@ def __init__(
147
149
):
148
150
self .settings = Settings (** settings )
149
151
150
- self ._mcp_server = MCPServer (
152
+ self ._mcp_server : MCPServer [ object , Request ] = MCPServer (
151
153
name = name or "FastMCP" ,
152
154
instructions = instructions ,
153
155
lifespan = (
@@ -260,7 +262,7 @@ async def list_tools(self) -> list[MCPTool]:
260
262
for info in tools
261
263
]
262
264
263
- def get_context (self ) -> Context [ServerSession , object ]:
265
+ def get_context (self ) -> Context [ServerSession , object , Request ]:
264
266
"""
265
267
Returns a Context object. Note that the context will only be valid
266
268
during a request; outside a request, most methods will error.
@@ -893,7 +895,7 @@ def _convert_to_content(
893
895
return [TextContent (type = "text" , text = result )]
894
896
895
897
896
- class Context (BaseModel , Generic [ServerSessionT , LifespanContextT ]):
898
+ class Context (BaseModel , Generic [ServerSessionT , LifespanContextT , RequestT ]):
897
899
"""Context object providing access to MCP capabilities.
898
900
899
901
This provides a cleaner interface to MCP's RequestContext functionality.
@@ -927,13 +929,15 @@ def my_tool(x: int, ctx: Context) -> str:
927
929
The context is optional - tools that don't need it can omit the parameter.
928
930
"""
929
931
930
- _request_context : RequestContext [ServerSessionT , LifespanContextT ] | None
932
+ _request_context : RequestContext [ServerSessionT , LifespanContextT , RequestT ] | None
931
933
_fastmcp : FastMCP | None
932
934
933
935
def __init__ (
934
936
self ,
935
937
* ,
936
- request_context : RequestContext [ServerSessionT , LifespanContextT ] | None = None ,
938
+ request_context : (
939
+ RequestContext [ServerSessionT , LifespanContextT , RequestT ] | None
940
+ ) = None ,
937
941
fastmcp : FastMCP | None = None ,
938
942
** kwargs : Any ,
939
943
):
@@ -949,7 +953,9 @@ def fastmcp(self) -> FastMCP:
949
953
return self ._fastmcp
950
954
951
955
@property
952
- def request_context (self ) -> RequestContext [ServerSessionT , LifespanContextT ]:
956
+ def request_context (
957
+ self ,
958
+ ) -> RequestContext [ServerSessionT , LifespanContextT , RequestT ]:
953
959
"""Access to the underlying request context."""
954
960
if self ._request_context is None :
955
961
raise ValueError ("Context is not available outside of a request" )
0 commit comments