diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index 0823925f505..8769d3952a4 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -618,16 +618,17 @@ class MCPServerManager: mcp_info["description"] = mcp_server.description auth_type = cast(MCPAuthType, mcp_server.auth_type) - if ( - mcp_server.url + server_url = mcp_server.url + needs_discovery = ( + bool(server_url) and auth_type == MCPAuth.oauth2 and not mcp_server.authorization_url - ): - mcp_oauth_metadata = await self._descovery_metadata( - server_url=mcp_server.url, - ) - else: - mcp_oauth_metadata = None + ) + mcp_oauth_metadata = ( + await self._descovery_metadata(server_url=server_url) # type: ignore[arg-type] + if needs_discovery + else None + ) resolved_scopes = scopes or ( mcp_oauth_metadata.scopes if mcp_oauth_metadata else None diff --git a/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.tsx b/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.tsx index 48a834318e0..90ecd4731cf 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.tsx @@ -35,6 +35,15 @@ const AUTH_TYPES_REQUIRING_AUTH_VALUE = [AUTH_TYPE.API_KEY, AUTH_TYPE.BEARER_TOK const AUTH_TYPES_REQUIRING_CREDENTIALS = [...AUTH_TYPES_REQUIRING_AUTH_VALUE, AUTH_TYPE.OAUTH2]; const CREATE_OAUTH_UI_STATE_KEY = "litellm-mcp-oauth-create-state"; +const reduceStaticHeaders = (list: unknown): Record => { + if (!Array.isArray(list)) return {}; + return list.reduce((acc: Record, entry: Record) => { + const header = entry?.header?.trim(); + if (header) acc[header] = entry?.value ?? ""; + return acc; + }, {}); +}; + const CreateMCPServer: React.FC = ({ userRole, accessToken, @@ -118,16 +127,7 @@ const CreateMCPServer: React.FC = ({ if (!url || !transport) { return null; } - const staticHeaders = Array.isArray(values.static_headers) - ? values.static_headers.reduce((acc: Record, entry: Record) => { - const header = entry?.header?.trim(); - if (!header) { - return acc; - } - acc[header] = entry?.value ?? ""; - return acc; - }, {}) - : ({} as Record); + const staticHeaders = reduceStaticHeaders(values.static_headers); return { server_id: undefined, @@ -282,16 +282,7 @@ const CreateMCPServer: React.FC = ({ // Transform access groups into objects with name property const accessGroups = restValues.mcp_access_groups; - const staticHeaders = Array.isArray(staticHeadersList) - ? staticHeadersList.reduce((acc: Record, entry: Record) => { - const header = entry?.header?.trim(); - if (!header) { - return acc; - } - acc[header] = entry?.value ?? ""; - return acc; - }, {}) - : ({} as Record); + const staticHeaders = reduceStaticHeaders(staticHeadersList); const credentialsPayload = credentialValues && typeof credentialValues === "object"