11#!/usr/bin/env node
22
33import cors from "cors" ;
4- import EventSource from "eventsource" ;
54import { parseArgs } from "node:util" ;
65import { parse as shellParseArgs } from "shell-quote" ;
76
@@ -12,18 +11,16 @@ import {
1211} from "@modelcontextprotocol/sdk/client/stdio.js" ;
1312import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js" ;
1413import express from "express" ;
15- import mcpProxy from "./mcpProxy.js" ;
1614import { findActualExecutable } from "spawn-rx" ;
15+ import mcpProxy from "./mcpProxy.js" ;
16+
17+ const SSE_HEADERS_PASSTHROUGH = [ 'Authorization' ] ;
1718
1819const defaultEnvironment = {
1920 ...getDefaultEnvironment ( ) ,
2021 ...( process . env . MCP_ENV_VARS ? JSON . parse ( process . env . MCP_ENV_VARS ) : { } ) ,
2122} ;
2223
23- // Polyfill EventSource for an SSE client in Node.js
24- // eslint-disable-next-line @typescript-eslint/no-explicit-any
25- ( global as any ) . EventSource = EventSource ;
26-
2724const { values } = parseArgs ( {
2825 args : process . argv . slice ( 2 ) ,
2926 options : {
@@ -37,7 +34,8 @@ app.use(cors());
3734
3835let webAppTransports : SSEServerTransport [ ] = [ ] ;
3936
40- const createTransport = async ( query : express . Request [ "query" ] ) => {
37+ const createTransport = async ( req : express . Request ) => {
38+ const query = req . query ;
4139 console . log ( "Query parameters:" , query ) ;
4240
4341 const transportType = query . transportType as string ;
@@ -65,9 +63,27 @@ const createTransport = async (query: express.Request["query"]) => {
6563 return transport ;
6664 } else if ( transportType === "sse" ) {
6765 const url = query . url as string ;
68- console . log ( `SSE transport: url=${ url } ` ) ;
66+ const headers : HeadersInit = { } ;
67+ for ( const key of SSE_HEADERS_PASSTHROUGH ) {
68+ if ( req . headers [ key ] === undefined ) {
69+ continue ;
70+
71+ }
6972
70- const transport = new SSEClientTransport ( new URL ( url ) ) ;
73+ const value = req . headers [ key ] ;
74+ headers [ key ] = Array . isArray ( value ) ? value [ value . length - 1 ] : value ;
75+ }
76+
77+ console . log ( `SSE transport: url=${ url } , headers=${ Object . keys ( headers ) } ` ) ;
78+
79+ const transport = new SSEClientTransport ( new URL ( url ) , {
80+ eventSourceInit : {
81+ fetch : ( url , init ) => fetch ( url , { ...init , headers } ) ,
82+ } ,
83+ requestInit : {
84+ headers,
85+ } ,
86+ } ) ;
7187 await transport . start ( ) ;
7288
7389 console . log ( "Connected to SSE transport" ) ;
@@ -82,7 +98,7 @@ app.get("/sse", async (req, res) => {
8298 try {
8399 console . log ( "New SSE connection" ) ;
84100
85- const backingServerTransport = await createTransport ( req . query ) ;
101+ const backingServerTransport = await createTransport ( req ) ;
86102
87103 console . log ( "Connected MCP client to backing server transport" ) ;
88104
@@ -152,4 +168,4 @@ app.get("/config", (req, res) => {
152168} ) ;
153169
154170const PORT = process . env . PORT || 3000 ;
155- app . listen ( PORT , ( ) => { } ) ;
171+ app . listen ( PORT , ( ) => { } ) ;
0 commit comments