import { z } from "zod"; export const MAX_MCP_HEADERS = 8; const reserved = new Set([ "host", "content-length", "content-type", "accept", "connection", "transfer-encoding", "upgrade", "origin", "referer", ]); export const mcpHeaderName = z .string() .trim() .toLowerCase() .min(1) .max(100) .regex(/^[!#$%&'*+.^_`|~0-9a-z-]+$/) .refine( (name) => !reserved.has(name) && !name.startsWith("sec-") && !name.startsWith("mcp-"), ); export const mcpHeaders = z .array( z.strictObject({ name: mcpHeaderName, value: z .string() .trim() .min(1) .max(4096) .regex(/^[\x20-\x7e]+$/), }), ) .max(MAX_MCP_HEADERS) .refine( (headers) => new Set(headers.map((header) => header.name)).size === headers.length, ) .refine( (headers) => headers.reduce( (bytes, header) => bytes + header.name.length + header.value.length, 0, ) <= 16384, ); export type McpHeader = z.infer[number];