From c882f70ec585219100e462616a9b2e14353124cc Mon Sep 17 00:00:00 2001 From: mac Date: Mon, 23 Feb 2026 23:07:37 -0800 Subject: [PATCH] fix: create new MCP transport per request for stateless mode MCP SDK >=1.26 added a guard that stateless transports (sessionIdGenerator: undefined) cannot be reused across requests. The previous code created a single transport at startup and reused it for all HTTP requests, causing every request after the initial `initialize` handshake to throw with HTTP 500. Move transport creation inside the HTTP request handler so each request gets a fresh transport, which is the SDK's recommended pattern for stateless mode. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude Co-Authored-By: Happy --- .../happy-cli/src/claude/utils/startHappyServer.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/happy-cli/src/claude/utils/startHappyServer.ts b/packages/happy-cli/src/claude/utils/startHappyServer.ts index 2a6ba79e6..9fed99cb2 100644 --- a/packages/happy-cli/src/claude/utils/startHappyServer.ts +++ b/packages/happy-cli/src/claude/utils/startHappyServer.ts @@ -74,19 +74,18 @@ export async function startHappyServer(client: ApiSessionClient) { } }); - const transport = new StreamableHTTPServerTransport({ - // NOTE: Returning session id here will result in claude - // sdk spawn to fail with `Invalid Request: Server already initialized` - sessionIdGenerator: undefined - }); - await mcp.connect(transport); - // // Create the HTTP server + // Use a new stateless transport per request as required by MCP SDK >=1.26 + // (stateless transports cannot be reused across requests) // const server = createServer(async (req, res) => { try { + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined + }); + await mcp.connect(transport); await transport.handleRequest(req, res); } catch (error) { logger.debug("Error handling request:", error);