12
12
from pydantic import BaseModel , Field
13
13
from pydantic .networks import AnyUrl
14
14
from pydantic_settings import BaseSettings , SettingsConfigDict
15
+ from typing_extensions import TypeAlias
15
16
16
17
from mcp .server .fastmcp .exceptions import ResourceError
17
18
from mcp .server .fastmcp .prompts import Prompt , PromptManager
48
49
49
50
logger = get_logger (__name__ )
50
51
52
+ _Function : TypeAlias = Callable [..., Any ]
53
+
51
54
52
55
class Settings (BaseSettings ):
53
56
"""FastMCP server settings.
@@ -165,7 +168,7 @@ def get_context(self) -> "Context":
165
168
return Context (request_context = request_context , fastmcp = self )
166
169
167
170
async def call_tool (
168
- self , name : str , arguments : dict
171
+ self , name : str , arguments : dict [ str , Any ]
169
172
) -> Sequence [TextContent | ImageContent | EmbeddedResource ]:
170
173
"""Call a tool by name with arguments."""
171
174
context = self .get_context ()
@@ -214,7 +217,7 @@ async def read_resource(self, uri: AnyUrl | str) -> ReadResourceContents:
214
217
215
218
def add_tool (
216
219
self ,
217
- fn : Callable ,
220
+ fn : _Function ,
218
221
name : str | None = None ,
219
222
description : str | None = None ,
220
223
) -> None :
@@ -230,7 +233,9 @@ def add_tool(
230
233
"""
231
234
self ._tool_manager .add_tool (fn , name = name , description = description )
232
235
233
- def tool (self , name : str | None = None , description : str | None = None ) -> Callable :
236
+ def tool (
237
+ self , name : str | None = None , description : str | None = None
238
+ ) -> Callable [[_Function ], _Function ]:
234
239
"""Decorator to register a tool.
235
240
236
241
Tools can optionally request a Context object by adding a parameter with the
@@ -263,7 +268,7 @@ async def async_tool(x: int, context: Context) -> str:
263
268
"Did you forget to call it? Use @tool() instead of @tool"
264
269
)
265
270
266
- def decorator (fn : Callable ) -> Callable :
271
+ def decorator (fn : _Function ) -> _Function :
267
272
self .add_tool (fn , name = name , description = description )
268
273
return fn
269
274
@@ -284,7 +289,7 @@ def resource(
284
289
name : str | None = None ,
285
290
description : str | None = None ,
286
291
mime_type : str | None = None ,
287
- ) -> Callable :
292
+ ) -> Callable [[ _Function ], _Function ] :
288
293
"""Decorator to register a function as a resource.
289
294
290
295
The function will be called when the resource is read to generate its content.
@@ -328,7 +333,7 @@ async def get_weather(city: str) -> str:
328
333
"Did you forget to call it? Use @resource('uri') instead of @resource"
329
334
)
330
335
331
- def decorator (fn : Callable ) -> Callable :
336
+ def decorator (fn : _Function ) -> _Function :
332
337
# Check if this should be a template
333
338
has_uri_params = "{" in uri and "}" in uri
334
339
has_func_params = bool (inspect .signature (fn ).parameters )
@@ -376,7 +381,7 @@ def add_prompt(self, prompt: Prompt) -> None:
376
381
377
382
def prompt (
378
383
self , name : str | None = None , description : str | None = None
379
- ) -> Callable :
384
+ ) -> Callable [[ _Function ], _Function ] :
380
385
"""Decorator to register a prompt.
381
386
382
387
Args:
@@ -417,7 +422,7 @@ async def analyze_file(path: str) -> list[Message]:
417
422
"Did you forget to call it? Use @prompt() instead of @prompt"
418
423
)
419
424
420
- def decorator (func : Callable ) -> Callable :
425
+ def decorator (func : _Function ) -> _Function :
421
426
prompt = Prompt .from_function (func , name = name , description = description )
422
427
self .add_prompt (prompt )
423
428
return func
0 commit comments