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 b0dfa89c0..3dd3a2e8f 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 @@ -80,7 +80,10 @@ public class WebFluxSseClientTransport implements McpClientTransport { * endpoint is used to establish the SSE connection with the server. */ private static final String SSE_ENDPOINT = "/sse"; - + /** + * Custom sseEndpoint + */ + private final String sseEndpoint; /** * Type reference for parsing SSE events containing string data. */ @@ -137,13 +140,17 @@ public WebFluxSseClientTransport(WebClient.Builder webClientBuilder) { * @throws IllegalArgumentException if either parameter is null */ public WebFluxSseClientTransport(WebClient.Builder webClientBuilder, ObjectMapper objectMapper) { + this(webClientBuilder,objectMapper,SSE_ENDPOINT); + } + public WebFluxSseClientTransport(WebClient.Builder webClientBuilder, ObjectMapper objectMapper,String sseEndpoint) { Assert.notNull(objectMapper, "ObjectMapper must not be null"); Assert.notNull(webClientBuilder, "WebClient.Builder must not be null"); + Assert.notNull(sseEndpoint, "sseEndpoint must not be null"); this.objectMapper = objectMapper; this.webClient = webClientBuilder.build(); + this.sseEndpoint=sseEndpoint; } - /** * Establishes a connection to the MCP server using Server-Sent Events (SSE). This * method initiates the SSE connection and sets up the message processing pipeline. @@ -254,7 +261,7 @@ public Mono sendMessage(JSONRPCMessage message) { protected Flux> eventStream() {// @formatter:off return this.webClient .get() - .uri(SSE_ENDPOINT) + .uri(this.sseEndpoint) .accept(MediaType.TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(SSE_TYPE) 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 ca1b0e87a..c926b1a6c 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java +++ b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java @@ -66,7 +66,10 @@ public class HttpClientSseClientTransport implements McpClientTransport { /** Default SSE endpoint path */ private static final String SSE_ENDPOINT = "/sse"; - + /** + * Custom sseEndPoint + */ + private final String sseEndpoint; /** Base URI for the MCP server */ private final String baseUri; @@ -110,15 +113,32 @@ public HttpClientSseClientTransport(String baseUri) { * @throws IllegalArgumentException if objectMapper or clientBuilder is null */ public HttpClientSseClientTransport(HttpClient.Builder clientBuilder, String baseUri, ObjectMapper objectMapper) { - Assert.notNull(objectMapper, "ObjectMapper must not be null"); - Assert.hasText(baseUri, "baseUri must not be empty"); - Assert.notNull(clientBuilder, "clientBuilder must not be null"); - this.baseUri = baseUri; - this.objectMapper = objectMapper; - this.httpClient = clientBuilder.connectTimeout(Duration.ofSeconds(10)).build(); - this.sseClient = new FlowSseClient(this.httpClient); + this(clientBuilder, baseUri, SSE_ENDPOINT, objectMapper); } + /** + * Creates a new transport instance with custom HTTP client builder and object mapper. + * + * @param clientBuilder the HTTP client builder to use + * @param baseUri the base URI of the MCP server + * @param objectMapper the object mapper for JSON serialization/deserialization + * @param clientBuilder the HTTP client builder to use + * @param baseUri the base URI of the MCP server + * @param sseEndpoint Custom sseEndPoint + * @param objectMapper the object mapper for JSON serialization/deserialization + * @throws IllegalArgumentException if objectMapper or clientBuilder is null + */ + public HttpClientSseClientTransport(HttpClient.Builder clientBuilder, String baseUri, String sseEndpoint, ObjectMapper objectMapper) { + Assert.notNull(objectMapper, "ObjectMapper must not be null"); + Assert.hasText(baseUri, "baseUri must not be empty"); + Assert.notNull(clientBuilder, "clientBuilder must not be null"); + Assert.notNull(sseEndpoint, "sseEndPoint must not be null"); + this.baseUri = baseUri; + this.objectMapper = objectMapper; + this.httpClient = clientBuilder.connectTimeout(Duration.ofSeconds(10)).build(); + this.sseClient = new FlowSseClient(this.httpClient); + this.sseEndpoint = sseEndpoint; + } /** * Establishes the SSE connection with the server and sets up message handling. * @@ -137,7 +157,7 @@ public Mono connect(Function, Mono> h CompletableFuture future = new CompletableFuture<>(); connectionFuture.set(future); - sseClient.subscribe(this.baseUri + SSE_ENDPOINT, new FlowSseClient.SseEventHandler() { + sseClient.subscribe(this.baseUri + this.sseEndpoint, new FlowSseClient.SseEventHandler() { @Override public void onEvent(SseEvent event) { if (isClosing) {