|
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 |
|
9 | 11 | asynccontextmanager, |
10 | 12 | ) |
11 | 13 | from itertools import chain |
12 | | -from typing import Any, Callable, Generic, Literal, Sequence, TypeVar |
| 14 | +from typing import Any, Callable, Generic, Literal, Sequence |
13 | 15 |
|
14 | 16 | import anyio |
15 | 17 | import pydantic_core |
|
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,9 +550,6 @@ def _convert_to_content( |
564 | 550 | return [TextContent(type="text", text=result)] |
565 | 551 |
|
566 | 552 |
|
567 | | -ServerSessionT = TypeVar("ServerSessionT", bound=ServerSession) |
568 | | - |
569 | | - |
570 | 553 | class Context(BaseModel, Generic[ServerSessionT, LifespanContextT]): |
571 | 554 | """Context object providing access to MCP capabilities. |
572 | 555 |
|
|
0 commit comments