Skip to content

MCP サーバーのトランスポートメカニズム:STDIO と SSE

Model Context Protocol(MCP)は、VJSP と MCP サーバー間の通信に、標準入出力(STDIO)および Server-Sent Events(SSE)という2つの主要なトランスポートメカニズムをサポートしています。各メカニズムには独自の特性、利点、および適したユースケースがあります。

STDIO トランスポート

STDIO トランスポートは、同じマシン上でローカルに動作し、標準入出力ストリームを介して通信を行います。

STDIO トランスポートの仕組み

  1. クライアント(VJSP)が MCP サーバーを子プロセスとして起動します
  2. クライアントはサーバーの STDIN に書き込み、サーバーは STDOUT を通じて応答します
  3. 各メッセージは改行文字で区切られます
  4. メッセージは 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 トランスポートの仕組み

  1. クライアント(VJSP)が HTTP GET リクエストでサーバーの SSE エンドポイントに接続します
  2. 永続的な接続が確立され、サーバーがイベントをクライアントにプッシュできるようになります
  3. クライアントからサーバーへの通信には、別途 HTTP POST リクエストを別のエンドポイントに送信します
  4. 通信は以下の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 を使用したデータベースクエリツールは以下のようになります:

  • 中央サーバー上で実行
  • サーバー側の認証情報でデータベースに接続
  • 複数ユーザーに対して常に利用可能
  • 適切なネットワークセキュリティ設定が必要
  • コンテナまたはクラウド技術を用いてデプロイ

ハイブリッドアプローチ

特定のシナリオでは、ハイブリッドアプローチが有効です:

  1. ネットワークアクセス付き STDIO:ローカルの STDIO サーバーがリモートサービスへのプロキシとして動作
  2. ローカルコマンド付き SSE:リモートの SSE サーバーがクライアントマシン上でコールバック経由でアクションをトリガー
  3. ゲートウェイモード:ローカル操作用の STDIO サーバーが、専門的な SSE サーバーに接続

STDIO と SSE の選択基準

考慮事項STDIOSSE
場所ローカルマシンのみローカルまたはリモート
クライアント数シングルクライアント複数クライアント
パフォーマンスレイテンシが低いレイテンシが高い(ネットワークオーバーヘッドあり)
セットアップの複雑さよりシンプルより複雑(HTTP サーバーが必要)
セキュリティ本質的により安全明示的なセキュリティ対策が必要
ネットワークアクセス不要必須
スケーラビリティローカルマシンに限定ネットワーク全体に分散可能
デプロイメントユーザーごとのインストール中央集中的なインストール
更新分散型の更新中央集中的な更新
リソース使用クライアント側のリソースサーバー側のリソース
依存関係クライアント側の依存関係サーバー側の依存関係

VJSP でのトランスポート設定

VJSP における STDIO および SSE トランスポートの設定方法や設定例については、トランスポートタイプの理解 のセクションをご参照ください。