From 2d11f407073d08a8adf6358497919e6f90eb9e5e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 19 May 2026 05:50:37 +0000 Subject: [PATCH] Fix bugs in MCP user-fields deep linking - Remove unused hasAnyUserFields export from userFields.ts - Preserve existing query params when building user-fields deep-link URL in UserFieldsModal so the link still routes via ?page=mcp-servers - Only clear ?openUserFields from the URL after the target server is found, so the deep link can be re-applied when the list later loads Co-authored-by: Yassin Kortam --- .../src/components/mcp_tools/UserFieldsModal.tsx | 12 +++++++++++- .../src/components/mcp_tools/mcp_servers.tsx | 10 +++++----- .../src/components/mcp_tools/userFields.ts | 4 ---- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ui/litellm-dashboard/src/components/mcp_tools/UserFieldsModal.tsx b/ui/litellm-dashboard/src/components/mcp_tools/UserFieldsModal.tsx index 98228dc34bc..31f65c040ef 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/UserFieldsModal.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/UserFieldsModal.tsx @@ -61,13 +61,23 @@ const UserFieldsModal: React.FC = ({ }; const serverDisplayName = server.server_name || server.alias || server.server_id; + + const buildDeepLinkUrl = (): string => { + if (typeof window === "undefined") { + return `?openUserFields=${server.server_id}`; + } + const params = new URLSearchParams(window.location.search); + params.set("openUserFields", server.server_id); + return `${window.location.origin}${window.location.pathname}?${params.toString()}`; + }; + const errorPreview = `Error: MCP server "${serverDisplayName}" requires user configuration before use. ${missing.length > 0 ? `Missing field${missing.length === 1 ? "" : "s"}:` : "All fields configured."} ${missing.map((f) => ` • ${f.label || f.name}${f.description ? ` — ${f.description}` : ""}`).join("\n")} Please configure your fields at: -${typeof window !== "undefined" ? `${window.location.origin}${window.location.pathname}?openUserFields=${server.server_id}` : `?openUserFields=${server.server_id}`} +${buildDeepLinkUrl()} Once configured, retry your request.`; diff --git a/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.tsx b/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.tsx index 2279d03b6af..b3b2bc6b6b6 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.tsx @@ -103,12 +103,12 @@ const MCPServers: React.FC = ({ accessToken, userRole, userID }) const target = serversWithHealth.find((s) => s.server_id === targetId); if (target) { setUserFieldsServer(target); + params.delete("openUserFields"); + const remaining = params.toString(); + const newUrl = + window.location.pathname + (remaining ? `?${remaining}` : "") + window.location.hash; + window.history.replaceState({}, "", newUrl); } - params.delete("openUserFields"); - const remaining = params.toString(); - const newUrl = - window.location.pathname + (remaining ? `?${remaining}` : "") + window.location.hash; - window.history.replaceState({}, "", newUrl); }, [serversWithHealth]); // Servers with one or more missing user fields for the current user (prototype) diff --git a/ui/litellm-dashboard/src/components/mcp_tools/userFields.ts b/ui/litellm-dashboard/src/components/mcp_tools/userFields.ts index 05556df02d4..9d6b81bec6c 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/userFields.ts +++ b/ui/litellm-dashboard/src/components/mcp_tools/userFields.ts @@ -79,7 +79,3 @@ export function getMissingUserFields( values[f.name].trim() === "", ); } - -export function hasAnyUserFields(serverId: string): boolean { - return getUserFieldDefs(serverId).length > 0; -}