From e091480a2515d90169b8ef493f29858bd372923f Mon Sep 17 00:00:00 2001 From: ophentis Date: Tue, 13 Oct 2026 09:32:00 +0800 Subject: [PATCH] Add 2026-07-28 protocol version to negotiation lists Adds MCP_2026_07_28 to ProtocolVersions and includes it in the default protocolVersions() lists for the base transport provider, Streamable HTTP server transport provider, stateless server transport, generic transport, and the Streamable HTTP client transport builder, so initialize negotiation can advertise and echo the latest published specification revision. This adds negotiation support only; feature work for the 2026-07-28 revision (Tasks extension, MCP Apps, etc.) remains tracked separately (e.g. SEP-2663 under the 2.2 milestone). Co-Authored-By: Claude Code --- .../transport/HttpClientStreamableHttpTransport.java | 2 +- ...HttpServletStreamableServerTransportProvider.java | 2 +- .../spec/McpServerTransportProviderBase.java | 2 +- .../spec/McpStatelessServerTransport.java | 2 +- .../io/modelcontextprotocol/spec/McpTransport.java | 2 +- .../modelcontextprotocol/spec/ProtocolVersions.java | 6 ++++++ ...amableHttpVersionNegotiationIntegrationTests.java | 12 ++++++------ .../server/McpServerProtocolVersionTests.java | 2 +- 8 files changed, 18 insertions(+), 12 deletions(-) diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java b/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java index e56a23f08..ceae846bf 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java @@ -679,7 +679,7 @@ public static class Builder { private Duration connectTimeout = Duration.ofSeconds(10); private List supportedProtocolVersions = List.of(ProtocolVersions.MCP_2025_03_26, - ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25); + ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25, ProtocolVersions.MCP_2026_07_28); private McpHttpClientTransportAuthorizationErrorHandler authorizationErrorHandler = McpHttpClientTransportAuthorizationErrorHandler.NOOP; diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java b/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java index 63e149ac9..db1c3e67b 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java @@ -981,7 +981,7 @@ public void close() { @Override public List protocolVersions() { return List.of(ProtocolVersions.MCP_2025_03_26, ProtocolVersions.MCP_2025_06_18, - ProtocolVersions.MCP_2025_11_25); + ProtocolVersions.MCP_2025_11_25, ProtocolVersions.MCP_2026_07_28); } public static Builder builder() { diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProviderBase.java b/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProviderBase.java index fa1ee055f..475f27c08 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProviderBase.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProviderBase.java @@ -83,7 +83,7 @@ default void close() { */ default List protocolVersions() { return List.of(ProtocolVersions.MCP_2024_11_05, ProtocolVersions.MCP_2025_03_26, - ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25); + ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25, ProtocolVersions.MCP_2026_07_28); } } diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpStatelessServerTransport.java b/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpStatelessServerTransport.java index ee28f5ff8..33277429c 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpStatelessServerTransport.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpStatelessServerTransport.java @@ -30,7 +30,7 @@ default void close() { default List protocolVersions() { return List.of(ProtocolVersions.MCP_2025_03_26, ProtocolVersions.MCP_2025_06_18, - ProtocolVersions.MCP_2025_11_25); + ProtocolVersions.MCP_2025_11_25, ProtocolVersions.MCP_2026_07_28); } } diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpTransport.java b/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpTransport.java index ab5fa3354..37fe4e840 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpTransport.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/spec/McpTransport.java @@ -102,7 +102,7 @@ static boolean isPeerClosed(Throwable t) { default List protocolVersions() { return List.of(ProtocolVersions.MCP_2024_11_05, ProtocolVersions.MCP_2025_03_26, - ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25); + ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25, ProtocolVersions.MCP_2026_07_28); } } diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/spec/ProtocolVersions.java b/mcp-core/src/main/java/io/modelcontextprotocol/spec/ProtocolVersions.java index d3d34db62..591781c7f 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/spec/ProtocolVersions.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/spec/ProtocolVersions.java @@ -26,4 +26,10 @@ public interface ProtocolVersions { */ String MCP_2025_11_25 = "2025-11-25"; + /** + * MCP protocol version for 2026-07-28. + * https://modelcontextprotocol.io/specification/2026-07-28 + */ + String MCP_2026_07_28 = "2026-07-28"; + } diff --git a/mcp-test/src/test/java/io/modelcontextprotocol/common/HttpClientStreamableHttpVersionNegotiationIntegrationTests.java b/mcp-test/src/test/java/io/modelcontextprotocol/common/HttpClientStreamableHttpVersionNegotiationIntegrationTests.java index 28432316c..0a43ee146 100644 --- a/mcp-test/src/test/java/io/modelcontextprotocol/common/HttpClientStreamableHttpVersionNegotiationIntegrationTests.java +++ b/mcp-test/src/test/java/io/modelcontextprotocol/common/HttpClientStreamableHttpVersionNegotiationIntegrationTests.java @@ -106,14 +106,14 @@ void usesLatestVersion() { .hasSize(3) .map(McpTestRequestRecordingServletFilter.Call::headers) .allSatisfy(headers -> assertThat(headers).containsEntry("mcp-protocol-version", - ProtocolVersions.MCP_2025_11_25)); + ProtocolVersions.MCP_2026_07_28)); assertThat(response).isNotNull(); assertThat(response.content()).hasSize(1) .first() .extracting(McpSchema.TextContent.class::cast) .extracting(McpSchema.TextContent::text) - .isEqualTo(ProtocolVersions.MCP_2025_11_25); + .isEqualTo(ProtocolVersions.MCP_2026_07_28); } } @@ -121,7 +121,7 @@ void usesLatestVersion() { @Test void usesServerSupportedVersion() { var transport = HttpClientStreamableHttpTransport.builder("http://localhost:" + PORT) - .supportedProtocolVersions(List.of(ProtocolVersions.MCP_2025_11_25, "2263-03-18")) + .supportedProtocolVersions(List.of(ProtocolVersions.MCP_2026_07_28, "2263-03-18")) .build(); try (var client = McpClient.sync(transport).build()) { client.initialize(); @@ -137,14 +137,14 @@ void usesServerSupportedVersion() { .hasSize(2) .map(McpTestRequestRecordingServletFilter.Call::headers) .allSatisfy(headers -> assertThat(headers).containsEntry("mcp-protocol-version", - ProtocolVersions.MCP_2025_11_25)); + ProtocolVersions.MCP_2026_07_28)); assertThat(response).isNotNull(); assertThat(response.content()).hasSize(1) .first() .extracting(McpSchema.TextContent.class::cast) .extracting(McpSchema.TextContent::text) - .isEqualTo(ProtocolVersions.MCP_2025_11_25); + .isEqualTo(ProtocolVersions.MCP_2026_07_28); } } @@ -155,7 +155,7 @@ void clientDoesNotSupportProtocolVersion20241105ByDefault() { // Testing it on the wire would require building a custom transport // We trust the protocolVersions() accessor instead assertThat(transport.protocolVersions()).containsExactly(ProtocolVersions.MCP_2025_03_26, - ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25); + ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25, ProtocolVersions.MCP_2026_07_28); } @Test diff --git a/mcp-test/src/test/java/io/modelcontextprotocol/server/McpServerProtocolVersionTests.java b/mcp-test/src/test/java/io/modelcontextprotocol/server/McpServerProtocolVersionTests.java index 3385b3a6e..b36f0e530 100644 --- a/mcp-test/src/test/java/io/modelcontextprotocol/server/McpServerProtocolVersionTests.java +++ b/mcp-test/src/test/java/io/modelcontextprotocol/server/McpServerProtocolVersionTests.java @@ -41,7 +41,7 @@ void shouldUseLatestVersionByDefault() { String requestId = UUID.randomUUID().toString(); - transportProvider.simulateIncomingMessage(jsonRpcInitializeRequest(requestId, ProtocolVersions.MCP_2025_11_25)); + transportProvider.simulateIncomingMessage(jsonRpcInitializeRequest(requestId, ProtocolVersions.MCP_2026_07_28)); McpSchema.JSONRPCMessage response = serverTransport.getLastSentMessage(); assertThat(response).isInstanceOf(McpSchema.JSONRPCResponse.class);