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: {