From f10d1ff93f6ea9daba663c44478db64088389df9 Mon Sep 17 00:00:00 2001 From: ihrpr Date: Thu, 17 Apr 2025 18:22:11 +0100 Subject: [PATCH] change sessionIdGenerator to be either undefined or generate a string --- README.md | 5 ++--- src/examples/README.md | 2 +- .../stateManagementStreamableHttp.test.ts | 2 +- src/server/streamableHttp.test.ts | 13 +++++++------ src/server/streamableHttp.ts | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 07d9eb30..ed97b83a 100644 --- a/README.md +++ b/README.md @@ -325,10 +325,9 @@ app.use(express.json()); // Handle all MCP requests (GET, POST, DELETE) at a single endpoint app.all('/mcp', async (req, res) => { - // Create a transport with sessionIdGenerator set to return undefined - // This disables session tracking completely + // Disable session tracking by setting sessionIdGenerator to undefined const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: () => undefined, + sessionIdGenerator: undefined, req, res }); diff --git a/src/examples/README.md b/src/examples/README.md index 2083f4ed..611c081e 100644 --- a/src/examples/README.md +++ b/src/examples/README.md @@ -134,7 +134,7 @@ The Streamable HTTP transport can be configured to operate without tracking sess To enable stateless mode, configure the `StreamableHTTPServerTransport` with: ```typescript -sessionIdGenerator: () => undefined +sessionIdGenerator: undefined ``` This disables session management entirely, and the server won't generate or expect session IDs. diff --git a/src/integration-tests/stateManagementStreamableHttp.test.ts b/src/integration-tests/stateManagementStreamableHttp.test.ts index 1e80b7b8..6d553727 100644 --- a/src/integration-tests/stateManagementStreamableHttp.test.ts +++ b/src/integration-tests/stateManagementStreamableHttp.test.ts @@ -68,7 +68,7 @@ describe('Streamable HTTP Transport Session Management', () => { const serverTransport = new StreamableHTTPServerTransport({ sessionIdGenerator: withSessionManagement ? () => randomUUID() // With session management, generate UUID - : () => undefined // Without session management, return undefined + : undefined // Without session management, return undefined }); await mcpServer.connect(serverTransport); diff --git a/src/server/streamableHttp.test.ts b/src/server/streamableHttp.test.ts index 0794e4bb..a0f2e0bb 100644 --- a/src/server/streamableHttp.test.ts +++ b/src/server/streamableHttp.test.ts @@ -10,7 +10,7 @@ import { z } from "zod"; * Test server configuration for StreamableHTTPServerTransport tests */ interface TestServerConfig { - sessionIdGenerator?: () => string | undefined; + sessionIdGenerator: (() => string) | undefined; enableJsonResponse?: boolean; customRequestHandler?: (req: IncomingMessage, res: ServerResponse, parsedBody?: unknown) => Promise; eventStore?: EventStore; @@ -19,7 +19,7 @@ interface TestServerConfig { /** * Helper to create and start test HTTP server with MCP setup */ -async function createTestServer(config: TestServerConfig = {}): Promise<{ +async function createTestServer(config: TestServerConfig = { sessionIdGenerator: (() => randomUUID()) }): Promise<{ server: Server; transport: StreamableHTTPServerTransport; mcpServer: McpServer; @@ -40,7 +40,7 @@ async function createTestServer(config: TestServerConfig = {}): Promise<{ ); const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: config.sessionIdGenerator ?? (() => randomUUID()), + sessionIdGenerator: config.sessionIdGenerator, enableJsonResponse: config.enableJsonResponse ?? false, eventStore: config.eventStore }); @@ -681,7 +681,7 @@ describe("StreamableHTTPServerTransport with JSON Response Mode", () => { let sessionId: string; beforeEach(async () => { - const result = await createTestServer({ enableJsonResponse: true }); + const result = await createTestServer({ sessionIdGenerator: (() => randomUUID()), enableJsonResponse: true }); server = result.server; transport = result.transport; baseUrl = result.baseUrl; @@ -784,7 +784,8 @@ describe("StreamableHTTPServerTransport with pre-parsed body", () => { console.error("Error handling request:", error); if (!res.headersSent) res.writeHead(500).end(); } - } + }, + sessionIdGenerator: (() => randomUUID()) }); server = result.server; @@ -1063,7 +1064,7 @@ describe("StreamableHTTPServerTransport in stateless mode", () => { let baseUrl: URL; beforeEach(async () => { - const result = await createTestServer({ sessionIdGenerator: () => undefined }); + const result = await createTestServer({ sessionIdGenerator: undefined }); server = result.server; transport = result.transport; baseUrl = result.baseUrl; diff --git a/src/server/streamableHttp.ts b/src/server/streamableHttp.ts index 82fcf321..d9205ac1 100644 --- a/src/server/streamableHttp.ts +++ b/src/server/streamableHttp.ts @@ -37,7 +37,7 @@ export interface StreamableHTTPServerTransportOptions { * * Return undefined to disable session management. */ - sessionIdGenerator: () => string | undefined; + sessionIdGenerator: (() => string) | undefined; /** * A callback for session initialization events @@ -98,7 +98,7 @@ export interface StreamableHTTPServerTransportOptions { */ export class StreamableHTTPServerTransport implements Transport { // when sessionId is not set (undefined), it means the transport is in stateless mode - private sessionIdGenerator: () => string | undefined; + private sessionIdGenerator: (() => string) | undefined; private _started: boolean = false; private _streamMapping: Map = new Map(); private _requestToStreamMapping: Map = new Map(); @@ -365,7 +365,7 @@ export class StreamableHTTPServerTransport implements Transport { })); return; } - this.sessionId = this.sessionIdGenerator(); + this.sessionId = this.sessionIdGenerator?.(); this._initialized = true; // If we have a session ID and an onsessioninitialized handler, call it immediately