4949from mcp .server .stdio import stdio_server
5050from mcp .server .streamable_http import EventStore
5151from mcp .server .streamable_http_manager import StreamableHTTPSessionManager
52- from mcp .shared .context import LifespanContextT , RequestContext
52+ from mcp .shared .context import LifespanContextT , RequestContext , RequestT
5353from mcp .types import (
5454 AnyFunction ,
5555 EmbeddedResource ,
@@ -124,9 +124,11 @@ class Settings(BaseSettings, Generic[LifespanResultT]):
124124def lifespan_wrapper (
125125 app : FastMCP ,
126126 lifespan : Callable [[FastMCP ], AbstractAsyncContextManager [LifespanResultT ]],
127- ) -> Callable [[MCPServer [LifespanResultT ]], AbstractAsyncContextManager [object ]]:
127+ ) -> Callable [
128+ [MCPServer [LifespanResultT , Request ]], AbstractAsyncContextManager [object ]
129+ ]:
128130 @asynccontextmanager
129- async def wrap (s : MCPServer [LifespanResultT ]) -> AsyncIterator [object ]:
131+ async def wrap (s : MCPServer [LifespanResultT , Request ]) -> AsyncIterator [object ]:
130132 async with lifespan (app ) as context :
131133 yield context
132134
@@ -147,7 +149,7 @@ def __init__(
147149 ):
148150 self .settings = Settings (** settings )
149151
150- self ._mcp_server = MCPServer (
152+ self ._mcp_server : MCPServer [ object , Request ] = MCPServer (
151153 name = name or "FastMCP" ,
152154 instructions = instructions ,
153155 lifespan = (
@@ -260,7 +262,7 @@ async def list_tools(self) -> list[MCPTool]:
260262 for info in tools
261263 ]
262264
263- def get_context (self ) -> Context [ServerSession , object ]:
265+ def get_context (self ) -> Context [ServerSession , object , Request ]:
264266 """
265267 Returns a Context object. Note that the context will only be valid
266268 during a request; outside a request, most methods will error.
@@ -893,7 +895,7 @@ def _convert_to_content(
893895 return [TextContent (type = "text" , text = result )]
894896
895897
896- class Context (BaseModel , Generic [ServerSessionT , LifespanContextT ]):
898+ class Context (BaseModel , Generic [ServerSessionT , LifespanContextT , RequestT ]):
897899 """Context object providing access to MCP capabilities.
898900
899901 This provides a cleaner interface to MCP's RequestContext functionality.
@@ -927,13 +929,15 @@ def my_tool(x: int, ctx: Context) -> str:
927929 The context is optional - tools that don't need it can omit the parameter.
928930 """
929931
930- _request_context : RequestContext [ServerSessionT , LifespanContextT ] | None
932+ _request_context : RequestContext [ServerSessionT , LifespanContextT , RequestT ] | None
931933 _fastmcp : FastMCP | None
932934
933935 def __init__ (
934936 self ,
935937 * ,
936- request_context : RequestContext [ServerSessionT , LifespanContextT ] | None = None ,
938+ request_context : (
939+ RequestContext [ServerSessionT , LifespanContextT , RequestT ] | None
940+ ) = None ,
937941 fastmcp : FastMCP | None = None ,
938942 ** kwargs : Any ,
939943 ):
@@ -949,7 +953,9 @@ def fastmcp(self) -> FastMCP:
949953 return self ._fastmcp
950954
951955 @property
952- def request_context (self ) -> RequestContext [ServerSessionT , LifespanContextT ]:
956+ def request_context (
957+ self ,
958+ ) -> RequestContext [ServerSessionT , LifespanContextT , RequestT ]:
953959 """Access to the underlying request context."""
954960 if self ._request_context is None :
955961 raise ValueError ("Context is not available outside of a request" )
0 commit comments