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.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/ | Agent 関連付け管理 |
useMcpMode.ts | renderer/src/features/marketplace/hooks/mcp/ | MCP モードとツール選択 Hook |
useMcpManagement.ts | renderer/src/features/settings/components/tabs/tools-tab/hooks/ | CRUD 管理 Hook |
IPC チャンネル
MCP 関連のすべての IPC チャンネルは、認証に secureHandle を使用して McpRouter 経由で登録されます。
| チャンネル | 方向 | パラメーター | 戻り値 | 説明 |
|---|---|---|---|---|
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
データフロー
ツール読み込みフロー
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
関連ドキュメント
- 接続プール管理 — McpService の接続ライフサイクル詳細
- ツール形式アダプター — ToolsLoader と McpToolAdapter の詳細
- Worker アーキテクチャ — mcp.worker.ts の CLI ブリッジアーキテクチャ
- 拡張方法 — 新しいトランスポートタイプとカスタム MCP サーバーを追加