fastmcp 4.16.3 → 4.16.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/fastmcp/fastmcp/dist/edge/index.cjs","../../src/edge/index.ts","../../src/edge/WebStreamableHTTPServerTransport.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fastmcp/fastmcp/dist/edge/index.cjs","sourcesContent":[null,"/**\n * FastMCP Edge Runtime Support\n *\n * This module provides edge runtime compatibility for FastMCP, enabling\n * deployment to Cloudflare Workers, Deno Deploy, and other edge platforms.\n *\n * @example\n * ```typescript\n * // Cloudflare Workers\n * import { EdgeFastMCP } from \"fastmcp/edge\";\n * import { z } from \"zod\";\n *\n * const server = new EdgeFastMCP({ name: \"MyMCP\", version: \"1.0.0\" });\n *\n * server.addTool({\n * name: \"hello\",\n * description: \"Say hello\",\n * parameters: z.object({ name: z.string() }),\n * execute: async ({ name }) => `Hello, ${name}!`,\n * });\n *\n * export default server;\n * ```\n */\n\nimport {\n ErrorCode,\n JSONRPCMessage,\n LATEST_PROTOCOL_VERSION,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { Hono } from \"hono\";\nimport { strictJsonSchema } from \"xsschema\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nexport { WebStreamableHTTPServerTransport } from \"./WebStreamableHTTPServerTransport.js\";\nexport type {\n EventStore,\n WebStreamableHTTPServerTransportOptions,\n} from \"./WebStreamableHTTPServerTransport.js\";\n\n/**\n * Options for EdgeFastMCP\n */\nexport interface EdgeFastMCPOptions {\n description?: string;\n logger?: EdgeLogger;\n /**\n * Base path for MCP endpoints (default: \"/mcp\")\n */\n mcpPath?: string;\n name: string;\n version: string;\n}\n\n/**\n * Type for edge runtime fetch handler\n */\nexport type EdgeFetchHandler = (request: Request) => Promise<Response>;\n\n/**\n * Logger interface for edge environments\n */\nexport interface EdgeLogger {\n debug(...args: unknown[]): void;\n error(...args: unknown[]): void;\n info(...args: unknown[]): void;\n log(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n}\n\n/**\n * Prompt definition for EdgeFastMCP\n */\nexport interface EdgePrompt {\n arguments?: Array<{ description?: string; name: string; required?: boolean }>;\n description?: string;\n load: (args: Record<string, string>) => Promise<\n | {\n messages: Array<{\n content: { text: string; type: string };\n role: string;\n }>;\n }\n | string\n >;\n name: string;\n}\n\n/**\n * Resource definition for EdgeFastMCP\n */\nexport interface EdgeResource {\n description?: string;\n load: () => Promise<\n { blob?: string; mimeType?: string; text?: string } | string\n >;\n mimeType?: string;\n name: string;\n uri: string;\n}\n\n/**\n * Tool definition for EdgeFastMCP\n */\nexport interface EdgeTool<TParams = unknown> {\n description: string;\n execute: (params: TParams) => Promise<\n | {\n content: Array<{\n data?: string;\n mimeType?: string;\n text?: string;\n type: string;\n }>;\n }\n | string\n >;\n name: string;\n parameters?: StandardSchemaV1<TParams> | z.ZodType<TParams>;\n}\n\n/**\n * Edge-compatible FastMCP server for Cloudflare Workers, Deno, and Bun\n *\n * This is a simplified implementation optimized for stateless edge environments.\n * It uses web-standard APIs only (no Node.js dependencies).\n */\nexport class EdgeFastMCP {\n #honoApp = new Hono();\n #logger: EdgeLogger;\n #mcpPath: string;\n #name: string;\n #prompts: EdgePrompt[] = [];\n #resources: EdgeResource[] = [];\n #tools: EdgeTool[] = [];\n #version: string;\n\n constructor(options: EdgeFastMCPOptions) {\n this.#name = options.name;\n this.#version = options.version;\n this.#logger = options.logger ?? console;\n this.#mcpPath = options.mcpPath ?? \"/mcp\";\n\n this.#setupRoutes();\n }\n\n /**\n * Add a prompt to the server\n */\n addPrompt(prompt: EdgePrompt): this {\n this.#prompts.push(prompt);\n return this;\n }\n\n /**\n * Add a resource to the server\n */\n addResource(resource: EdgeResource): this {\n this.#resources.push(resource);\n return this;\n }\n\n /**\n * Add a tool to the server\n */\n addTool<TParams>(tool: EdgeTool<TParams>): this {\n this.#tools.push(tool as EdgeTool);\n return this;\n }\n\n /**\n * Handle an incoming request (main entry point for edge runtimes)\n */\n async fetch(request: Request): Promise<Response> {\n return this.#honoApp.fetch(request);\n }\n\n /**\n * Get the Hono app for adding custom routes\n */\n getApp(): Hono {\n return this.#honoApp;\n }\n\n /**\n * Create an error HTTP response\n */\n #errorResponse(status: number, code: number, message: string): Response {\n return new Response(\n JSON.stringify({\n error: { code, message },\n id: null,\n jsonrpc: \"2.0\",\n }),\n {\n headers: { \"Content-Type\": \"application/json\" },\n status,\n },\n );\n }\n\n /**\n * Handle initialize request\n */\n #handleInitialize(id: number | string): JSONRPCMessage {\n return {\n id,\n jsonrpc: \"2.0\",\n result: {\n capabilities: {\n prompts: this.#prompts.length > 0 ? {} : undefined,\n resources: this.#resources.length > 0 ? {} : undefined,\n tools: this.#tools.length > 0 ? {} : undefined,\n },\n protocolVersion: LATEST_PROTOCOL_VERSION,\n serverInfo: {\n name: this.#name,\n version: this.#version,\n },\n },\n } as JSONRPCMessage;\n }\n\n /**\n * Handle MCP POST requests\n */\n async #handleMcpRequest(request: Request): Promise<Response> {\n // Validate headers\n const acceptHeader = request.headers.get(\"accept\");\n if (\n !acceptHeader?.includes(\"application/json\") &&\n !acceptHeader?.includes(\"text/event-stream\")\n ) {\n return this.#errorResponse(\n 406,\n -32000,\n \"Not Acceptable: Client must accept application/json or text/event-stream\",\n );\n }\n\n const contentType = request.headers.get(\"content-type\");\n if (!contentType?.includes(\"application/json\")) {\n return this.#errorResponse(\n 415,\n -32000,\n \"Unsupported Media Type: Content-Type must be application/json\",\n );\n }\n\n // Parse request body\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n return this.#errorResponse(400, -32700, \"Parse error: Invalid JSON\");\n }\n\n // Handle single or batch requests\n const isBatch = Array.isArray(body);\n const messages = Array.isArray(body) ? body : [body];\n\n if (isBatch && messages.length === 0) {\n return this.#errorResponse(\n 400,\n ErrorCode.InvalidRequest,\n \"Invalid Request: Batch must contain at least one message\",\n );\n }\n\n const responses: JSONRPCMessage[] = [];\n\n for (const message of messages) {\n const response = await this.#handleMessage(message);\n if (response) {\n responses.push(response);\n }\n }\n\n // Return appropriate response format\n if (responses.length === 0) {\n return new Response(null, { status: 202 });\n }\n\n const responseBody = JSON.stringify(isBatch ? responses : responses[0]);\n\n return new Response(responseBody, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n status: 200,\n });\n }\n\n /**\n * Handle SSE GET requests\n */\n async #handleMcpSseRequest(request: Request): Promise<Response> {\n const acceptHeader = request.headers.get(\"accept\");\n if (!acceptHeader?.includes(\"text/event-stream\")) {\n return this.#errorResponse(\n 406,\n -32000,\n \"Not Acceptable: Client must accept text/event-stream\",\n );\n }\n\n // In stateless mode, GET requests are not supported (no server-initiated messages)\n return this.#errorResponse(\n 405,\n -32000,\n \"Method Not Allowed: SSE streams not supported in stateless mode\",\n );\n }\n\n /**\n * Handle individual MCP messages\n */\n async #handleMessage(message: unknown): Promise<JSONRPCMessage | null> {\n if (!message || typeof message !== \"object\") {\n return this.#rpcError(null, -32700, \"Parse error: Invalid message\");\n }\n\n const msg = message as {\n id?: number | string;\n jsonrpc?: string;\n method?: string;\n params?: unknown;\n };\n\n if (msg.jsonrpc !== \"2.0\") {\n return this.#rpcError(\n msg.id ?? null,\n -32600,\n \"Invalid Request: jsonrpc must be 2.0\",\n );\n }\n\n // Handle notifications (no response expected)\n if (!(\"id\" in msg) || msg.id === undefined) {\n return null;\n }\n\n const method = msg.method;\n const id = msg.id;\n const params = msg.params as Record<string, unknown> | undefined;\n\n try {\n switch (method) {\n case \"initialize\":\n return this.#handleInitialize(id);\n\n case \"ping\":\n return { id, jsonrpc: \"2.0\", result: {} } as JSONRPCMessage;\n\n case \"prompts/get\":\n return this.#handlePromptsGet(id, params);\n\n case \"prompts/list\":\n return this.#handlePromptsList(id);\n\n case \"resources/list\":\n return this.#handleResourcesList(id);\n\n case \"resources/read\":\n return this.#handleResourcesRead(id, params);\n\n case \"tools/call\":\n return this.#handleToolsCall(id, params);\n\n case \"tools/list\":\n return this.#handleToolsList(id);\n\n default:\n return this.#rpcError(id, -32601, `Method not found: ${method}`);\n }\n } catch (error) {\n this.#logger.error(`Error handling ${method}:`, error);\n return this.#rpcError(\n id,\n -32603,\n `Internal error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handle prompts/get request\n */\n async #handlePromptsGet(\n id: number | string,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCMessage> {\n const promptName = params?.name as string;\n const promptArgs = params?.arguments as Record<string, string> | undefined;\n\n const prompt = this.#prompts.find((p) => p.name === promptName);\n if (!prompt) {\n return this.#rpcError(\n id,\n ErrorCode.InvalidParams,\n `Prompt not found: ${promptName}`,\n );\n }\n\n try {\n const result = await prompt.load(promptArgs ?? {});\n const messages =\n typeof result === \"string\"\n ? [{ content: { text: result, type: \"text\" }, role: \"user\" }]\n : result.messages;\n\n return {\n id,\n jsonrpc: \"2.0\",\n result: { messages },\n } as JSONRPCMessage;\n } catch (error) {\n return this.#rpcError(\n id,\n ErrorCode.InternalError,\n `Prompt load failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handle prompts/list request\n */\n #handlePromptsList(id: number | string): JSONRPCMessage {\n return {\n id,\n jsonrpc: \"2.0\",\n result: {\n prompts: this.#prompts.map((p) => ({\n arguments: p.arguments,\n description: p.description,\n name: p.name,\n })),\n },\n } as JSONRPCMessage;\n }\n\n /**\n * Handle resources/list request\n */\n #handleResourcesList(id: number | string): JSONRPCMessage {\n return {\n id,\n jsonrpc: \"2.0\",\n result: {\n resources: this.#resources.map((r) => ({\n description: r.description,\n mimeType: r.mimeType,\n name: r.name,\n uri: r.uri,\n })),\n },\n } as JSONRPCMessage;\n }\n\n /**\n * Handle resources/read request\n */\n async #handleResourcesRead(\n id: number | string,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCMessage> {\n const uri = params?.uri as string;\n const resource = this.#resources.find((r) => r.uri === uri);\n\n if (!resource) {\n return this.#rpcError(\n id,\n ErrorCode.InvalidParams,\n `Resource not found: ${uri}`,\n );\n }\n\n try {\n const result = await resource.load();\n const content =\n typeof result === \"string\"\n ? { mimeType: resource.mimeType ?? \"text/plain\", text: result, uri }\n : { uri, ...result };\n\n return {\n id,\n jsonrpc: \"2.0\",\n result: { contents: [content] },\n } as JSONRPCMessage;\n } catch (error) {\n return this.#rpcError(\n id,\n ErrorCode.InternalError,\n `Resource load failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handle tools/call request\n */\n async #handleToolsCall(\n id: number | string,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCMessage> {\n const toolName = params?.name as string;\n const toolArgs = params?.arguments as Record<string, unknown> | undefined;\n\n const tool = this.#tools.find((t) => t.name === toolName);\n if (!tool) {\n return this.#rpcError(\n id,\n ErrorCode.InvalidParams,\n `Tool not found: ${toolName}`,\n );\n }\n\n let args: unknown = toolArgs ?? {};\n\n if (tool.parameters) {\n let parsed: StandardSchemaV1.Result<unknown>;\n\n try {\n parsed = await tool.parameters[\"~standard\"].validate(toolArgs);\n } catch (error) {\n return this.#rpcError(\n id,\n ErrorCode.InternalError,\n `Tool '${toolName}' parameter validation failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (parsed.issues) {\n const friendlyErrors = parsed.issues\n .map((issue) => {\n const path = issue.path?.join(\".\") || \"root\";\n return `${path}: ${issue.message}`;\n })\n .join(\", \");\n\n return this.#rpcError(\n id,\n ErrorCode.InvalidParams,\n `Tool '${toolName}' parameter validation failed: ${friendlyErrors}. Please check the parameter types and values according to the tool's schema.`,\n );\n }\n\n args = parsed.value;\n }\n\n try {\n const result = await tool.execute(args);\n\n // Normalize result to content array\n const content =\n typeof result === \"string\"\n ? [{ text: result, type: \"text\" }]\n : result.content;\n\n return {\n id,\n jsonrpc: \"2.0\",\n result: { content },\n } as JSONRPCMessage;\n } catch (error) {\n return this.#rpcError(\n id,\n ErrorCode.InternalError,\n `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handle tools/list request\n */\n #handleToolsList(id: number | string): JSONRPCMessage {\n return {\n id,\n jsonrpc: \"2.0\",\n result: {\n tools: this.#tools.map((tool) => ({\n description: tool.description,\n inputSchema: tool.parameters\n ? this.#schemaToJsonSchema(tool.parameters)\n : { type: \"object\" },\n name: tool.name,\n })),\n },\n } as JSONRPCMessage;\n }\n\n /**\n * Create an RPC error message\n */\n #rpcError(\n id: null | number | string,\n code: number,\n message: string,\n ): JSONRPCMessage {\n return {\n error: { code, message },\n id,\n jsonrpc: \"2.0\",\n } as JSONRPCMessage;\n }\n\n /**\n * Convert schema to JSON Schema\n */\n #schemaToJsonSchema(\n schema: StandardSchemaV1 | z.ZodType,\n ): Record<string, unknown> {\n try {\n // Zod 4+: use native toJSONSchema if available\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (typeof (z as any).toJSONSchema === \"function\") {\n return strictJsonSchema(\n (z as any).toJSONSchema(schema) as Record<string, unknown>,\n ) as Record<string, unknown>;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n // Zod 3 fallback: use zod-to-json-schema\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (\"_def\" in (schema as any) || schema instanceof z.ZodType) {\n return strictJsonSchema(\n zodToJsonSchema(schema as any, { target: \"openApi3\" }) as Record<\n string,\n unknown\n >,\n ) as Record<string, unknown>;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n // For StandardSchema, fall back to a generic object schema\n return { type: \"object\" };\n } catch {\n return { type: \"object\" };\n }\n }\n\n /**\n * Set up MCP and health routes\n */\n #setupRoutes(): void {\n // Health endpoint\n this.#honoApp.get(\"/health\", (c) => c.text(\"✓ Ok\"));\n\n // MCP endpoint - handles all MCP protocol messages\n this.#honoApp.post(this.#mcpPath, async (c) => {\n return this.#handleMcpRequest(c.req.raw);\n });\n\n // MCP GET endpoint for SSE streams (server-initiated messages)\n this.#honoApp.get(this.#mcpPath, async (c) => {\n return this.#handleMcpSseRequest(c.req.raw);\n });\n\n // MCP DELETE endpoint for session termination\n this.#honoApp.delete(this.#mcpPath, async () => {\n return new Response(null, { status: 204 });\n });\n }\n}\n","/**\n * Web-standard Streamable HTTP Server Transport for MCP\n *\n * This transport implements the MCP Streamable HTTP specification using\n * web standard APIs (Request, Response, TransformStream) for compatibility\n * with edge runtimes like Cloudflare Workers, Deno, and Bun.\n */\n\nimport { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport {\n CancelledNotificationSchema,\n isInitializeRequest,\n isJSONRPCError,\n isJSONRPCRequest,\n isJSONRPCResponse,\n JSONRPCMessage,\n JSONRPCMessageSchema,\n MessageExtraInfo,\n RequestId,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nexport type EventId = string;\n/**\n * Interface for resumability support via event storage\n */\nexport interface EventStore {\n getStreamIdForEventId?(eventId: EventId): Promise<StreamId | undefined>;\n replayEventsAfter(\n lastEventId: EventId,\n options: {\n send: (eventId: EventId, message: JSONRPCMessage) => Promise<void>;\n },\n ): Promise<StreamId>;\n storeEvent(streamId: StreamId, message: JSONRPCMessage): Promise<EventId>;\n}\n\nexport type StreamId = string;\n\n/**\n * Configuration options for WebStreamableHTTPServerTransport\n */\nexport interface WebStreamableHTTPServerTransportOptions {\n /**\n * If true, return JSON responses instead of SSE streams\n */\n enableJsonResponse?: boolean;\n\n /**\n * Event store for resumability support\n */\n eventStore?: EventStore;\n\n /**\n * Callback for session close events\n */\n onsessionclosed?: (sessionId: string) => Promise<void> | void;\n\n /**\n * Callback for session initialization events\n */\n onsessioninitialized?: (sessionId: string) => Promise<void> | void;\n\n /**\n * Function that generates a session ID for the transport.\n * Return undefined to disable session management (stateless mode).\n */\n sessionIdGenerator: (() => string) | undefined;\n}\n\n/**\n * Collects the responses to every request that arrived on a single POST, so\n * that JSON mode can answer once all of them are in.\n */\ninterface PendingJsonResponse {\n expectedIds: RequestId[];\n resolve: (responses: JSONRPCMessage[]) => void;\n responses: Map<RequestId, JSONRPCMessage>;\n}\n\nconst MAXIMUM_MESSAGE_SIZE = 4 * 1024 * 1024; // 4MB\n\n/**\n * Web-standard Server transport for Streamable HTTP.\n * Uses web APIs (Request, Response, TransformStream) for edge runtime compatibility.\n */\nexport class WebStreamableHTTPServerTransport implements Transport {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void;\n sessionId?: string;\n private _enableJsonResponse = false;\n private _encoder = new TextEncoder();\n private _eventStore?: EventStore;\n private _jsonResponseCollectors = new Map<StreamId, PendingJsonResponse>();\n private _onsessionclosed?: (sessionId: string) => Promise<void> | void;\n private _onsessioninitialized?: (sessionId: string) => Promise<void> | void;\n /**\n * Replays whose stream id is still being resolved. `replayEventsAfter` only\n * reveals which stream it was replaying once it settles, so a standalone\n * send during that window has nothing to test against; persist rather than\n * drop, since over-storing for the length of a replay beats losing an event.\n */\n private _replaysInFlight = 0;\n\n private _requestToStreamMapping = new Map<RequestId, StreamId>();\n\n private _standaloneSseStreamId = \"_GET_stream\";\n /**\n * Whether a client has held the standalone GET stream during this session.\n * Latched rather than read from `_streamMapping`, so persistence survives\n * the disconnect window the store exists to cover while still telling a\n * dropped stream apart from one that was never opened. Reset with the rest\n * of the per-session state, since the next session starts with no stream.\n */\n private _standaloneStreamOpened = false;\n private _started = false;\n private _streamMapping = new Map<\n StreamId,\n WritableStreamDefaultWriter<Uint8Array>\n >();\n private sessionIdGenerator: (() => string) | undefined;\n\n constructor(options: WebStreamableHTTPServerTransportOptions) {\n this.sessionIdGenerator = options.sessionIdGenerator;\n this._enableJsonResponse = options.enableJsonResponse ?? false;\n this._eventStore = options.eventStore;\n this._onsessioninitialized = options.onsessioninitialized;\n this._onsessionclosed = options.onsessionclosed;\n }\n\n /**\n * Close the transport\n */\n async close(): Promise<void> {\n for (const writer of this._streamMapping.values()) {\n try {\n await writer.close();\n } catch {\n // Ignore close errors\n }\n }\n this._streamMapping.clear();\n this._standaloneStreamOpened = false;\n this.releasePendingRequests();\n this._started = false;\n this.onclose?.();\n }\n\n /**\n * Handles an incoming web Request and returns a Response\n */\n async handleRequest(\n request: Request,\n parsedBody?: unknown,\n ): Promise<Response> {\n const method = request.method;\n\n if (method === \"POST\") {\n return this.handlePostRequest(request, parsedBody);\n } else if (method === \"GET\") {\n return this.handleGetRequest(request);\n } else if (method === \"DELETE\") {\n return this.handleDeleteRequest(request);\n } else {\n return this.handleUnsupportedRequest();\n }\n }\n\n /**\n * Send a message to connected clients\n */\n async send(\n message: JSONRPCMessage,\n options?: { relatedRequestId?: RequestId },\n ): Promise<void> {\n let requestId = options?.relatedRequestId;\n const isResponse = isJSONRPCResponse(message) || isJSONRPCError(message);\n if (isResponse) {\n // Responses are routed by the id of the request they answer\n requestId = message.id;\n }\n\n const streamId =\n requestId === undefined\n ? this._standaloneSseStreamId\n : this._requestToStreamMapping.get(requestId);\n\n if (streamId) {\n // JSON mode has no stream to write to: collect the responses instead and\n // let handlePostRequest answer once every request on this POST is done.\n const collector = this._jsonResponseCollectors.get(streamId);\n if (collector) {\n if (isResponse && requestId !== undefined) {\n collector.responses.set(requestId, message);\n this.settleJsonResponse(streamId, collector);\n }\n return;\n }\n\n const writer = this._streamMapping.get(streamId);\n // With an event store the message must be persisted even if the client\n // has already disconnected, so a reconnect with Last-Event-Id can replay\n // it. The live write to the SSE stream is best-effort on top of that.\n const store = this.shouldPersist(streamId, writer)\n ? this._eventStore\n : undefined;\n\n if (writer || store) {\n try {\n let eventId: string | undefined;\n if (store) {\n eventId = await store.storeEvent(streamId, message);\n }\n if (writer) {\n if (eventId === undefined) {\n await this.writeSSEEvent(writer, message);\n } else {\n await this.writeSSEEventWithId(writer, eventId, message);\n }\n }\n } catch (error) {\n this.onerror?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Close the POST stream once all of its requests are answered. Drained\n // whether or not the store and the socket cooperated: with an event\n // store configured `trackStream` deliberately leaves routing entries\n // alone on disconnect, so this is the only thing that reclaims them,\n // and giving up on a failed write strands the entry until the session\n // ends.\n if (requestId !== undefined && isResponse) {\n this._requestToStreamMapping.delete(requestId);\n const streamInUse = Array.from(\n this._requestToStreamMapping.values(),\n ).includes(streamId);\n if (!streamInUse) {\n this._streamMapping.delete(streamId);\n if (writer) {\n try {\n await writer.close();\n } catch (error) {\n this.onerror?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n }\n }\n }\n }\n }\n\n async start(): Promise<void> {\n if (this._started) {\n throw new Error(\"Transport already started\");\n }\n this._started = true;\n }\n\n /**\n * Create an error response\n */\n private createErrorResponse(\n status: number,\n code: number,\n message: string,\n ): Response {\n return new Response(\n JSON.stringify({\n error: { code, message },\n id: null,\n jsonrpc: \"2.0\",\n }),\n {\n headers: {\n ...this.getResponseHeaders(),\n \"Content-Type\": \"application/json\",\n },\n status,\n },\n );\n }\n\n /**\n * Get common response headers\n */\n private getResponseHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n if (this.sessionId) {\n headers[\"mcp-session-id\"] = this.sessionId;\n }\n return headers;\n }\n\n /**\n * Handles DELETE requests to terminate sessions\n */\n private async handleDeleteRequest(request: Request): Promise<Response> {\n const sessionId = request.headers.get(\"mcp-session-id\");\n\n if (this.sessionIdGenerator) {\n if (!sessionId) {\n return this.createErrorResponse(\n 400,\n -32000,\n \"Bad Request: Mcp-Session-Id header is required\",\n );\n }\n\n if (this.sessionId !== sessionId) {\n return this.createErrorResponse(404, -32001, \"Session not found\");\n }\n }\n\n // Close all streams\n for (const writer of this._streamMapping.values()) {\n try {\n await writer.close();\n } catch {\n // Ignore close errors\n }\n }\n this._streamMapping.clear();\n // Per-session, like the session id below: this instance stays usable, and\n // the next session starts having opened no standalone stream of its own.\n this._standaloneStreamOpened = false;\n this.releasePendingRequests();\n\n await this._onsessionclosed?.(this.sessionId ?? \"\");\n this.sessionId = undefined;\n\n return new Response(null, {\n headers: this.getResponseHeaders(),\n status: 204,\n });\n }\n\n /**\n * Handles GET requests for SSE stream\n */\n private async handleGetRequest(request: Request): Promise<Response> {\n const acceptHeader = request.headers.get(\"accept\");\n if (!acceptHeader?.includes(\"text/event-stream\")) {\n return this.createErrorResponse(\n 406,\n -32000,\n \"Not Acceptable: Client must accept text/event-stream\",\n );\n }\n\n // Validate session\n const sessionId = request.headers.get(\"mcp-session-id\");\n if (this.sessionIdGenerator && !sessionId) {\n return this.createErrorResponse(\n 400,\n -32000,\n \"Bad Request: Mcp-Session-Id header is required\",\n );\n }\n\n if (this.sessionIdGenerator && this.sessionId !== sessionId) {\n return this.createErrorResponse(404, -32001, \"Session not found\");\n }\n\n // Check for existing standalone stream\n if (this._streamMapping.has(this._standaloneSseStreamId)) {\n return this.createErrorResponse(\n 409,\n -32000,\n \"Conflict: SSE stream already exists for this session\",\n );\n }\n\n // Handle resumability\n if (this._eventStore) {\n const lastEventId = request.headers.get(\"last-event-id\");\n if (lastEventId) {\n return this.handleReplayEvents(lastEventId);\n }\n }\n\n // Create SSE stream\n const { readable, writable } = new TransformStream<Uint8Array>();\n const writer = writable.getWriter();\n this.trackStream(this._standaloneSseStreamId, writer);\n\n return new Response(readable, {\n headers: {\n ...this.getResponseHeaders(),\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"Content-Type\": \"text/event-stream\",\n },\n status: 200,\n });\n }\n\n /**\n * Handles POST requests containing JSON-RPC messages\n */\n private async handlePostRequest(\n request: Request,\n parsedBody?: unknown,\n ): Promise<Response> {\n // Validate Accept header\n const acceptHeader = request.headers.get(\"accept\");\n if (\n !acceptHeader?.includes(\"application/json\") &&\n !acceptHeader?.includes(\"text/event-stream\")\n ) {\n return this.createErrorResponse(\n 406,\n -32000,\n \"Not Acceptable: Client must accept application/json or text/event-stream\",\n );\n }\n\n // Validate Content-Type\n const contentType = request.headers.get(\"content-type\");\n if (!contentType?.includes(\"application/json\")) {\n return this.createErrorResponse(\n 415,\n -32000,\n \"Unsupported Media Type: Content-Type must be application/json\",\n );\n }\n\n // Validate Content-Length\n const contentLength = parseInt(\n request.headers.get(\"content-length\") ?? \"0\",\n 10,\n );\n if (contentLength > MAXIMUM_MESSAGE_SIZE) {\n return this.createErrorResponse(\n 413,\n -32000,\n `Request body too large. Maximum size is ${MAXIMUM_MESSAGE_SIZE} bytes`,\n );\n }\n\n // Parse body\n let rawMessage: unknown;\n try {\n rawMessage = parsedBody ?? (await request.json());\n } catch {\n return this.createErrorResponse(400, -32700, \"Parse error: Invalid JSON\");\n }\n\n // Handle batch or single message. The original shape decides the response\n // envelope: a batch always answers with an array, even when only one\n // response survives.\n const isBatch = Array.isArray(rawMessage);\n const arrayMessage: unknown[] = Array.isArray(rawMessage)\n ? rawMessage\n : [rawMessage];\n\n if (isBatch && arrayMessage.length === 0) {\n return this.createErrorResponse(\n 400,\n -32600,\n \"Invalid Request: Batch must contain at least one message\",\n );\n }\n\n // Validate messages\n const messages: JSONRPCMessage[] = [];\n for (const msg of arrayMessage) {\n const result = JSONRPCMessageSchema.safeParse(msg);\n if (!result.success) {\n return this.createErrorResponse(\n 400,\n -32700,\n \"Parse error: Invalid JSON-RPC message\",\n );\n }\n messages.push(result.data);\n }\n\n // Handle session ID\n const requestSessionId = request.headers.get(\"mcp-session-id\");\n const hasInitRequest = messages.some((msg) => isInitializeRequest(msg));\n\n // Validate session requirements\n if (hasInitRequest && requestSessionId) {\n return this.createErrorResponse(\n 400,\n -32600,\n \"Invalid Request: Initialization requests must not include a sessionId\",\n );\n }\n\n if (hasInitRequest && messages.length > 1) {\n return this.createErrorResponse(\n 400,\n -32600,\n \"Invalid Request: Only one initialization request is allowed\",\n );\n }\n\n if (!hasInitRequest && !requestSessionId && this.sessionIdGenerator) {\n return this.createErrorResponse(\n 400,\n -32000,\n \"Bad Request: Mcp-Session-Id header is required\",\n );\n }\n\n // Generate or validate session ID\n if (hasInitRequest && this.sessionIdGenerator) {\n this.sessionId = this.sessionIdGenerator();\n await this._onsessioninitialized?.(this.sessionId);\n } else if (requestSessionId) {\n if (this.sessionIdGenerator && this.sessionId !== requestSessionId) {\n return this.createErrorResponse(404, -32001, \"Session not found\");\n }\n }\n\n const requestIds = messages\n .filter((msg) => isJSONRPCRequest(msg))\n .map((msg) => msg.id);\n const useJsonResponse =\n this._enableJsonResponse &&\n Boolean(acceptHeader?.includes(\"application/json\"));\n\n // Register the response sink before dispatching: the SDK produces\n // responses asynchronously and send() routes them back by request id.\n let jsonResponses: Promise<JSONRPCMessage[]> | undefined;\n let sseReadable: ReadableStream<Uint8Array> | undefined;\n if (requestIds.length > 0) {\n // Must be unique: a wall-clock id collides between two POSTs issued in\n // the same millisecond, which would cross-deliver their responses.\n const streamId = crypto.randomUUID();\n for (const id of requestIds) {\n this._requestToStreamMapping.set(id, streamId);\n }\n\n if (useJsonResponse) {\n jsonResponses = new Promise((resolve) => {\n this._jsonResponseCollectors.set(streamId, {\n expectedIds: requestIds,\n resolve,\n responses: new Map(),\n });\n });\n } else {\n const { readable, writable } = new TransformStream<Uint8Array>();\n this.trackStream(streamId, writable.getWriter());\n sseReadable = readable;\n }\n }\n\n // A cancelled request is never answered — the SDK suppresses the response\n // of a request whose abort signal fired — so send() never runs for its id\n // and nothing else would ever drop its routing entry. Release it here.\n for (const message of messages) {\n const cancelled = CancelledNotificationSchema.safeParse(message);\n if (cancelled.success) {\n await this.releaseCancelledRequest(cancelled.data.params.requestId);\n }\n }\n\n // Process messages through the transport\n for (const message of messages) {\n this.onmessage?.(message, { authInfo: undefined });\n }\n\n // Nothing to answer: the batch was only notifications and/or responses\n if (requestIds.length === 0) {\n return new Response(null, {\n headers: this.getResponseHeaders(),\n status: 202,\n });\n }\n\n // Return JSON response if enabled and client accepts it\n if (jsonResponses) {\n // Wait for the handlers to actually answer, however long they take\n const responses = await jsonResponses;\n\n const responseBody = JSON.stringify(isBatch ? responses : responses[0]);\n\n return new Response(responseBody, {\n headers: {\n ...this.getResponseHeaders(),\n \"Content-Type\": \"application/json\",\n },\n status: 200,\n });\n }\n\n // Return SSE stream\n return new Response(sseReadable ?? null, {\n headers: {\n ...this.getResponseHeaders(),\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"Content-Type\": \"text/event-stream\",\n },\n status: 200,\n });\n }\n\n /**\n * Replay events for resumability\n */\n private async handleReplayEvents(lastEventId: string): Promise<Response> {\n if (!this._eventStore) {\n return this.createErrorResponse(\n 400,\n -32000,\n \"Resumability not supported\",\n );\n }\n\n const { readable, writable } = new TransformStream<Uint8Array>();\n const writer = writable.getWriter();\n\n this._replaysInFlight += 1;\n try {\n const streamId = await this._eventStore.replayEventsAfter(lastEventId, {\n send: async (eventId, message) => {\n await this.writeSSEEventWithId(writer, eventId, message);\n },\n });\n this.trackStream(streamId, writer);\n } catch (error) {\n await writer.close();\n return this.createErrorResponse(500, -32000, `Replay failed: ${error}`);\n } finally {\n this._replaysInFlight -= 1;\n }\n\n return new Response(readable, {\n headers: {\n ...this.getResponseHeaders(),\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"Content-Type\": \"text/event-stream\",\n },\n status: 200,\n });\n }\n\n /**\n * Handles unsupported HTTP methods\n */\n private handleUnsupportedRequest(): Response {\n return this.createErrorResponse(405, -32000, \"Method not allowed\");\n }\n\n /**\n * Settle the routing state of a request the client cancelled, which will\n * therefore never produce a response: the same drain `send()` performs once\n * a response has been written, minus the response. Idempotent, so it is a\n * no-op if the response won the race against the cancellation.\n *\n * JSON-mode POSTs are left alone: `_jsonResponseCollectors` owns their\n * settlement.\n */\n private async releaseCancelledRequest(requestId: RequestId): Promise<void> {\n const streamId = this._requestToStreamMapping.get(requestId);\n if (streamId === undefined || this._jsonResponseCollectors.has(streamId)) {\n return;\n }\n\n this._requestToStreamMapping.delete(requestId);\n const streamInUse = Array.from(\n this._requestToStreamMapping.values(),\n ).includes(streamId);\n if (streamInUse) {\n return;\n }\n\n // Nothing will ever be written to this stream again; close it rather than\n // leaving the client reading a stream that can only hang.\n const writer = this._streamMapping.get(streamId);\n this._streamMapping.delete(streamId);\n if (writer) {\n try {\n await writer.close();\n } catch (error) {\n this.onerror?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n }\n\n /**\n * Drop the routing state left over once every stream is gone, answering any\n * POST still waiting on a JSON response with whatever arrived rather than\n * leaving the request hanging.\n */\n private releasePendingRequests(): void {\n for (const collector of this._jsonResponseCollectors.values()) {\n collector.resolve(\n collector.expectedIds\n .map((id) => collector.responses.get(id))\n .filter((response) => response !== undefined),\n );\n }\n this._jsonResponseCollectors.clear();\n this._requestToStreamMapping.clear();\n }\n\n /**\n * Answer a JSON-mode POST once every request it carried has a response\n */\n private settleJsonResponse(\n streamId: StreamId,\n collector: PendingJsonResponse,\n ): void {\n const responses: JSONRPCMessage[] = [];\n for (const id of collector.expectedIds) {\n const response = collector.responses.get(id);\n if (!response) {\n // Still waiting on at least one of this POST's requests\n return;\n }\n responses.push(response);\n }\n\n this._jsonResponseCollectors.delete(streamId);\n for (const id of collector.expectedIds) {\n this._requestToStreamMapping.delete(id);\n }\n collector.resolve(responses);\n }\n\n /**\n * Whether an event addressed to `streamId` should go to the event store.\n *\n * Everything but the standalone stream is persisted whenever a store is\n * configured: those ids exist only because their stream did. The standalone\n * id is a constant, so it resolves whether or not a client ever opened that\n * stream, and storing before the first GET writes events nothing can reach —\n * replay is keyed off Last-Event-Id, and a client that never held the stream\n * was never handed an id to resume from.\n */\n private shouldPersist(\n streamId: StreamId,\n writer: undefined | WritableStreamDefaultWriter<Uint8Array>,\n ): boolean {\n if (this._eventStore === undefined) {\n return false;\n }\n\n if (streamId !== this._standaloneSseStreamId) {\n return true;\n }\n\n return (\n this._standaloneStreamOpened ||\n // A live writer means the stream is open now, which is stronger evidence\n // than the latch. Belt and braces: it keeps a writer reaching this point\n // without `trackStream` from producing an SSE event with no `id:`.\n writer !== undefined ||\n this._replaysInFlight > 0\n );\n }\n\n private trackStream(\n streamId: StreamId,\n writer: WritableStreamDefaultWriter<Uint8Array>,\n ): void {\n // Latched here rather than at each call site so a new way of opening the\n // standalone stream cannot forget to record it.\n if (streamId === this._standaloneSseStreamId) {\n this._standaloneStreamOpened = true;\n }\n this._streamMapping.set(streamId, writer);\n const removeStreamIfCurrent = () => {\n if (this._streamMapping.get(streamId) !== writer) {\n return;\n }\n this._streamMapping.delete(streamId);\n // With an event store, a response can still arrive after the client gave\n // up, and it must be persisted for replay. Keep the routing entry so\n // send() can resolve the stream id and store under it; send() drops the\n // entry once the response has been stored.\n if (this._eventStore) {\n return;\n }\n // No event store: nothing will be persisted for this stream, so drop the\n // routing entries now rather than leaking them. No-op for the standalone\n // GET stream, which is never a request target.\n for (const [requestId, mappedStreamId] of this._requestToStreamMapping) {\n if (mappedStreamId === streamId) {\n this._requestToStreamMapping.delete(requestId);\n }\n }\n };\n void writer.closed.then(removeStreamIfCurrent, removeStreamIfCurrent);\n }\n\n /**\n * Write an SSE event to the stream\n */\n private async writeSSEEvent(\n writer: WritableStreamDefaultWriter<Uint8Array>,\n message: JSONRPCMessage,\n ): Promise<void> {\n const data = `data: ${JSON.stringify(message)}\\n\\n`;\n await writer.write(this._encoder.encode(data));\n }\n\n /**\n * Write an SSE event with ID to the stream\n */\n private async writeSSEEventWithId(\n writer: WritableStreamDefaultWriter<Uint8Array>,\n eventId: string,\n message: JSONRPCMessage,\n ): Promise<void> {\n const data = `id: ${eventId}\\ndata: ${JSON.stringify(message)}\\n\\n`;\n await writer.write(this._encoder.encode(data));\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/fastmcp/fastmcp/dist/edge/index.cjs","../../src/edge/index.ts","../../src/edge/WebStreamableHTTPServerTransport.ts"],"names":[],"mappings":"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","file":"/home/runner/work/fastmcp/fastmcp/dist/edge/index.cjs","sourcesContent":[null,"/**\n * FastMCP Edge Runtime Support\n *\n * This module provides edge runtime compatibility for FastMCP, enabling\n * deployment to Cloudflare Workers, Deno Deploy, and other edge platforms.\n *\n * @example\n * ```typescript\n * // Cloudflare Workers\n * import { EdgeFastMCP } from \"fastmcp/edge\";\n * import { z } from \"zod\";\n *\n * const server = new EdgeFastMCP({ name: \"MyMCP\", version: \"1.0.0\" });\n *\n * server.addTool({\n * name: \"hello\",\n * description: \"Say hello\",\n * parameters: z.object({ name: z.string() }),\n * execute: async ({ name }) => `Hello, ${name}!`,\n * });\n *\n * export default server;\n * ```\n */\n\nimport {\n ErrorCode,\n JSONRPCMessage,\n LATEST_PROTOCOL_VERSION,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { Hono } from \"hono\";\nimport { strictJsonSchema } from \"xsschema\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nexport { WebStreamableHTTPServerTransport } from \"./WebStreamableHTTPServerTransport.js\";\nexport type {\n EventStore,\n WebStreamableHTTPServerTransportOptions,\n} from \"./WebStreamableHTTPServerTransport.js\";\n\n/**\n * Options for EdgeFastMCP\n */\nexport interface EdgeFastMCPOptions {\n description?: string;\n logger?: EdgeLogger;\n /**\n * Base path for MCP endpoints (default: \"/mcp\")\n */\n mcpPath?: string;\n name: string;\n version: string;\n}\n\n/**\n * Type for edge runtime fetch handler\n */\nexport type EdgeFetchHandler = (request: Request) => Promise<Response>;\n\n/**\n * Logger interface for edge environments\n */\nexport interface EdgeLogger {\n debug(...args: unknown[]): void;\n error(...args: unknown[]): void;\n info(...args: unknown[]): void;\n log(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n}\n\n/**\n * Prompt definition for EdgeFastMCP\n */\nexport interface EdgePrompt {\n arguments?: Array<{ description?: string; name: string; required?: boolean }>;\n description?: string;\n load: (args: Record<string, string>) => Promise<\n | {\n messages: Array<{\n content: { text: string; type: string };\n role: string;\n }>;\n }\n | string\n >;\n name: string;\n}\n\n/**\n * Resource definition for EdgeFastMCP\n */\nexport interface EdgeResource {\n description?: string;\n load: () => Promise<\n { blob?: string; mimeType?: string; text?: string } | string\n >;\n mimeType?: string;\n name: string;\n uri: string;\n}\n\n/**\n * Tool definition for EdgeFastMCP\n */\nexport interface EdgeTool<TParams = unknown> {\n description: string;\n execute: (params: TParams) => Promise<\n | {\n content: Array<{\n data?: string;\n mimeType?: string;\n text?: string;\n type: string;\n }>;\n }\n | string\n >;\n name: string;\n parameters?: StandardSchemaV1<TParams> | z.ZodType<TParams>;\n}\n\n/**\n * Edge-compatible FastMCP server for Cloudflare Workers, Deno, and Bun\n *\n * This is a simplified implementation optimized for stateless edge environments.\n * It uses web-standard APIs only (no Node.js dependencies).\n */\nexport class EdgeFastMCP {\n #honoApp = new Hono();\n #logger: EdgeLogger;\n #mcpPath: string;\n #name: string;\n #prompts: EdgePrompt[] = [];\n #resources: EdgeResource[] = [];\n #tools: EdgeTool[] = [];\n #version: string;\n\n constructor(options: EdgeFastMCPOptions) {\n this.#name = options.name;\n this.#version = options.version;\n this.#logger = options.logger ?? console;\n this.#mcpPath = options.mcpPath ?? \"/mcp\";\n\n this.#setupRoutes();\n }\n\n /**\n * Add a prompt to the server\n */\n addPrompt(prompt: EdgePrompt): this {\n this.#prompts.push(prompt);\n return this;\n }\n\n /**\n * Add a resource to the server\n */\n addResource(resource: EdgeResource): this {\n this.#resources.push(resource);\n return this;\n }\n\n /**\n * Add a tool to the server\n */\n addTool<TParams>(tool: EdgeTool<TParams>): this {\n this.#tools.push(tool as EdgeTool);\n return this;\n }\n\n /**\n * Handle an incoming request (main entry point for edge runtimes)\n */\n async fetch(request: Request): Promise<Response> {\n return this.#honoApp.fetch(request);\n }\n\n /**\n * Get the Hono app for adding custom routes\n */\n getApp(): Hono {\n return this.#honoApp;\n }\n\n /**\n * Create an error HTTP response\n */\n #errorResponse(status: number, code: number, message: string): Response {\n return new Response(\n JSON.stringify({\n error: { code, message },\n id: null,\n jsonrpc: \"2.0\",\n }),\n {\n headers: { \"Content-Type\": \"application/json\" },\n status,\n },\n );\n }\n\n /**\n * Handle initialize request\n */\n #handleInitialize(id: number | string): JSONRPCMessage {\n return {\n id,\n jsonrpc: \"2.0\",\n result: {\n capabilities: {\n prompts: this.#prompts.length > 0 ? {} : undefined,\n resources: this.#resources.length > 0 ? {} : undefined,\n tools: this.#tools.length > 0 ? {} : undefined,\n },\n protocolVersion: LATEST_PROTOCOL_VERSION,\n serverInfo: {\n name: this.#name,\n version: this.#version,\n },\n },\n } as JSONRPCMessage;\n }\n\n /**\n * Handle MCP POST requests\n */\n async #handleMcpRequest(request: Request): Promise<Response> {\n // Validate headers\n const acceptHeader = request.headers.get(\"accept\");\n if (\n !acceptHeader?.includes(\"application/json\") &&\n !acceptHeader?.includes(\"text/event-stream\")\n ) {\n return this.#errorResponse(\n 406,\n -32000,\n \"Not Acceptable: Client must accept application/json or text/event-stream\",\n );\n }\n\n const contentType = request.headers.get(\"content-type\");\n if (!contentType?.includes(\"application/json\")) {\n return this.#errorResponse(\n 415,\n -32000,\n \"Unsupported Media Type: Content-Type must be application/json\",\n );\n }\n\n // Parse request body\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n return this.#errorResponse(400, -32700, \"Parse error: Invalid JSON\");\n }\n\n // Handle single or batch requests\n const isBatch = Array.isArray(body);\n const messages = Array.isArray(body) ? body : [body];\n\n if (isBatch && messages.length === 0) {\n return this.#errorResponse(\n 400,\n ErrorCode.InvalidRequest,\n \"Invalid Request: Batch must contain at least one message\",\n );\n }\n\n const responses: JSONRPCMessage[] = [];\n\n for (const message of messages) {\n const response = await this.#handleMessage(message);\n if (response) {\n responses.push(response);\n }\n }\n\n // Return appropriate response format\n if (responses.length === 0) {\n return new Response(null, { status: 202 });\n }\n\n const responseBody = JSON.stringify(isBatch ? responses : responses[0]);\n\n return new Response(responseBody, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n status: 200,\n });\n }\n\n /**\n * Handle SSE GET requests\n */\n async #handleMcpSseRequest(request: Request): Promise<Response> {\n const acceptHeader = request.headers.get(\"accept\");\n if (!acceptHeader?.includes(\"text/event-stream\")) {\n return this.#errorResponse(\n 406,\n -32000,\n \"Not Acceptable: Client must accept text/event-stream\",\n );\n }\n\n // In stateless mode, GET requests are not supported (no server-initiated messages)\n return this.#errorResponse(\n 405,\n -32000,\n \"Method Not Allowed: SSE streams not supported in stateless mode\",\n );\n }\n\n /**\n * Handle individual MCP messages\n */\n async #handleMessage(message: unknown): Promise<JSONRPCMessage | null> {\n if (!message || typeof message !== \"object\") {\n return this.#rpcError(null, -32700, \"Parse error: Invalid message\");\n }\n\n const msg = message as {\n id?: number | string;\n jsonrpc?: string;\n method?: string;\n params?: unknown;\n };\n\n if (msg.jsonrpc !== \"2.0\") {\n return this.#rpcError(\n msg.id ?? null,\n -32600,\n \"Invalid Request: jsonrpc must be 2.0\",\n );\n }\n\n // Handle notifications (no response expected)\n if (!(\"id\" in msg) || msg.id === undefined) {\n return null;\n }\n\n const method = msg.method;\n const id = msg.id;\n const params = msg.params as Record<string, unknown> | undefined;\n\n try {\n switch (method) {\n case \"initialize\":\n return this.#handleInitialize(id);\n\n case \"ping\":\n return { id, jsonrpc: \"2.0\", result: {} } as JSONRPCMessage;\n\n case \"prompts/get\":\n return this.#handlePromptsGet(id, params);\n\n case \"prompts/list\":\n return this.#handlePromptsList(id);\n\n case \"resources/list\":\n return this.#handleResourcesList(id);\n\n case \"resources/read\":\n return this.#handleResourcesRead(id, params);\n\n case \"tools/call\":\n return this.#handleToolsCall(id, params);\n\n case \"tools/list\":\n return this.#handleToolsList(id);\n\n default:\n return this.#rpcError(id, -32601, `Method not found: ${method}`);\n }\n } catch (error) {\n this.#logger.error(`Error handling ${method}:`, error);\n return this.#rpcError(\n id,\n -32603,\n `Internal error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handle prompts/get request\n */\n async #handlePromptsGet(\n id: number | string,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCMessage> {\n const promptName = params?.name as string;\n const promptArgs = params?.arguments as Record<string, string> | undefined;\n\n const prompt = this.#prompts.find((p) => p.name === promptName);\n if (!prompt) {\n return this.#rpcError(\n id,\n ErrorCode.InvalidParams,\n `Prompt not found: ${promptName}`,\n );\n }\n\n try {\n const result = await prompt.load(promptArgs ?? {});\n const messages =\n typeof result === \"string\"\n ? [{ content: { text: result, type: \"text\" }, role: \"user\" }]\n : result.messages;\n\n return {\n id,\n jsonrpc: \"2.0\",\n result: { messages },\n } as JSONRPCMessage;\n } catch (error) {\n return this.#rpcError(\n id,\n ErrorCode.InternalError,\n `Prompt load failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handle prompts/list request\n */\n #handlePromptsList(id: number | string): JSONRPCMessage {\n return {\n id,\n jsonrpc: \"2.0\",\n result: {\n prompts: this.#prompts.map((p) => ({\n arguments: p.arguments,\n description: p.description,\n name: p.name,\n })),\n },\n } as JSONRPCMessage;\n }\n\n /**\n * Handle resources/list request\n */\n #handleResourcesList(id: number | string): JSONRPCMessage {\n return {\n id,\n jsonrpc: \"2.0\",\n result: {\n resources: this.#resources.map((r) => ({\n description: r.description,\n mimeType: r.mimeType,\n name: r.name,\n uri: r.uri,\n })),\n },\n } as JSONRPCMessage;\n }\n\n /**\n * Handle resources/read request\n */\n async #handleResourcesRead(\n id: number | string,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCMessage> {\n const uri = params?.uri as string;\n const resource = this.#resources.find((r) => r.uri === uri);\n\n if (!resource) {\n return this.#rpcError(\n id,\n ErrorCode.InvalidParams,\n `Resource not found: ${uri}`,\n );\n }\n\n try {\n const result = await resource.load();\n const content =\n typeof result === \"string\"\n ? { mimeType: resource.mimeType ?? \"text/plain\", text: result, uri }\n : { uri, ...result };\n\n return {\n id,\n jsonrpc: \"2.0\",\n result: { contents: [content] },\n } as JSONRPCMessage;\n } catch (error) {\n return this.#rpcError(\n id,\n ErrorCode.InternalError,\n `Resource load failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handle tools/call request\n */\n async #handleToolsCall(\n id: number | string,\n params?: Record<string, unknown>,\n ): Promise<JSONRPCMessage> {\n const toolName = params?.name as string;\n const toolArgs = params?.arguments as Record<string, unknown> | undefined;\n\n const tool = this.#tools.find((t) => t.name === toolName);\n if (!tool) {\n return this.#rpcError(\n id,\n ErrorCode.InvalidParams,\n `Tool not found: ${toolName}`,\n );\n }\n\n let args: unknown = toolArgs ?? {};\n\n if (tool.parameters) {\n let parsed: StandardSchemaV1.Result<unknown>;\n\n try {\n parsed = await tool.parameters[\"~standard\"].validate(toolArgs);\n } catch (error) {\n return this.#rpcError(\n id,\n ErrorCode.InternalError,\n `Tool '${toolName}' parameter validation failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (parsed.issues) {\n const friendlyErrors = parsed.issues\n .map((issue) => {\n const path = issue.path?.join(\".\") || \"root\";\n return `${path}: ${issue.message}`;\n })\n .join(\", \");\n\n return this.#rpcError(\n id,\n ErrorCode.InvalidParams,\n `Tool '${toolName}' parameter validation failed: ${friendlyErrors}. Please check the parameter types and values according to the tool's schema.`,\n );\n }\n\n args = parsed.value;\n }\n\n try {\n const result = await tool.execute(args);\n\n // Normalize result to content array\n const content =\n typeof result === \"string\"\n ? [{ text: result, type: \"text\" }]\n : result.content;\n\n return {\n id,\n jsonrpc: \"2.0\",\n result: { content },\n } as JSONRPCMessage;\n } catch (error) {\n return this.#rpcError(\n id,\n ErrorCode.InternalError,\n `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handle tools/list request\n */\n #handleToolsList(id: number | string): JSONRPCMessage {\n return {\n id,\n jsonrpc: \"2.0\",\n result: {\n tools: this.#tools.map((tool) => ({\n description: tool.description,\n inputSchema: tool.parameters\n ? this.#schemaToJsonSchema(tool.parameters)\n : { type: \"object\" },\n name: tool.name,\n })),\n },\n } as JSONRPCMessage;\n }\n\n /**\n * Create an RPC error message\n */\n #rpcError(\n id: null | number | string,\n code: number,\n message: string,\n ): JSONRPCMessage {\n return {\n error: { code, message },\n id,\n jsonrpc: \"2.0\",\n } as JSONRPCMessage;\n }\n\n /**\n * Convert schema to JSON Schema\n */\n #schemaToJsonSchema(\n schema: StandardSchemaV1 | z.ZodType,\n ): Record<string, unknown> {\n try {\n // Zod 4+: use native toJSONSchema if available\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (typeof (z as any).toJSONSchema === \"function\") {\n return strictJsonSchema(\n (z as any).toJSONSchema(schema) as Record<string, unknown>,\n ) as Record<string, unknown>;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n // Zod 3 fallback: use zod-to-json-schema\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (\"_def\" in (schema as any) || schema instanceof z.ZodType) {\n return strictJsonSchema(\n zodToJsonSchema(schema as any, { target: \"openApi3\" }) as Record<\n string,\n unknown\n >,\n ) as Record<string, unknown>;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n // For StandardSchema, fall back to a generic object schema\n return { type: \"object\" };\n } catch {\n return { type: \"object\" };\n }\n }\n\n /**\n * Set up MCP and health routes\n */\n #setupRoutes(): void {\n // Health endpoint\n this.#honoApp.get(\"/health\", (c) => c.text(\"✓ Ok\"));\n\n // MCP endpoint - handles all MCP protocol messages\n this.#honoApp.post(this.#mcpPath, async (c) => {\n return this.#handleMcpRequest(c.req.raw);\n });\n\n // MCP GET endpoint for SSE streams (server-initiated messages)\n this.#honoApp.get(this.#mcpPath, async (c) => {\n return this.#handleMcpSseRequest(c.req.raw);\n });\n\n // MCP DELETE endpoint for session termination\n this.#honoApp.delete(this.#mcpPath, async () => {\n return new Response(null, { status: 204 });\n });\n }\n}\n","/**\n * Web-standard Streamable HTTP Server Transport for MCP\n *\n * This transport implements the MCP Streamable HTTP specification using\n * web standard APIs (Request, Response, TransformStream) for compatibility\n * with edge runtimes like Cloudflare Workers, Deno, and Bun.\n */\n\nimport { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport {\n CancelledNotificationSchema,\n ErrorCode,\n isInitializeRequest,\n isJSONRPCError,\n isJSONRPCRequest,\n isJSONRPCResponse,\n JSONRPCMessage,\n JSONRPCMessageSchema,\n MessageExtraInfo,\n RequestId,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nexport type EventId = string;\n/**\n * Interface for resumability support via event storage\n */\nexport interface EventStore {\n getStreamIdForEventId?(eventId: EventId): Promise<StreamId | undefined>;\n replayEventsAfter(\n lastEventId: EventId,\n options: {\n send: (eventId: EventId, message: JSONRPCMessage) => Promise<void>;\n },\n ): Promise<StreamId>;\n storeEvent(streamId: StreamId, message: JSONRPCMessage): Promise<EventId>;\n}\n\nexport type StreamId = string;\n\n/**\n * Configuration options for WebStreamableHTTPServerTransport\n */\nexport interface WebStreamableHTTPServerTransportOptions {\n /**\n * If true, return JSON responses instead of SSE streams\n */\n enableJsonResponse?: boolean;\n\n /**\n * Event store for resumability support\n */\n eventStore?: EventStore;\n\n /**\n * Callback for session close events\n */\n onsessionclosed?: (sessionId: string) => Promise<void> | void;\n\n /**\n * Callback for session initialization events\n */\n onsessioninitialized?: (sessionId: string) => Promise<void> | void;\n\n /**\n * Function that generates a session ID for the transport.\n * Return undefined to disable session management (stateless mode).\n */\n sessionIdGenerator: (() => string) | undefined;\n}\n\n/**\n * Collects the responses to every request that arrived on a single POST, so\n * that JSON mode can answer once all of them are in.\n */\ninterface PendingJsonResponse {\n expectedIds: RequestId[];\n resolve: (responses: JSONRPCMessage[]) => void;\n responses: Map<RequestId, JSONRPCMessage>;\n}\n\nconst MAXIMUM_MESSAGE_SIZE = 4 * 1024 * 1024; // 4MB\n\n/**\n * Web-standard Server transport for Streamable HTTP.\n * Uses web APIs (Request, Response, TransformStream) for edge runtime compatibility.\n */\nexport class WebStreamableHTTPServerTransport implements Transport {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void;\n sessionId?: string;\n private _enableJsonResponse = false;\n private _encoder = new TextEncoder();\n private _eventStore?: EventStore;\n private _jsonResponseCollectors = new Map<StreamId, PendingJsonResponse>();\n private _onsessionclosed?: (sessionId: string) => Promise<void> | void;\n private _onsessioninitialized?: (sessionId: string) => Promise<void> | void;\n /**\n * Replays whose stream id is still being resolved. `replayEventsAfter` only\n * reveals which stream it was replaying once it settles, so a standalone\n * send during that window has nothing to test against; persist rather than\n * drop, since over-storing for the length of a replay beats losing an event.\n */\n private _replaysInFlight = 0;\n\n private _requestToStreamMapping = new Map<RequestId, StreamId>();\n\n private _standaloneSseStreamId = \"_GET_stream\";\n /**\n * Whether a client has held the standalone GET stream during this session.\n * Latched rather than read from `_streamMapping`, so persistence survives\n * the disconnect window the store exists to cover while still telling a\n * dropped stream apart from one that was never opened. Reset with the rest\n * of the per-session state, since the next session starts with no stream.\n */\n private _standaloneStreamOpened = false;\n private _started = false;\n private _streamMapping = new Map<\n StreamId,\n WritableStreamDefaultWriter<Uint8Array>\n >();\n private sessionIdGenerator: (() => string) | undefined;\n\n constructor(options: WebStreamableHTTPServerTransportOptions) {\n this.sessionIdGenerator = options.sessionIdGenerator;\n this._enableJsonResponse = options.enableJsonResponse ?? false;\n this._eventStore = options.eventStore;\n this._onsessioninitialized = options.onsessioninitialized;\n this._onsessionclosed = options.onsessionclosed;\n }\n\n /**\n * Close the transport\n */\n async close(): Promise<void> {\n for (const writer of this._streamMapping.values()) {\n try {\n await writer.close();\n } catch {\n // Ignore close errors\n }\n }\n this._streamMapping.clear();\n this._standaloneStreamOpened = false;\n this.releasePendingRequests();\n this._started = false;\n this.onclose?.();\n }\n\n /**\n * Handles an incoming web Request and returns a Response\n */\n async handleRequest(\n request: Request,\n parsedBody?: unknown,\n ): Promise<Response> {\n const method = request.method;\n\n if (method === \"POST\") {\n return this.handlePostRequest(request, parsedBody);\n } else if (method === \"GET\") {\n return this.handleGetRequest(request);\n } else if (method === \"DELETE\") {\n return this.handleDeleteRequest(request);\n } else {\n return this.handleUnsupportedRequest();\n }\n }\n\n /**\n * Send a message to connected clients\n */\n async send(\n message: JSONRPCMessage,\n options?: { relatedRequestId?: RequestId },\n ): Promise<void> {\n let requestId = options?.relatedRequestId;\n const isResponse = isJSONRPCResponse(message) || isJSONRPCError(message);\n if (isResponse) {\n // Responses are routed by the id of the request they answer\n requestId = message.id;\n }\n\n const streamId =\n requestId === undefined\n ? this._standaloneSseStreamId\n : this._requestToStreamMapping.get(requestId);\n\n if (streamId) {\n // JSON mode has no stream to write to: collect the responses instead and\n // let handlePostRequest answer once every request on this POST is done.\n const collector = this._jsonResponseCollectors.get(streamId);\n if (collector) {\n if (isResponse && requestId !== undefined) {\n collector.responses.set(requestId, message);\n this.settleJsonResponse(streamId, collector);\n }\n return;\n }\n\n const writer = this._streamMapping.get(streamId);\n // With an event store the message must be persisted even if the client\n // has already disconnected, so a reconnect with Last-Event-Id can replay\n // it. The live write to the SSE stream is best-effort on top of that.\n const store = this.shouldPersist(streamId, writer)\n ? this._eventStore\n : undefined;\n\n if (writer || store) {\n try {\n let eventId: string | undefined;\n if (store) {\n eventId = await store.storeEvent(streamId, message);\n }\n if (writer) {\n if (eventId === undefined) {\n await this.writeSSEEvent(writer, message);\n } else {\n await this.writeSSEEventWithId(writer, eventId, message);\n }\n }\n } catch (error) {\n this.onerror?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Close the POST stream once all of its requests are answered. Drained\n // whether or not the store and the socket cooperated: with an event\n // store configured `trackStream` deliberately leaves routing entries\n // alone on disconnect, so this is the only thing that reclaims them,\n // and giving up on a failed write strands the entry until the session\n // ends.\n if (requestId !== undefined && isResponse) {\n this._requestToStreamMapping.delete(requestId);\n const streamInUse = Array.from(\n this._requestToStreamMapping.values(),\n ).includes(streamId);\n if (!streamInUse) {\n this._streamMapping.delete(streamId);\n if (writer) {\n try {\n await writer.close();\n } catch (error) {\n this.onerror?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n }\n }\n }\n }\n }\n\n async start(): Promise<void> {\n if (this._started) {\n throw new Error(\"Transport already started\");\n }\n this._started = true;\n }\n\n /**\n * Create an error response\n */\n private createErrorResponse(\n status: number,\n code: number,\n message: string,\n ): Response {\n return new Response(\n JSON.stringify({\n error: { code, message },\n id: null,\n jsonrpc: \"2.0\",\n }),\n {\n headers: {\n ...this.getResponseHeaders(),\n \"Content-Type\": \"application/json\",\n },\n status,\n },\n );\n }\n\n /**\n * Get common response headers\n */\n private getResponseHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n if (this.sessionId) {\n headers[\"mcp-session-id\"] = this.sessionId;\n }\n return headers;\n }\n\n /**\n * Handles DELETE requests to terminate sessions\n */\n private async handleDeleteRequest(request: Request): Promise<Response> {\n const sessionId = request.headers.get(\"mcp-session-id\");\n\n if (this.sessionIdGenerator) {\n if (!sessionId) {\n return this.createErrorResponse(\n 400,\n -32000,\n \"Bad Request: Mcp-Session-Id header is required\",\n );\n }\n\n if (this.sessionId !== sessionId) {\n return this.createErrorResponse(404, -32001, \"Session not found\");\n }\n }\n\n // Close all streams\n for (const writer of this._streamMapping.values()) {\n try {\n await writer.close();\n } catch {\n // Ignore close errors\n }\n }\n this._streamMapping.clear();\n // Per-session, like the session id below: this instance stays usable, and\n // the next session starts having opened no standalone stream of its own.\n this._standaloneStreamOpened = false;\n this.releasePendingRequests();\n\n await this._onsessionclosed?.(this.sessionId ?? \"\");\n this.sessionId = undefined;\n\n return new Response(null, {\n headers: this.getResponseHeaders(),\n status: 204,\n });\n }\n\n /**\n * Handles GET requests for SSE stream\n */\n private async handleGetRequest(request: Request): Promise<Response> {\n const acceptHeader = request.headers.get(\"accept\");\n if (!acceptHeader?.includes(\"text/event-stream\")) {\n return this.createErrorResponse(\n 406,\n -32000,\n \"Not Acceptable: Client must accept text/event-stream\",\n );\n }\n\n // Validate session\n const sessionId = request.headers.get(\"mcp-session-id\");\n if (this.sessionIdGenerator && !sessionId) {\n return this.createErrorResponse(\n 400,\n -32000,\n \"Bad Request: Mcp-Session-Id header is required\",\n );\n }\n\n if (this.sessionIdGenerator && this.sessionId !== sessionId) {\n return this.createErrorResponse(404, -32001, \"Session not found\");\n }\n\n // Check for existing standalone stream\n if (this._streamMapping.has(this._standaloneSseStreamId)) {\n return this.createErrorResponse(\n 409,\n -32000,\n \"Conflict: SSE stream already exists for this session\",\n );\n }\n\n // Handle resumability\n if (this._eventStore) {\n const lastEventId = request.headers.get(\"last-event-id\");\n if (lastEventId) {\n return this.handleReplayEvents(lastEventId);\n }\n }\n\n // Create SSE stream\n const { readable, writable } = new TransformStream<Uint8Array>();\n const writer = writable.getWriter();\n this.trackStream(this._standaloneSseStreamId, writer);\n\n return new Response(readable, {\n headers: {\n ...this.getResponseHeaders(),\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"Content-Type\": \"text/event-stream\",\n },\n status: 200,\n });\n }\n\n /**\n * Handles POST requests containing JSON-RPC messages\n */\n private async handlePostRequest(\n request: Request,\n parsedBody?: unknown,\n ): Promise<Response> {\n // Validate Accept header\n const acceptHeader = request.headers.get(\"accept\");\n if (\n !acceptHeader?.includes(\"application/json\") &&\n !acceptHeader?.includes(\"text/event-stream\")\n ) {\n return this.createErrorResponse(\n 406,\n -32000,\n \"Not Acceptable: Client must accept application/json or text/event-stream\",\n );\n }\n\n // Validate Content-Type\n const contentType = request.headers.get(\"content-type\");\n if (!contentType?.includes(\"application/json\")) {\n return this.createErrorResponse(\n 415,\n -32000,\n \"Unsupported Media Type: Content-Type must be application/json\",\n );\n }\n\n // Validate Content-Length\n const contentLength = parseInt(\n request.headers.get(\"content-length\") ?? \"0\",\n 10,\n );\n if (contentLength > MAXIMUM_MESSAGE_SIZE) {\n return this.createErrorResponse(\n 413,\n -32000,\n `Request body too large. Maximum size is ${MAXIMUM_MESSAGE_SIZE} bytes`,\n );\n }\n\n // Parse body\n let rawMessage: unknown;\n try {\n rawMessage = parsedBody ?? (await request.json());\n } catch {\n return this.createErrorResponse(400, -32700, \"Parse error: Invalid JSON\");\n }\n\n // Handle batch or single message. The original shape decides the response\n // envelope: a batch always answers with an array, even when only one\n // response survives.\n const isBatch = Array.isArray(rawMessage);\n const arrayMessage: unknown[] = Array.isArray(rawMessage)\n ? rawMessage\n : [rawMessage];\n\n if (isBatch && arrayMessage.length === 0) {\n return this.createErrorResponse(\n 400,\n -32600,\n \"Invalid Request: Batch must contain at least one message\",\n );\n }\n\n // Validate messages\n const messages: JSONRPCMessage[] = [];\n for (const msg of arrayMessage) {\n const result = JSONRPCMessageSchema.safeParse(msg);\n if (!result.success) {\n return this.createErrorResponse(\n 400,\n -32700,\n \"Parse error: Invalid JSON-RPC message\",\n );\n }\n messages.push(result.data);\n }\n\n // Handle session ID\n const requestSessionId = request.headers.get(\"mcp-session-id\");\n const hasInitRequest = messages.some((msg) => isInitializeRequest(msg));\n\n // Validate session requirements\n if (hasInitRequest && requestSessionId) {\n return this.createErrorResponse(\n 400,\n -32600,\n \"Invalid Request: Initialization requests must not include a sessionId\",\n );\n }\n\n if (hasInitRequest && messages.length > 1) {\n return this.createErrorResponse(\n 400,\n -32600,\n \"Invalid Request: Only one initialization request is allowed\",\n );\n }\n\n if (!hasInitRequest && !requestSessionId && this.sessionIdGenerator) {\n return this.createErrorResponse(\n 400,\n -32000,\n \"Bad Request: Mcp-Session-Id header is required\",\n );\n }\n\n // Generate or validate session ID\n if (hasInitRequest && this.sessionIdGenerator) {\n this.sessionId = this.sessionIdGenerator();\n await this._onsessioninitialized?.(this.sessionId);\n } else if (requestSessionId) {\n if (this.sessionIdGenerator && this.sessionId !== requestSessionId) {\n return this.createErrorResponse(404, -32001, \"Session not found\");\n }\n }\n\n const requestIds = messages\n .filter((msg) => isJSONRPCRequest(msg))\n .map((msg) => msg.id);\n const useJsonResponse =\n this._enableJsonResponse &&\n Boolean(acceptHeader?.includes(\"application/json\"));\n\n // Register the response sink before dispatching: the SDK produces\n // responses asynchronously and send() routes them back by request id.\n let jsonResponses: Promise<JSONRPCMessage[]> | undefined;\n let sseReadable: ReadableStream<Uint8Array> | undefined;\n if (requestIds.length > 0) {\n // Must be unique: a wall-clock id collides between two POSTs issued in\n // the same millisecond, which would cross-deliver their responses.\n const streamId = crypto.randomUUID();\n for (const id of requestIds) {\n this._requestToStreamMapping.set(id, streamId);\n }\n\n if (useJsonResponse) {\n jsonResponses = new Promise((resolve) => {\n this._jsonResponseCollectors.set(streamId, {\n expectedIds: requestIds,\n resolve,\n responses: new Map(),\n });\n });\n } else {\n const { readable, writable } = new TransformStream<Uint8Array>();\n this.trackStream(streamId, writable.getWriter());\n sseReadable = readable;\n }\n }\n\n // A cancelled request is never answered — the SDK suppresses the response\n // of a request whose abort signal fired — so send() never runs for its id\n // and nothing else would ever drop its routing entry. Release it here.\n for (const message of messages) {\n const cancelled = CancelledNotificationSchema.safeParse(message);\n if (cancelled.success) {\n await this.releaseCancelledRequest(cancelled.data.params.requestId);\n }\n }\n\n // Process messages through the transport\n for (const message of messages) {\n this.onmessage?.(message, { authInfo: undefined });\n }\n\n // Nothing to answer: the batch was only notifications and/or responses\n if (requestIds.length === 0) {\n return new Response(null, {\n headers: this.getResponseHeaders(),\n status: 202,\n });\n }\n\n // Return JSON response if enabled and client accepts it\n if (jsonResponses) {\n // Wait for the handlers to actually answer, however long they take\n const responses = await jsonResponses;\n\n // Every request this POST carried was cancelled, so there is nothing to\n // put in the body — and an empty body is not a JSON-RPC message. Answer\n // the way a POST that carried no requests at all does.\n if (responses.length === 0) {\n return new Response(null, {\n headers: this.getResponseHeaders(),\n status: 202,\n });\n }\n\n const responseBody = JSON.stringify(isBatch ? responses : responses[0]);\n\n return new Response(responseBody, {\n headers: {\n ...this.getResponseHeaders(),\n \"Content-Type\": \"application/json\",\n },\n status: 200,\n });\n }\n\n // Return SSE stream\n return new Response(sseReadable ?? null, {\n headers: {\n ...this.getResponseHeaders(),\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"Content-Type\": \"text/event-stream\",\n },\n status: 200,\n });\n }\n\n /**\n * Replay events for resumability\n */\n private async handleReplayEvents(lastEventId: string): Promise<Response> {\n if (!this._eventStore) {\n return this.createErrorResponse(\n 400,\n -32000,\n \"Resumability not supported\",\n );\n }\n\n const { readable, writable } = new TransformStream<Uint8Array>();\n const writer = writable.getWriter();\n\n this._replaysInFlight += 1;\n try {\n const streamId = await this._eventStore.replayEventsAfter(lastEventId, {\n send: async (eventId, message) => {\n await this.writeSSEEventWithId(writer, eventId, message);\n },\n });\n this.trackStream(streamId, writer);\n } catch (error) {\n await writer.close();\n return this.createErrorResponse(500, -32000, `Replay failed: ${error}`);\n } finally {\n this._replaysInFlight -= 1;\n }\n\n return new Response(readable, {\n headers: {\n ...this.getResponseHeaders(),\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"Content-Type\": \"text/event-stream\",\n },\n status: 200,\n });\n }\n\n /**\n * Handles unsupported HTTP methods\n */\n private handleUnsupportedRequest(): Response {\n return this.createErrorResponse(405, -32000, \"Method not allowed\");\n }\n\n /**\n * Settle the routing state of a request the client cancelled, which will\n * therefore never produce a response: the same drain `send()` performs once\n * a response has been written, minus the response. Idempotent, so it is a\n * no-op if the response won the race against the cancellation.\n */\n private async releaseCancelledRequest(requestId: RequestId): Promise<void> {\n const streamId = this._requestToStreamMapping.get(requestId);\n if (streamId === undefined) {\n return;\n }\n\n // A JSON-mode POST has no stream to close: it is parked on its collector,\n // which would keep waiting for a response that is never coming. Stop\n // expecting that one and answer with whatever the POST's other requests\n // produce.\n const collector = this._jsonResponseCollectors.get(streamId);\n if (collector) {\n collector.expectedIds = collector.expectedIds.filter(\n (id) => id !== requestId,\n );\n this._requestToStreamMapping.delete(requestId);\n this.settleJsonResponse(streamId, collector);\n return;\n }\n\n this._requestToStreamMapping.delete(requestId);\n const streamInUse = Array.from(\n this._requestToStreamMapping.values(),\n ).includes(streamId);\n if (streamInUse) {\n return;\n }\n\n // Nothing will ever be written to this stream again; close it rather than\n // leaving the client reading a stream that can only hang.\n const writer = this._streamMapping.get(streamId);\n this._streamMapping.delete(streamId);\n if (writer) {\n try {\n await writer.close();\n } catch (error) {\n this.onerror?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n }\n\n /**\n * Drop the routing state left over once every stream is gone, answering any\n * POST still waiting on a JSON response with whatever arrived rather than\n * leaving the request hanging.\n */\n private releasePendingRequests(): void {\n for (const collector of this._jsonResponseCollectors.values()) {\n collector.resolve(\n collector.expectedIds.map(\n (id) =>\n collector.responses.get(id) ??\n // Nobody can answer this one now. Dropping it silently would leave\n // the POST with an empty body for a single request and an empty\n // array for a batch, neither of which a client can read as a\n // result.\n ({\n error: {\n code: ErrorCode.ConnectionClosed,\n message:\n \"Connection closed: the session ended before this request was answered\",\n },\n id,\n jsonrpc: \"2.0\",\n } satisfies JSONRPCMessage),\n ),\n );\n }\n this._jsonResponseCollectors.clear();\n this._requestToStreamMapping.clear();\n }\n\n /**\n * Answer a JSON-mode POST once every request it carried has a response\n */\n private settleJsonResponse(\n streamId: StreamId,\n collector: PendingJsonResponse,\n ): void {\n const responses: JSONRPCMessage[] = [];\n for (const id of collector.expectedIds) {\n const response = collector.responses.get(id);\n if (!response) {\n // Still waiting on at least one of this POST's requests\n return;\n }\n responses.push(response);\n }\n\n this._jsonResponseCollectors.delete(streamId);\n for (const id of collector.expectedIds) {\n this._requestToStreamMapping.delete(id);\n }\n collector.resolve(responses);\n }\n\n /**\n * Whether an event addressed to `streamId` should go to the event store.\n *\n * Everything but the standalone stream is persisted whenever a store is\n * configured: those ids exist only because their stream did. The standalone\n * id is a constant, so it resolves whether or not a client ever opened that\n * stream, and storing before the first GET writes events nothing can reach —\n * replay is keyed off Last-Event-Id, and a client that never held the stream\n * was never handed an id to resume from.\n */\n private shouldPersist(\n streamId: StreamId,\n writer: undefined | WritableStreamDefaultWriter<Uint8Array>,\n ): boolean {\n if (this._eventStore === undefined) {\n return false;\n }\n\n if (streamId !== this._standaloneSseStreamId) {\n return true;\n }\n\n return (\n this._standaloneStreamOpened ||\n // A live writer means the stream is open now, which is stronger evidence\n // than the latch. Belt and braces: it keeps a writer reaching this point\n // without `trackStream` from producing an SSE event with no `id:`.\n writer !== undefined ||\n this._replaysInFlight > 0\n );\n }\n\n private trackStream(\n streamId: StreamId,\n writer: WritableStreamDefaultWriter<Uint8Array>,\n ): void {\n // Latched here rather than at each call site so a new way of opening the\n // standalone stream cannot forget to record it.\n if (streamId === this._standaloneSseStreamId) {\n this._standaloneStreamOpened = true;\n }\n this._streamMapping.set(streamId, writer);\n const removeStreamIfCurrent = () => {\n if (this._streamMapping.get(streamId) !== writer) {\n return;\n }\n this._streamMapping.delete(streamId);\n // With an event store, a response can still arrive after the client gave\n // up, and it must be persisted for replay. Keep the routing entry so\n // send() can resolve the stream id and store under it; send() drops the\n // entry once the response has been stored.\n if (this._eventStore) {\n return;\n }\n // No event store: nothing will be persisted for this stream, so drop the\n // routing entries now rather than leaking them. No-op for the standalone\n // GET stream, which is never a request target.\n for (const [requestId, mappedStreamId] of this._requestToStreamMapping) {\n if (mappedStreamId === streamId) {\n this._requestToStreamMapping.delete(requestId);\n }\n }\n };\n void writer.closed.then(removeStreamIfCurrent, removeStreamIfCurrent);\n }\n\n /**\n * Write an SSE event to the stream\n */\n private async writeSSEEvent(\n writer: WritableStreamDefaultWriter<Uint8Array>,\n message: JSONRPCMessage,\n ): Promise<void> {\n const data = `data: ${JSON.stringify(message)}\\n\\n`;\n await writer.write(this._encoder.encode(data));\n }\n\n /**\n * Write an SSE event with ID to the stream\n */\n private async writeSSEEventWithId(\n writer: WritableStreamDefaultWriter<Uint8Array>,\n eventId: string,\n message: JSONRPCMessage,\n ): Promise<void> {\n const data = `id: ${eventId}\\ndata: ${JSON.stringify(message)}\\n\\n`;\n await writer.write(this._encoder.encode(data));\n }\n}\n"]}
@@ -134,9 +134,6 @@ declare class WebStreamableHTTPServerTransport implements Transport {
134
134
  * therefore never produce a response: the same drain `send()` performs once
135
135
  * a response has been written, minus the response. Idempotent, so it is a
136
136
  * no-op if the response won the race against the cancellation.
137
- *
138
- * JSON-mode POSTs are left alone: `_jsonResponseCollectors` owns their
139
- * settlement.
140
137
  */
141
138
  private releaseCancelledRequest;
142
139
  /**
@@ -134,9 +134,6 @@ declare class WebStreamableHTTPServerTransport implements Transport {
134
134
  * therefore never produce a response: the same drain `send()` performs once
135
135
  * a response has been written, minus the response. Idempotent, so it is a
136
136
  * no-op if the response won the race against the cancellation.
137
- *
138
- * JSON-mode POSTs are left alone: `_jsonResponseCollectors` owns their
139
- * settlement.
140
137
  */
141
138
  private releaseCancelledRequest;
142
139
  /**
@@ -1,6 +1,6 @@
1
1
  // src/edge/index.ts
2
2
  import {
3
- ErrorCode,
3
+ ErrorCode as ErrorCode2,
4
4
  LATEST_PROTOCOL_VERSION
5
5
  } from "@modelcontextprotocol/sdk/types.js";
6
6
  import { Hono } from "hono";
@@ -11,6 +11,7 @@ import { zodToJsonSchema } from "zod-to-json-schema";
11
11
  // src/edge/WebStreamableHTTPServerTransport.ts
12
12
  import {
13
13
  CancelledNotificationSchema,
14
+ ErrorCode,
14
15
  isInitializeRequest,
15
16
  isJSONRPCError,
16
17
  isJSONRPCRequest,
@@ -393,6 +394,12 @@ var WebStreamableHTTPServerTransport = class {
393
394
  }
394
395
  if (jsonResponses) {
395
396
  const responses = await jsonResponses;
397
+ if (responses.length === 0) {
398
+ return new Response(null, {
399
+ headers: this.getResponseHeaders(),
400
+ status: 202
401
+ });
402
+ }
396
403
  const responseBody = JSON.stringify(isBatch ? responses : responses[0]);
397
404
  return new Response(responseBody, {
398
405
  headers: {
@@ -460,13 +467,19 @@ var WebStreamableHTTPServerTransport = class {
460
467
  * therefore never produce a response: the same drain `send()` performs once
461
468
  * a response has been written, minus the response. Idempotent, so it is a
462
469
  * no-op if the response won the race against the cancellation.
463
- *
464
- * JSON-mode POSTs are left alone: `_jsonResponseCollectors` owns their
465
- * settlement.
466
470
  */
467
471
  async releaseCancelledRequest(requestId) {
468
472
  const streamId = this._requestToStreamMapping.get(requestId);
469
- if (streamId === void 0 || this._jsonResponseCollectors.has(streamId)) {
473
+ if (streamId === void 0) {
474
+ return;
475
+ }
476
+ const collector = this._jsonResponseCollectors.get(streamId);
477
+ if (collector) {
478
+ collector.expectedIds = collector.expectedIds.filter(
479
+ (id) => id !== requestId
480
+ );
481
+ this._requestToStreamMapping.delete(requestId);
482
+ this.settleJsonResponse(streamId, collector);
470
483
  return;
471
484
  }
472
485
  this._requestToStreamMapping.delete(requestId);
@@ -496,7 +509,20 @@ var WebStreamableHTTPServerTransport = class {
496
509
  releasePendingRequests() {
497
510
  for (const collector of this._jsonResponseCollectors.values()) {
498
511
  collector.resolve(
499
- collector.expectedIds.map((id) => collector.responses.get(id)).filter((response) => response !== void 0)
512
+ collector.expectedIds.map(
513
+ (id) => collector.responses.get(id) ?? // Nobody can answer this one now. Dropping it silently would leave
514
+ // the POST with an empty body for a single request and an empty
515
+ // array for a batch, neither of which a client can read as a
516
+ // result.
517
+ {
518
+ error: {
519
+ code: ErrorCode.ConnectionClosed,
520
+ message: "Connection closed: the session ended before this request was answered"
521
+ },
522
+ id,
523
+ jsonrpc: "2.0"
524
+ }
525
+ )
500
526
  );
501
527
  }
502
528
  this._jsonResponseCollectors.clear();
@@ -702,7 +728,7 @@ var EdgeFastMCP = class {
702
728
  if (isBatch && messages.length === 0) {
703
729
  return this.#errorResponse(
704
730
  400,
705
- ErrorCode.InvalidRequest,
731
+ ErrorCode2.InvalidRequest,
706
732
  "Invalid Request: Batch must contain at least one message"
707
733
  );
708
734
  }
@@ -803,7 +829,7 @@ var EdgeFastMCP = class {
803
829
  if (!prompt) {
804
830
  return this.#rpcError(
805
831
  id,
806
- ErrorCode.InvalidParams,
832
+ ErrorCode2.InvalidParams,
807
833
  `Prompt not found: ${promptName}`
808
834
  );
809
835
  }
@@ -818,7 +844,7 @@ var EdgeFastMCP = class {
818
844
  } catch (error) {
819
845
  return this.#rpcError(
820
846
  id,
821
- ErrorCode.InternalError,
847
+ ErrorCode2.InternalError,
822
848
  `Prompt load failed: ${error instanceof Error ? error.message : String(error)}`
823
849
  );
824
850
  }
@@ -865,7 +891,7 @@ var EdgeFastMCP = class {
865
891
  if (!resource) {
866
892
  return this.#rpcError(
867
893
  id,
868
- ErrorCode.InvalidParams,
894
+ ErrorCode2.InvalidParams,
869
895
  `Resource not found: ${uri}`
870
896
  );
871
897
  }
@@ -880,7 +906,7 @@ var EdgeFastMCP = class {
880
906
  } catch (error) {
881
907
  return this.#rpcError(
882
908
  id,
883
- ErrorCode.InternalError,
909
+ ErrorCode2.InternalError,
884
910
  `Resource load failed: ${error instanceof Error ? error.message : String(error)}`
885
911
  );
886
912
  }
@@ -895,7 +921,7 @@ var EdgeFastMCP = class {
895
921
  if (!tool) {
896
922
  return this.#rpcError(
897
923
  id,
898
- ErrorCode.InvalidParams,
924
+ ErrorCode2.InvalidParams,
899
925
  `Tool not found: ${toolName}`
900
926
  );
901
927
  }
@@ -907,7 +933,7 @@ var EdgeFastMCP = class {
907
933
  } catch (error) {
908
934
  return this.#rpcError(
909
935
  id,
910
- ErrorCode.InternalError,
936
+ ErrorCode2.InternalError,
911
937
  `Tool '${toolName}' parameter validation failed: ${error instanceof Error ? error.message : String(error)}`
912
938
  );
913
939
  }
@@ -918,7 +944,7 @@ var EdgeFastMCP = class {
918
944
  }).join(", ");
919
945
  return this.#rpcError(
920
946
  id,
921
- ErrorCode.InvalidParams,
947
+ ErrorCode2.InvalidParams,
922
948
  `Tool '${toolName}' parameter validation failed: ${friendlyErrors}. Please check the parameter types and values according to the tool's schema.`
923
949
  );
924
950
  }
@@ -935,7 +961,7 @@ var EdgeFastMCP = class {
935
961
  } catch (error) {
936
962
  return this.#rpcError(
937
963
  id,
938
- ErrorCode.InternalError,
964
+ ErrorCode2.InternalError,
939
965
  `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`
940
966
  );
941
967
  }