1
1
"""FastMCP - A more ergonomic interface for MCP servers."""
2
2
3
+ from __future__ import annotations as _annotations
4
+
3
5
import inspect
4
6
import json
5
7
import re
25
27
from mcp .server .fastmcp .utilities .logging import configure_logging , get_logger
26
28
from mcp .server .fastmcp .utilities .types import Image
27
29
from 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
38
34
from mcp .server .sse import SseServerTransport
39
35
from mcp .server .stdio import stdio_server
40
36
from mcp .shared .context import LifespanContextT , RequestContext
45
41
ImageContent ,
46
42
TextContent ,
47
43
)
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
63
49
64
50
logger = get_logger (__name__ )
65
51
@@ -105,11 +91,11 @@ class Settings(BaseSettings, Generic[LifespanResultT]):
105
91
106
92
107
93
def lifespan_wrapper (
108
- app : " FastMCP" ,
94
+ app : FastMCP ,
109
95
lifespan : Callable [["FastMCP" ], AbstractAsyncContextManager [LifespanResultT ]],
110
- ) -> Callable [[MCPServer ], AbstractAsyncContextManager [object ]]:
96
+ ) -> Callable [[MCPServer [ LifespanResultT ] ], AbstractAsyncContextManager [object ]]:
111
97
@asynccontextmanager
112
- async def wrap (s : MCPServer ) -> AsyncIterator [object ]:
98
+ async def wrap (s : MCPServer [ LifespanResultT ] ) -> AsyncIterator [object ]:
113
99
async with lifespan (app ) as context :
114
100
yield context
115
101
@@ -191,7 +177,7 @@ async def list_tools(self) -> list[MCPTool]:
191
177
for info in tools
192
178
]
193
179
194
- def get_context (self ) -> "Context" :
180
+ def get_context (self ) -> "Context[ServerSession, object] " :
195
181
"""
196
182
Returns a Context object. Note that the context will only be valid
197
183
during a request; outside a request, most methods will error.
@@ -564,7 +550,7 @@ def _convert_to_content(
564
550
return [TextContent (type = "text" , text = result )]
565
551
566
552
567
- class Context (BaseModel , Generic [LifespanContextT ]):
553
+ class Context (BaseModel , Generic [ServerSessionT , LifespanContextT ]):
568
554
"""Context object providing access to MCP capabilities.
569
555
570
556
This provides a cleaner interface to MCP's RequestContext functionality.
@@ -598,13 +584,13 @@ def my_tool(x: int, ctx: Context) -> str:
598
584
The context is optional - tools that don't need it can omit the parameter.
599
585
"""
600
586
601
- _request_context : RequestContext [ServerSession , LifespanContextT ] | None
587
+ _request_context : RequestContext [ServerSessionT , LifespanContextT ] | None
602
588
_fastmcp : FastMCP | None
603
589
604
590
def __init__ (
605
591
self ,
606
592
* ,
607
- request_context : RequestContext [ServerSession , LifespanContextT ] | None = None ,
593
+ request_context : RequestContext [ServerSessionT , LifespanContextT ] | None = None ,
608
594
fastmcp : FastMCP | None = None ,
609
595
** kwargs : Any ,
610
596
):
@@ -620,7 +606,7 @@ def fastmcp(self) -> FastMCP:
620
606
return self ._fastmcp
621
607
622
608
@property
623
- def request_context (self ) -> RequestContext [ServerSession , LifespanContextT ]:
609
+ def request_context (self ) -> RequestContext [ServerSessionT , LifespanContextT ]:
624
610
"""Access to the underlying request context."""
625
611
if self ._request_context is None :
626
612
raise ValueError ("Context is not available outside of a request" )
0 commit comments