diff --git a/ui/litellm-dashboard/src/components/mcp_tools/mcp_server_view.tsx b/ui/litellm-dashboard/src/components/mcp_tools/mcp_server_view.tsx index 6a4e9c105ff..809095c048c 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/mcp_server_view.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/mcp_server_view.tsx @@ -36,6 +36,8 @@ export const MCPServerView: React.FC = ({ const [editing, setEditing] = useState(isEditing); const [showFullUrl, setShowFullUrl] = useState(false); const [copiedStates, setCopiedStates] = useState>({}); + const [selectedTabIndex, setSelectedTabIndex] = useState(0); + const handleSuccess = (updated: MCPServer) => { setEditing(false); onBack(); @@ -72,11 +74,10 @@ export const MCPServerView: React.FC = ({ size="small" icon={copiedStates["mcp-server_name"] ? : } onClick={() => copyToClipboard(mcpServer.server_name, "mcp-server_name")} - className={`left-2 z-10 transition-all duration-200 ${ - copiedStates["mcp-server_name"] - ? "text-green-600 bg-green-50 border-green-200" - : "text-gray-500 hover:text-gray-700 hover:bg-gray-100" - }`} + className={`left-2 z-10 transition-all duration-200 ${copiedStates["mcp-server_name"] + ? "text-green-600 bg-green-50 border-green-200" + : "text-gray-500 hover:text-gray-700 hover:bg-gray-100" + }`} /> {mcpServer.alias && ( <> @@ -87,11 +88,10 @@ export const MCPServerView: React.FC = ({ size="small" icon={copiedStates["mcp-alias"] ? : } onClick={() => copyToClipboard(mcpServer.alias, "mcp-alias")} - className={`left-2 z-10 transition-all duration-200 ${ - copiedStates["mcp-alias"] - ? "text-green-600 bg-green-50 border-green-200" - : "text-gray-500 hover:text-gray-700 hover:bg-gray-100" - }`} + className={`left-2 z-10 transition-all duration-200 ${copiedStates["mcp-alias"] + ? "text-green-600 bg-green-50 border-green-200" + : "text-gray-500 hover:text-gray-700 hover:bg-gray-100" + }`} /> )} @@ -103,18 +103,17 @@ export const MCPServerView: React.FC = ({ size="small" icon={copiedStates["mcp-server-id"] ? : } onClick={() => copyToClipboard(mcpServer.server_id, "mcp-server-id")} - className={`left-2 z-10 transition-all duration-200 ${ - copiedStates["mcp-server-id"] - ? "text-green-600 bg-green-50 border-green-200" - : "text-gray-500 hover:text-gray-700 hover:bg-gray-100" - }`} + className={`left-2 z-10 transition-all duration-200 ${copiedStates["mcp-server-id"] + ? "text-green-600 bg-green-50 border-green-200" + : "text-gray-500 hover:text-gray-700 hover:bg-gray-100" + }`} /> {/* TODO: magic number for index */} - + {[ Overview, 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 f6669fb2829..a0cd1720c88 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.tsx @@ -212,103 +212,28 @@ const MCPServers: React.FC = ({ accessToken, userRole, userID }) return
Missing required authentication parameters.
; } - const ServersTab = () => - selectedServerId ? ( - server.server_id === selectedServerId) || { - server_id: "", - server_name: "", - alias: "", - url: "", - transport: "", - auth_type: "", - created_at: "", - created_by: "", - updated_at: "", - updated_by: "", - } - } - onBack={() => { - setEditServer(false); - setSelectedServerId(null); - refetch(); - }} - isProxyAdmin={isAdminRole(userRole)} - isEditing={editServer} - accessToken={accessToken} - userID={userID} - userRole={userRole} - availableAccessGroups={uniqueMcpAccessGroups} - /> - ) : ( -
-
-
-
-
- Current Team: - - - Access Group: - - - - - -
-
-
-
-
-
} - getRowCanExpand={() => false} - isLoading={isLoadingServers} - noDataMessage="No MCP servers configured" - loadingMessage="🚅 Loading MCP servers..." - /> -
-
- ); + // Memoize the selected server to prevent unnecessary re-renders + const selectedServer = React.useMemo(() => { + return filteredServers.find((server: MCPServer) => server.server_id === selectedServerId) || { + server_id: "", + server_name: "", + alias: "", + url: "", + transport: "", + auth_type: "", + created_at: "", + created_by: "", + updated_at: "", + updated_by: "", + }; + }, [filteredServers, selectedServerId]); + + // Memoize the onBack callback to prevent unnecessary re-renders + const handleBack = React.useCallback(() => { + setEditServer(false); + setSelectedServerId(null); + refetch(); + }, [refetch]); return (
@@ -381,7 +306,86 @@ const MCPServers: React.FC = ({ accessToken, userRole, userID }) - + {selectedServerId ? ( + + ) : ( +
+
+
+
+
+ Current Team: + + + Access Group: + + + + + +
+
+
+
+
+
} + getRowCanExpand={() => false} + isLoading={isLoadingServers} + noDataMessage="No MCP servers configured" + loadingMessage="🚅 Loading MCP servers..." + /> +
+
+ )}
diff --git a/ui/litellm-dashboard/src/components/mcp_tools/mcp_tools.tsx b/ui/litellm-dashboard/src/components/mcp_tools/mcp_tools.tsx index 37c61023f23..7ee1e64a228 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/mcp_tools.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/mcp_tools.tsx @@ -127,11 +127,10 @@ const MCPToolsViewer = ({ {toolsData.map((tool: MCPTool) => (
{ setSelectedTool(tool); setToolResult(null);