From 4b137dd9836afca4a6ab1f751d00eada82c3f572 Mon Sep 17 00:00:00 2001 From: Yu Cheng <75090715+Gloria72@users.noreply.github.com> Date: Sun, 9 Aug 2026 16:28:29 -0700 Subject: [PATCH] Fix MCP connect base URL normalization --- .../_components/mcpConnectBaseUrl.test.ts | 22 +++++++++++++++++++ .../_components/mcpConnectBaseUrl.ts | 10 ++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcpConnectBaseUrl.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcpConnectBaseUrl.test.ts index dfc5e33557a..c6b8e9c03be 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcpConnectBaseUrl.test.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcpConnectBaseUrl.test.ts @@ -49,4 +49,26 @@ describe("resolveMCPConnectBaseUrl", () => { ), ).toBe(fallbackBaseUrl); }); + + it("trims trailing slashes before endpoint paths are appended", () => { + expect( + resolveMCPConnectBaseUrl( + { + LITELLM_UI_API_DOC_BASE_URL: " https://docs.litellm.test/// ", + }, + fallbackBaseUrl, + ), + ).toBe("https://docs.litellm.test"); + + expect( + resolveMCPConnectBaseUrl( + { + PROXY_BASE_URL: "https://proxy.litellm.test/", + }, + `${fallbackBaseUrl}/`, + ), + ).toBe("https://proxy.litellm.test"); + + expect(resolveMCPConnectBaseUrl(undefined, `${fallbackBaseUrl}/`)).toBe(fallbackBaseUrl); + }); }); diff --git a/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcpConnectBaseUrl.ts b/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcpConnectBaseUrl.ts index 5e250c36db8..7507f0729a0 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcpConnectBaseUrl.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/mcpConnectBaseUrl.ts @@ -3,19 +3,23 @@ export interface MCPConnectProxySettings { LITELLM_UI_API_DOC_BASE_URL?: string | null; } +function normalizeBaseUrl(baseUrl: string): string { + return baseUrl.trim().replace(/\/+$/, ""); +} + export function resolveMCPConnectBaseUrl( proxySettings: MCPConnectProxySettings | undefined, fallbackBaseUrl: string, ): string { const customDocBaseUrl = proxySettings?.LITELLM_UI_API_DOC_BASE_URL; if (customDocBaseUrl && customDocBaseUrl.trim()) { - return customDocBaseUrl.trim(); + return normalizeBaseUrl(customDocBaseUrl); } const proxyBaseUrl = proxySettings?.PROXY_BASE_URL; if (proxyBaseUrl && proxyBaseUrl.trim()) { - return proxyBaseUrl.trim(); + return normalizeBaseUrl(proxyBaseUrl); } - return fallbackBaseUrl; + return normalizeBaseUrl(fallbackBaseUrl); }