From 3867fece4a9fc9611d856f769e3bcc113726b209 Mon Sep 17 00:00:00 2001 From: hjlarry Date: Tue, 9 Sep 2025 15:01:38 +0800 Subject: [PATCH] mcp server update --- api/controllers/console/app/online_user.py | 1 + .../components/tools/mcp/mcp-service-card.tsx | 46 +++++++++++++++++++ .../core/collaboration-manager.ts | 8 ++++ 3 files changed, 55 insertions(+) diff --git a/api/controllers/console/app/online_user.py b/api/controllers/console/app/online_user.py index 4a95e777d9..c9c266692c 100644 --- a/api/controllers/console/app/online_user.py +++ b/api/controllers/console/app/online_user.py @@ -209,6 +209,7 @@ def handle_collaboration_event(sid, data): 2. varsAndFeaturesUpdate 3. syncRequest(ask leader to update graph) 4. appStateUpdate + 5. mcpServerUpdate """ mapping = redis_client.get(f"ws_sid_map:{sid}") diff --git a/web/app/components/tools/mcp/mcp-service-card.tsx b/web/app/components/tools/mcp/mcp-service-card.tsx index 301bb66897..f2c9f1a78a 100644 --- a/web/app/components/tools/mcp/mcp-service-card.tsx +++ b/web/app/components/tools/mcp/mcp-service-card.tsx @@ -26,6 +26,8 @@ import { import { BlockEnum } from '@/app/components/workflow/types' import cn from '@/utils/classnames' import { fetchAppDetail } from '@/service/apps' +import { webSocketClient } from '@/app/components/workflow/collaboration/core/websocket-manager' +import { collaborationManager } from '@/app/components/workflow/collaboration/core/collaboration-manager' export type IAppCardProps = { appInfo: AppDetailResponse & Partial @@ -90,6 +92,19 @@ function MCPServiceCard({ const onGenCode = async () => { await refreshMCPServerCode(detail?.id || '') invalidateMCPServerDetail(appId) + + // Emit collaboration event to notify other clients of MCP server changes + const socket = webSocketClient.getSocket(appId) + if (socket) { + socket.emit('collaboration_event', { + type: 'mcpServerUpdate', + data: { + action: 'codeRegenerated', + timestamp: Date.now(), + }, + timestamp: Date.now(), + }) + } } const onChangeStatus = async (state: boolean) => { @@ -119,6 +134,20 @@ function MCPServiceCard({ }) invalidateMCPServerDetail(appId) } + + // Emit collaboration event to notify other clients of MCP server status change + const socket = webSocketClient.getSocket(appId) + if (socket) { + socket.emit('collaboration_event', { + type: 'mcpServerUpdate', + data: { + action: 'statusChanged', + status: state ? 'active' : 'inactive', + timestamp: Date.now(), + }, + timestamp: Date.now(), + }) + } } const handleServerModalHide = () => { @@ -131,6 +160,23 @@ function MCPServiceCard({ setActivated(serverActivated) }, [serverActivated]) + // Listen for collaborative MCP server updates from other clients + useEffect(() => { + if (!appId) return + + const unsubscribe = collaborationManager.onMcpServerUpdate(async (update: any) => { + try { + console.log('Received MCP server update from collaboration:', update) + invalidateMCPServerDetail(appId) + } + catch (error) { + console.error('MCP server update failed:', error) + } + }) + + return unsubscribe + }, [appId, invalidateMCPServerDetail]) + if (!currentWorkflow && isAdvancedApp) return null diff --git a/web/app/components/workflow/collaboration/core/collaboration-manager.ts b/web/app/components/workflow/collaboration/core/collaboration-manager.ts index 98fb76c03b..7cdc0aaf17 100644 --- a/web/app/components/workflow/collaboration/core/collaboration-manager.ts +++ b/web/app/components/workflow/collaboration/core/collaboration-manager.ts @@ -250,6 +250,10 @@ export class CollaborationManager { return this.eventEmitter.on('appStateUpdate', callback) } + onMcpServerUpdate(callback: (update: any) => void): () => void { + return this.eventEmitter.on('mcpServerUpdate', callback) + } + onLeaderChange(callback: (isLeader: boolean) => void): () => void { return this.eventEmitter.on('leaderChange', callback) } @@ -583,6 +587,10 @@ export class CollaborationManager { console.log('Processing appStateUpdate event:', update) this.eventEmitter.emit('appStateUpdate', update) } + else if (update.type === 'mcpServerUpdate') { + console.log('Processing mcpServerUpdate event:', update) + this.eventEmitter.emit('mcpServerUpdate', update) + } else if (update.type === 'syncRequest') { console.log('Received sync request from another user') // Only process if we are the leader