11"""FastMCP - A more ergonomic interface for MCP servers."""
22
3+ from __future__ import annotations as _annotations
4+
35import inspect
46import json
57import re
2527from mcp .server .fastmcp .utilities .logging import configure_logging , get_logger
2628from mcp .server .fastmcp .utilities .types import Image
2729from mcp .server .lowlevel .helper_types import ReadResourceContents
28- from mcp .server .lowlevel .server import (
29- LifespanResultT ,
30- )
31- from mcp .server .lowlevel .server import (
32- Server as MCPServer ,
33- )
34- from mcp .server .lowlevel .server import (
35- lifespan as default_lifespan ,
36- )
37- from mcp .server .session import ServerSession
30+ from mcp .server .lowlevel .server import LifespanResultT
31+ from mcp .server .lowlevel .server import Server as MCPServer
32+ from mcp .server .lowlevel .server import lifespan as default_lifespan
33+ from mcp .server .session import ServerSession , ServerSessionT
3834from mcp .server .sse import SseServerTransport
3935from mcp .server .stdio import stdio_server
4036from mcp .shared .context import LifespanContextT , RequestContext
4541 ImageContent ,
4642 TextContent ,
4743)
48- from mcp .types import (
49- Prompt as MCPPrompt ,
50- )
51- from mcp .types import (
52- PromptArgument as MCPPromptArgument ,
53- )
54- from mcp .types import (
55- Resource as MCPResource ,
56- )
57- from mcp .types import (
58- ResourceTemplate as MCPResourceTemplate ,
59- )
60- from mcp .types import (
61- Tool as MCPTool ,
62- )
44+ from mcp .types import Prompt as MCPPrompt
45+ from mcp .types import PromptArgument as MCPPromptArgument
46+ from mcp .types import Resource as MCPResource
47+ from mcp .types import ResourceTemplate as MCPResourceTemplate
48+ from mcp .types import Tool as MCPTool
6349
6450logger = get_logger (__name__ )
6551
@@ -105,11 +91,11 @@ class Settings(BaseSettings, Generic[LifespanResultT]):
10591
10692
10793def lifespan_wrapper (
108- app : " FastMCP" ,
94+ app : FastMCP ,
10995 lifespan : Callable [["FastMCP" ], AbstractAsyncContextManager [LifespanResultT ]],
110- ) -> Callable [[MCPServer ], AbstractAsyncContextManager [object ]]:
96+ ) -> Callable [[MCPServer [ LifespanResultT ] ], AbstractAsyncContextManager [object ]]:
11197 @asynccontextmanager
112- async def wrap (s : MCPServer ) -> AsyncIterator [object ]:
98+ async def wrap (s : MCPServer [ LifespanResultT ] ) -> AsyncIterator [object ]:
11399 async with lifespan (app ) as context :
114100 yield context
115101
@@ -191,7 +177,7 @@ async def list_tools(self) -> list[MCPTool]:
191177 for info in tools
192178 ]
193179
194- def get_context (self ) -> "Context" :
180+ def get_context (self ) -> "Context[ServerSession, object] " :
195181 """
196182 Returns a Context object. Note that the context will only be valid
197183 during a request; outside a request, most methods will error.
@@ -564,7 +550,7 @@ def _convert_to_content(
564550 return [TextContent (type = "text" , text = result )]
565551
566552
567- class Context (BaseModel , Generic [LifespanContextT ]):
553+ class Context (BaseModel , Generic [ServerSessionT , LifespanContextT ]):
568554 """Context object providing access to MCP capabilities.
569555
570556 This provides a cleaner interface to MCP's RequestContext functionality.
@@ -598,13 +584,13 @@ def my_tool(x: int, ctx: Context) -> str:
598584 The context is optional - tools that don't need it can omit the parameter.
599585 """
600586
601- _request_context : RequestContext [ServerSession , LifespanContextT ] | None
587+ _request_context : RequestContext [ServerSessionT , LifespanContextT ] | None
602588 _fastmcp : FastMCP | None
603589
604590 def __init__ (
605591 self ,
606592 * ,
607- request_context : RequestContext [ServerSession , LifespanContextT ] | None = None ,
593+ request_context : RequestContext [ServerSessionT , LifespanContextT ] | None = None ,
608594 fastmcp : FastMCP | None = None ,
609595 ** kwargs : Any ,
610596 ):
@@ -620,7 +606,7 @@ def fastmcp(self) -> FastMCP:
620606 return self ._fastmcp
621607
622608 @property
623- def request_context (self ) -> RequestContext [ServerSession , LifespanContextT ]:
609+ def request_context (self ) -> RequestContext [ServerSessionT , LifespanContextT ]:
624610 """Access to the underlying request context."""
625611 if self ._request_context is None :
626612 raise ValueError ("Context is not available outside of a request" )
0 commit comments