Обзор модуля MCP
Модуль MCP (Model Context Protocol — протокол контекста модели) управляет соединениями с внешними MCP-серверами, обнаружением инструментов, преобразованием форматов и выполнением вызовов. Модуль использует многоуровневую архитектуру: ядро находится в главном процессе и предоставляется процессу рендеринга через IPC.
Диаграмма архитектуры
graph TB
subgraph Renderer["Процесс рендеринга"]
McpPage["McpServersPage"]
McpForm["McpServerForm"]
McpManage["McpManageDialog"]
UseMcp["useMcpMode Hook"]
UseMgmt["useMcpManagement Hook"]
end
subgraph Main["Главный процесс"]
McpRouter["McpRouter<br/>(IPC-маршрутизация)"]
McpService["McpService<br/>(Пул соединений)"]
ToolsLoader["ToolsLoader<br/>(Преобразование форматов)"]
DepCheck["DependencyCheckService<br/>(Проверка зависимостей)"]
subgraph Transports["Транспортный уровень"]
Stdio["StdioClientTransport"]
SSE["SSEClientTransport"]
HTTP["StreamableHTTPClientTransport"]
end
subgraph TinyElf["Движок TinyElf"]
McpAdapter["McpToolAdapter<br/>(Обёртка ITool)"]
DirectAdapter["DirectMcpToolAdapter<br/>(Встроенные серверы)"]
Tracker["McpProcessTracker<br/>(Отслеживание процессов)"]
end
end
subgraph Worker["Worker-поток"]
McpWorker["mcp.worker.ts<br/>(Мост CLI)"]
end
subgraph External["Внешние"]
MCP1["MCP Server A<br/>(stdio)"]
MCP2["MCP Server B<br/>(SSE/HTTP)"]
ClaudeCLI["claude CLI"]
end
McpPage -->|IPC| McpRouter
McpRouter --> McpService
McpRouter --> DepCheck
McpService --> Stdio
McpService --> SSE
McpService --> HTTP
Stdio --> MCP1
SSE --> MCP2
HTTP --> MCP2
McpService --> ToolsLoader
McpService --> McpAdapter
McpAdapter --> McpService
DirectAdapter --> MCP1
Tracker --> DirectAdapter
McpWorker --> ClaudeCLI
Ключевые файлы
| Файл | Путь | Ответственность |
|---|---|---|
McpService.ts | desktop/app/main/services/capabilities/tools/mcp-users/ | Управление пулом соединений, жизненный цикл клиентов, кэширование инструментов |
ToolsLoader.ts | desktop/app/main/services/capabilities/tools/mcp-users/ | Преобразование MCP-инструментов в форматы OpenAI/Anthropic/Gemini |
DependencyCheckService.ts | desktop/app/main/services/capabilities/tools/mcp-users/ | Обнаружение зависимостей командной строки и автоустановка |
McpRouter.ts | desktop/app/main/services/routers/ | Регистрация IPC-маршрутов, валидация параметров |
McpToolAdapter.ts | desktop/app/main/services/agent-core/engine/tinyelf/tools/ | Адаптер MCPTool → ITool |
McpProcessTracker.ts | desktop/app/main/services/agent-core/engine/tinyelf/tools/ | Отслеживание PID дочерних процессов и их очистка |
mcp.worker.ts | desktop/app/main/workers/ | Worker-поток, мост CLI |
mcp-types.ts | desktop/app/shared/contracts/ | Общие определения типов |
mcp-presets.ts | desktop/app/shared/ | Официальные пресеты MCP-серверов |
mcp-detector.ts | desktop/app/main/lib/utils/ | Утилита обнаружения конфигурации MCP |
McpServersPage.tsx | renderer/src/pages/ | Страница управления MCP-серверами |
McpServerForm.tsx | renderer/src/features/settings/components/tabs/tools-tab/ | Форма добавления/редактирования |
McpManageDialog.tsx | renderer/src/features/marketplace/components/mcp/ | Управление ассоциацией с агентами |
useMcpMode.ts | renderer/src/features/marketplace/hooks/mcp/ | Hook выбора режима MCP и инструментов |
useMcpManagement.ts | renderer/src/features/settings/components/tabs/tools-tab/hooks/ | Hook управления CRUD |
IPC-каналы
Все IPC-каналы, связанные с MCP, регистрируются через McpRouter с использованием secureHandle для аутентификации:
| Канал | Направление | Параметры | Возврат | Описание |
|---|---|---|---|---|
mcp:list | R→M | Нет | McpServerRecord[] | Список всех серверов |
mcp:add | R→M | McpServerInput | McpActionResult | Добавить сервер |
mcp:addJson | R→M | McpServerJsonInput | McpActionResult | Пакетное добавление из JSON |
mcp:remove | R→M | McpServerRemoveInput | McpActionResult | Удалить сервер |
mcp:update | R→M | { id, updates } | McpActionResult | Обновить конфигурацию сервера |
mcp:test | R→M | McpServerRemoveInput | McpTestResult | Проверить соединение |
mcp:discover | R→M | McpServerRemoveInput | McpDiscoverResult | Обнаружить инструменты/ресурсы/промпты |
mcp:list-server-tools | R→M | { serverId } | MCPTool[] | Список инструментов одного сервера |
mcp:list-all-tools | R→M | Нет | MCPTool[] | Список инструментов всех активных серверов |
mcp:call-tool | R→M | { serverId, toolName, args, callId } | MCPCallToolResponse | Вызвать инструмент |
mcp:check-dependency | R→M | { command } | DependencyCheckResult | Проверить зависимость |
mcp:install-dependency | R→M | { command } | DependencyInstallResult | Установить зависимость |
Основные типы
type McpServerTransport = 'stdio' | 'http' | 'sse';
type McpServerScope = 'user' | 'local';
type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'error';
type McpMode = 'disabled' | 'auto' | 'manual';
interface McpServerRecord {
id: string;
name: string;
scope: McpServerScope;
type: McpServerTransport;
config: McpServerConfig;
isActive?: boolean;
isTrusted?: boolean;
disabledTools?: string[];
installSource?: 'builtin' | 'manual' | 'protocol' | 'unknown';
createdAt?: number;
updatedAt?: number;
}
interface MCPTool {
id: string; // mcp__serverName__toolName
serverId: string;
serverName: string;
name: string;
description?: string;
inputSchema: Record<string, any>;
type: 'mcp';
}
Зависимости между модулями
graph LR
McpRouter --> McpService
McpRouter --> DependencyCheckService
McpService --> ConfigStore["Electron Store<br/>(mcp-config)"]
McpService --> MCP_SDK["@modelcontextprotocol/sdk"]
ToolsLoader --> McpService
McpToolAdapter --> McpService
CompletionService["CompletionService"] --> ToolsLoader
TinyElfEngine --> McpToolAdapter
TinyElfEngine --> DirectMcpToolAdapter
Потоки данных
Поток загрузки инструментов
Пользователь инициирует чат
↓
CompletionService вызывает setupMcpTools()
↓
fetchMcpTools() определяет, какие серверы загружать, исходя из режима MCP
↓ (auto: все активные серверы / manual: выбранные серверы)
McpService.listServerTools() / listAllActiveServerTools()
↓ (проверка кэша → попадание: вернуть / промах: initClient + listTools)
ToolsLoader преобразует в целевой формат (OpenAI / Anthropic / Gemini)
↓
Определения инструментов внедряются в LLM-запрос
Поток вызова инструментов
LLM возвращает tool_call (name = mcp__server__tool)
↓
Разобрать ID сервера и имя инструмента
↓
McpService.callTool(serverId, toolName, args, callId)
↓
initClient() обеспечивает соединение → client.callTool()
↓
Вернуть MCPCallToolResponse (isError, content[])
↓
Результат передаётся обратно LLM для продолжения разговора
Связанная документация
- Управление пулом соединений — Подробности жизненного цикла соединений McpService
- Адаптеры форматов инструментов — Подробности ToolsLoader и McpToolAdapter
- Архитектура Worker — Архитектура CLI-моста mcp.worker.ts
- Как расширить — Добавление новых транспортных типов и пользовательских MCP-серверов