コンテンツにスキップ
LinkedInX

MCPのアーキテクチャ

約5分

対象読者: MCPの概要(なぜMCPが必要か)を理解している方
前提知識: なぜ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とは、ユーザーに直接向き合い、1つ以上のMCP Clientを管理するAIアプリケーションです。[1]

役割

  • ユーザーからの入力(テキスト・音声など)を受け取る
  • 会話履歴を保持し、コンテキストを管理する
  • AIモデルを呼び出してレスポンスを生成する
  • 必要に応じてMCPサーバーへの接続を開始する
  • 最終的な応答をユーザーに表示する

具体例

Hostアプリケーション種類
Claude DesktopデスクトップAIアシスタント
CursorAI搭載コードエディタ
WindsurfAI搭載コードエディタ
ZedAI搭載テキストエディタ
ChainlitAIチャットアプリ構築フレームワーク

Clientとは、Host内部に組み込まれ、特定のMCP Serverとの接続を維持してHostが使うコンテキストを取得するコンポーネントです。[1]「アダプター」または「メッセンジャー」のような役割です。

役割

  • MCPプロトコルに従ったメッセージの送受信
  • 利用可能なツール・リソース・プロンプトのリスト取得(サーバーへの問い合わせ)
  • Hostからの指示をMCPメッセージに変換してServerに送信
  • Serverからの結果をHostに返す

HostとClientの関係

HostとClientは概念的に分離されていますが、実装上は同一アプリケーション内に存在します。

  • Host: AIの意図を決定する(「天気を調べよう」と判断する)
  • Client: MCPプロトコルで実際に通信する(天気MCPサーバーにリクエストを送る)

Serverとは、MCP Clientにコンテキストや機能を提供する外部プログラムまたはサービスです。[1]

役割

  • 提供できる機能(Tools・Resources・Prompts)を標準化されたフォーマットで公開
  • ClientからのToolsリスト要求に応答する
  • ツール呼び出しリクエストを受信し、実際の処理を実行する
  • 処理結果をClientに返す

動作環境

種類説明
ローカルサーバー同じマシン上で動作し、通常はstdioトランスポートを使うファイルシステムMCPサーバー
リモートサーバーネットワーク上で動作し、通常はStreamable HTTPトランスポートを使うSentryなどのリモートMCPサーバー

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を例に、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]

疎結合(そけつごう)とは、コンポーネント間の依存関係を最小限にする設計原則です。

MCPのアーキテクチャでは、HostはServerの実装詳細を直接知る必要がありません。MCPはJSON-RPCベースのデータ層と、stdioまたはStreamable HTTPのトランスポート層を分けて定義しているため、Server実装を差し替えてもHost側の接続モデルを保ちやすくなります。[1]

MCPでは、HostがServerごとにClientを作り、1つ以上のServerへ接続します。[1] そのため、同じAIアプリがファイルシステム、検索、GitHubなど複数のMCPサーバーを同時に使う構成を取れます。

役割何者か主な責任
Hostユーザーが使うAIアプリユーザーとのインタラクション、AIモデルの実行
ClientHost内の通信コンポーネントMCPプロトコルに従ったServer間通信
Serverツール提供プログラム機能の公開、ツール呼び出しの実行

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ドキュメントを確認してください。

  1. Model Context Protocol, Architecture overview
  2. Anthropic, Connect Claude Code to tools via MCP
クイズ