Skip to content

Commit b1b8b2a

Browse files
committed
Merged with current main
1 parent 946facb commit b1b8b2a

File tree

82 files changed

+436
-471
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+436
-471
lines changed

mcp-core/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
<version>0.17.0-SNAPSHOT</version>
106106
<scope>test</scope>
107107
</dependency>
108+
108109
<dependency>
109110
<groupId>org.springframework</groupId>
110111
<artifactId>spring-webmvc</artifactId>

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,9 @@ public <T> Mono<T> withInitialization(String actionName, Function<Initialization
287287
this.initializationRef.compareAndSet(newInit, null);
288288
return Mono.error(new RuntimeException("Client failed to initialize " + actionName, ex));
289289
})
290-
.flatMap(operation);
290+
.flatMap(res -> operation.apply(res)
291+
.contextWrite(c -> c.put(McpAsyncClient.NEGOTIATED_PROTOCOL_VERSION,
292+
res.initializeResult().protocolVersion())));
291293
});
292294
}
293295

@@ -319,6 +321,8 @@ private Mono<McpSchema.InitializeResult> doInitialize(DefaultInitialization init
319321
}
320322

321323
return mcpClientSession.sendNotification(McpSchema.METHOD_NOTIFICATION_INITIALIZED, null)
324+
.contextWrite(
325+
c -> c.put(McpAsyncClient.NEGOTIATED_PROTOCOL_VERSION, initializeResult.protocolVersion()))
322326
.thenReturn(initializeResult);
323327
}).flatMap(initializeResult -> {
324328
initialization.cacheResult(initializeResult);

mcp-core/src/main/java/io/modelcontextprotocol/client/McpClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
import java.util.function.Function;
1414
import java.util.function.Supplier;
1515

16-
import io.modelcontextprotocol.common.McpTransportContext;
1716
import io.modelcontextprotocol.json.McpJsonDefaults;
1817
import io.modelcontextprotocol.json.schema.JsonSchemaValidator;
18+
import io.modelcontextprotocol.common.McpTransportContext;
1919
import io.modelcontextprotocol.spec.McpClientTransport;
2020
import io.modelcontextprotocol.spec.McpSchema;
2121
import io.modelcontextprotocol.spec.McpSchema.ClientCapabilities;

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import org.slf4j.Logger;
2020
import org.slf4j.LoggerFactory;
21-
2221
import io.modelcontextprotocol.client.transport.ResponseSubscribers.ResponseEvent;
2322
import io.modelcontextprotocol.client.transport.customizer.McpAsyncHttpClientRequestCustomizer;
2423
import io.modelcontextprotocol.client.transport.customizer.McpSyncHttpClientRequestCustomizer;
@@ -28,7 +27,6 @@
2827
import io.modelcontextprotocol.json.TypeRef;
2928
import io.modelcontextprotocol.spec.HttpHeaders;
3029
import io.modelcontextprotocol.spec.McpClientTransport;
31-
import io.modelcontextprotocol.spec.McpError;
3230
import io.modelcontextprotocol.spec.McpSchema;
3331
import io.modelcontextprotocol.spec.McpSchema.JSONRPCMessage;
3432
import io.modelcontextprotocol.spec.McpTransportException;

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.function.Consumer;
2121
import java.util.function.Function;
2222

23+
import io.modelcontextprotocol.client.McpAsyncClient;
2324
import io.modelcontextprotocol.client.transport.ResponseSubscribers.ResponseEvent;
2425
import io.modelcontextprotocol.client.transport.customizer.McpAsyncHttpClientRequestCustomizer;
2526
import io.modelcontextprotocol.client.transport.customizer.McpSyncHttpClientRequestCustomizer;
@@ -194,7 +195,9 @@ private Publisher<Void> createDelete(String sessionId) {
194195
.uri(uri)
195196
.header("Cache-Control", "no-cache")
196197
.header(HttpHeaders.MCP_SESSION_ID, sessionId)
197-
.header(HttpHeaders.PROTOCOL_VERSION, this.latestSupportedProtocolVersion)
198+
.header(HttpHeaders.PROTOCOL_VERSION,
199+
ctx.getOrDefault(McpAsyncClient.NEGOTIATED_PROTOCOL_VERSION,
200+
this.latestSupportedProtocolVersion))
198201
.DELETE();
199202
var transportContext = ctx.getOrDefault(McpTransportContext.KEY, McpTransportContext.EMPTY);
200203
return Mono.from(this.httpRequestCustomizer.customize(builder, "DELETE", uri, null, transportContext));
@@ -265,7 +268,9 @@ private Mono<Disposable> reconnect(McpTransportStream<Disposable> stream) {
265268
var builder = requestBuilder.uri(uri)
266269
.header(HttpHeaders.ACCEPT, TEXT_EVENT_STREAM)
267270
.header("Cache-Control", "no-cache")
268-
.header(HttpHeaders.PROTOCOL_VERSION, this.latestSupportedProtocolVersion)
271+
.header(HttpHeaders.PROTOCOL_VERSION,
272+
connectionCtx.getOrDefault(McpAsyncClient.NEGOTIATED_PROTOCOL_VERSION,
273+
this.latestSupportedProtocolVersion))
269274
.GET();
270275
var transportContext = connectionCtx.getOrDefault(McpTransportContext.KEY, McpTransportContext.EMPTY);
271276
return Mono.from(this.httpRequestCustomizer.customize(builder, "GET", uri, null, transportContext));
@@ -440,7 +445,9 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage sentMessage) {
440445
.header(HttpHeaders.ACCEPT, APPLICATION_JSON + ", " + TEXT_EVENT_STREAM)
441446
.header(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON)
442447
.header(HttpHeaders.CACHE_CONTROL, "no-cache")
443-
.header(HttpHeaders.PROTOCOL_VERSION, this.latestSupportedProtocolVersion)
448+
.header(HttpHeaders.PROTOCOL_VERSION,
449+
ctx.getOrDefault(McpAsyncClient.NEGOTIATED_PROTOCOL_VERSION,
450+
this.latestSupportedProtocolVersion))
444451
.POST(HttpRequest.BodyPublishers.ofString(jsonBody));
445452
var transportContext = ctx.getOrDefault(McpTransportContext.KEY, McpTransportContext.EMPTY);
446453
return Mono
@@ -814,9 +821,10 @@ public Builder supportedProtocolVersions(List<String> supportedProtocolVersions)
814821
*/
815822
public HttpClientStreamableHttpTransport build() {
816823
HttpClient httpClient = this.clientBuilder.connectTimeout(this.connectTimeout).build();
817-
return new HttpClientStreamableHttpTransport(jsonMapper == null ? McpJsonDefaults.getDefaultMcpJsonMapper() : jsonMapper,
818-
httpClient, requestBuilder, baseUri, endpoint, resumableStreams, openConnectionOnStartup,
819-
httpRequestCustomizer, supportedProtocolVersions);
824+
return new HttpClientStreamableHttpTransport(
825+
jsonMapper == null ? McpJsonDefaults.getDefaultMcpJsonMapper() : jsonMapper, httpClient,
826+
requestBuilder, baseUri, endpoint, resumableStreams, openConnectionOnStartup, httpRequestCustomizer,
827+
supportedProtocolVersions);
820828
}
821829

822830
}

mcp-core/src/main/java/io/modelcontextprotocol/client/transport/ServerParameters.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
import com.fasterxml.jackson.annotation.JsonInclude;
1515
import com.fasterxml.jackson.annotation.JsonProperty;
16-
1716
import io.modelcontextprotocol.util.Assert;
1817

1918
/**

mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpAsyncHttpClientRequestCustomizer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
import java.net.http.HttpRequest;
99

1010
import org.reactivestreams.Publisher;
11-
12-
import io.modelcontextprotocol.common.McpTransportContext;
1311
import reactor.core.publisher.Mono;
1412
import reactor.core.scheduler.Schedulers;
1513
import reactor.util.annotation.Nullable;
1614

15+
import io.modelcontextprotocol.common.McpTransportContext;
16+
1717
/**
1818
* Customize {@link HttpRequest.Builder} before executing the request, in either SSE or
1919
* Streamable HTTP transport.

mcp-core/src/main/java/io/modelcontextprotocol/client/transport/customizer/McpSyncHttpClientRequestCustomizer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
import java.net.URI;
88
import java.net.http.HttpRequest;
99

10+
import reactor.util.annotation.Nullable;
11+
1012
import io.modelcontextprotocol.client.McpClient.SyncSpec;
1113
import io.modelcontextprotocol.common.McpTransportContext;
12-
import reactor.util.annotation.Nullable;
1314

1415
/**
1516
* Customize {@link HttpRequest.Builder} before executing the request, either in SSE or

mcp-core/src/main/java/io/modelcontextprotocol/server/DefaultMcpStatelessServerHandler.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@
44

55
package io.modelcontextprotocol.server;
66

7-
import java.util.Map;
8-
9-
import org.slf4j.Logger;
10-
import org.slf4j.LoggerFactory;
11-
127
import io.modelcontextprotocol.common.McpTransportContext;
138
import io.modelcontextprotocol.spec.McpError;
149
import io.modelcontextprotocol.spec.McpSchema;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
1512
import reactor.core.publisher.Mono;
1613

14+
import java.util.Map;
15+
1716
class DefaultMcpStatelessServerHandler implements McpStatelessServerHandler {
1817

1918
private static final Logger logger = LoggerFactory.getLogger(DefaultMcpStatelessServerHandler.class);

mcp-core/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
package io.modelcontextprotocol.server;
66

7-
import static io.modelcontextprotocol.spec.McpError.RESOURCE_NOT_FOUND;
8-
97
import java.time.Duration;
108
import java.util.HashMap;
119
import java.util.List;
@@ -16,9 +14,6 @@
1614
import java.util.concurrent.CopyOnWriteArrayList;
1715
import java.util.function.BiFunction;
1816

19-
import org.slf4j.Logger;
20-
import org.slf4j.LoggerFactory;
21-
2217
import io.modelcontextprotocol.json.McpJsonMapper;
2318
import io.modelcontextprotocol.json.TypeRef;
2419
import io.modelcontextprotocol.json.schema.JsonSchemaValidator;
@@ -43,9 +38,13 @@
4338
import io.modelcontextprotocol.util.DefaultMcpUriTemplateManagerFactory;
4439
import io.modelcontextprotocol.util.McpUriTemplateManagerFactory;
4540
import io.modelcontextprotocol.util.Utils;
41+
import org.slf4j.Logger;
42+
import org.slf4j.LoggerFactory;
4643
import reactor.core.publisher.Flux;
4744
import reactor.core.publisher.Mono;
4845

46+
import static io.modelcontextprotocol.spec.McpError.RESOURCE_NOT_FOUND;
47+
4948
/**
5049
* The Model Context Protocol (MCP) server implementation that provides asynchronous
5150
* communication using Project Reactor's Mono and Flux types.

0 commit comments

Comments
 (0)