diff --git a/.changeset/strong-hairs-study.md b/.changeset/strong-hairs-study.md new file mode 100644 index 000000000..9addb05e9 --- /dev/null +++ b/.changeset/strong-hairs-study.md @@ -0,0 +1,5 @@ +--- +'@modelcontextprotocol/server': patch +--- + +add application/json header for notifications diff --git a/packages/server/src/server/webStandardStreamableHttp.ts b/packages/server/src/server/webStandardStreamableHttp.ts index 082c904e1..012f75ac1 100644 --- a/packages/server/src/server/webStandardStreamableHttp.ts +++ b/packages/server/src/server/webStandardStreamableHttp.ts @@ -667,7 +667,12 @@ export class WebStandardStreamableHTTPServerTransport implements Transport { for (const message of messages) { this.onmessage?.(message, { authInfo: options?.authInfo, requestInfo }); } - return new Response(null, { status: 202 }); + return new Response(null, { + status: 202, + headers: { + 'Content-Type': 'application/json' + } + }); } // The default behavior is to use SSE streaming diff --git a/packages/server/test/server/streamableHttp.test.ts b/packages/server/test/server/streamableHttp.test.ts index d8c6388e4..ae5a3f1f9 100644 --- a/packages/server/test/server/streamableHttp.test.ts +++ b/packages/server/test/server/streamableHttp.test.ts @@ -651,6 +651,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { const response = await sendPostRequest(baseUrl, batchNotifications, sessionId); expect(response.status).toBe(202); + expect(response.headers.get('content-type')).toBe('application/json'); }); it('should handle batch request messages with SSE stream for responses', async () => {