[v2] move to Headers object (#1327)

Co-authored-by: Matt <77928207+mattzcarey@users.noreply.github.com>
This commit is contained in:
Konstantin Konstantinov 2026-01-20 12:30:57 +02:00 • committed by GitHub
commit 40f6ba7a19
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 12 additions and 12 deletions

View file

@ -2384,11 +2384,6 @@ type Flatten<T> = T extends Primitive
type Infer<Schema extends z.ZodTypeAny> = Flatten<z.infer<Schema>>;
/**
* Headers that are compatible with both Node.js and the browser.
*/
export type IsomorphicHeaders = Record<string, string | string[] | undefined>;
/**
* Information about the incoming request.
*/
@ -2396,7 +2391,7 @@ export interface RequestInfo {
/**
* The headers of the request.
*/
headers: IsomorphicHeaders;
headers: Headers;
}
/**

View file

@ -12,13 +12,13 @@ import type {
JSONRPCResultResponse,
RequestId
} from '@modelcontextprotocol/core';
import type { EventId, EventStore, StreamId } from '@modelcontextprotocol/server';
import { McpServer } from '@modelcontextprotocol/server';
import type { ZodMatrixEntry } from '@modelcontextprotocol/test-helpers';
import { listenOnRandomPort, zodTestMatrix } from '@modelcontextprotocol/test-helpers';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import { NodeStreamableHTTPServerTransport } from '../src/streamableHttp.js';
import { McpServer } from '@modelcontextprotocol/server';
import type { EventId, EventStore, StreamId } from '@modelcontextprotocol/server';
import { describe, expect, beforeEach, afterEach, it } from 'vitest';
async function getFreePort() {
return new Promise(res => {
@ -402,10 +402,15 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
'A simple test tool with request info',
{ name: z.string().describe('Name to greet') },
async ({ name }, { requestInfo }): Promise<CallToolResult> => {
// Convert Headers object to plain object for JSON serialization
// Headers is a Web API class that doesn't serialize with JSON.stringify
const serializedRequestInfo = {
headers: Object.fromEntries(requestInfo?.headers ?? new Headers())
};
return {
content: [
{ type: 'text', text: `Hello, ${name}!` },
{ type: 'text', text: `${JSON.stringify(requestInfo)}` }
{ type: 'text', text: `${JSON.stringify(serializedRequestInfo)}` }
]
};
}

View file

@ -168,7 +168,7 @@ export class Server<
if (this._capabilities.logging) {
this.setRequestHandler(SetLevelRequestSchema, async (request, extra) => {
const transportSessionId: string | undefined =
extra.sessionId || (extra.requestInfo?.headers['mcp-session-id'] as string) || undefined;
extra.sessionId || (extra.requestInfo?.headers.get('mcp-session-id') as string) || undefined;
const { level } = request.params;
const parseResult = LoggingLevelSchema.safeParse(level);
if (parseResult.success) {

View file

@ -596,7 +596,7 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
// Build request info from headers
const requestInfo: RequestInfo = {
headers: Object.fromEntries(req.headers.entries())
headers: req.headers
};
let rawMessage;