diff --git a/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebClientStreamableHttpTransport.java b/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebClientStreamableHttpTransport.java index 53b59cb3..bd530e38 100644 --- a/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebClientStreamableHttpTransport.java +++ b/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebClientStreamableHttpTransport.java @@ -65,6 +65,10 @@ public class WebClientStreamableHttpTransport implements McpClientTransport { private static final Logger logger = LoggerFactory.getLogger(WebClientStreamableHttpTransport.class); + private static final String MCP_PROTOCOL_VERSION = "2025-06-18"; + + private static final String MCP_PROTOCOL_VERSION_HEADER_NAME = "MCP-Protocol-Version"; + private static final String DEFAULT_ENDPOINT = "/mcp"; /** @@ -127,12 +131,20 @@ public Mono connect(Function, Mono> onClose = sessionId -> sessionId == null ? Mono.empty() - : webClient.delete().uri(this.endpoint).headers(httpHeaders -> { - httpHeaders.add("mcp-session-id", sessionId); - }).retrieve().toBodilessEntity().onErrorComplete(e -> { - logger.warn("Got error when closing transport", e); - return true; - }).then(); + : webClient.delete() + .uri(this.endpoint) + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) + .headers(httpHeaders -> { + httpHeaders.add("mcp-session-id", sessionId); + httpHeaders.add(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION); + }) + .retrieve() + .toBodilessEntity() + .onErrorComplete(e -> { + logger.warn("Got error when closing transport", e); + return true; + }) + .then(); return new DefaultMcpTransportSession(onClose); } @@ -185,6 +197,7 @@ private Mono reconnect(McpTransportStream stream) { Disposable connection = webClient.get() .uri(this.endpoint) .accept(MediaType.TEXT_EVENT_STREAM) + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .headers(httpHeaders -> { transportSession.sessionId().ifPresent(id -> httpHeaders.add("mcp-session-id", id)); if (stream != null) { @@ -245,6 +258,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message) { Disposable connection = webClient.post() .uri(this.endpoint) .accept(MediaType.TEXT_EVENT_STREAM, MediaType.APPLICATION_JSON) + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .headers(httpHeaders -> { transportSession.sessionId().ifPresent(id -> httpHeaders.add("mcp-session-id", id)); }) diff --git a/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebFluxSseClientTransport.java b/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebFluxSseClientTransport.java index 128cda4c..3aa4e5d7 100644 --- a/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebFluxSseClientTransport.java +++ b/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/client/transport/WebFluxSseClientTransport.java @@ -62,6 +62,10 @@ public class WebFluxSseClientTransport implements McpClientTransport { private static final Logger logger = LoggerFactory.getLogger(WebFluxSseClientTransport.class); + private static final String MCP_PROTOCOL_VERSION = "2024-11-05"; + + private static final String MCP_PROTOCOL_VERSION_HEADER_NAME = "MCP-Protocol-Version"; + /** * Event type for JSON-RPC messages received through the SSE connection. The server * sends messages with this event type to transmit JSON-RPC protocol data. @@ -249,6 +253,7 @@ public Mono sendMessage(JSONRPCMessage message) { return webClient.post() .uri(messageEndpointUri) .contentType(MediaType.APPLICATION_JSON) + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .bodyValue(jsonText) .retrieve() .toBodilessEntity() @@ -281,6 +286,7 @@ protected Flux> eventStream() {// @formatter:off .get() .uri(this.sseEndpoint) .accept(MediaType.TEXT_EVENT_STREAM) + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .retrieve() .bodyToFlux(SSE_TYPE) .retryWhen(Retry.from(retrySignal -> retrySignal.handle(inboundRetryHandler))); diff --git a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java index 8598e316..f4c692f9 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java +++ b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java @@ -61,6 +61,10 @@ */ public class HttpClientSseClientTransport implements McpClientTransport { + private static final String MCP_PROTOCOL_VERSION = "2024-11-05"; + + private static final String MCP_PROTOCOL_VERSION_HEADER_NAME = "MCP-Protocol-Version"; + private static final Logger logger = LoggerFactory.getLogger(HttpClientSseClientTransport.class); /** SSE event type for JSON-RPC messages */ @@ -330,6 +334,7 @@ public Mono connect(Function, Mono> h .uri(Utils.resolveUri(this.baseUri, this.sseEndpoint)) .header("Accept", "text/event-stream") .header("Cache-Control", "no-cache") + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .GET() .build(); @@ -457,6 +462,7 @@ private Mono> sendHttpPost(final String endpoint, final Str final URI requestUri = Utils.resolveUri(baseUri, endpoint); final HttpRequest request = this.requestBuilder.copy() .uri(requestUri) + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .POST(HttpRequest.BodyPublishers.ofString(body)) .build(); diff --git a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java index 4cf1690f..97dff9fe 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java +++ b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientStreamableHttpTransport.java @@ -72,6 +72,10 @@ public class HttpClientStreamableHttpTransport implements McpClientTransport { private static final Logger logger = LoggerFactory.getLogger(HttpClientStreamableHttpTransport.class); + private static final String MCP_PROTOCOL_VERSION = "2025-06-18"; + + private static final String MCP_PROTOCOL_VERSION_HEADER_NAME = "MCP-Protocol-Version"; + private static final String DEFAULT_ENDPOINT = "/mcp"; /** @@ -158,6 +162,7 @@ private Publisher createDelete(String sessionId) { .uri(Utils.resolveUri(this.baseUri, this.endpoint)) .header("Cache-Control", "no-cache") .header("mcp-session-id", sessionId) + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .DELETE() .build(); @@ -222,6 +227,7 @@ private Mono reconnect(McpTransportStream stream) { HttpRequest request = requestBuilder.uri(Utils.resolveUri(this.baseUri, this.endpoint)) .header("Accept", TEXT_EVENT_STREAM) .header("Cache-Control", "no-cache") + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .GET() .build(); @@ -361,6 +367,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage sendMessage) { .header("Accept", TEXT_EVENT_STREAM + ", " + APPLICATION_JSON) .header("Content-Type", APPLICATION_JSON) .header("Cache-Control", "no-cache") + .header(MCP_PROTOCOL_VERSION_HEADER_NAME, MCP_PROTOCOL_VERSION) .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) .build();