Skip to content

Commit 5e035ea

Browse files
committed
fix: add backward compatibility for MCP servers returning older protocol versions
- Add ProtocolVersions interface with version constants - Change protocolVersion() to protocolVersions() returning List<String> - Streamable HTTP clients now support both 2024-11-05 and 2025-03-26 - Fixes compatibility with MCP servers that return 2024-11-05 instead of 2025-03-26 Resolves #436 Related to #438 Signed-off-by: Christian Tzolov <[email protected]>
1 parent 577952d commit 5e035ea

26 files changed

+107
-54
lines changed

mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebClientStreamableHttpTransport.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.modelcontextprotocol.spec.McpTransportSession;
3535
import io.modelcontextprotocol.spec.McpTransportSessionNotFoundException;
3636
import io.modelcontextprotocol.spec.McpTransportStream;
37+
import io.modelcontextprotocol.spec.ProtocolVersions;
3738
import io.modelcontextprotocol.util.Assert;
3839
import io.modelcontextprotocol.util.Utils;
3940
import reactor.core.Disposable;
@@ -71,7 +72,7 @@ public class WebClientStreamableHttpTransport implements McpClientTransport {
7172

7273
private static final Logger logger = LoggerFactory.getLogger(WebClientStreamableHttpTransport.class);
7374

74-
private static final String MCP_PROTOCOL_VERSION = "2025-03-26";
75+
private static final String MCP_PROTOCOL_VERSION = ProtocolVersions.MCP_2025_03_26;
7576

7677
private static final String DEFAULT_ENDPOINT = "/mcp";
7778

@@ -111,8 +112,8 @@ private WebClientStreamableHttpTransport(ObjectMapper objectMapper, WebClient.Bu
111112
}
112113

113114
@Override
114-
public String protocolVersion() {
115-
return MCP_PROTOCOL_VERSION;
115+
public List<String> protocolVersions() {
116+
return List.of(ProtocolVersions.MCP_2024_11_05, ProtocolVersions.MCP_2025_03_26);
116117
}
117118

118119
/**

mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebFluxSseClientTransport.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package io.modelcontextprotocol.client.transport;
66

77
import java.io.IOException;
8+
import java.util.List;
89
import java.util.function.BiConsumer;
910
import java.util.function.Function;
1011

@@ -16,6 +17,7 @@
1617
import io.modelcontextprotocol.spec.McpError;
1718
import io.modelcontextprotocol.spec.McpSchema;
1819
import io.modelcontextprotocol.spec.McpSchema.JSONRPCMessage;
20+
import io.modelcontextprotocol.spec.ProtocolVersions;
1921
import io.modelcontextprotocol.util.Assert;
2022
import org.slf4j.Logger;
2123
import org.slf4j.LoggerFactory;
@@ -65,7 +67,7 @@ public class WebFluxSseClientTransport implements McpClientTransport {
6567

6668
private static final Logger logger = LoggerFactory.getLogger(WebFluxSseClientTransport.class);
6769

68-
private static final String MCP_PROTOCOL_VERSION = "2024-11-05";
70+
private static final String MCP_PROTOCOL_VERSION = ProtocolVersions.MCP_2024_11_05;
6971

7072
/**
7173
* Event type for JSON-RPC messages received through the SSE connection. The server
@@ -172,8 +174,8 @@ public WebFluxSseClientTransport(WebClient.Builder webClientBuilder, ObjectMappe
172174
}
173175

174176
@Override
175-
public String protocolVersion() {
176-
return MCP_PROTOCOL_VERSION;
177+
public List<String> protocolVersions() {
178+
return List.of(MCP_PROTOCOL_VERSION);
177179
}
178180

179181
/**

mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.io.IOException;
88
import java.time.Duration;
9+
import java.util.List;
910
import java.util.concurrent.ConcurrentHashMap;
1011

1112
import com.fasterxml.jackson.core.type.TypeReference;
@@ -15,6 +16,7 @@
1516
import io.modelcontextprotocol.spec.McpServerSession;
1617
import io.modelcontextprotocol.spec.McpServerTransport;
1718
import io.modelcontextprotocol.spec.McpServerTransportProvider;
19+
import io.modelcontextprotocol.spec.ProtocolVersions;
1820
import io.modelcontextprotocol.util.Assert;
1921
import io.modelcontextprotocol.util.KeepAliveScheduler;
2022

@@ -219,8 +221,8 @@ public WebFluxSseServerTransportProvider(ObjectMapper objectMapper, String baseU
219221
}
220222

221223
@Override
222-
public String protocolVersion() {
223-
return "2024-11-05";
224+
public List<String> protocolVersions() {
225+
return List.of(ProtocolVersions.MCP_2024_11_05);
224226
}
225227

226228
@Override

mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxStreamableServerTransportProvider.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.modelcontextprotocol.spec.McpStreamableServerSession;
1515
import io.modelcontextprotocol.spec.McpStreamableServerTransport;
1616
import io.modelcontextprotocol.spec.McpStreamableServerTransportProvider;
17+
import io.modelcontextprotocol.spec.ProtocolVersions;
1718
import io.modelcontextprotocol.server.McpTransportContext;
1819
import io.modelcontextprotocol.util.Assert;
1920
import io.modelcontextprotocol.util.KeepAliveScheduler;
@@ -96,8 +97,8 @@ private WebFluxStreamableServerTransportProvider(ObjectMapper objectMapper, Stri
9697
}
9798

9899
@Override
99-
public String protocolVersion() {
100-
return "2025-03-26";
100+
public List<String> protocolVersions() {
101+
return List.of(ProtocolVersions.MCP_2024_11_05, ProtocolVersions.MCP_2025_03_26);
101102
}
102103

103104
@Override

mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.io.IOException;
88
import java.time.Duration;
9+
import java.util.List;
910
import java.util.UUID;
1011
import java.util.concurrent.ConcurrentHashMap;
1112
import java.util.concurrent.locks.ReentrantLock;
@@ -16,6 +17,7 @@
1617
import io.modelcontextprotocol.spec.McpSchema;
1718
import io.modelcontextprotocol.spec.McpServerTransport;
1819
import io.modelcontextprotocol.spec.McpServerTransportProvider;
20+
import io.modelcontextprotocol.spec.ProtocolVersions;
1921
import io.modelcontextprotocol.spec.McpServerSession;
2022
import io.modelcontextprotocol.util.Assert;
2123
import io.modelcontextprotocol.util.KeepAliveScheduler;
@@ -210,8 +212,8 @@ public WebMvcSseServerTransportProvider(ObjectMapper objectMapper, String baseUr
210212
}
211213

212214
@Override
213-
public String protocolVersion() {
214-
return "2024-11-05";
215+
public List<String> protocolVersions() {
216+
return List.of(ProtocolVersions.MCP_2024_11_05);
215217
}
216218

217219
@Override

mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcStreamableServerTransportProvider.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.modelcontextprotocol.spec.McpStreamableServerSession;
3333
import io.modelcontextprotocol.spec.McpStreamableServerTransport;
3434
import io.modelcontextprotocol.spec.McpStreamableServerTransportProvider;
35+
import io.modelcontextprotocol.spec.ProtocolVersions;
3536
import io.modelcontextprotocol.util.Assert;
3637
import io.modelcontextprotocol.util.KeepAliveScheduler;
3738
import reactor.core.publisher.Flux;
@@ -142,8 +143,8 @@ private WebMvcStreamableServerTransportProvider(ObjectMapper objectMapper, Strin
142143
}
143144

144145
@Override
145-
public String protocolVersion() {
146-
return "2025-03-26";
146+
public List<String> protocolVersions() {
147+
return List.of(ProtocolVersions.MCP_2024_11_05, ProtocolVersions.MCP_2025_03_26);
147148
}
148149

149150
@Override

mcp/src/main/java/io/modelcontextprotocol/client/LifecycleInitializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,8 @@ public <T> Mono<T> withIntitialization(String actionName, Function<Initializatio
290290
.timeout(this.initializationTimeout)
291291
.onErrorResume(ex -> {
292292
logger.warn("Failed to initialize", ex);
293-
return Mono.error(new McpError("Client failed to initialize " + actionName));
293+
return Mono.error(
294+
new McpError("Client failed to initialize " + actionName + " due to: " + ex.getMessage()));
294295
})
295296
.flatMap(operation);
296297
});

mcp/src/main/java/io/modelcontextprotocol/client/McpAsyncClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,9 @@ public class McpAsyncClient {
272272
notificationHandlers.put(McpSchema.METHOD_NOTIFICATION_PROGRESS,
273273
asyncProgressNotificationHandler(progressConsumersFinal));
274274

275-
this.initializer = new LifecycleInitializer(clientCapabilities, clientInfo,
276-
List.of(transport.protocolVersion()), initializationTimeout, ctx -> new McpClientSession(requestTimeout,
277-
transport, requestHandlers, notificationHandlers, con -> con.contextWrite(ctx)));
275+
this.initializer = new LifecycleInitializer(clientCapabilities, clientInfo, transport.protocolVersions(),
276+
initializationTimeout, ctx -> new McpClientSession(requestTimeout, transport, requestHandlers,
277+
notificationHandlers, con -> con.contextWrite(ctx)));
278278
this.transport.setExceptionHandler(this.initializer::handleException);
279279
}
280280

mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.net.http.HttpRequest;
1111
import java.net.http.HttpResponse;
1212
import java.time.Duration;
13+
import java.util.List;
1314
import java.util.concurrent.CompletableFuture;
1415
import java.util.concurrent.atomic.AtomicReference;
1516
import java.util.function.Consumer;
@@ -25,6 +26,7 @@
2526
import io.modelcontextprotocol.spec.McpClientTransport;
2627
import io.modelcontextprotocol.spec.McpError;
2728
import io.modelcontextprotocol.spec.McpSchema;
29+
import io.modelcontextprotocol.spec.ProtocolVersions;
2830
import io.modelcontextprotocol.spec.McpSchema.JSONRPCMessage;
2931
import io.modelcontextprotocol.util.Assert;
3032
import io.modelcontextprotocol.util.Utils;
@@ -62,7 +64,7 @@
6264
*/
6365
public class HttpClientSseClientTransport implements McpClientTransport {
6466

65-
private static final String MCP_PROTOCOL_VERSION = "2024-11-05";
67+
private static final String MCP_PROTOCOL_VERSION = ProtocolVersions.MCP_2024_11_05;
6668

6769
private static final String MCP_PROTOCOL_VERSION_HEADER_NAME = "MCP-Protocol-Version";
6870

@@ -217,8 +219,8 @@ public HttpClientSseClientTransport(HttpClient.Builder clientBuilder, HttpReques
217219
}
218220

219221
@Override
220-
public String protocolVersion() {
221-
return MCP_PROTOCOL_VERSION;
222+
public List<String> protocolVersions() {
223+
return List.of(ProtocolVersions.MCP_2024_11_05);
222224
}
223225

224226
/**

mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.modelcontextprotocol.spec.McpTransportSession;
3636
import io.modelcontextprotocol.spec.McpTransportSessionNotFoundException;
3737
import io.modelcontextprotocol.spec.McpTransportStream;
38+
import io.modelcontextprotocol.spec.ProtocolVersions;
3839
import io.modelcontextprotocol.util.Assert;
3940
import io.modelcontextprotocol.util.Utils;
4041
import reactor.core.Disposable;
@@ -73,7 +74,7 @@ public class HttpClientStreamableHttpTransport implements McpClientTransport {
7374

7475
private static final Logger logger = LoggerFactory.getLogger(HttpClientStreamableHttpTransport.class);
7576

76-
private static final String MCP_PROTOCOL_VERSION = "2025-03-26";
77+
private static final String MCP_PROTOCOL_VERSION = ProtocolVersions.MCP_2025_03_26;
7778

7879
private static final String DEFAULT_ENDPOINT = "/mcp";
7980

@@ -135,8 +136,8 @@ private HttpClientStreamableHttpTransport(ObjectMapper objectMapper, HttpClient
135136
}
136137

137138
@Override
138-
public String protocolVersion() {
139-
return MCP_PROTOCOL_VERSION;
139+
public List<String> protocolVersions() {
140+
return List.of(ProtocolVersions.MCP_2024_11_05, ProtocolVersions.MCP_2025_03_26);
140141
}
141142

142143
public static Builder builder(String baseUri) {

0 commit comments

Comments
 (0)