diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index 2330120adad..eb242f894a7 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -2136,6 +2136,8 @@ class MCPServerManager: extra_headers=server_config.get("extra_headers", None), allowed_tools=server_config.get("allowed_tools", None), disallowed_tools=server_config.get("disallowed_tools", None), + tool_name_to_display_name=server_config.get("tool_name_to_display_name", None), + tool_name_to_description=server_config.get("tool_name_to_description", None), allowed_params=server_config.get("allowed_params", None), access_groups=server_config.get("access_groups", None), static_headers=server_config.get("static_headers", None), diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py index 5508259273d..5dbb9fc44d3 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py @@ -422,6 +422,44 @@ class TestMCPServerManager: assert server.alias == "friendly_alias" assert server.server_name == "validserver" + @pytest.mark.asyncio + async def test_load_servers_from_config_preserves_tool_name_overrides(self): + """Display-name/description overrides declared in config.yaml must survive the yaml load + path, replace the prefixed name in tools/list, and reverse-map for tools/call routing.""" + from litellm.proxy._experimental.mcp_server.server import ( + _resolve_display_name_to_original, + apply_tool_overrides, + ) + from litellm.proxy._experimental.mcp_server.utils import ( + add_server_prefix_to_name, + get_server_prefix, + ) + + manager = MCPServerManager() + await manager.load_servers_from_config( + { + "example_server": { + "url": "https://example.com/mcp", + "transport": MCPTransport.http, + "tool_name_to_display_name": {"example_tool": "renamed_tool"}, + "tool_name_to_description": {"example_tool": "overridden description"}, + } + } + ) + + server = next(iter(manager.config_mcp_servers.values())) + assert server.tool_name_to_display_name == {"example_tool": "renamed_tool"} + assert server.tool_name_to_description == {"example_tool": "overridden description"} + + prefixed_name = add_server_prefix_to_name("example_tool", get_server_prefix(server)) + (overridden,) = apply_tool_overrides( + [MCPTool(name=prefixed_name, description="upstream description", inputSchema={})], + server, + ) + assert overridden.name == "renamed_tool" + assert overridden.description == "overridden description" + assert _resolve_display_name_to_original("renamed_tool", [server]) == prefixed_name + def _oauth2_config(self, **overrides): base = { "url": "https://example.com/mcp",