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:
parent
3225345bb4
commit
cf459b1a0d
1 changed files with 23 additions and 1 deletions
|
@ -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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue