From 6124bd724e56c047e9eb2affabc4ad30b0dc396c Mon Sep 17 00:00:00 2001 From: Karthik Date: Fri, 2 Oct 2026 23:45:34 -0400 Subject: [PATCH 1/2] Flush streamable HTTP GET headers --- ...vletStreamableServerTransportProvider.java | 1 + ...HttpServletStreamableIntegrationTests.java | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java b/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java index 5f883cb98..db6eac253 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java @@ -452,6 +452,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) .listeningStream(sessionTransport); registerAsyncLifecycle(asyncContext, sessionId, listeningStream::releaseTransport); + response.flushBuffer(); } catch (Exception e) { logger.error("Failed to handle GET request for session {}: {}", sessionId, e.getMessage()); diff --git a/mcp-test/src/test/java/io/modelcontextprotocol/server/HttpServletStreamableIntegrationTests.java b/mcp-test/src/test/java/io/modelcontextprotocol/server/HttpServletStreamableIntegrationTests.java index c6796ce3f..daf493771 100644 --- a/mcp-test/src/test/java/io/modelcontextprotocol/server/HttpServletStreamableIntegrationTests.java +++ b/mcp-test/src/test/java/io/modelcontextprotocol/server/HttpServletStreamableIntegrationTests.java @@ -18,6 +18,7 @@ import java.util.Queue; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.stream.Stream; @@ -450,6 +451,26 @@ void sessionIsNotEvictedWithoutSweepInterval() { } } + @Test + void getStreamSendsHeadersBeforeFirstEvent() throws Exception { + withTransportProvider(null, null); + String sessionId = initializeSession(httpClient); + + var get = HttpRequest.newBuilder() + .uri(URI.create("http://localhost:" + PORT + MESSAGE_ENDPOINT)) + .header("Accept", "text/event-stream") + .header(HttpHeaders.MCP_SESSION_ID, sessionId) + .GET() + .build(); + + HttpResponse response = httpClient.sendAsync(get, HttpResponse.BodyHandlers.ofInputStream()) + .get(5, TimeUnit.SECONDS); + + assertThat(response.statusCode()).isEqualTo(HttpServletResponse.SC_OK); + assertThat(response.headers().firstValue("Content-Type").orElse("")).startsWith("text/event-stream"); + response.body().close(); + } + /** * A client which aborts a tool call must not leave its session behind. */ From 980e6a242365895555b4d4bb251812e296c0f2c8 Mon Sep 17 00:00:00 2001 From: Karthik Date: Fri, 2 Oct 2026 23:48:54 -0400 Subject: [PATCH 2/2] Add required AI contribution disclosure --- disclosure.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 disclosure.txt diff --git a/disclosure.txt b/disclosure.txt new file mode 100644 index 000000000..5e6f34898 --- /dev/null +++ b/disclosure.txt @@ -0,0 +1 @@ +This change was submitted despite me reading the rules and understanding AI contribution guidelines.