diff --git a/src/controllers/serverController.ts b/src/controllers/serverController.ts index 2daf763..e166b86 100644 --- a/src/controllers/serverController.ts +++ b/src/controllers/serverController.ts @@ -1,8 +1,9 @@ import { Request, Response } from 'express'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { ApiResponse, AddServerRequest } from '../types/index.js'; -import { getServersInfo, addServer, removeServer } from '../services/mcpService.js'; +import { getServersInfo, addServer, removeServer, createMcpServer, registerAllTools } from '../services/mcpService.js'; import { loadSettings } from '../config/index.js'; +import config from '../config/index.js'; let mcpServerInstance: McpServer; @@ -10,6 +11,32 @@ export const setMcpServerInstance = (server: McpServer): void => { mcpServerInstance = server; }; +// 重新创建 McpServer 实例 +export const recreateMcpServerInstance = async (): Promise => { + console.log('Re-creating McpServer instance'); + + // 如果存在旧的实例,尝试关闭它(如果有相关的关闭方法) + if (mcpServerInstance && typeof mcpServerInstance.close === 'function') { + try { + await mcpServerInstance.close(); + } catch (error) { + console.error('Error closing existing McpServer instance:', error); + } + } + + // 创建新的 McpServer 实例 + const newServer = createMcpServer(config.mcpHubName, config.mcpHubVersion); + + // 更新全局实例 + mcpServerInstance = newServer; + + // 重新注册所有工具 + await registerAllTools(mcpServerInstance); + + console.log('McpServer instance successfully re-created'); + return mcpServerInstance; +}; + export const getAllServers = (_: Request, res: Response): void => { try { const serversInfo = getServersInfo(); @@ -103,13 +130,24 @@ export const deleteServer = async (req: Request, res: Response): Promise = return; } + // 先删除服务器 const result = removeServer(name); if (result.success) { - res.json({ - success: true, - message: 'Server removed successfully', - }); + // 重新创建 McpServer 实例 + try { + await recreateMcpServerInstance(); + res.json({ + success: true, + message: 'Server removed successfully and McpServer re-created' + }); + } catch (error) { + console.error('Failed to re-create McpServer after removing server:', error); + res.json({ + success: true, + message: 'Server removed successfully but failed to re-create McpServer' + }); + } } else { res.status(404).json({ success: false, diff --git a/src/services/mcpService.ts b/src/services/mcpService.ts index 63b640d..0580d93 100644 --- a/src/services/mcpService.ts +++ b/src/services/mcpService.ts @@ -173,7 +173,10 @@ export const addServer = async ( }; // Remove server -export const removeServer = (name: string): { success: boolean; message?: string } => { +export const removeServer = ( + name: string, + mcpServer?: McpServer +): { success: boolean; message?: string } => { try { const settings = loadSettings(); @@ -197,6 +200,14 @@ export const removeServer = (name: string): { success: boolean; message?: string // Remove from list serverInfos = serverInfos.filter((serverInfo) => serverInfo.name !== name); + // Re-create and initialize the McpServer if provided + if (mcpServer) { + console.log(`Re-initializing McpServer after removing ${name}`); + registerAllTools(mcpServer).catch(error => { + console.error(`Error re-initializing McpServer after removing ${name}:`, error); + }); + } + return { success: true, message: 'Server removed successfully' }; } catch (error) { console.error(`Failed to remove server: ${name}`, error);