メインコンテンツまでスキップ

MCP モジュール概要

MCP(Model Context Protocol)モジュールは、外部 MCP サーバーへの接続、ツール検出、形式変換、呼び出し実行を管理します。このモジュールは、メインプロセスを中核とするレイヤードアーキテクチャを採用し、IPC 経由でレンダラープロセスに公開されます。

アーキテクチャ図

graph TB
subgraph Renderer["Renderer Process"]
McpPage["McpServersPage"]
McpForm["McpServerForm"]
McpManage["McpManageDialog"]
UseMcp["useMcpMode Hook"]
UseMgmt["useMcpManagement Hook"]
end

subgraph Main["Main Process"]
McpRouter["McpRouter<br/>(IPC Routing)"]
McpService["McpService<br/>(Connection Pool)"]
ToolsLoader["ToolsLoader<br/>(Format Conversion)"]
DepCheck["DependencyCheckService<br/>(Dependency Check)"]

subgraph Transports["Transport Layer"]
Stdio["StdioClientTransport"]
SSE["SSEClientTransport"]
HTTP["StreamableHTTPClientTransport"]
end

subgraph TinyElf["TinyElf Engine"]
McpAdapter["McpToolAdapter<br/>(ITool Wrapping)"]
DirectAdapter["DirectMcpToolAdapter<br/>(Built-in Servers)"]
Tracker["McpProcessTracker<br/>(Process Tracking)"]
end
end

subgraph Worker["Worker Thread"]
McpWorker["mcp.worker.ts<br/>(CLI Bridging)"]
end

subgraph External["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/Agent 関連付け管理
useMcpMode.tsrenderer/src/features/marketplace/hooks/mcp/MCP モードとツール選択 Hook
useMcpManagement.tsrenderer/src/features/settings/components/tabs/tools-tab/hooks/CRUD 管理 Hook

IPC チャンネル

MCP 関連のすべての IPC チャンネルは、認証に secureHandle を使用して McpRouter 経由で登録されます。

チャンネル方向パラメーター戻り値説明
mcp:listR→MなしMcpServerRecord[]すべてのサーバーを一覧表示
mcp:addR→MMcpServerInputMcpActionResultサーバーを追加
mcp:addJsonR→MMcpServerJsonInputMcpActionResultJSON から一括追加
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

データフロー

ツール読み込みフロー

User initiates chat

CompletionService calls setupMcpTools()

fetchMcpTools() determines which servers to load based on MCP mode
↓ (auto: all active servers / manual: selected servers)
McpService.listServerTools() / listAllActiveServerTools()
↓ (check cache → hit: return / miss: initClient + listTools)
ToolsLoader converts to target format (OpenAI / Anthropic / Gemini)

Tool definitions injected into LLM request

ツール呼び出しフロー

LLM returns tool_call (name = mcp__server__tool)

Parse server ID and tool name

McpService.callTool(serverId, toolName, args, callId)

initClient() ensures connection → client.callTool()

Return MCPCallToolResponse (isError, content[])

Result passed back to LLM for continued conversation

関連ドキュメント