MCP入門ガイド:Transport方式とデータフロー
最近、MCPのカスタム開発についてちゃんと勉強したいなーと思っていたので、書籍なんかを見つつ、AIエージェントと相談しながら「MCPの基礎、データがどういう流れで処理されのか」というふわっとしていた部分の疑問点を整理してみました。
公式サイトなどを参照させながらAIエージェントと相談してファクトチェックもしたので基本的にあっていると思いますが、もし「そこちょっと違うよ」ってところがあった場合、コメントいただけると幸いです。
なお、本記事の内容を解説した動画もM365-Copilotで自動生成しましたので、以下もご覧ください。
※最近、Copilotの機能進化もかなりすごいんですよね。
はじめに
Model Context Protocol(MCP)は、AI エージェントツールと外部データソースを連携させる強力な仕組みです。しかし、MCPを使う上で絶対に理解しておくべき重要なポイントがあります。
「stdio方式ならローカル処理だから安全」という誤解が広まっていますが、これは正しくありません。本記事では、MCPのTransport方式とデータフローの詳細を詳しく解説します。
MCPの基本構成
MCPシステムは3つのコンポーネントで構成されています。
① MCPホスト(AIエージェントツール)
Claude Code、Cline、Cursor等のツールがこれにあたります。LLMと連携してMCPサーバーを呼び出す役割を担います。
② MCPサーバー
ファイル変換、DB検索、外部サービス連携など、特定の機能を提供するコンポーネントです。
③ LLMプロバイダー
Anthropic(Claude)、OpenAI(GPT)、Google(Gemini)等のLLMサービスです。
主要なAIエージェントツール
| ツール | 選択可能なLLM | 説明 |
|---|---|---|
| Claude Code | Anthropic Claude専用 | Anthropic公式CLI |
| Cline | OpenAI, Anthropic, Google, AWS等 | VS Code拡張機能 |
| Cursor | OpenAI, Anthropic, Google等 | AIコーディングエディタ |
| Gemini CLI | Google Gemini専用 | Google公式CLI |
2つのTransport方式
MCPには2つのTransport方式があります。それぞれの特徴を理解することが重要です。
比較表
| 項目 | stdio | HTTP |
|---|---|---|
| 通信方法 | 標準入出力 | HTTPプロトコル |
| 実行場所 | ローカル(子プロセス) | ローカル or リモート |
| 設定の難易度 | 簡単 | やや複雑 |
| 複数クライアント | 不可(1対1) | 可能(1対多) |
| 主な用途 | ローカルツール | リモートサービス連携 |
stdio方式:1台のPC内で完結
あなたのPC
├── MCPホスト
│ ↕ stdin/stdout
└── MCPサーバー(子プロセス)
✅ メリット
- シンプルな設定
- ローカル処理で高速
- セキュアな通信
❌ 制限
- 1対1通信のみ
- 同一PC内限定
HTTP方式:リモート接続が可能
PC 1 PC 2
MCPホスト MCPホスト
↓ HTTP ↓
↓
MCPサーバー
(localhost/remote)
✅ メリット
- 複数クライアント対応
- リモート接続可能
- スケーラブル
⚠️ 注意点
- 設定がやや複雑
- 認証・セキュリティ必要
どちらの方式を選ぶ?
stdio方式が適した用途:
- ローカルファイル処理
- PDF変換
- DB検索
- プライベートデータ処理
HTTP方式が適した用途:
- 外部サービス連携(Notion、GitHub、Slack)
基本的には、ローカル処理ならstdio、外部サービス連携ならHTTPと覚えておけば大丈夫です。
npxとuvxの違い
MCPサーバーを実行する際に、npxまたはuvxというコマンドを使います。
比較表
| 項目 | npx | uvx |
|---|---|---|
| 対応言語 | JavaScript/TypeScript | Python |
| 配布元 | npm registry | PyPI |
| 役割 | パッケージを一時実行 | パッケージを一時実行 |
| 速度 | 標準 | 10倍高速 |
動作の流れ
初回実行時
-
コードをダウンロード
- npm/PyPI からパッケージ取得
- ⚠️ コードのみ(データは送信されない)
-
ローカルにキャッシュ
- npx:
~/.npm/_npx/ - uvx:
~/.cache/uv/
- npx:
-
実行
2回目以降
✅ キャッシュから即座に実行
- ダウンロード不要
- オフライン動作可能
使い分け
MCPサーバーの実装言語で決まります。
-
npx: JavaScript/TypeScript製(例:
@modelcontextprotocol/server-filesystem) -
uvx: Python製(例:
markitdown-mcp)⚡ 10倍高速
データフローの真実
ここからが本記事の核心部分です。
stdio方式の真実
完全なデータフロー(stdio方式)
ステップ1〜4:LLMがMCPサーバーの使用を判断
STEP 1: あなたの入力
「このPDFをMarkdownに変換して」
↓
STEP 2: MCPホスト(Claude Code等)
- ローカルで動作
↓ LLM API(インターネット経由)
STEP 3: ⚠️ LLMプロバイダー(Anthropic等)
- 入力を解析し「MCPサーバーを使え」と判断
↓ 指示を返す
STEP 4: MCPホスト
- MCPサーバーを起動
この時点で、すでにあなたの入力はLLMプロバイダーに送信されています。
ステップ5〜8:処理結果がLLMに送信される
STEP 5: ✅ MCPサーバー(ローカル)
- PDFを読み取り、Markdownに変換
- ※この段階では外部送信なし
↓ 処理結果を返す
STEP 6: MCPホスト
- 結果を受け取る
↓ LLM API(処理結果を含む)
STEP 7: ⚠️ LLMプロバイダー
- 変換されたMarkdownテキストを受信
- 解析して応答を生成
↓
STEP 8: あなたに結果表示
📊 データ送信先
- ✅ MCPサーバー(ローカルのみ)
- ⚠️ LLMプロバイダー(入力 + 処理結果)
HTTP方式(リモート)の真実
リモートサービスを使う場合は、さらに注意が必要です。
STEP 1: あなたの入力
「Notionにページを作成して」
↓
STEP 2-3: ⚠️ LLMプロバイダー
- 「Notion MCPを使え」と判断
↓ HTTPS(インターネット経由)
STEP 4-5: ⚠️ Notion社のMCPサーバー
- リクエストを受信、Notionデータベースに保存
↓ 結果を返す
STEP 6-7: ⚠️ LLMプロバイダー
- Notionの処理結果を受信
📊 データ送信先
⚠️ Notion社 + LLMプロバイダー = 2社に送信
具体例で理解する
例1:PDFをMarkdownに変換(stdio + uvx方式)
コマンド
$ claude mcp add --transport stdio markitdown --scope user uvx markitdown-mcp
何が送信されるか?
| データ | MCPサーバー | LLMプロバイダー |
|---|---|---|
| 元PDFファイル(バイナリ) | ✅ 読み取り | ❌ 送信されない |
| 変換後のMarkdownテキスト | ✅ 生成 | ⚠️ 送信される |
データの流れ
あなたのPC:
secret.pdf(機密文書)
↓
MCPサーバー(markitdown)
- ローカルでPDFを読み取り
- Markdownに変換
- 結果:「# 機密情報\n詳細な内容...」
↓
Claude Code
↓ Anthropic API
Anthropic社:
⚠️ 「# 機密情報\n詳細な内容...」を受信
📊 送信先
1社(Anthropic社など、使用するLLMプロバイダー)
例2:NotionにTODOを作成(HTTP + リモート方式)
コマンド
$ claude mcp add --transport http notion --scope user https://mcp.notion.com/mcp
何が送信されるか?
| データ | Notion社 | LLMプロバイダー |
|---|---|---|
| TODO内容 | ⚠️ 送信 | ⚠️ 送信 |
| 作成されたページ情報 | ⚠️ 保存 | ⚠️ 送信 |
データの流れ
あなたの入力:
「明日の会議準備をTODOに追加」
↓
Claude Code
├→ Notion API
│ ⚠️ 「明日の会議準備」を送信
│ ⚠️ Notionデータベースに保存
│
└→ Anthropic API
⚠️ 「明日の会議準備」を送信
⚠️ Notion処理結果を送信
📊 送信先
2社(Notion社 + Anthropic社など、使用するLLMプロバイダー)
データ送信先まとめ
Transport方式別の送信先
| 方式 | MCPサーバー | LLMプロバイダー | 合計 |
|---|---|---|---|
| stdio | なし(ローカル) | 送信される ⚠️ | 1社 |
| HTTP (localhost) | なし(ローカル) | 送信される ⚠️ | 1社 |
| HTTP (remote) | 送信される ⚠️ | 送信される ⚠️ | 2社 |
🔑 重要: stdio/HTTP localhostは1社、HTTP remoteは2社にデータが送信されます
AIエージェントツール別の送信先
| ツール | 選択可能なLLM | データ送信先 |
|---|---|---|
| Claude Code | Anthropic Claude専用 | Anthropic社 ⚠️ |
| Cline | OpenAI, Anthropic, Google等 | 選択したプロバイダー ⚠️ |
| Cursor | OpenAI, Anthropic, Google等 | 選択したプロバイダー ⚠️ |
| Gemini CLI | Google Gemini専用 | Google社 ⚠️ |
⚠️ すべてのツールで、選択したLLMプロバイダーにデータが送信されます
LLMプロバイダーが受信するデータ
実際にLLMプロバイダーに送信されるデータの形式を見てみましょう。
{
"messages": [
{
"role": "user",
"content": "このPDFをMarkdownに変換して"
},
{
"role": "tool_result",
"content": "# 変換されたMarkdownの全文\n..."
}
]
}
⚠️ MCP処理結果がすべて含まれます
あなたの入力だけでなく、MCPサーバーが生成したすべての結果データがLLMに送信されることを理解しておく必要があります。
重要ポイントまとめ
1. MCPサーバー自体はローカル処理
stdio方式でもHTTP(localhost)方式でも、MCPサーバー自体はローカルで動作します。
2. 処理結果は必ずLLMプロバイダーへ
AIエージェントツールを使う限り、MCPの処理結果はLLMプロバイダーに送信されます。
3. HTTP(リモート)方式は2社に送信
Notion、GitHub、Slackなどのリモートサービスを使う場合、そのサービス提供者とLLMプロバイダーの両方にデータが送信されます。
まとめ
MCPは非常に便利な技術ですが、データの流れを正しく理解し、適切に使用することが重要です。
機密情報を扱う際の推奨対応
-
ローカルLLMの使用
- Ollama等を使用してローカルでLLMを実行
-
従来のツールの利用
- MCPを経由せず、直接コマンドラインツールを使用
-
データの事前確認
- LLMに送信される内容を意識的に確認
MCPの仕組みを正しく理解し、安全に活用していきましょう!
Discussion