Перейти к основному содержимому

Обзор модуля 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.tsdesktop/app/main/services/capabilities/tools/mcp-users/Управление пулом соединений, жизненный цикл клиентов, кэширование инструментов
ToolsLoader.tsdesktop/app/main/services/capabilities/tools/mcp-users/Преобразование MCP-инструментов в форматы OpenAI/Anthropic/Gemini
DependencyCheckService.tsdesktop/app/main/services/capabilities/tools/mcp-users/Обнаружение зависимостей командной строки и автоустановка
McpRouter.tsdesktop/app/main/services/routers/Регистрация IPC-маршрутов, валидация параметров
McpToolAdapter.tsdesktop/app/main/services/agent-core/engine/tinyelf/tools/Адаптер MCPTool → ITool
McpProcessTracker.tsdesktop/app/main/services/agent-core/engine/tinyelf/tools/Отслеживание PID дочерних процессов и их очистка
mcp.worker.tsdesktop/app/main/workers/Worker-поток, мост CLI
mcp-types.tsdesktop/app/shared/contracts/Общие определения типов
mcp-presets.tsdesktop/app/shared/Официальные пресеты MCP-серверов
mcp-detector.tsdesktop/app/main/lib/utils/Утилита обнаружения конфигурации MCP
McpServersPage.tsxrenderer/src/pages/Страница управления MCP-серверами
McpServerForm.tsxrenderer/src/features/settings/components/tabs/tools-tab/Форма добавления/редактирования
McpManageDialog.tsxrenderer/src/features/marketplace/components/mcp/Управление ассоциацией с агентами
useMcpMode.tsrenderer/src/features/marketplace/hooks/mcp/Hook выбора режима MCP и инструментов
useMcpManagement.tsrenderer/src/features/settings/components/tabs/tools-tab/hooks/Hook управления CRUD

IPC-каналы

Все IPC-каналы, связанные с MCP, регистрируются через McpRouter с использованием secureHandle для аутентификации:

КаналНаправлениеПараметрыВозвратОписание
mcp:listR→MНетMcpServerRecord[]Список всех серверов
mcp:addR→MMcpServerInputMcpActionResultДобавить сервер
mcp:addJsonR→MMcpServerJsonInputMcpActionResultПакетное добавление из JSON
mcp:removeR→MMcpServerRemoveInputMcpActionResultУдалить сервер
mcp:updateR→M{ id, updates }McpActionResultОбновить конфигурацию сервера
mcp:testR→MMcpServerRemoveInputMcpTestResultПроверить соединение
mcp:discoverR→MMcpServerRemoveInputMcpDiscoverResultОбнаружить инструменты/ресурсы/промпты
mcp:list-server-toolsR→M{ serverId }MCPTool[]Список инструментов одного сервера
mcp:list-all-toolsR→MНетMCPTool[]Список инструментов всех активных серверов
mcp:call-toolR→M{ serverId, toolName, args, callId }MCPCallToolResponseВызвать инструмент
mcp:check-dependencyR→M{ command }DependencyCheckResultПроверить зависимость
mcp:install-dependencyR→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 для продолжения разговора

Связанная документация