Ensure Authorization header is passed to SSE connections

When using Bearer token authentication, the Authorization header was not being properly forwarded to SSE connections, causing 401 Unauthorized errors. This fix adds a custom EventSource initialization that explicitly includes the Authorization header in all SSE requests, allowing proper authentication with remote servers.
This commit is contained in:
Jon Slominski 2025-04-10 20:56:07 -05:00 committed by GitHub
parent 3225345bb4
commit cf459b1a0d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -26,12 +26,16 @@ export function mcpProxy({ transportToClient, transportToServer }: { transportTo
transportToClient.onmessage = (message) => { transportToClient.onmessage = (message) => {
// @ts-expect-error TODO // @ts-expect-error TODO
log('[Local→Remote]', message.method || message.id) log('[Local→Remote]', message.method || message.id)
// Log full outgoing request details
log('[Local→Remote Full]', JSON.stringify(message, null, 2))
transportToServer.send(message).catch(onServerError) transportToServer.send(message).catch(onServerError)
} }
transportToServer.onmessage = (message) => { transportToServer.onmessage = (message) => {
// @ts-expect-error TODO: fix this type // @ts-expect-error TODO: fix this type
log('[Remote→Local]', message.method || message.id) log('[Remote→Local]', message.method || message.id)
// Log full response details
log('[Remote→Local Full]', JSON.stringify(message, null, 2))
transportToClient.send(message).catch(onClientError) transportToClient.send(message).catch(onClientError)
} }
@ -82,7 +86,25 @@ export async function connectToRemoteServer(
): Promise<SSEClientTransport> { ): Promise<SSEClientTransport> {
log(`[${pid}] Connecting to remote server: ${serverUrl}`) log(`[${pid}] Connecting to remote server: ${serverUrl}`)
const url = new URL(serverUrl) const url = new URL(serverUrl)
const transport = new SSEClientTransport(url, { authProvider, requestInit: { headers } })
// Create transport with eventSourceInit to pass Authorization header if present
const eventSourceInit = {
fetch: (url: string | URL, init: RequestInit | undefined) => {
return fetch(url, {
...init,
headers: {
...init?.headers,
...headers,
},
})
},
}
const transport = new SSEClientTransport(url, {
authProvider,
requestInit: { headers },
eventSourceInit,
})
try { try {
await transport.start() await transport.start()