Skip to main content
Glama
architecture.md14.3 kB
# アーキテクチャ ## 概要 Search MCP Serverは、**MCPアグリゲーター**として設計された、複数のMCPサーバーを統合管理するサーバーです。Model Context Protocol (MCP) の理念に基づき、プログレッシブな開示によってAIクライアントのコンテキスト消費を70-80%削減します。 ## 設計原則 ### 1. MCPアグリゲーションパターン Search MCPは、複数のMCPサーバーを束ね、単一のエンドポイントとしてAIクライアントに提供します: ``` ┌─────────────────────────────────────────────┐ │ AIクライアント (Claude/Cursor/Windsurf) │ │ │ │ 従来: 4個のMCPサーバーに個別接続 │ │ → 23,000トークン消費 │ │ │ │ Search MCP: 1個のMCPサーバーのみ接続 │ │ → 6,000トークン消費 (75%削減) │ └──────────────────┬──────────────────────────┘ │ MCP Protocol (stdio) ↓ ┌─────────────────────────────────────────────┐ │ Search MCP Server (アグリゲーター) │ │ │ │ ┌──────────────────────────────────────┐ │ │ │ MCP Client Manager │ │ │ │ - 複数MCPサーバーの統合管理 │ │ │ │ - stdio通信でMCPサーバーと接続 │ │ │ │ - ツール情報の集約 │ │ │ └──────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────┐ │ │ │ Tool Registry │ │ │ │ - 軽量なメタデータ管理 │ │ │ │ - プログレッシブな開示 │ │ │ └──────────────────────────────────────┘ │ └──────┬────────┬────────┬────────┬──────────┘ │ │ │ │ │ stdio │ stdio │ stdio │ stdio ↓ ↓ ↓ ↓ ┌──────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │filesystem│ │ brave │ │database│ │ slack │ │ MCP │ │ MCP │ │ MCP │ │ MCP │ │(50 tools)│ │(20) │ │(30) │ │(15) │ └──────────┘ └────────┘ └────────┘ └────────┘ ``` ### 2. プログレッシブな開示 (Progressive Disclosure) AIクライアントは段階的に情報を取得します: **Phase 1: 初期読み込み(軽量)** ``` Client → Search MCP: tools/list ← ツール名とサーバー名のみ ← 115 tools × 50トークン = 5,750トークン ``` **Phase 2: 詳細取得(必要時のみ)** ``` Client → Search MCP: tools/get filesystem.read_file ← 詳細なパラメータ情報 ← 1 tool × 200トークン = 200トークン ``` **Phase 3: 実行** ``` Client → Search MCP: tools/call filesystem.read_file {path: "..."} → filesystem MCP: 実行依頼 ← filesystem MCP: 結果 ← Client: 結果 ``` **合計コンテキスト消費: 約6,000トークン (従来比75%削減)** ## コンポーネント ### 1. MCP Client Manager (`src/mcp/mcp-client-manager.ts`) 複数のMCPサーバーを統合管理するコアコンポーネント。 **責務:** - 設定ファイル (`config/mcp-servers.json`) の読み込み - 複数MCPサーバーのプロセス起動・停止 - 各MCPサーバーとのstdio通信管理 - ツール情報の集約 - ヘルスチェックと自動再接続 **主要メソッド:** ```typescript loadConfig(configPath: string): Promise<void> startAll(): Promise<void> start(name: string): Promise<void> stop(name: string): Promise<void> listAllTools(): Promise<AggregatedToolMetadata[]> executeTool(serverName: string, toolName: string, parameters): Promise<any> healthCheck(): Promise<Record<string, boolean>> ``` ### 2. MCP Client (`src/mcp/mcp-client.ts`) 個別のMCPサーバーとの通信を担当。 **責務:** - MCPサーバープロセスの起動 - stdio経由のMCPプロトコル通信 - `initialize`, `tools/list`, `tools/call` メソッドの実装 - エラーハンドリングと再接続 **主要メソッド:** ```typescript connect(): Promise<void> disconnect(): Promise<void> listTools(): Promise<ToolMetadata[]> executeTool(toolName: string, parameters): Promise<any> ping(): Promise<void> ``` **MCPプロトコル実装例:** ```typescript // Initialize await sendMessage({ jsonrpc: '2.0', id: 1, method: 'initialize', params: { protocolVersion: '1.0.0', clientInfo: { name: 'search-mcp', version: '1.0.0' } } }); // List tools await sendMessage({ jsonrpc: '2.0', id: 2, method: 'tools/list', params: {} }); // Call tool await sendMessage({ jsonrpc: '2.0', id: 3, method: 'tools/call', params: { name: 'read_file', arguments: { path: '/path/to/file' } } }); ``` ### 3. Tool Registry (`src/tool-registry.ts`) 集約されたツール情報を管理。 **責務:** - 各MCPサーバーから取得したツール情報の統合 - 軽量なメタデータの提供 - ツール名の名前空間管理 (`serverName.toolName`) **主要メソッド:** ```typescript aggregateTools(mcpManager: MCPClientManager): Promise<void> list(): LightweightToolMetadata[] get(toolName: string): DetailedToolMetadata ``` ### 4. MCP Server (`src/index.ts`) Search MCP自身のMCPサーバー実装。AIクライアント(Claude等)からの接続を受け付けます。 **提供するMCPメソッド:** - `initialize`: クライアント接続の初期化 - `tools/list`: 集約されたツール一覧を返す(軽量版) - `tools/call`: 指定されたツールを実行(該当MCPサーバーへプロキシ) ### 5. 設定ファイル (`config/mcp-servers.json`) 接続するMCPサーバーの定義。 ```json { "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path"], "env": { ... }, "enabled": true } } } ``` ## データフロー ### ツール一覧取得フロー(軽量版) ``` ┌─────────┐ ┌────────────┐ ┌─────────────┐ │ Claude │ │ Search MCP │ │ filesystem │ │ Desktop │ │ Server │ │ MCP │ └────┬────┘ └─────┬──────┘ └──────┬──────┘ │ │ │ │ tools/list │ │ ├──────────────────────────>│ │ │ │ (初回のみ) tools/list │ │ ├───────────────────────────>│ │ │<───────────────────────────┤ │ │ {tools: [...50 tools...]} │ │ │ │ │ 軽量版ツールリスト │ │ │<──────────────────────────┤ │ │ {tools: [ │ │ │ {name: "filesystem.read_file", ...}, // 詳細除外 │ │ ... │ │ │ ]} │ │ │ │ │ ``` **ポイント**: - 初回のみ各MCPサーバーから完全なツール情報を取得 - Claude Desktopには軽量なメタデータのみ返す - パラメータ詳細は省略(必要時のみ取得) ### ツール実行フロー ``` ┌─────────┐ ┌────────────┐ ┌─────────────┐ │ Claude │ │ Search MCP │ │ filesystem │ │ Desktop │ │ Server │ │ MCP │ └────┬────┘ └─────┬──────┘ └──────┬──────┘ │ │ │ │ tools/call │ │ │ filesystem.read_file │ │ │ {path: "/path/to/file"} │ │ ├──────────────────────────>│ │ │ │ tools/call │ │ │ read_file │ │ │ {path: "/path/to/file"} │ │ ├───────────────────────────>│ │ │ │ │ │ {content: "..."} │ │ │<───────────────────────────┤ │ │ │ │ {content: "..."} │ │ │<──────────────────────────┤ │ │ │ │ ``` **ポイント**: - Search MCPは該当するMCPサーバーへリクエストをプロキシ - ツール名は `serverName.toolName` 形式で管理 - 結果はそのままClaude Desktopへ返す ## 技術スタック - **ランタイム**: Node.js 18+ - **言語**: TypeScript 5.9+ - **プロトコル**: MCP (Model Context Protocol) - stdio通信 - **プロセス管理**: child_process (spawn) - **JSON-RPC**: 2.0準拠 ### 選定理由 **Node.js + TypeScript**: - 非同期I/Oに優れ、複数MCPサーバーとの並行通信に適している - stdio通信の実装が容易 - 型安全性による保守性の向上 **stdio通信**: - MCPプロトコルの標準通信方式 - プロセス間通信として軽量かつ確実 - デバッグが容易 ## 拡張性 ### 新しいMCPサーバーの追加 設定ファイルに追記するだけ: ```json { "mcpServers": { "new-mcp": { "command": "npx", "args": ["-y", "new-mcp-server"] } } } ``` 再起動すれば自動的に統合されます。 ### 対応MCPサーバー MCP仕様に準拠したすべてのサーバーに対応: - stdio通信をサポート - `tools/list`と`tools/call`メソッドを実装 - JSON-RPC 2.0形式 ## パフォーマンス特性 ### コンテキスト削減効果 | 項目 | 従来 | Search MCP | 削減率 | |------|------|-----------|--------| | 初期読み込み | 23,000トークン | 5,750トークン | **75%削減** | | ツール詳細取得 | - | 200トークン/ツール | 必要時のみ | | 合計(3ツール使用時) | 23,000トークン | 6,350トークン | **72%削減** | ### レスポンスタイム目標 - MCP初期化: < 1秒 - ツール一覧取得: < 100ms - ツール実行: バックエンドMCPサーバー依存 + 数ms(プロキシオーバーヘッド) ### メモリフットプリント - 基本メモリ: < 50MB - MCPサーバー毎: 追加 20-30MB - 4つのMCPサーバー接続時: 約150MB ## セキュリティ考慮事項 ### MCPサーバー管理 - 設定ファイルで管理するMCPサーバーのみを信頼 - 不正なコマンド実行を防ぐため、設定ファイルへのアクセス制御が重要 - 環境変数はプロセス実行時に展開され、ログに記録されない ### 今後の改善 - MCPサーバー間の通信暗号化(オプション) - MCPサーバーのサンドボックス化 - レート制限(AIクライアント側) - 監査ログ ## 将来の拡張 ### Phase 2: 検索機能強化 - ツール名での部分一致検索 - タグ・カテゴリベースのフィルタリング ### Phase 3: セキュリティ強化 - API認証・認可 - レート制限 - 監査ログ ### Phase 4: 高度な機能 - ホットリロード(設定変更時の再起動不要) - セマンティック検索(ベクトル検索) - ツール使用統計・分析 ### Phase 5: Web管理UI(オプション) - MCPサーバーの管理画面 - ツール使用状況のダッシュボード - リアルタイム監視 ## 関連ドキュメント - [MCPアグリゲーター設計](design/08-mcp-aggregator.md) - 実装の詳細 - [セットアップガイド](design/07-simplified-setup.md) - 設定方法 - [MCP概念](mcp-concepts.md) - MCPの基本概念 - [詳細設計](design/) - すべての設計ドキュメント

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/krtw00/search-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server