From b50a62f17f37532cf7de540de7cea3933ecd47b1 Mon Sep 17 00:00:00 2001 From: Charlie Tonneslan Date: Tue, 17 Mar 2026 15:27:05 -0400 Subject: [PATCH 1/2] fix: preserve custom Accept headers instead of unconditionally overwriting The SDK unconditionally overwrites Accept headers with headers.set(), discarding any custom Accept values provided via requestInit.headers. This breaks APIs that require specific Accept header values. Now checks headers.has('Accept') before setting the default value, preserving user-provided Accept headers in both Streamable HTTP and SSE transports. Fixes #1646 --- packages/client/src/client/sse.ts | 4 +++- packages/client/src/client/streamableHttp.ts | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) 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, From 0a586a2f8f80ea329bf6acd00ffb230338bde56a Mon Sep 17 00:00:00 2001 From: Charlie Tonneslan Date: Tue, 17 Mar 2026 19:58:37 -0400 Subject: [PATCH 2/2] add changeset --- .changeset/preserve-accept-header.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/preserve-accept-header.md 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