diff --git a/.changeset/preserve-accept-header.md b/.changeset/preserve-accept-header.md new file mode 100644 index 000000000..d3bd2ed24 --- /dev/null +++ b/.changeset/preserve-accept-header.md @@ -0,0 +1,5 @@ +--- +"@modelcontextprotocol/client": patch +--- + +Preserve custom Accept headers instead of unconditionally overwriting them diff --git a/packages/client/src/client/sse.ts b/packages/client/src/client/sse.ts index 133aa0004..ad50dfc21 100644 --- a/packages/client/src/client/sse.ts +++ b/packages/client/src/client/sse.ts @@ -143,7 +143,9 @@ export class SSEClientTransport implements Transport { ...this._eventSourceInit, fetch: async (url, init) => { const headers = await this._commonHeaders(); - headers.set('Accept', 'text/event-stream'); + if (!headers.has('Accept')) { + headers.set('Accept', 'text/event-stream'); + } const response = await fetchImpl(url, { ...init, headers diff --git a/packages/client/src/client/streamableHttp.ts b/packages/client/src/client/streamableHttp.ts index dab9b37ab..53c74c111 100644 --- a/packages/client/src/client/streamableHttp.ts +++ b/packages/client/src/client/streamableHttp.ts @@ -214,7 +214,9 @@ export class StreamableHTTPClientTransport implements Transport { // Try to open an initial SSE stream with GET to listen for server messages // This is optional according to the spec - server may not support it const headers = await this._commonHeaders(); - headers.set('Accept', 'text/event-stream'); + if (!headers.has('Accept')) { + headers.set('Accept', 'text/event-stream'); + } // Include Last-Event-ID header for resumable streams if provided if (resumptionToken) { @@ -473,7 +475,9 @@ export class StreamableHTTPClientTransport implements Transport { const headers = await this._commonHeaders(); headers.set('content-type', 'application/json'); - headers.set('accept', 'application/json, text/event-stream'); + if (!headers.has('accept')) { + headers.set('accept', 'application/json, text/event-stream'); + } const init = { ...this._requestInit,