From 402f5e22935fd9cf19c176348265db4e9569ad8f Mon Sep 17 00:00:00 2001 From: Tan Wee Joe <84664178+w3joe@users.noreply.github.com> Date: Tue, 5 May 2026 23:24:58 +0100 Subject: [PATCH] Support bulk actions on filtered tools Allow bulk approval actions to target the currently filtered tool list when a search is active. UI: update tooltips to reflect "filtered" vs "all", disable buttons based on filteredTools length, and pass filteredTools to the action when toolSearch is set. Hook: change setBulkApproval mutation signature to accept an object { approval_state, targetTools? } and forward targetTools (or fallback to tools) to dispatchBulkApproval; expose setBulkApproval as a function taking (approval_state, targetTools?) for callers. --- .../components/parts/ServerDetailView.tsx | 41 +++++++++++++++---- .../hooks/useMcpInstallationTools.ts | 17 ++++++-- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/apps/code/src/renderer/features/mcp-servers/components/parts/ServerDetailView.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/ServerDetailView.tsx index 3b6ec7784..905e9da2b 100644 --- a/apps/code/src/renderer/features/mcp-servers/components/parts/ServerDetailView.tsx +++ b/apps/code/src/renderer/features/mcp-servers/components/parts/ServerDetailView.tsx @@ -252,35 +252,58 @@ export function ServerDetailView({ Set all: - + setBulkApproval("approved")} + disabled={bulkPending || filteredTools.length === 0} + onClick={() => + setBulkApproval( + "approved", + toolSearch ? filteredTools : undefined, + ) + } > - + setBulkApproval("needs_approval")} + disabled={bulkPending || filteredTools.length === 0} + onClick={() => + setBulkApproval( + "needs_approval", + toolSearch ? filteredTools : undefined, + ) + } > - + setBulkApproval("do_not_use")} + disabled={bulkPending || filteredTools.length === 0} + onClick={() => + setBulkApproval( + "do_not_use", + toolSearch ? filteredTools : undefined, + ) + } > diff --git a/apps/code/src/renderer/features/mcp-servers/hooks/useMcpInstallationTools.ts b/apps/code/src/renderer/features/mcp-servers/hooks/useMcpInstallationTools.ts index b3343a535..86fe802b0 100644 --- a/apps/code/src/renderer/features/mcp-servers/hooks/useMcpInstallationTools.ts +++ b/apps/code/src/renderer/features/mcp-servers/hooks/useMcpInstallationTools.ts @@ -77,15 +77,21 @@ export function useMcpInstallationTools( ); const setBulkApprovalMutation = useAuthenticatedMutation( - (client, approval_state: McpApprovalState) => { + ( + client, + vars: { + approval_state: McpApprovalState; + targetTools?: McpInstallationTool[]; + }, + ) => { if (!installationId) { return Promise.reject(new Error("No installation selected")); } return dispatchBulkApproval( client, installationId, - tools ?? [], - approval_state, + vars.targetTools ?? tools ?? [], + vars.approval_state, ); }, { @@ -174,7 +180,10 @@ export function useMcpInstallationTools( tools: tools ?? [], isLoading, setToolApproval: setToolApprovalMutation.mutate, - setBulkApproval: setBulkApprovalMutation.mutate, + setBulkApproval: ( + approval_state: McpApprovalState, + targetTools?: McpInstallationTool[], + ) => setBulkApprovalMutation.mutate({ approval_state, targetTools }), bulkPending: setBulkApprovalMutation.isPending, refresh: () => refreshMutation.mutate(undefined), refreshPending: refreshMutation.isPending,