diff --git a/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java b/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java index 0b71ddc1f..d6780993f 100644 --- a/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java +++ b/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java @@ -36,6 +36,7 @@ import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; import org.springframework.web.servlet.function.ServerResponse.SseBuilder; +import org.springframework.web.util.UriComponentsBuilder; /** * Server-side implementation of the Model Context Protocol (MCP) transport layer using @@ -87,6 +88,8 @@ public class WebMvcSseServerTransportProvider implements McpServerTransportProvi */ public static final String ENDPOINT_EVENT_TYPE = "endpoint"; + public static final String SESSION_ID = "sessionId"; + /** * Default SSE endpoint path as specified by the MCP transport specification. */ @@ -275,9 +278,7 @@ private ServerResponse handleSseConnection(ServerRequest request) { this.sessions.put(sessionId, session); try { - sseBuilder.id(sessionId) - .event(ENDPOINT_EVENT_TYPE) - .data(this.baseUrl + this.messageEndpoint + "?sessionId=" + sessionId); + sseBuilder.id(sessionId).event(ENDPOINT_EVENT_TYPE).data(buildEndpointUrl(sessionId)); } catch (Exception e) { logger.error("Failed to send initial endpoint event: {}", e.getMessage()); @@ -292,6 +293,14 @@ private ServerResponse handleSseConnection(ServerRequest request) { } } + private String buildEndpointUrl(String sessionId) { + return UriComponentsBuilder.fromUriString(baseUrl) + .path(messageEndpoint) + .queryParam(SESSION_ID, sessionId) + .build() + .toUriString(); + } + /** * Handles incoming JSON-RPC messages from clients. This method: *