@@ -141,7 +141,7 @@ let backingServerTransport: Transport | undefined;
141
141
142
142
app . get ( "/mcp" , async ( req , res ) => {
143
143
const sessionId = req . headers [ "mcp-session-id" ] as string ;
144
- console . log ( `Received GET message for sessionId ${ sessionId } ` ) ;
144
+ console . log ( `GET /mcp for sessionId ${ sessionId } ` ) ;
145
145
try {
146
146
const transport = webAppTransports . get (
147
147
sessionId ,
@@ -160,7 +160,7 @@ app.get("/mcp", async (req, res) => {
160
160
161
161
app . post ( "/mcp" , async ( req , res ) => {
162
162
const sessionId = req . headers [ "mcp-session-id" ] as string | undefined ;
163
- console . log ( `Received POST message for sessionId ${ sessionId } ` ) ;
163
+ console . log ( `POST /mcp for sessionId ${ sessionId } ` ) ;
164
164
if ( ! sessionId ) {
165
165
try {
166
166
console . log ( "New streamable-http connection" ) ;
@@ -228,7 +228,7 @@ app.post("/mcp", async (req, res) => {
228
228
229
229
app . get ( "/stdio" , async ( req , res ) => {
230
230
try {
231
- console . log ( "New connection " ) ;
231
+ console . log ( "GET /stdio " ) ;
232
232
233
233
try {
234
234
await backingServerTransport ?. close ( ) ;
@@ -254,18 +254,44 @@ app.get("/stdio", async (req, res) => {
254
254
console . log ( "Created web app transport" ) ;
255
255
256
256
await webAppTransport . start ( ) ;
257
- ( backingServerTransport as StdioClientTransport ) . stderr ! . on (
258
- "data" ,
259
- ( chunk ) => {
260
- webAppTransport . send ( {
261
- jsonrpc : "2.0" ,
262
- method : "notifications/stderr" ,
263
- params : {
264
- content : chunk . toString ( ) ,
265
- } ,
266
- } ) ;
267
- } ,
268
- ) ;
257
+
258
+ // Handle client disconnection
259
+ res . on ( 'close' , ( ) => {
260
+ console . log ( `Client disconnected from session ${ webAppTransport . sessionId } ` ) ;
261
+ // Clean up the transport map
262
+ webAppTransports . delete ( webAppTransport . sessionId ) ;
263
+ } ) ;
264
+
265
+ // Create a stderr handler that checks connection state
266
+ const stderrHandler = ( chunk : Buffer ) => {
267
+ try {
268
+ // Only send if the transport exists in our map (meaning it's still active)
269
+ if ( webAppTransports . has ( webAppTransport . sessionId ) ) {
270
+ webAppTransport . send ( {
271
+ jsonrpc : "2.0" ,
272
+ method : "notifications/stderr" ,
273
+ params : {
274
+ content : chunk . toString ( ) ,
275
+ } ,
276
+ } ) ;
277
+ }
278
+ } catch ( error : any ) {
279
+ console . log ( `Error sending stderr data to client: ${ error . message } ` ) ;
280
+ // If we hit an error sending, clean up the transport
281
+ webAppTransports . delete ( webAppTransport . sessionId ) ;
282
+ }
283
+ } ;
284
+
285
+ if ( ( backingServerTransport as StdioClientTransport ) . stderr ) {
286
+ ( backingServerTransport as StdioClientTransport ) . stderr ! . on ( "data" , stderrHandler ) ;
287
+
288
+ // Store the handler reference so we can remove it when client disconnects
289
+ res . on ( 'close' , ( ) => {
290
+ if ( ( backingServerTransport as StdioClientTransport ) . stderr ) {
291
+ ( backingServerTransport as StdioClientTransport ) . stderr ! . removeListener ( "data" , stderrHandler ) ;
292
+ }
293
+ } ) ;
294
+ }
269
295
270
296
mcpProxy ( {
271
297
transportToClient : webAppTransport ,
@@ -282,7 +308,7 @@ app.get("/stdio", async (req, res) => {
282
308
app . get ( "/sse" , async ( req , res ) => {
283
309
try {
284
310
console . log (
285
- "New SSE connection. NOTE: The sse transport is deprecated and has been replaced by streamable-http" ,
311
+ "GET /sse ( NOTE: The sse transport is deprecated and has been replaced by streamable-http) " ,
286
312
) ;
287
313
288
314
try {
@@ -324,7 +350,7 @@ app.get("/sse", async (req, res) => {
324
350
app . post ( "/message" , async ( req , res ) => {
325
351
try {
326
352
const sessionId = req . query . sessionId ;
327
- console . log ( `Received message for sessionId ${ sessionId } ` ) ;
353
+ console . log ( `POST / message for sessionId ${ sessionId } ` ) ;
328
354
329
355
const transport = webAppTransports . get (
330
356
sessionId as string ,
@@ -341,13 +367,15 @@ app.post("/message", async (req, res) => {
341
367
} ) ;
342
368
343
369
app . get ( "/health" , ( req , res ) => {
370
+ console . log ( "GET /health" ) ;
344
371
res . json ( {
345
372
status : "ok" ,
346
373
} ) ;
347
374
} ) ;
348
375
349
376
app . get ( "/config" , ( req , res ) => {
350
377
try {
378
+ console . log ( "GET /config" ) ;
351
379
res . json ( {
352
380
defaultEnvironment,
353
381
defaultCommand : values . env ,
0 commit comments