diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx index 27158a0b7d2..9bcdb853fad 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx @@ -157,8 +157,7 @@ export function MCP() { const { data: mcpToolsData = [], error: toolsError, - isLoading: toolsLoading, - isFetching: toolsFetching, + toolsStateByServer, } = useMcpToolsQuery(workspaceId) const { data: storedTools = [], refetch: refetchStoredTools } = useStoredMcpTools(workspaceId) const forceRefreshToolsMutation = useForceRefreshMcpTools() @@ -623,7 +622,10 @@ export function MCP() { {filteredServers.map((server) => { if (!server?.id) return null const tools = toolsByServer[server.id] || [] - const isLoadingTools = toolsLoading || toolsFetching + const serverToolsState = toolsStateByServer.get(server.id) + const isLoadingTools = serverToolsState + ? serverToolsState.isLoading || serverToolsState.isFetching + : false return ( () + for (let index = 0; index < results.length; index++) { + const result = results[index] // Drop stale data from servers whose latest refetch errored. if (result.data && !result.isError) { tools.push(...result.data) @@ -170,16 +175,25 @@ export function useMcpToolsQuery(workspaceId: string) { } if (result.isLoading) anyServerLoading = true if (!firstError && result.error instanceof Error) firstError = result.error + + const serverId = serverIds[index] + if (serverId) { + toolsStateByServer.set(serverId, { + isLoading: result.isLoading, + isFetching: result.isFetching, + error: result.error instanceof Error ? result.error : null, + }) + } } return { data: tools, isLoading: (serversLoading || anyServerLoading) && !hasData, isFetching: serversLoading || results.some((r) => r.isFetching), - // Suppress when any healthy server rendered; per-server errors live in `perServer`. + // Suppress when any healthy server rendered; per-server errors live in `toolsStateByServer`. error: hasData ? null : firstError, - perServer: results, + toolsStateByServer, } - }, [results, serversLoading]) + }, [results, serversLoading, serverIds]) } export function useForceRefreshMcpTools() {