Streamable HTTP accepts unsupported or malformed MCP-Protocol-Version headers
まだ誰も着手していません。
評価
調査の方向性
Streamable HTTP サーバートランスポートのリクエストエントリポイントから開始し、提供された curl シーケンスで問題を再現して、サポートされていない MCP-Protocol-Version 値と不正な形式の MCP-Protocol-Version 値の両方をテストします。リクエストディスパッチ前の検証を追跡し、両方のケースが HTTP 200 ではなく HTTP 400 を返すようにトランスポートのテストを追加または更新します。
索引モデルが issue の本文から書いたものです。
説明
Bug description
After a normal Streamable HTTP initialization flow, the server transport accepts requests with an unsupported or malformed MCP-Protocol-Version header and dispatches them normally with HTTP 200. The MCP Streamable HTTP specification for 2025-11-25 requires that if a server receives a request with an invalid or unsupported MCP-Protocol-Version, it MUST respond with HTTP 400 Bad Request.
This is a server-side validation issue. It is separate from client-side fixes that make the Java SDK client send the negotiated protocol version correctly.
Environment
- Java SDK: reproduced with
v1.1.2 - Also reproduced with a
mainsnapshot from 2026-05-11 (87e2c7d4dec60dc98a981ff24fedc2afc960de72) - Transport: Streamable HTTP server
- Java: Java 17 target
- Spring MCP integration: not required for reproduction
- Vector store: not used
Steps to reproduce
- Start a Java SDK Streamable HTTP server.
- Complete a normal
initializefollowed bynotifications/initializedflow. - Send a valid JSON-RPC request, such as
tools/list, withMCP-Protocol-Versionset to a well-formed but unsupported value such as1900-01-01. - Repeat with a malformed value such as
not-a-version. - Observe that the request is dispatched and returns HTTP 200.
Expected behavior
The server should reject the request before dispatching it:
HTTP/1.1 400 Bad Request
Minimal Complete Reproducible example
Set ENDPOINT to a Java SDK Streamable HTTP endpoint:
ENDPOINT=http://127.0.0.1:8080/mcp
Initialize and copy the returned Mcp-Session-Id header into SID:
curl -i -sS --http1.1 -X POST "$ENDPOINT" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2025-11-25' \
--data '{"jsonrpc":"2.0","id":"init-1","method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"version-header-repro","version":"0.1.0"}}}'
Send the initialized notification:
curl -i -sS --http1.1 -X POST "$ENDPOINT" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2025-11-25' \
-H "Mcp-Session-Id: $SID" \
--data '{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}'
Send an otherwise valid request with an unsupported protocol version:
curl -i -sS --http1.1 -X POST "$ENDPOINT" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 1900-01-01' \
-H "Mcp-Session-Id: $SID" \
--data '{"jsonrpc":"2.0","id":"bad-version-1","method":"tools/list","params":{}}'
Observed response:
HTTP/1.1 200 OK
{"jsonrpc":"2.0","result":{"tools":[...]},"id":"bad-version-1"}
The same behavior is observed with a malformed header value:
curl -i -sS --http1.1 -X POST "$ENDPOINT" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: not-a-version' \
-H "Mcp-Session-Id: $SID" \
--data '{"jsonrpc":"2.0","id":"bad-version-2","method":"tools/list","params":{}}'
Observed response:
HTTP/1.1 200 OK
{"jsonrpc":"2.0","result":{...},"id":"bad-version-2"}
Additional context
- Related: #436 reports a client-side failure when a server responds with an unsupported protocol version during initialization. This is the opposite direction: the Java SDK server accepts unsupported or malformed protocol-version headers on subsequent HTTP requests.
- Related: #883 and #931 discuss client-side version emission on GET reconnect. Those are useful context, but this report is about server-side validation before dispatch.
- 主要言語
- Java
- スター
- 3.7k
- フォーク
- 1.1k
- 平均マージ
- 1日 15時間
- マージ済み PR(30日)
- 9
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
modelcontextprotocol/java-sdk のほかの issue
-
area/transport bug P2
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
modelcontextprotocol/java-sdk#1136 ·
-
area/client bug P2
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
modelcontextprotocol/java-sdk#1124 · コメント 1 件 ·
-
ServerCapabilities.logging is added unconditionally, overriding the caller's explicit capabilities オープンbug P2 ready for work
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
modelcontextprotocol/java-sdk#1086 · コメント 1 件 ·
-
enhancement good first issue P3
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
modelcontextprotocol/java-sdk#1067 ·
-
bug P2 ready for work
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
modelcontextprotocol/java-sdk#898 · コメント 1 件 ·
modelcontextprotocol/java-sdk の issue をすべて見る
似ている issue
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
apache/cloudstack#14222 ·
-
[BUG]茶杯方块在取茶时会引发崩溃 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
-
1.0.0-alpha2 Type/Improvement
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
wso2/dpdp-accelerator#272 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
infinispan/infinispan#18150 ·
-
area/frontend
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100