@@ -48,7 +48,8 @@ app.use((req, res, next) => {
48
48
next ( ) ;
49
49
} ) ;
50
50
51
- const webAppTransports : Map < string , Transport > = new Map < string , Transport > ( ) ; // Transports by sessionId
51
+ const webAppTransports : Map < string , Transport > = new Map < string , Transport > ( ) ; // Web app transports by web app sessionId
52
+ const serverTransports : Map < string , Transport > = new Map < string , Transport > ( ) ; // Server Transports by web app sessionId
52
53
53
54
const createTransport = async ( req : express . Request ) : Promise < Transport > => {
54
55
const query = req . query ;
@@ -137,8 +138,6 @@ const createTransport = async (req: express.Request): Promise<Transport> => {
137
138
}
138
139
} ;
139
140
140
- let backingServerTransport : Transport | undefined ;
141
-
142
141
app . get ( "/mcp" , async ( req , res ) => {
143
142
const sessionId = req . headers [ "mcp-session-id" ] as string ;
144
143
console . log ( `Received GET message for sessionId ${ sessionId } ` ) ;
@@ -161,12 +160,12 @@ app.get("/mcp", async (req, res) => {
161
160
app . post ( "/mcp" , async ( req , res ) => {
162
161
const sessionId = req . headers [ "mcp-session-id" ] as string | undefined ;
163
162
console . log ( `Received POST message for sessionId ${ sessionId } ` ) ;
163
+ let serverTransport : Transport | undefined ;
164
164
if ( ! sessionId ) {
165
165
try {
166
166
console . log ( "New streamable-http connection" ) ;
167
167
try {
168
- await backingServerTransport ?. close ( ) ;
169
- backingServerTransport = await createTransport ( req ) ;
168
+ serverTransport = await createTransport ( req ) ;
170
169
} catch ( error ) {
171
170
if ( error instanceof SseError && error . code === 401 ) {
172
171
console . error (
@@ -180,12 +179,13 @@ app.post("/mcp", async (req, res) => {
180
179
throw error ;
181
180
}
182
181
183
- console . log ( "Connected MCP client to backing server transport" ) ;
182
+ console . log ( "Connected MCP client to server transport" ) ;
184
183
185
184
const webAppTransport = new StreamableHTTPServerTransport ( {
186
185
sessionIdGenerator : randomUUID ,
187
186
onsessioninitialized : ( sessionId ) => {
188
187
webAppTransports . set ( sessionId , webAppTransport ) ;
188
+ serverTransports . set ( sessionId , serverTransport ! ) ;
189
189
console . log ( "Created streamable web app transport " + sessionId ) ;
190
190
} ,
191
191
} ) ;
@@ -194,7 +194,7 @@ app.post("/mcp", async (req, res) => {
194
194
195
195
mcpProxy ( {
196
196
transportToClient : webAppTransport ,
197
- transportToServer : backingServerTransport ,
197
+ transportToServer : serverTransport ,
198
198
} ) ;
199
199
200
200
await ( webAppTransport as StreamableHTTPServerTransport ) . handleRequest (
@@ -229,10 +229,9 @@ app.post("/mcp", async (req, res) => {
229
229
app . get ( "/stdio" , async ( req , res ) => {
230
230
try {
231
231
console . log ( "New connection" ) ;
232
-
232
+ let serverTransport : Transport | undefined ;
233
233
try {
234
- await backingServerTransport ?. close ( ) ;
235
- backingServerTransport = await createTransport ( req ) ;
234
+ serverTransport = await createTransport ( req ) ;
236
235
} catch ( error ) {
237
236
if ( error instanceof SseError && error . code === 401 ) {
238
237
console . error (
@@ -250,26 +249,24 @@ app.get("/stdio", async (req, res) => {
250
249
251
250
const webAppTransport = new SSEServerTransport ( "/message" , res ) ;
252
251
webAppTransports . set ( webAppTransport . sessionId , webAppTransport ) ;
253
-
254
- console . log ( "Created web app transport " ) ;
252
+ serverTransports . set ( webAppTransport . sessionId , serverTransport ) ;
253
+ console . log ( "Created client/server transports " ) ;
255
254
256
255
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
- ) ;
256
+
257
+ ( serverTransport as StdioClientTransport ) . stderr ! . on ( "data" , ( chunk ) => {
258
+ webAppTransport . send ( {
259
+ jsonrpc : "2.0" ,
260
+ method : "notifications/stderr" ,
261
+ params : {
262
+ content : chunk . toString ( ) ,
263
+ } ,
264
+ } ) ;
265
+ } ) ;
269
266
270
267
mcpProxy ( {
271
268
transportToClient : webAppTransport ,
272
- transportToServer : backingServerTransport ,
269
+ transportToServer : serverTransport ,
273
270
} ) ;
274
271
275
272
console . log ( "Set up MCP proxy" ) ;
@@ -284,10 +281,9 @@ app.get("/sse", async (req, res) => {
284
281
console . log (
285
282
"New SSE connection. NOTE: The sse transport is deprecated and has been replaced by streamable-http" ,
286
283
) ;
287
-
284
+ let serverTransport : Transport | undefined ;
288
285
try {
289
- await backingServerTransport ?. close ( ) ;
290
- backingServerTransport = await createTransport ( req ) ;
286
+ serverTransport = await createTransport ( req ) ;
291
287
} catch ( error ) {
292
288
if ( error instanceof SseError && error . code === 401 ) {
293
289
console . error (
@@ -305,13 +301,15 @@ app.get("/sse", async (req, res) => {
305
301
306
302
const webAppTransport = new SSEServerTransport ( "/message" , res ) ;
307
303
webAppTransports . set ( webAppTransport . sessionId , webAppTransport ) ;
308
- console . log ( "Created web app transport" ) ;
304
+ console . log ( "Created client transport" ) ;
305
+ serverTransports . set ( webAppTransport . sessionId , serverTransport ) ;
306
+ console . log ( "Created server transport" ) ;
309
307
310
308
await webAppTransport . start ( ) ;
311
309
312
310
mcpProxy ( {
313
311
transportToClient : webAppTransport ,
314
- transportToServer : backingServerTransport ,
312
+ transportToServer : serverTransport ,
315
313
} ) ;
316
314
317
315
console . log ( "Set up MCP proxy" ) ;
0 commit comments