diff --git a/src/fastmcp/tools.py b/src/fastmcp/tools.py index 117ccb42a..93b82a5f9 100644 --- a/src/fastmcp/tools.py +++ b/src/fastmcp/tools.py @@ -30,6 +30,10 @@ class Tool(BaseModel): ) -> "Tool": """Create a Tool from a function.""" func_name = name or func.__name__ + + if func_name == "": + raise ValueError("You must provide a name for lambda functions") + func_doc = description or func.__doc__ or "" is_async = inspect.iscoroutinefunction(func) diff --git a/tests/test_server.py b/tests/test_server.py index cde7871b4..5ab03b989 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -10,22 +10,27 @@ class TestServer: assert server.name == "FastMCPServer" +def tool_fn(x: int, y: int) -> int: + return x + y + + class TestServerTools: async def test_add_tool(self): server = FastMCPServer() - server.add_tool(lambda x: x) + server.add_tool(tool_fn) + server.add_tool(tool_fn) assert len(server._tool_manager.list_tools()) == 1 async def test_list_tools(self): server = FastMCPServer() - server.add_tool(lambda x: x) + server.add_tool(tool_fn) async with client_session(server._mcp_server) as client: tools = await client.list_tools() assert len(tools.tools) == 1 async def test_call_tool(self): server = FastMCPServer() - server.add_tool(lambda x: x) + server.add_tool(tool_fn) async with client_session(server._mcp_server) as client: result = await client.call_tool("my_tool", {"arg1": "value"}) assert "error" not in result diff --git a/tests/test_tool_manager.py b/tests/test_tool_manager.py index 3018029fc..ea56a8b19 100644 --- a/tests/test_tool_manager.py +++ b/tests/test_tool_manager.py @@ -73,8 +73,15 @@ class TestAddTools: def test_add_lambda(self): manager = ToolManager() - manager.add_tool(lambda x: x) - assert len(manager.list_tools()) == 1 + tool = manager.add_tool(lambda x: x, name="my_tool") + assert tool.name == "my_tool" + + def test_add_lambda_with_no_name(self): + manager = ToolManager() + with pytest.raises( + ValueError, match="You must provide a name for lambda functions" + ): + manager.add_tool(lambda x: x) def test_warn_on_duplicate_tools(self): """Test warning on duplicate tools."""