feat: 实现 MCP (Model Context Protocol) 完整功能
主进程: - 新增 mcp-manager.ts: JSON-RPC 2.0 over stdio 通信 - 服务器生命周期管理 (spawn/initialize/handshake/stop) - tools/list 动态工具发现 - tools/call 工具执行 (30 秒超时) - 消息分帧 (newline-delimited JSON) - 优雅清理 (pending 请求超时 + SIGTERM) IPC 通道 (7 个): - mcp:startServer / mcp:stopServer / mcp:stopAll - mcp:callTool / mcp:getTools / mcp:getStatuses / mcp:refreshTools 渲染端: - mcp-client.ts 完整重写: 配置管理 + 服务器生命周期 + 工具定义获取 + 工具执行 - tool-registry.ts: MCP 工具路由 (mcp_ 前缀识别 → executeMCPTool) - settings-modal.ts: MCP 服务器管理 UI (添加/启用/禁用/删除/状态显示) - main.ts: 启动时自动启动已启用的 MCP 服务器 数据流: settings.mcp_servers → startAllMCPServers → initialize → tools/list → getMCPToolDefinitions → Agent Loop → mcp_ 工具调用 → callTool → JSON-RPC → MCP Server
This commit is contained in:
@@ -48,6 +48,7 @@ import {
|
||||
handleCompress
|
||||
} from './tool-handlers.js';
|
||||
import { browserOpen, browserScreenshot, browserEvaluate, browserExtract, browserClick, browserType, browserScroll, browserClose } from './browser.js';
|
||||
import { startServer, stopServer, stopAllServers, callTool, getAllTools, getServerStatuses, refreshTools } from './mcp-manager.js';
|
||||
import { getAllowedDirs, getBlockedDirs, setAllowedDirs } from './tool-security.js';
|
||||
import { startProcess, killProcess, getWorkspaceDir, setWorkspaceDir, listWorkspaceDir } from './workspace.js';
|
||||
|
||||
@@ -408,4 +409,29 @@ export async function setupIPC(): Promise<void> {
|
||||
try { incrementSkillUsage(id, success, durationMs); return { success: true }; }
|
||||
catch (err) { return { success: false, error: (err as Error).message }; }
|
||||
});
|
||||
|
||||
// ── MCP IPC ──
|
||||
ipcMain.handle('mcp:startServer', async (_, config) => {
|
||||
return startServer(config);
|
||||
});
|
||||
ipcMain.handle('mcp:stopServer', (_, name: string) => {
|
||||
stopServer(name);
|
||||
return { success: true };
|
||||
});
|
||||
ipcMain.handle('mcp:stopAll', () => {
|
||||
stopAllServers();
|
||||
return { success: true };
|
||||
});
|
||||
ipcMain.handle('mcp:callTool', async (_, serverName: string, toolName: string, args: Record<string, unknown>) => {
|
||||
return callTool(serverName, toolName, args);
|
||||
});
|
||||
ipcMain.handle('mcp:getTools', () => {
|
||||
return getAllTools();
|
||||
});
|
||||
ipcMain.handle('mcp:getStatuses', () => {
|
||||
return getServerStatuses();
|
||||
});
|
||||
ipcMain.handle('mcp:refreshTools', async (_, name: string) => {
|
||||
return refreshTools(name);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user