MCP サーバーのトランスポートメカニズム:STDIO と SSE
Model Context Protocol(MCP)は、VJSP と MCP サーバー間の通信に、標準入出力(STDIO)および Server-Sent Events(SSE)という2つの主要なトランスポートメカニズムをサポートしています。各メカニズムには独自の特性、利点、および適したユースケースがあります。
STDIO トランスポート
STDIO トランスポートは、同じマシン上でローカルに動作し、標準入出力ストリームを介して通信を行います。
STDIO トランスポートの仕組み
- クライアント(VJSP)が MCP サーバーを子プロセスとして起動します
- クライアントはサーバーの STDIN に書き込み、サーバーは STDOUT を通じて応答します
- 各メッセージは改行文字で区切られます
- メッセージは JSON-RPC 2.0 形式に従います
クライアント サーバー
| |
|---- JSON メッセージ ---->| (STDIN 経由)
| | (リクエストを処理)
|<---- JSON メッセージ ----| (STDOUT 経由)
| |STDIO の特徴
- ローカル性:VJSP と同じマシン上で実行される
- パフォーマンス:ネットワークスタックを介さないため、レイテンシとオーバーヘッドが極めて低い
- シンプルさ:ネットワーク設定不要の直接的なプロセス間通信
- 関係性:クライアントとサーバーの 1 対 1 の関係
- セキュリティ:ネットワークに公開されないため、本質的により安全
STDIO のユースケース
STDIO トランスポートは以下のような用途に適しています:
- ローカルでの統合やツール
- セキュリティが重要な操作
- 低レイテンシが求められるケース
- シングルクライアントシナリオ(1 つの VJSP インスタンスにつき 1 つのサーバー)
- コマンドラインツールや IDE 拡張機能
STDIO 実装例
typescript
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server({name: 'local-server', version: '1.0.0'});
// ツールを登録...
// STDIO トランスポートを使用
const transport = new StdioServerTransport(server);
transport.listen();SSE トランスポート
Server-Sent Events(SSE)トランスポートはリモートサーバー上で動作し、HTTP/HTTPS を介して通信します。
SSE トランスポートの仕組み
- クライアント(VJSP)が HTTP GET リクエストでサーバーの SSE エンドポイントに接続します
- 永続的な接続が確立され、サーバーがイベントをクライアントにプッシュできるようになります
- クライアントからサーバーへの通信には、別途 HTTP POST リクエストを別のエンドポイントに送信します
- 通信は以下の2つのチャネルで行われます:
- イベントストリーム(GET):サーバーからクライアントへの更新
- メッセージエンドポイント(POST):クライアントからサーバーへのリクエスト
クライアント サーバー
| |
|---- HTTP GET /events ----------->| (SSE 接続を確立)
|<---- SSE イベントストリーム ------| (永続的接続)
| |
|---- HTTP POST /message --------->| (クライアントからのリクエスト)
|<---- 応答付き SSE イベント -------| (サーバーからの応答)
| |SSE の特徴
- リモートアクセス:VJSP とは別のマシンでホスト可能
- スケーラビリティ:複数クライアントからの同時接続をサポート
- プロトコル:標準 HTTP ベース(特別なプロトコル不要)
- 永続性:サーバーからクライアントへのメッセージ用に永続的接続を維持
- 認証:標準的な HTTP 認証メカニズムを利用可能
SSE のユースケース
SSE トランスポートは以下のような用途により適しています:
- ネットワーク越しのリモートアクセス
- 複数クライアント対応のシナリオ
- パブリックサービス
- 多数のユーザーが利用する集中型ツール
- Web サービスとの統合
SSE 実装例
typescript
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import express from 'express';
const app = express();
const server = new Server({name: 'remote-server', version: '1.0.0'});
// ツールを登録...
// SSE トランスポートを使用
const transport = new SSEServerTransport(server);
app.use('/mcp', transport.requestHandler());
app.listen(3000, () => {
console.log('MCP サーバーがポート 3000 で待機中');
});ローカル vs ホスト型:デプロイメントに関する考慮事項
STDIO と SSE のトランスポート方式の選択は、MCP サーバーのデプロイおよび管理方法に直接影響を与えます。
STDIO:ローカルデプロイモデル
STDIO サーバーは VJSP と同じマシン上で実行されるため、いくつかの重要な影響があります:
- インストール:サーバーの実行ファイルを各ユーザーのマシンにインストールする必要がある
- 配布:異なるオペレーティングシステム向けにインストールパッケージを提供する必要がある
- 更新:各インスタンスを個別に更新する必要がある
- リソース:ローカルマシンの CPU、メモリ、ディスクを使用
- アクセス制御:ローカルマシンのファイルシステム権限に依存
- 統合:ローカルシステムリソース(ファイル、プロセスなど)との統合が容易
- 実行:VJSP とともに起動・終了(子プロセスのライフサイクル)
- 依存関係:すべての依存関係をユーザーのマシンにインストールする必要がある
実践例
STDIO を使用したローカルファイル検索ツールは以下のようになります:
- ユーザーのマシン上で実行
- ローカルファイルシステムに直接アクセス
- VJSP が必要なときに起動
- ネットワーク設定が不要
- VJSP と一緒に、またはパッケージマネージャー経由でインストールが必要
SSE:ホスト型デプロイモデル
SSE サーバーはリモートサーバーにデプロイされ、ネットワーク経由でアクセスできます:
- インストール:サーバーに一度インストールすれば、複数ユーザーに対応可能
- 配布:単一のデプロイで多数のクライアントをサポート
- 更新:中央集中的な更新により、すべてのユーザーに即時反映
- リソース:ローカルマシンではなくサーバーリソースを使用
- アクセス制御:認証・認可システムによって管理
- 統合:ユーザー固有のリソースとの統合がより複雑
- 実行:独立したサービスとして常時稼働(通常は常時起動)
- 依存関係:ユーザーのマシンではなくサーバー側で管理
実践例
SSE を使用したデータベースクエリツールは以下のようになります:
- 中央サーバー上で実行
- サーバー側の認証情報でデータベースに接続
- 複数ユーザーに対して常に利用可能
- 適切なネットワークセキュリティ設定が必要
- コンテナまたはクラウド技術を用いてデプロイ
ハイブリッドアプローチ
特定のシナリオでは、ハイブリッドアプローチが有効です:
- ネットワークアクセス付き STDIO:ローカルの STDIO サーバーがリモートサービスへのプロキシとして動作
- ローカルコマンド付き SSE:リモートの SSE サーバーがクライアントマシン上でコールバック経由でアクションをトリガー
- ゲートウェイモード:ローカル操作用の STDIO サーバーが、専門的な SSE サーバーに接続
STDIO と SSE の選択基準
| 考慮事項 | STDIO | SSE |
|---|---|---|
| 場所 | ローカルマシンのみ | ローカルまたはリモート |
| クライアント数 | シングルクライアント | 複数クライアント |
| パフォーマンス | レイテンシが低い | レイテンシが高い(ネットワークオーバーヘッドあり) |
| セットアップの複雑さ | よりシンプル | より複雑(HTTP サーバーが必要) |
| セキュリティ | 本質的により安全 | 明示的なセキュリティ対策が必要 |
| ネットワークアクセス | 不要 | 必須 |
| スケーラビリティ | ローカルマシンに限定 | ネットワーク全体に分散可能 |
| デプロイメント | ユーザーごとのインストール | 中央集中的なインストール |
| 更新 | 分散型の更新 | 中央集中的な更新 |
| リソース使用 | クライアント側のリソース | サーバー側のリソース |
| 依存関係 | クライアント側の依存関係 | サーバー側の依存関係 |
VJSP でのトランスポート設定
VJSP における STDIO および SSE トランスポートの設定方法や設定例については、トランスポートタイプの理解 のセクションをご参照ください。
