Skip to content

Commit 772c795

Browse files
author
clark.cao
committed
[fix] when mcp server not give mcp session id ,mcp session store null as session id
1 parent 80d0ad8 commit 772c795

2 files changed

Lines changed: 43 additions & 59 deletions

File tree

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

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,46 +4,35 @@
44

55
package io.modelcontextprotocol.client.transport;
66

7-
import java.io.IOException;
8-
import java.util.List;
9-
import java.util.Optional;
10-
import java.util.concurrent.atomic.AtomicReference;
11-
import java.util.function.Consumer;
12-
import java.util.function.Function;
13-
7+
import io.modelcontextprotocol.json.McpJsonMapper;
8+
import io.modelcontextprotocol.json.TypeRef;
9+
import io.modelcontextprotocol.spec.*;
10+
import io.modelcontextprotocol.util.Assert;
11+
import io.modelcontextprotocol.util.Utils;
1412
import org.reactivestreams.Publisher;
1513
import org.slf4j.Logger;
1614
import org.slf4j.LoggerFactory;
1715
import org.springframework.core.ParameterizedTypeReference;
1816
import org.springframework.http.HttpStatus;
1917
import org.springframework.http.MediaType;
2018
import org.springframework.http.codec.ServerSentEvent;
19+
import org.springframework.util.StringUtils;
2120
import org.springframework.web.reactive.function.client.ClientResponse;
2221
import org.springframework.web.reactive.function.client.WebClient;
2322
import org.springframework.web.reactive.function.client.WebClientResponseException;
24-
25-
import io.modelcontextprotocol.json.TypeRef;
26-
import io.modelcontextprotocol.json.McpJsonMapper;
27-
28-
import io.modelcontextprotocol.spec.DefaultMcpTransportSession;
29-
import io.modelcontextprotocol.spec.DefaultMcpTransportStream;
30-
import io.modelcontextprotocol.spec.HttpHeaders;
31-
import io.modelcontextprotocol.spec.McpClientTransport;
32-
import io.modelcontextprotocol.spec.McpError;
33-
import io.modelcontextprotocol.spec.McpSchema;
34-
import io.modelcontextprotocol.spec.McpTransportException;
35-
import io.modelcontextprotocol.spec.McpTransportSession;
36-
import io.modelcontextprotocol.spec.McpTransportSessionNotFoundException;
37-
import io.modelcontextprotocol.spec.McpTransportStream;
38-
import io.modelcontextprotocol.spec.ProtocolVersions;
39-
import io.modelcontextprotocol.util.Assert;
40-
import io.modelcontextprotocol.util.Utils;
4123
import reactor.core.Disposable;
4224
import reactor.core.publisher.Flux;
4325
import reactor.core.publisher.Mono;
4426
import reactor.util.function.Tuple2;
4527
import reactor.util.function.Tuples;
4628

29+
import java.io.IOException;
30+
import java.util.List;
31+
import java.util.Optional;
32+
import java.util.concurrent.atomic.AtomicReference;
33+
import java.util.function.Consumer;
34+
import java.util.function.Function;
35+
4736
/**
4837
* An implementation of the Streamable HTTP protocol as defined by the
4938
* <code>2025-03-26</code> version of the MCP specification.
@@ -279,8 +268,8 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage message) {
279268
})
280269
.bodyValue(message)
281270
.exchangeToFlux(response -> {
282-
if (transportSession
283-
.markInitialized(response.headers().asHttpHeaders().getFirst(HttpHeaders.MCP_SESSION_ID))) {
271+
String mcpSessionId = response.headers().asHttpHeaders().getFirst(HttpHeaders.MCP_SESSION_ID);
272+
if (StringUtils.hasText(mcpSessionId) && transportSession.markInitialized(mcpSessionId)) {
284273
// Once we have a session, we try to open an async stream for
285274
// the server to send notifications and requests out-of-band.
286275
reconnect(null).contextWrite(sink.contextView()).subscribe();

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

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,25 @@
44

55
package io.modelcontextprotocol.client.transport;
66

7+
import io.modelcontextprotocol.client.transport.ResponseSubscribers.ResponseEvent;
8+
import io.modelcontextprotocol.client.transport.customizer.McpAsyncHttpClientRequestCustomizer;
9+
import io.modelcontextprotocol.client.transport.customizer.McpSyncHttpClientRequestCustomizer;
10+
import io.modelcontextprotocol.common.McpTransportContext;
11+
import io.modelcontextprotocol.json.McpJsonMapper;
12+
import io.modelcontextprotocol.json.TypeRef;
13+
import io.modelcontextprotocol.spec.*;
14+
import io.modelcontextprotocol.util.Assert;
15+
import io.modelcontextprotocol.util.Utils;
16+
import org.reactivestreams.Publisher;
17+
import org.slf4j.Logger;
18+
import org.slf4j.LoggerFactory;
19+
import reactor.core.Disposable;
20+
import reactor.core.publisher.Flux;
21+
import reactor.core.publisher.FluxSink;
22+
import reactor.core.publisher.Mono;
23+
import reactor.util.function.Tuple2;
24+
import reactor.util.function.Tuples;
25+
726
import java.io.IOException;
827
import java.net.URI;
928
import java.net.http.HttpClient;
@@ -12,42 +31,13 @@
1231
import java.net.http.HttpResponse.BodyHandler;
1332
import java.time.Duration;
1433
import java.util.List;
34+
import java.util.Objects;
1535
import java.util.Optional;
1636
import java.util.concurrent.CompletionException;
1737
import java.util.concurrent.atomic.AtomicReference;
1838
import java.util.function.Consumer;
1939
import java.util.function.Function;
2040

21-
import org.reactivestreams.Publisher;
22-
import org.slf4j.Logger;
23-
import org.slf4j.LoggerFactory;
24-
25-
import io.modelcontextprotocol.json.TypeRef;
26-
import io.modelcontextprotocol.json.McpJsonMapper;
27-
28-
import io.modelcontextprotocol.client.transport.customizer.McpAsyncHttpClientRequestCustomizer;
29-
import io.modelcontextprotocol.client.transport.customizer.McpSyncHttpClientRequestCustomizer;
30-
import io.modelcontextprotocol.client.transport.ResponseSubscribers.ResponseEvent;
31-
import io.modelcontextprotocol.common.McpTransportContext;
32-
import io.modelcontextprotocol.spec.DefaultMcpTransportSession;
33-
import io.modelcontextprotocol.spec.DefaultMcpTransportStream;
34-
import io.modelcontextprotocol.spec.HttpHeaders;
35-
import io.modelcontextprotocol.spec.McpClientTransport;
36-
import io.modelcontextprotocol.spec.McpSchema;
37-
import io.modelcontextprotocol.spec.McpTransportException;
38-
import io.modelcontextprotocol.spec.McpTransportSession;
39-
import io.modelcontextprotocol.spec.McpTransportSessionNotFoundException;
40-
import io.modelcontextprotocol.spec.McpTransportStream;
41-
import io.modelcontextprotocol.spec.ProtocolVersions;
42-
import io.modelcontextprotocol.util.Assert;
43-
import io.modelcontextprotocol.util.Utils;
44-
import reactor.core.Disposable;
45-
import reactor.core.publisher.Flux;
46-
import reactor.core.publisher.FluxSink;
47-
import reactor.core.publisher.Mono;
48-
import reactor.util.function.Tuple2;
49-
import reactor.util.function.Tuples;
50-
5141
/**
5242
* An implementation of the Streamable HTTP protocol as defined by the
5343
* <code>2025-03-26</code> version of the MCP specification.
@@ -87,7 +77,9 @@ public class HttpClientStreamableHttpTransport implements McpClientTransport {
8777
*/
8878
private final HttpClient httpClient;
8979

90-
/** HTTP request builder for building requests to send messages to the server */
80+
/**
81+
* HTTP request builder for building requests to send messages to the server
82+
*/
9183
private final HttpRequest.Builder requestBuilder;
9284

9385
/**
@@ -442,8 +434,11 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage sentMessage) {
442434
})).onErrorMap(CompletionException.class, t -> t.getCause()).onErrorComplete().subscribe();
443435

444436
})).flatMap(responseEvent -> {
445-
if (transportSession.markInitialized(
446-
responseEvent.responseInfo().headers().firstValue("mcp-session-id").orElseGet(() -> null))) {
437+
String mcpSessionId = responseEvent.responseInfo()
438+
.headers()
439+
.firstValue("mcp-session-id")
440+
.orElseGet(() -> null);
441+
if (Objects.nonNull(mcpSessionId) && transportSession.markInitialized(mcpSessionId)) {
447442
// Once we have a session, we try to open an async stream for
448443
// the server to send notifications and requests out-of-band.
449444

0 commit comments

Comments
 (0)