From d7aa14473c8b0984800c262dd82ed40f92d27298 Mon Sep 17 00:00:00 2001 From: Satyadivya Maddipudi Date: Tue, 4 Aug 2026 10:05:25 -0700 Subject: [PATCH] Add MCP protocol version 2025-11-25 --- .../java/mcp/server/ProtocolVersion.java | 11 +++- .../smithy/java/mcp/server/McpServerTest.java | 38 +++++++++++++ .../java/mcp/server/ProtocolVersionTest.java | 56 +++++++++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 mcp/mcp-server/src/test/java/software/amazon/smithy/java/mcp/server/ProtocolVersionTest.java diff --git a/mcp/mcp-server/src/main/java/software/amazon/smithy/java/mcp/server/ProtocolVersion.java b/mcp/mcp-server/src/main/java/software/amazon/smithy/java/mcp/server/ProtocolVersion.java index b43d23d52f..555559a3b8 100644 --- a/mcp/mcp-server/src/main/java/software/amazon/smithy/java/mcp/server/ProtocolVersion.java +++ b/mcp/mcp-server/src/main/java/software/amazon/smithy/java/mcp/server/ProtocolVersion.java @@ -10,7 +10,15 @@ @SmithyUnstableApi public abstract sealed class ProtocolVersion implements Comparable permits ProtocolVersion.UnknownVersion, ProtocolVersion.v2024_11_05, ProtocolVersion.v2025_03_26, - ProtocolVersion.v2025_06_18 { + ProtocolVersion.v2025_06_18, ProtocolVersion.v2025_11_25 { + public static final class v2025_11_25 extends ProtocolVersion { + public static final v2025_11_25 INSTANCE = new v2025_11_25(); + + private v2025_11_25() { + super("2025-11-25"); + } + } + public static final class v2025_06_18 extends ProtocolVersion { public static final v2025_06_18 INSTANCE = new v2025_06_18(); @@ -69,6 +77,7 @@ public static ProtocolVersion version(String identifier) { case "2024-11-05" -> v2024_11_05.INSTANCE; case "2025-03-26" -> v2025_03_26.INSTANCE; case "2025-06-18" -> v2025_06_18.INSTANCE; + case "2025-11-25" -> v2025_11_25.INSTANCE; default -> new UnknownVersion(identifier); }; } diff --git a/mcp/mcp-server/src/test/java/software/amazon/smithy/java/mcp/server/McpServerTest.java b/mcp/mcp-server/src/test/java/software/amazon/smithy/java/mcp/server/McpServerTest.java index 9525ca4eab..326fef7d86 100644 --- a/mcp/mcp-server/src/test/java/software/amazon/smithy/java/mcp/server/McpServerTest.java +++ b/mcp/mcp-server/src/test/java/software/amazon/smithy/java/mcp/server/McpServerTest.java @@ -116,6 +116,44 @@ public void testPing() { assertTrue(response.getResult().asStringMap().isEmpty()); } + @Test + public void initializeWithV2025_11_25ProtocolVersion() { + server = McpServer.builder() + .name("smithy-mcp-server") + .input(input) + .output(output) + .addService("test-mcp", + ProxyService.builder() + .service(ShapeId.from("smithy.test#TestService")) + .proxyEndpoint("http://localhost") + .model(MODEL) + .build()) + .build(); + + server.start(); + + initializeWithProtocolVersion(ProtocolVersion.v2025_11_25.INSTANCE); + write("tools/list", Document.of(Map.of())); + var response = read(); + var tools = response.getResult().asStringMap().get("tools").asList(); + assertEquals(6, tools.size()); + + // 2025-11-25 >= 2025-06-18, so outputSchema must be retained. This is the positive + // mirror of noOutputSchemaWithUnsupportedProtocolVersion, which asserts it is stripped. + var tool = tools.stream() + .filter(t -> t.asStringMap().get("name").asString().equals("NoInputOperation")) + .findFirst() + .orElseThrow() + .asStringMap(); + + assertEquals("NoInputOperation", tool.get("name").asString()); + assertNotNull(tool.get("inputSchema")); + + var outputSchema = tool.get("outputSchema").asStringMap(); + assertEquals("object", outputSchema.get("type").asString()); + assertTrue(outputSchema.get("properties").asStringMap().containsKey("outputStr")); + } + @Test public void noOutputSchemaWithUnsupportedProtocolVersion() { server = McpServer.builder() diff --git a/mcp/mcp-server/src/test/java/software/amazon/smithy/java/mcp/server/ProtocolVersionTest.java b/mcp/mcp-server/src/test/java/software/amazon/smithy/java/mcp/server/ProtocolVersionTest.java new file mode 100644 index 0000000000..d95017e472 --- /dev/null +++ b/mcp/mcp-server/src/test/java/software/amazon/smithy/java/mcp/server/ProtocolVersionTest.java @@ -0,0 +1,56 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.java.mcp.server; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class ProtocolVersionTest { + + @Test + void knownVersionsResolveCorrectly() { + assertInstanceOf(ProtocolVersion.v2024_11_05.class, ProtocolVersion.version("2024-11-05")); + assertInstanceOf(ProtocolVersion.v2025_03_26.class, ProtocolVersion.version("2025-03-26")); + assertInstanceOf(ProtocolVersion.v2025_06_18.class, ProtocolVersion.version("2025-06-18")); + assertInstanceOf(ProtocolVersion.v2025_11_25.class, ProtocolVersion.version("2025-11-25")); + } + + @Test + void unknownVersionReturnsUnknownVersion() { + var version = ProtocolVersion.version("9999-01-01"); + assertInstanceOf(ProtocolVersion.UnknownVersion.class, version); + assertEquals("9999-01-01", version.identifier()); + } + + @Test + void nullVersionResolvesToDefault() { + var version = ProtocolVersion.version(null); + assertEquals(ProtocolVersion.defaultVersion(), version); + } + + @Test + void defaultVersionIs2025_03_26() { + assertEquals("2025-03-26", ProtocolVersion.defaultVersion().identifier()); + } + + @Test + void compareToOrdersChronologically() { + assertTrue(ProtocolVersion.v2024_11_05.INSTANCE.compareTo(ProtocolVersion.v2025_03_26.INSTANCE) < 0); + assertTrue(ProtocolVersion.v2025_03_26.INSTANCE.compareTo(ProtocolVersion.v2025_06_18.INSTANCE) < 0); + assertTrue(ProtocolVersion.v2025_06_18.INSTANCE.compareTo(ProtocolVersion.v2025_11_25.INSTANCE) < 0); + assertEquals(0, ProtocolVersion.v2025_11_25.INSTANCE.compareTo(ProtocolVersion.v2025_11_25.INSTANCE)); + } + + @Test + void knownVersionsRankAboveUnknown() { + var unknown = ProtocolVersion.version("0000-00-00"); + assertTrue(ProtocolVersion.v2024_11_05.INSTANCE.compareTo(unknown) > 0); + assertTrue(ProtocolVersion.v2025_11_25.INSTANCE.compareTo(unknown) > 0); + } +}