Skip to content

Commit e7697eb

Browse files
committed
Pass through Authorization headers sent to inspector server
1 parent c1e06c4 commit e7697eb

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

server/src/index.ts

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#!/usr/bin/env node
22

33
import cors from "cors";
4-
import EventSource from "eventsource";
54
import { parseArgs } from "node:util";
65
import { parse as shellParseArgs } from "shell-quote";
76

@@ -12,18 +11,16 @@ import {
1211
} from "@modelcontextprotocol/sdk/client/stdio.js";
1312
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
1413
import express from "express";
15-
import mcpProxy from "./mcpProxy.js";
1614
import { findActualExecutable } from "spawn-rx";
15+
import mcpProxy from "./mcpProxy.js";
16+
17+
const SSE_HEADERS_PASSTHROUGH = ['Authorization'];
1718

1819
const 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-
2724
const { values } = parseArgs({
2825
args: process.argv.slice(2),
2926
options: {
@@ -37,7 +34,8 @@ app.use(cors());
3734

3835
let 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

154170
const PORT = process.env.PORT || 3000;
155-
app.listen(PORT, () => {});
171+
app.listen(PORT, () => { });

0 commit comments

Comments
 (0)