@@ -296,7 +296,8 @@ export class McpServer {
296296 *
297297 * Sets up the HTTP transport layer for the MCP server, creating endpoints for
298298 * Server-Sent Events (SSE) streaming, POST message handling, and DELETE session cleanup.
299- * Uses stateless mode for session management, making it suitable for stateless deployments.
299+ * Each request gets its own transport instance to prevent state conflicts between
300+ * concurrent client connections.
300301 *
301302 * This method is called automatically when the server starts listening and ensures
302303 * that MCP clients can communicate with the server over HTTP.
@@ -314,34 +315,53 @@ export class McpServer {
314315 if ( this . mcpMounted ) return
315316
316317 const { StreamableHTTPServerTransport } = await import ( '@modelcontextprotocol/sdk/server/streamableHttp.js' )
317-
318- // Create StreamableHTTPServerTransport in stateless mode
319- // Note: Stateless mode means one active connection at a time
320- // For multiple concurrent inspectors, use the built-in proxy or same-origin connections
321- const httpTransport = new StreamableHTTPServerTransport ( {
322- sessionIdGenerator : undefined , // Stateless mode
323- enableJsonResponse : true
324- } )
325318
319+ const endpoint = '/mcp'
320+
321+ // POST endpoint for messages
322+ // Create a new transport for each request to support multiple concurrent clients
323+ this . app . post ( endpoint , express . json ( ) , async ( req , res ) => {
324+ const transport = new StreamableHTTPServerTransport ( {
325+ sessionIdGenerator : undefined ,
326+ enableJsonResponse : true
327+ } )
326328
327- // Connect the MCP server to the transport
328- await this . server . connect ( httpTransport )
329+ res . on ( 'close' , ( ) => {
330+ transport . close ( )
331+ } )
329332
330- const endpoint = '/mcp'
333+ await this . server . connect ( transport )
334+ await transport . handleRequest ( req , res , req . body )
335+ } )
331336
332337 // GET endpoint for SSE streaming
333338 this . app . get ( endpoint , async ( req , res ) => {
334- await httpTransport . handleRequest ( req , res )
335- } )
339+ const transport = new StreamableHTTPServerTransport ( {
340+ sessionIdGenerator : undefined ,
341+ enableJsonResponse : true
342+ } )
336343
337- // POST endpoint for messages
338- this . app . post ( endpoint , express . json ( ) , async ( req , res ) => {
339- await httpTransport . handleRequest ( req , res , req . body )
344+ res . on ( 'close' , ( ) => {
345+ transport . close ( )
346+ } )
347+
348+ await this . server . connect ( transport )
349+ await transport . handleRequest ( req , res )
340350 } )
341351
342352 // DELETE endpoint for session cleanup
343353 this . app . delete ( endpoint , async ( req , res ) => {
344- await httpTransport . handleRequest ( req , res )
354+ const transport = new StreamableHTTPServerTransport ( {
355+ sessionIdGenerator : undefined ,
356+ enableJsonResponse : true
357+ } )
358+
359+ res . on ( 'close' , ( ) => {
360+ transport . close ( )
361+ } )
362+
363+ await this . server . connect ( transport )
364+ await transport . handleRequest ( req , res )
345365 } )
346366
347367 this . mcpMounted = true
0 commit comments