Skip to content

Commit 169967e

Browse files
committed
fix: 1 transport per request
1 parent c1dc666 commit 169967e

File tree

1 file changed

+38
-18
lines changed

1 file changed

+38
-18
lines changed

packages/mcp-use/src/server/mcp-server.ts

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)