From 24e663b53be5a1482ea7573d3d0ac2ddebde198d Mon Sep 17 00:00:00 2001 From: luxp <luxianpo@gmail.com> Date: Wed, 16 Apr 2025 16:17:16 +0800 Subject: [PATCH] StreamableHTTPServerTransport should support multiple initializations in stateless mode --- src/server/streamableHttp.test.ts | 7 +++++++ src/server/streamableHttp.ts | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/server/streamableHttp.test.ts b/src/server/streamableHttp.test.ts index efd5de1c..730d42ab 100644 --- a/src/server/streamableHttp.test.ts +++ b/src/server/streamableHttp.test.ts @@ -1077,6 +1077,13 @@ describe("StreamableHTTPServerTransport in stateless mode", () => { await stopTestServer({ server, transport }); }); + it("should support multiple initializations in stateless mode", async () => { + await sendPostRequest(baseUrl, TEST_MESSAGES.initialize); + const initResponse = await sendPostRequest(baseUrl, TEST_MESSAGES.initialize); + expect(initResponse.status).toBe(200); + expect(initResponse.headers.get("mcp-session-id")).toBeNull(); + }); + it("should operate without session ID validation", async () => { // Initialize the server first const initResponse = await sendPostRequest(baseUrl, TEST_MESSAGES.initialize); diff --git a/src/server/streamableHttp.ts b/src/server/streamableHttp.ts index 31aad09c..3f19e1b2 100644 --- a/src/server/streamableHttp.ts +++ b/src/server/streamableHttp.ts @@ -334,7 +334,8 @@ export class StreamableHTTPServerTransport implements Transport { if (isInitializationRequest) { // If it's a server with session management and the session ID is already set we should reject the request // to avoid re-initialization. - if (this._initialized) { + // sessionId undefined means stateless mode, so we don't need to check for re-initialization + if (this._initialized && this.sessionId !== undefined) { res.writeHead(400).end(JSON.stringify({ jsonrpc: "2.0", error: {