- MCP(Model Context Protocol) は、LLMが外部世界と相互作用するための標準化された連携方式を提供する
- 最近ではIBMの ACP やGoogleの A2A など類似の標準が登場し、MCP実装および関連ツールが急速に増えている
- しかし、設計上の混乱、文書不足、実際のプロトコル仕様の不足 など、未成熟なエンジニアリング慣行が問題点として指摘されている
- HTTP+SSE および Streamable HTTP のような現在提案されている転送方式は、複雑性とセキュリティ問題を増大させており、代替としてWebSocketの利用が推奨される
- 最新のプロトコルは、認可とセッション管理 において一貫性がなく、過度な複雑さを追加している
MCPと最近の動向の検討
- MCP は、アプリケーションが 大規模言語モデル(LLM) にコンテキストを提供する方法を標準化するために作られた公開プロトコルである
- この1か月で、MCPはLLMを エージェント にする中核標準として浮上し、活用と実装が急速に広がっている
- IBMの ACP やGoogleの A2A のように、似た目的を持つオーソドックスな標準も急速に登場している
エンジニアリング慣行とプロトコル仕様の問題点
- 実際の実装および文書化の水準が低いことが各所で明らかになっている
- 大手テック企業はモデル訓練に莫大な投資を行う一方で、SDKやドキュメント の品質は低く、利用者の混乱を招いている
- MCPも同様の問題を示しており、一部の設計は不合理で、仕様・例・ガイドラインが不足している状態である
転送プロトコル(Transport)の議論
stdio転送方式
- Stdio は、MCPサーバーとクライアントをローカルでパイプ(
stdout, stdin)により直接接続する伝統的な方式である
- 複雑なソケット処理やOSごとの差異が少なく、環境変数、入出力ストリームなど 簡潔な環境構成 が可能である
HTTP+SSE / Streamable HTTP方式
- Web時代に合わせてHTTPベースにも対応しようという意図のもと、HTTP+SSE と Streamable HTTP 方式が採用された
- しかしこの方式は、WebSocketの代替 を目指しながら、かえってより多くの曖昧さ、設計上の混乱、複雑性を引き起こしている
- 1つのセッションと接続が複数の方法で生成・終了し得るため、サーバーの状態管理とセキュリティの面で 大きな負担 となる
MCPサーバー/クライアント実装事例における困難
- 公式 Go SDK の不在など、複数言語でサポート不足の問題が目立つ
- ドキュメントと仕様が不明確なため、実際には リバースエンジニアリング によって実装しなければならない場合が多い
- 例示サーバーの多くが Python, JavaScript ベースであるにもかかわらず、依存性や移植性の問題により業務環境への適用が難しい
- サーバー実装では SSE/Streamable HTTP がソケットを装っているものの、実際にはセッションと接続状態を一貫して維持しにくく、メッセージキューなど別個のインフラが必要になる
HTTP+SSEおよびStreamable HTTPの構造と問題点
HTTP+SSEモード
- クライアントはサーバーとSSEセッションを開き、別エンドポイントに書き込み要求を行うと、サーバーは202応答を返し、既存のSSE接続を通じて応答を送信する
- セッション接続および状態同期の維持などが必要だが、この過程は文書化も不十分で、運用の複雑性が非常に高い
Streamable HTTPモード
- セッション生成・SSEオープン・応答伝達 のすべてで複数の方式が混在し、1つの要求〜応答フローに一貫性がない
- 複数の状態管理、さまざまなエンドポイントおよびヘッダー方式が混在し、実質的な実装と拡張性 に深刻な障害要因を生んでいる
一般的な含意
- 技術的複雑性の増大とともに、開発者の 認知負荷・保守負担 が大きくなり、多様なサーバー・クライアント実装の中で 互換性の不一致、予測不能な動作 の問題が浮上する
- サーバーはすべての状態と接続状況を追跡しなければならず、分散環境では効率的なスケーリングと状態同期がさらに難しくなる
セキュリティ上の含意
- 細分化され多様化した接続/セッション方式は、セッションハイジャック、リプレイ攻撃、サービス拒否(DoS) といった 状態管理上のセキュリティ脆弱性 を高める
- 複数の入口と応答方式が攻撃面を拡大し、意図しないフローによって 悪意ある活動を隠蔽 しやすくする
認可(Authorization)プロトコルの混乱
- 現在の仕様は、HTTP転送時にのみOAuth2 などを強制し、STDIO転送時には任意に環境変数を使用 するなど、一貫性のないルールを適用している
- なぜHTTP転送にだけ複雑なOAuth2実装を強いるのか、といった混乱や不合理がある
改善案の提言
- 1つの JSON RPCプロトコル に対して、転送方式は実質的に StdioとWebSocket のみを中心に単純化する必要がある
- Stdio環境の変数はHTTP環境のヘッダーへ、入力・出力はそれぞれWebSocketの双方向ストリームへ対応付ける形が望ましい
- 不要なセッション追跡、状態管理、数多くの例外処理を排除できる
- WebSocketがすべてのHTTPベース転送の標準的選択肢となるべきであり、複雑な状態同期の問題も解決できる
代替プロトコルとの比較、市場動向
- IBMの ACP およびGoogleの A2A は、エージェント相互運用の面でより簡潔なTransport設計とエージェント探索機能を提供する
- しかし本質的には、その大半はMCP構築環境内で別ツールとして統合できる水準にとどまる
- 新しいプロトコルが次々と登場する現象は 標準の乱立 につながるリスクがあるため、Transportの単純さを優先することが業界成長に重要である
1件のコメント
Hacker Newsの意見
agents.jsonファイルをWebルートに置き、意味的な対話を通じてエージェント同士が自動的に解決する方式の方が直感的かもしれない。結果としてHTTPがエージェント標準の入出力になるninja.aiというRuby on RailsベースのMCPサービスを作っている。これはワンクリックでMCPサーバーをインストールできるアプリストアだ。クライアント端末にはTauriを使ってModel Context Protocolサーバーをインストールし、RailsでクラウドMCPサーバーも提供している。HTTP+SSEやStreamable HTTPの機能には批判的だ。双方向のリアルタイム通信にはWebSocketsの方が優れており、RailsのSSEサポートには制限があるため、Falconウェブサーバーへエンドポイントを移行することになった。ShopifyのエンジニアがなぜStreamable HTTPを選んだのか気になる。おそらくインフラやデプロイ上の制約が理由かもしれない。MCPのトランスポート層が抽象化されている点にも注目すべきで、将来の実装でWebSocketsやWebRTCが採用される余地は十分にある