MCPのアーキテクチャ
Section titled “MCPのアーキテクチャ”MCPはクライアント-サーバーアーキテクチャ(Client-Server Architecture)に基づいて設計されています。このアーキテクチャには3つの役割があります。Host(AIアプリケーション)・Client(通信コンポーネント)・Server(ツール提供プログラム)です。[1] それぞれが明確に分離されることで、拡張性と再利用性が高まります。
MCPにおける通信フローを図示します。
graph LR
U[ユーザー] --> H[Host\nClaude Desktop / Cursor]
H --> C[Client\nMCPクライアント]
C --> S1[Server A\n天気 MCP サーバー]
C --> S2[Server B\nファイルシステム\nMCP サーバー]
S1 --> T1[天気 API]
S2 --> T2[ローカル\nファイル]ユーザーはHostに指示を送り、HostはClientを通じてMCPサーバーと通信し、ツールや情報を取得して応答します。
Host(ホスト)
Section titled “Host(ホスト)”Hostとは、ユーザーに直接向き合い、1つ以上のMCP Clientを管理するAIアプリケーションです。[1]
役割
- ユーザーからの入力(テキスト・音声など)を受け取る
- 会話履歴を保持し、コンテキストを管理する
- AIモデルを呼び出してレスポンスを生成する
- 必要に応じてMCPサーバーへの接続を開始する
- 最終的な応答をユーザーに表示する
具体例
| Hostアプリケーション | 種類 |
|---|---|
| Claude Desktop | デスクトップAIアシスタント |
| Cursor | AI搭載コードエディタ |
| Windsurf | AI搭載コードエディタ |
| Zed | AI搭載テキストエディタ |
| Chainlit | AIチャットアプリ構築フレームワーク |
Client(クライアント)
Section titled “Client(クライアント)”Clientとは、Host内部に組み込まれ、特定のMCP Serverとの接続を維持してHostが使うコンテキストを取得するコンポーネントです。[1]「アダプター」または「メッセンジャー」のような役割です。
役割
- MCPプロトコルに従ったメッセージの送受信
- 利用可能なツール・リソース・プロンプトのリスト取得(サーバーへの問い合わせ)
- Hostからの指示をMCPメッセージに変換してServerに送信
- Serverからの結果をHostに返す
HostとClientの関係
HostとClientは概念的に分離されていますが、実装上は同一アプリケーション内に存在します。
- Host: AIの意図を決定する(「天気を調べよう」と判断する)
- Client: MCPプロトコルで実際に通信する(天気MCPサーバーにリクエストを送る)
Server(サーバー)
Section titled “Server(サーバー)”Serverとは、MCP Clientにコンテキストや機能を提供する外部プログラムまたはサービスです。[1]
役割
- 提供できる機能(Tools・Resources・Prompts)を標準化されたフォーマットで公開
- ClientからのToolsリスト要求に応答する
- ツール呼び出しリクエストを受信し、実際の処理を実行する
- 処理結果をClientに返す
動作環境
| 種類 | 説明 | 例 |
|---|---|---|
| ローカルサーバー | 同じマシン上で動作し、通常はstdioトランスポートを使う | ファイルシステムMCPサーバー |
| リモートサーバー | ネットワーク上で動作し、通常はStreamable HTTPトランスポートを使う | SentryなどのリモートMCPサーバー |
通信フローの詳細
Section titled “通信フローの詳細”MCPによるツール呼び出しの流れを手順で示します。
sequenceDiagram
participant U as ユーザー
participant H as Host
participant C as Client
participant S as Server
U->>H: 「今日の東京の天気は?」
H->>C: 利用可能なツールを取得
C->>S: tools/list リクエスト
S-->>C: [get_weather, get_forecast, ...]
C-->>H: ツールリストを返す
H->>H: LLMが get_weather の呼び出しを決定
H->>C: get_weather(location="Tokyo") を実行
C->>S: tools/call リクエスト
S->>S: 天気APIを呼び出す
S-->>C: {"temp": 18, "condition": "晴れ"}
C-->>H: ツール結果を返す
H->>H: LLMが結果を元に回答を生成
H-->>U: 「今日の東京は18度で晴れです。」実装例:Claude Desktop
Section titled “実装例:Claude Desktop”Claude Desktopを例に、3つの役割の対応を整理します。
Claude Desktop (Host + Client)
├── チャットUI (Host の役割)
│ - ユーザー入力の受付
│ - 会話履歴の表示
│ - Anthropic API との通信
│
└── MCP クライアント (Client の役割)
- MCPサーバーへの接続管理
- プロトコルに従ったメッセージ送受信
接続先 MCPサーバー群 (Server の役割)
├── filesystem: ファイルシステム操作
├── brave-search: Web検索
└── github: GitHubリポジトリ操作Claude Desktopの設定ファイル(claude_desktop_config.json)でMCPサーバーを追加すると、ClaudeがそのサーバーのToolsを使えるようになります。Claude Codeでは、プロジェクト共有用の .mcp.json やユーザー別の ~/.claude.json など、スコープに応じた設定方法が公式ドキュメントで説明されています。[2]
アーキテクチャの特徴
Section titled “アーキテクチャの特徴”疎結合(Loose Coupling)
Section titled “疎結合(Loose Coupling)”疎結合(そけつごう)とは、コンポーネント間の依存関係を最小限にする設計原則です。
MCPのアーキテクチャでは、HostはServerの実装詳細を直接知る必要がありません。MCPはJSON-RPCベースのデータ層と、stdioまたはStreamable HTTPのトランスポート層を分けて定義しているため、Server実装を差し替えてもHost側の接続モデルを保ちやすくなります。[1]
1対多の接続
Section titled “1対多の接続”MCPでは、HostがServerごとにClientを作り、1つ以上のServerへ接続します。[1] そのため、同じAIアプリがファイルシステム、検索、GitHubなど複数のMCPサーバーを同時に使う構成を取れます。
| 役割 | 何者か | 主な責任 |
|---|---|---|
| Host | ユーザーが使うAIアプリ | ユーザーとのインタラクション、AIモデルの実行 |
| Client | Host内の通信コンポーネント | MCPプロトコルに従ったServer間通信 |
| Server | ツール提供プログラム | 機能の公開、ツール呼び出しの実行 |
よくある質問
Section titled “よくある質問”Q: 1つのAIアプリに複数のMCPクライアントを持つことはできますか?
A: MCP公式ドキュメントでは、HostがServerごとにMCP Clientを作成し、それぞれのServerへの専用接続を維持する構成として説明されています。[1]
Q: MCPサーバーはどこで動かすのですか?
A: MCPサーバーはローカルマシン上またはリモート環境で動作します。公式ドキュメントでは、ローカルはstdio、リモートはStreamable HTTPが代表的なトランスポートとして説明されています。[1]
Q: Serverはどのプログラミング言語で実装できますか?
A: MCPはプロトコルであり、公式ドキュメントは複数言語のSDKをMCPプロジェクトの一部として扱っています。[1] 実装時は利用する言語のSDKドキュメントを確認してください。
- MCPとは — MCPの基本概念
- MCPのケイパビリティ — Tools・Resources・Promptsの違い
- Model Context Protocol, Architecture overview
- Anthropic, Connect Claude Code to tools via MCP