From fd2eeb751c79d74d97b41074b265bb031d37ec25 Mon Sep 17 00:00:00 2001 From: Ishaan Jaffer Date: Wed, 11 Mar 2026 19:08:49 -0700 Subject: [PATCH] fix: cursor-pointer on read-only rows, stable sort, simplify handleCrudPanelChange --- .../litellm_proxy_extras/schema.prisma | 5 ---- .../MCPToolPermissions.tsx | 7 ++--- .../mcp_tools/McpCrudPermissionPanel.tsx | 10 +++---- .../src/components/mcp_tools/mcp_servers.tsx | 1 + .../mcp_tools/mcp_tool_configuration.tsx | 26 +++++++++++++++---- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma index b4d0f82d7b2..8d4bdffb2dd 100644 --- a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma +++ b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma @@ -315,11 +315,6 @@ model LiteLLM_MCPServerTable { is_byok Boolean @default(false) byok_description String[] @default([]) byok_api_key_help_url String? - approval_status String @default("approved") - submitted_by String? - submitted_at DateTime? - reviewed_at DateTime? - review_notes String? } // Per-user BYOK credentials for MCP servers diff --git a/ui/litellm-dashboard/src/components/mcp_server_management/MCPToolPermissions.tsx b/ui/litellm-dashboard/src/components/mcp_server_management/MCPToolPermissions.tsx index 40ee35ea4e9..829051c1a5c 100644 --- a/ui/litellm-dashboard/src/components/mcp_server_management/MCPToolPermissions.tsx +++ b/ui/litellm-dashboard/src/components/mcp_server_management/MCPToolPermissions.tsx @@ -85,11 +85,8 @@ const MCPToolPermissions: React.FC = ({ }); }, [servers]); - const handleCrudPanelChange = (serverId: string, allowed: string[] | undefined) => { - // `undefined` from the panel means "allow all" — expand to the full tool list - // rather than collapsing to [] ("allow none"). - const resolved = allowed ?? (serverTools[serverId] || []).map((t) => t.name); - onChange({ ...toolPermissions, [serverId]: resolved }); + const handleCrudPanelChange = (serverId: string, allowed: string[]) => { + onChange({ ...toolPermissions, [serverId]: allowed }); }; const handleSelectAll = (serverId: string) => { diff --git a/ui/litellm-dashboard/src/components/mcp_tools/McpCrudPermissionPanel.tsx b/ui/litellm-dashboard/src/components/mcp_tools/McpCrudPermissionPanel.tsx index bfda8277203..6fddb6f2e5a 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/McpCrudPermissionPanel.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/McpCrudPermissionPanel.tsx @@ -30,8 +30,8 @@ interface McpCrudPermissionPanelProps { * An empty array means "allow none". */ value: string[] | undefined; - /** Called whenever the allowed set changes. */ - onChange: (allowed: string[] | undefined) => void; + /** Called whenever the allowed set changes. Always emits a concrete string[]. */ + onChange: (allowed: string[]) => void; readOnly?: boolean; } @@ -205,9 +205,9 @@ const McpCrudPermissionPanel: React.FC = ({ return (
toggleTool(tool.name)} > = ({ accessToken, userRole, userID }) ); } const sorted = [...filtered].sort((a, b) => { + if (!a.created_at && !b.created_at) return 0; if (!a.created_at) return 1; if (!b.created_at) return -1; return new Date(b.created_at).getTime() - new Date(a.created_at).getTime(); diff --git a/ui/litellm-dashboard/src/components/mcp_tools/mcp_tool_configuration.tsx b/ui/litellm-dashboard/src/components/mcp_tools/mcp_tool_configuration.tsx index 01126df956e..6397e7e5b93 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/mcp_tool_configuration.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/mcp_tool_configuration.tsx @@ -453,11 +453,27 @@ const MCPToolConfiguration: React.FC = ({ {/* CRUD grouped view */} {viewMode === "crud" && ( - onAllowedToolsChange(allowed ?? tools.map((t) => t.name))} - /> + <> + } + value={toolSearchTerm} + onChange={(e) => setToolSearchTerm(e.target.value)} + allowClear + className="rounded-lg" + size="large" + /> + + !toolSearchTerm || + t.name.toLowerCase().includes(toolSearchTerm.toLowerCase()) || + (t.description ?? "").toLowerCase().includes(toolSearchTerm.toLowerCase()) + )} + value={allowedTools} + onChange={(allowed) => onAllowedToolsChange(allowed)} + /> + )} {/* Flat list view */}