【ITニュース解説】MCP connection errors explained: 404 on /sse, 406 Not Acceptable, session 400s, 402
2026年10月09日に「Dev.to」が公開したITニュース「MCP connection errors explained: 404 on /sse, 406 Not Acceptable, session 400s, 402」について初心者にもわかりやすく解説しています。
ITニュース概要
MCP接続エラーは、間違ったURL利用や不適切なHTTPヘッダー(Content-Type, Accept)が主な原因だ。404はURL誤り、406/415はヘッダー不備を示す。Statefulサーバーでは初期化とセッションIDが必須で、欠けると400となる。402は支払い、タイムアウトは処理時間による。正しいURLとヘッダー設定、セッション管理、適切なタイムアウトが重要だ。
ITニュース解説
MCP、つまりMessage Control Protocolは、クライアントとサーバーが効率的に情報をやり取りするための約束事、つまりプロトコルの一種である。近年、このプロトコルはHTTP+SSEという旧来の方式から、Streamable HTTPという新しい方式へと進化している。この新しいStreamable HTTPでは、クライアントは単一のURLに対してデータを送信し、同じURLを通じてサーバーからの情報ストリームを受け取ることもできる。クライアントからのデータ送信は通常、JSON-RPCという形式で行われる。
しかし、このような通信の過程で、さまざまな接続エラーに遭遇することがある。これらのエラーは通常、クライアントが誤ったURLにアクセスしようとしたり、サーバーが要求するヘッダー情報を正しく送信しなかったりすることが原因で発生する。ここでは、主なエラーの種類とその意味、そしてシステムエンジニアを目指す初心者がどのように対処すべきかを解説する。
まず「404 Not Found」というエラーは、指定したリソースが見つからないことを意味する。MCPの文脈では、クライアントが誤ったURLに接続しようとした場合に発生することが多い。特に、旧プロトコル時代に使われていた/sseというパスを現在のStreamable HTTPサーバーに付加してしまったり、サーバーパスの末尾に不必要に/mcpを付け加えたりすると、サーバーは該当するリソースを見つけられずに404を返す。Streamable HTTPでは、提供されたURLをそのまま正確に使用することが重要だ。クライアントが古いプロトコルにのみ対応している場合は、間に変換を行う「ブリッジ」ツールを使うなどの対応が必要となる。
次に「406 Not Acceptable」というエラーは、クライアントがサーバーからの応答形式を適切に指定していない場合に発生する。MCPのクライアントがサーバーに情報を送信する際には、POSTリクエストのヘッダーに「Accept: application/json, text/event-stream」と明示的に含める必要がある。これは、サーバーがJSON形式のデータと、イベントストリーム(SSE)の両方で応答する可能性があるためだ。もしこのヘッダーが正しく設定されていないと、サーバーはクライアントが受け入れ可能な形式で応答できないと判断し、406エラーを返す。一般的なHTTPライブラリでは「Accept: /」のようなワイルドカードが使われることもあるが、MCPのサーバーではこれを拒否する場合があるため、指定された正確な形式でヘッダーを設定することが不可欠だ。
また「415 Unsupported Media Type」というエラーは、クライアントがサーバーに送信するデータの形式を誤った場合に発生する。MCPの通信では、リクエストボディはJSON-RPC形式であり、これは必ず「Content-Type: application/json」というヘッダーで示されなければならない。もしこのヘッダーが間違っていたり、不足していたりすると、サーバーは送られてきたデータ形式を理解できないため、415エラーとなる。例えば、単なるテキスト形式で送ったり、フォームエンコーディングを使ったりするとこのエラーに遭遇する可能性がある。
「400 Bad Request」は、サーバーがクライアントからのリクエスト内容を不正だと判断した場合に発生する汎用的なエラーだ。MCPにおいて、これは「Server not initialized」または「Missing session ID」というメッセージとともに表示されることが多い。これは、サーバーが「ステートフル」な動作をする場合に特に重要となる。ステートフルなサーバーは、クライアントとの間でセッション(通信の履歴)を管理しており、まず「initialize」という初期化リクエストを送信してセッションを開始する必要がある。この初期化の応答でサーバーから提供される「Mcp-Session-Id」というヘッダーを、以降のすべてのリクエストに含めて送らなければならない。もしこのセッションIDが欠落していたり、初期化前に特定のツールを呼び出そうとすると400エラーとなる。サーバーが再起動するなどしてセッション情報が失われた場合は「404 Session not found」というエラーになることもあり、その場合はクライアントは新しいセッションで再度初期化から始める必要がある。ただし、中にはTanodのサーバーのように「ステートレス」なものもあり、これらはセッション管理を必要としないため、セッションIDなしで直接ツールを呼び出すことができる。
「405 Method Not Allowed」は、サーバーが特定のリクエストメソッド(GETやPOSTなど)を受け付けないと判断した場合に発生する。MCPでは、サーバー側がクライアントからサーバーへの情報ストリームをGETリクエストで開くことを拒否する設定が可能だ。この場合に405エラーが発生することがあるが、これは接続自体が完全に失敗したわけではない。クライアントは引き続きPOSTリクエストでツールを呼び出すことが可能であり、機能は通常通り動作するため、このエラーに直面しても通信を継続して問題ない。
ウェブブラウザがMCPのURLにアクセスした際に「Webページやリダイレクト」が表示されることがある。これは、ブラウザが「Accept: text/html」というヘッダーを送信することで、サーバーがリクエストを人間からのものだと判断し、ウェブページや情報提供ページを返しているためだ。これはMCPクライアントからの通信とは異なり、MCPクライアントのPOSTリクエストによる通信には影響しない。
「402 Payment Required」は、その名の通り支払いを要求するエラーだ。これは、有料のサービスを提供するMCPサーバーにおいて、ツールの利用に対して料金が発生する場合に発生する。この場合、通常のHTTPステータスコードとしての402が返されることもあれば、ツールからの応答内に「isError: true」というフラグとともに「PaymentRequired」というオブジェクトが含まれることもある。このオブジェクトには、料金体系、ネットワーク、金額、支払い先などの詳細情報が含まれている。これを受け取ったクライアントは、必要な支払いを行い、その支払いの情報をリクエストのメタデータに含めて再度呼び出しを行う。料金を伴うサービスを利用する際には、この402エラーが適切に処理されることを確認する必要がある。
最後に、クライアントがサーバーへの呼び出し後に「ハングアップし、タイムアウトを報告する」ケースもある。これは特に、PDFのOCR処理や契約書の全体スキャンといった、処理に数秒から数十秒かかるツールを呼び出した場合に発生しやすい。クライアントアプリケーションは通常、応答がない場合に一定時間でタイムアウトするように設定されている。サーバーが非常に長い処理を伴う場合でも、Tanodのサーバーのように90秒以内に何らかの応答を返し、ハングアップではなく構造化されたエラーを返すことが望ましい。したがって、クライアント側でタイムアウト設定が短すぎる場合は、これを長く設定することで問題を解決できることが多い。サーバーがSSEによる進行状況通知を送ることで、プロキシ経由の接続でも接続を維持できる場合がある。
これらのエラーを回避し、MCPサーバーとの円滑な通信を確立するためには、いくつかの重要な点を心に留めておくべきである。第一に、サーバーから提供されたURLを正確に使い、不必要なパスを付加しないこと。第二に、POSTリクエストを送信する際には、「Content-Type: application/json」と「Accept: application/json, text/event-stream」というヘッダーを常に含めること。第三に、ステートフルなサーバーを使用する場合は、まず初期化を行い、セッションIDを適切に管理し、セッションが失われた場合は再初期化を行うこと。第四に、402エラーや「PaymentRequired」を含むツールエラーは、料金の見積もりとして正しく解釈すること。最後に、サーバー側の処理時間がかかる可能性がある場合は、クライアントのタイムアウト設定を適切に調整することである。これらのポイントを理解し、適切に対処することで、システムエンジニアを目指す初心者もMCPサーバーとの接続エラーを効率的に解決し、開発を進めることができるだろう。