From cdecfe24e18d1e77bbfe9977619d8b8e0c19c5a1 Mon Sep 17 00:00:00 2001 From: KK-MCP Date: Mon, 22 Jun 2026 12:16:23 -0700 Subject: [PATCH] fix(mcp): resolve OAuth endpoints by server_id when name lookup fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The OAuth broker endpoints (authorize, register, token, callback, and metadata) use get_mcp_server_by_name() to resolve the MCP server from the URL path parameter. However, the LiteLLM UI sends the server_id (SHA-256 hash) in the path, which doesn't match any alias, server_name, or name — causing the lookup to fail with "MCP server authorization url is not set". Add get_mcp_server_by_id() as a fallback at all five call sites in discoverable_endpoints.py so that servers can be resolved by either name or ID. Fixes #30997 --- .../mcp_server/discoverable_endpoints.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/litellm/proxy/_experimental/mcp_server/discoverable_endpoints.py b/litellm/proxy/_experimental/mcp_server/discoverable_endpoints.py index 3beddd2c435..dbb99767592 100644 --- a/litellm/proxy/_experimental/mcp_server/discoverable_endpoints.py +++ b/litellm/proxy/_experimental/mcp_server/discoverable_endpoints.py @@ -611,6 +611,8 @@ async def authorize( if lookup_name else None ) + if mcp_server is None and lookup_name: + mcp_server = global_mcp_server_manager.get_mcp_server_by_id(lookup_name) if mcp_server is None and mcp_server_name is None: mcp_server = _resolve_oauth2_server_for_root_endpoints(client_ip=client_ip) if mcp_server is None: @@ -673,6 +675,8 @@ async def token_endpoint( mcp_server = global_mcp_server_manager.get_mcp_server_by_name( lookup_name, client_ip=client_ip ) + if mcp_server is None and lookup_name: + mcp_server = global_mcp_server_manager.get_mcp_server_by_id(lookup_name) if mcp_server is None and mcp_server_name is None: mcp_server = _resolve_oauth2_server_for_root_endpoints(client_ip=client_ip) if mcp_server is None: @@ -991,6 +995,10 @@ async def _build_oauth_protected_resource_response( mcp_server = global_mcp_server_manager.get_mcp_server_by_name( mcp_server_name, client_ip=client_ip ) + if mcp_server is None: + mcp_server = global_mcp_server_manager.get_mcp_server_by_id( + mcp_server_name + ) # Build resource URL based on the pattern if mcp_server_name: @@ -1144,6 +1152,10 @@ def _build_oauth_authorization_server_response( mcp_server = global_mcp_server_manager.get_mcp_server_by_name( mcp_server_name, client_ip=client_ip ) + if mcp_server is None: + mcp_server = global_mcp_server_manager.get_mcp_server_by_id( + mcp_server_name + ) return { "issuer": request_base_url, # point to your proxy @@ -1310,6 +1322,10 @@ async def register_client(request: Request, mcp_server_name: Optional[str] = Non mcp_server = global_mcp_server_manager.get_mcp_server_by_name( mcp_server_name, client_ip=client_ip ) + if mcp_server is None: + mcp_server = global_mcp_server_manager.get_mcp_server_by_id( + mcp_server_name + ) if mcp_server is None: return dummy_return return await register_client_with_server(