|
10 | 10 | asynccontextmanager, |
11 | 11 | ) |
12 | 12 | from itertools import chain |
13 | | -from typing import Any, Generic, Literal |
| 13 | +from typing import Any, Generic, Literal, overload |
14 | 14 |
|
15 | 15 | import anyio |
16 | 16 | import pydantic_core |
|
37 | 37 | from mcp.server.fastmcp.exceptions import ResourceError |
38 | 38 | from mcp.server.fastmcp.prompts import Prompt, PromptManager |
39 | 39 | from mcp.server.fastmcp.resources import FunctionResource, Resource, ResourceManager |
40 | | -from mcp.server.fastmcp.tools import ToolManager |
| 40 | +from mcp.server.fastmcp.tools import Tool, ToolManager |
41 | 41 | from mcp.server.fastmcp.utilities.logging import configure_logging, get_logger |
42 | 42 | from mcp.server.fastmcp.utilities.types import Image |
43 | 43 | from mcp.server.lowlevel.helper_types import ReadResourceContents |
@@ -315,27 +315,42 @@ async def read_resource(self, uri: AnyUrl | str) -> Iterable[ReadResourceContent |
315 | 315 | logger.error(f"Error reading resource {uri}: {e}") |
316 | 316 | raise ResourceError(str(e)) |
317 | 317 |
|
| 318 | + @overload |
| 319 | + def add_tool(self, fn: Tool) -> None: ... |
| 320 | + |
| 321 | + @overload |
318 | 322 | def add_tool( |
319 | 323 | self, |
320 | 324 | fn: AnyFunction, |
321 | 325 | name: str | None = None, |
322 | 326 | description: str | None = None, |
323 | 327 | annotations: ToolAnnotations | None = None, |
| 328 | + ) -> None: ... |
| 329 | + |
| 330 | + def add_tool( |
| 331 | + self, |
| 332 | + fn: AnyFunction | Tool, |
| 333 | + name: str | None = None, |
| 334 | + description: str | None = None, |
| 335 | + annotations: ToolAnnotations | None = None, |
324 | 336 | ) -> None: |
325 | 337 | """Add a tool to the server. |
326 | 338 |
|
327 | 339 | The tool function can optionally request a Context object by adding a parameter |
328 | 340 | with the Context type annotation. See the @tool decorator for examples. |
329 | 341 |
|
330 | 342 | Args: |
331 | | - fn: The function to register as a tool |
| 343 | + fn: The function to register as a tool or a Tool instance |
332 | 344 | name: Optional name for the tool (defaults to function name) |
333 | 345 | description: Optional description of what the tool does |
334 | 346 | annotations: Optional ToolAnnotations providing additional tool information |
335 | 347 | """ |
336 | | - self._tool_manager.add_tool( |
337 | | - fn, name=name, description=description, annotations=annotations |
338 | | - ) |
| 348 | + if isinstance(fn, Tool): |
| 349 | + self._tool_manager.add_tool(fn) |
| 350 | + else: |
| 351 | + self._tool_manager.add_tool( |
| 352 | + fn, name=name, description=description, annotations=annotations |
| 353 | + ) |
339 | 354 |
|
340 | 355 | def tool( |
341 | 356 | self, |
|
0 commit comments