diff --git a/src/mcp/server/fastmcp/server.py b/src/mcp/server/fastmcp/server.py index 924baaa9b..c536a96c3 100644 --- a/src/mcp/server/fastmcp/server.py +++ b/src/mcp/server/fastmcp/server.py @@ -418,14 +418,15 @@ async def async_tool(x: int, context: Context) -> str: ) def decorator(fn: AnyFunction) -> AnyFunction: - self.add_tool( - fn, - name=name, - title=title, - description=description, - annotations=annotations, - structured_output=structured_output, - ) + if not self._tool_manager.has_tool(fn.__name__): + self.add_tool( + fn, + name=name, + title=title, + description=description, + annotations=annotations, + structured_output=structured_output, + ) return fn return decorator diff --git a/src/mcp/server/fastmcp/tools/tool_manager.py b/src/mcp/server/fastmcp/tools/tool_manager.py index bfa8b2382..174e9da96 100644 --- a/src/mcp/server/fastmcp/tools/tool_manager.py +++ b/src/mcp/server/fastmcp/tools/tool_manager.py @@ -38,6 +38,10 @@ def get_tool(self, name: str) -> Tool | None: """Get tool by name.""" return self._tools.get(name) + def has_tool(self, name: str) -> bool: + """Check if a tool exists.""" + return name in self._tools + def list_tools(self) -> list[Tool]: """List all registered tools.""" return list(self._tools.values())