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