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,