diff --git a/packages/shared/IpcChannel.ts b/packages/shared/IpcChannel.ts index c47008146e..ebd33065af 100644 --- a/packages/shared/IpcChannel.ts +++ b/packages/shared/IpcChannel.ts @@ -83,7 +83,7 @@ export enum IpcChannel { Mcp_UploadDxt = 'mcp:upload-dxt', Mcp_AbortTool = 'mcp:abort-tool', Mcp_GetServerVersion = 'mcp:get-server-version', - + Mcp_Progress = 'mcp:progress', // Python Python_Execute = 'python:execute', diff --git a/packages/shared/config/types.ts b/packages/shared/config/types.ts index 8fb11cd8b3..90e5c64579 100644 --- a/packages/shared/config/types.ts +++ b/packages/shared/config/types.ts @@ -17,3 +17,8 @@ export type FileChangeEvent = { filePath: string watchPath: string } + +export type MCPProgressEvent = { + callId: string + progress: number // 0-1 range +} diff --git a/src/main/services/MCPService.ts b/src/main/services/MCPService.ts index 775ca12db5..ecb34500c5 100644 --- a/src/main/services/MCPService.ts +++ b/src/main/services/MCPService.ts @@ -27,6 +27,8 @@ import { ToolListChangedNotificationSchema } from '@modelcontextprotocol/sdk/types.js' import { nanoid } from '@reduxjs/toolkit' +import { MCPProgressEvent } from '@shared/config/types' +import { IpcChannel } from '@shared/IpcChannel' import { BuiltinMCPServerNames, type GetResourceResponse, @@ -689,7 +691,10 @@ class McpService { }) const mainWindow = windowService.getMainWindow() if (mainWindow) { - mainWindow.webContents.send('mcp-progress', process.progress / (process.total || 1)) + mainWindow.webContents.send(IpcChannel.Mcp_Progress, { + callId: toolCallId, + progress: process.progress / (process.total || 1) + } as MCPProgressEvent) } }, timeout: server.timeout ? server.timeout * 1000 : 60000, // Default timeout of 1 minute, diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx index 312f5bb448..3c56e2f1d7 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageMcpTool.tsx @@ -7,6 +7,8 @@ import { useTimer } from '@renderer/hooks/useTimer' import type { ToolMessageBlock } from '@renderer/types/newMessage' import { isToolAutoApproved } from '@renderer/utils/mcp-tools' import { cancelToolAction, confirmToolAction } from '@renderer/utils/userConfirmation' +import { MCPProgressEvent } from '@shared/config/types' +import { IpcChannel } from '@shared/IpcChannel' import { Button, Collapse, @@ -85,16 +87,19 @@ const MessageMcpTool: FC = ({ block }) => { useEffect(() => { const removeListener = window.electron.ipcRenderer.on( - 'mcp-progress', - (_event: Electron.IpcRendererEvent, value: number) => { - setProgress(value) + IpcChannel.Mcp_Progress, + (_event: Electron.IpcRendererEvent, data: MCPProgressEvent) => { + // Only update progress if this event is for our specific tool call + if (data.callId === id) { + setProgress(data.progress) + } } ) return () => { setProgress(0) removeListener() } - }, []) + }, [id]) const cancelCountdown = () => { if (timer.current) {