@@ -86,7 +86,8 @@ app.use((req, res, next) => {
86
86
next ( ) ;
87
87
} ) ;
88
88
89
- const webAppTransports : Map < string , Transport > = new Map < string , Transport > ( ) ; // Transports by sessionId
89
+ const webAppTransports : Map < string , Transport > = new Map < string , Transport > ( ) ; // Web app transports by web app sessionId
90
+ const serverTransports : Map < string , Transport > = new Map < string , Transport > ( ) ; // Server Transports by web app sessionId
90
91
91
92
const createTransport = async ( req : express . Request ) : Promise < Transport > => {
92
93
const query = req . query ;
@@ -154,8 +155,6 @@ const createTransport = async (req: express.Request): Promise<Transport> => {
154
155
}
155
156
} ;
156
157
157
- let backingServerTransport : Transport | undefined ;
158
-
159
158
app . get ( "/mcp" , async ( req , res ) => {
160
159
const sessionId = req . headers [ "mcp-session-id" ] as string ;
161
160
console . log ( `Received GET message for sessionId ${ sessionId } ` ) ;
@@ -178,12 +177,12 @@ app.get("/mcp", async (req, res) => {
178
177
app . post ( "/mcp" , async ( req , res ) => {
179
178
const sessionId = req . headers [ "mcp-session-id" ] as string | undefined ;
180
179
console . log ( `Received POST message for sessionId ${ sessionId } ` ) ;
180
+ let serverTransport : Transport | undefined ;
181
181
if ( ! sessionId ) {
182
182
try {
183
183
console . log ( "New streamable-http connection" ) ;
184
184
try {
185
- await backingServerTransport ?. close ( ) ;
186
- backingServerTransport = await createTransport ( req ) ;
185
+ serverTransport = await createTransport ( req ) ;
187
186
} catch ( error ) {
188
187
if ( error instanceof SseError && error . code === 401 ) {
189
188
console . error (
@@ -197,12 +196,13 @@ app.post("/mcp", async (req, res) => {
197
196
throw error ;
198
197
}
199
198
200
- console . log ( "Connected MCP client to backing server transport" ) ;
199
+ console . log ( "Connected MCP client to server transport" ) ;
201
200
202
201
const webAppTransport = new StreamableHTTPServerTransport ( {
203
202
sessionIdGenerator : randomUUID ,
204
203
onsessioninitialized : ( sessionId ) => {
205
204
webAppTransports . set ( sessionId , webAppTransport ) ;
205
+ serverTransports . set ( sessionId , serverTransport ! ) ;
206
206
console . log ( "Created streamable web app transport " + sessionId ) ;
207
207
} ,
208
208
} ) ;
@@ -211,7 +211,7 @@ app.post("/mcp", async (req, res) => {
211
211
212
212
mcpProxy ( {
213
213
transportToClient : webAppTransport ,
214
- transportToServer : backingServerTransport ,
214
+ transportToServer : serverTransport ,
215
215
} ) ;
216
216
217
217
await ( webAppTransport as StreamableHTTPServerTransport ) . handleRequest (
@@ -246,10 +246,9 @@ app.post("/mcp", async (req, res) => {
246
246
app . get ( "/stdio" , async ( req , res ) => {
247
247
try {
248
248
console . log ( "New connection" ) ;
249
-
249
+ let serverTransport : Transport | undefined ;
250
250
try {
251
- await backingServerTransport ?. close ( ) ;
252
- backingServerTransport = await createTransport ( req ) ;
251
+ serverTransport = await createTransport ( req ) ;
253
252
} catch ( error ) {
254
253
if ( error instanceof SseError && error . code === 401 ) {
255
254
console . error (
@@ -267,26 +266,24 @@ app.get("/stdio", async (req, res) => {
267
266
268
267
const webAppTransport = new SSEServerTransport ( "/message" , res ) ;
269
268
webAppTransports . set ( webAppTransport . sessionId , webAppTransport ) ;
270
-
271
- console . log ( "Created web app transport " ) ;
269
+ serverTransports . set ( webAppTransport . sessionId , serverTransport ) ;
270
+ console . log ( "Created client/server transports " ) ;
272
271
273
272
await webAppTransport . start ( ) ;
274
- ( backingServerTransport as StdioClientTransport ) . stderr ! . on (
275
- "data" ,
276
- ( chunk ) => {
277
- webAppTransport . send ( {
278
- jsonrpc : "2.0" ,
279
- method : "notifications/stderr" ,
280
- params : {
281
- content : chunk . toString ( ) ,
282
- } ,
283
- } ) ;
284
- } ,
285
- ) ;
273
+
274
+ ( serverTransport as StdioClientTransport ) . stderr ! . on ( "data" , ( chunk ) => {
275
+ webAppTransport . send ( {
276
+ jsonrpc : "2.0" ,
277
+ method : "notifications/stderr" ,
278
+ params : {
279
+ content : chunk . toString ( ) ,
280
+ } ,
281
+ } ) ;
282
+ } ) ;
286
283
287
284
mcpProxy ( {
288
285
transportToClient : webAppTransport ,
289
- transportToServer : backingServerTransport ,
286
+ transportToServer : serverTransport ,
290
287
} ) ;
291
288
292
289
console . log ( "Set up MCP proxy" ) ;
@@ -301,10 +298,9 @@ app.get("/sse", async (req, res) => {
301
298
console . log (
302
299
"New SSE connection. NOTE: The sse transport is deprecated and has been replaced by streamable-http" ,
303
300
) ;
304
-
301
+ let serverTransport : Transport | undefined ;
305
302
try {
306
- await backingServerTransport ?. close ( ) ;
307
- backingServerTransport = await createTransport ( req ) ;
303
+ serverTransport = await createTransport ( req ) ;
308
304
} catch ( error ) {
309
305
if ( error instanceof SseError && error . code === 401 ) {
310
306
console . error (
@@ -322,13 +318,15 @@ app.get("/sse", async (req, res) => {
322
318
323
319
const webAppTransport = new SSEServerTransport ( "/message" , res ) ;
324
320
webAppTransports . set ( webAppTransport . sessionId , webAppTransport ) ;
325
- console . log ( "Created web app transport" ) ;
321
+ console . log ( "Created client transport" ) ;
322
+ serverTransports . set ( webAppTransport . sessionId , serverTransport ) ;
323
+ console . log ( "Created server transport" ) ;
326
324
327
325
await webAppTransport . start ( ) ;
328
326
329
327
mcpProxy ( {
330
328
transportToClient : webAppTransport ,
331
- transportToServer : backingServerTransport ,
329
+ transportToServer : serverTransport ,
332
330
} ) ;
333
331
334
332
console . log ( "Set up MCP proxy" ) ;
0 commit comments