{"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 { 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 messages = Array.isArray(body) ? body : [body];\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 =\n      responses.length === 1\n        ? JSON.stringify(responses[0])\n        : JSON.stringify(responses);\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    try {\n      const result = await tool.execute(toolArgs ?? {});\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-next-line @typescript-eslint/no-explicit-any\n      if (typeof (z as any).toJSONSchema === \"function\") {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return (z as any).toJSONSchema(schema) as Record<string, unknown>;\n      }\n      // Zod 3 fallback: use zod-to-json-schema\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (\"_def\" in (schema as any) || schema instanceof z.ZodType) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return zodToJsonSchema(schema as any, { target: \"openApi3\" }) as Record<\n          string,\n          unknown\n        >;\n      }\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  isInitializeRequest,\n  isJSONRPCNotification,\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\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 _onsessionclosed?: (sessionId: string) => Promise<void> | void;\n  private _onsessioninitialized?: (sessionId: string) => Promise<void> | void;\n  private _pendingResponses: JSONRPCMessage[] = [];\n  private _requestToStreamMapping = new Map<RequestId, StreamId>();\n\n  private _standaloneSseStreamId = \"_GET_stream\";\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._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    // Store for pending responses (used in JSON response mode)\n    this._pendingResponses.push(message);\n\n    // Send to SSE streams\n    const streamId = options?.relatedRequestId\n      ? this._requestToStreamMapping.get(options.relatedRequestId)\n      : this._standaloneSseStreamId;\n\n    if (streamId) {\n      const writer = this._streamMapping.get(streamId);\n      if (writer) {\n        try {\n          if (this._eventStore) {\n            const eventId = await this._eventStore.storeEvent(\n              streamId,\n              message,\n            );\n            await this.writeSSEEventWithId(writer, eventId, message);\n          } else {\n            await this.writeSSEEvent(writer, message);\n          }\n        } catch (error) {\n          this.onerror?.(\n            error instanceof Error ? error : new Error(String(error)),\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\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._streamMapping.set(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\n    const arrayMessage: unknown[] = Array.isArray(rawMessage)\n      ? rawMessage\n      : [rawMessage];\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    // Process messages through the transport\n    this._pendingResponses = [];\n    for (const message of messages) {\n      this.onmessage?.(message, { authInfo: undefined });\n    }\n\n    // If all messages are notifications/responses, return 202\n    if (\n      messages.every(\n        (msg) => isJSONRPCNotification(msg) || isJSONRPCResponse(msg),\n      )\n    ) {\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 (\n      this._enableJsonResponse &&\n      acceptHeader?.includes(\"application/json\")\n    ) {\n      // Wait a tick for responses to be collected\n      await new Promise((resolve) => setTimeout(resolve, 0));\n\n      const responseBody =\n        this._pendingResponses.length === 1\n          ? JSON.stringify(this._pendingResponses[0])\n          : JSON.stringify(this._pendingResponses);\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    const { readable, writable } = new TransformStream<Uint8Array>();\n    const writer = writable.getWriter();\n    const streamId = `post_${Date.now()}`;\n    this._streamMapping.set(streamId, writer);\n\n    // Send any pending responses as SSE events\n    (async () => {\n      try {\n        for (const response of this._pendingResponses) {\n          await this.writeSSEEvent(writer, response);\n        }\n      } catch (error) {\n        this.onerror?.(\n          error instanceof Error ? error : new Error(String(error)),\n        );\n      }\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   * 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    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._streamMapping.set(streamId, writer);\n    } catch (error) {\n      await writer.close();\n      return this.createErrorResponse(500, -32000, `Replay failed: ${error}`);\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   * 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"]}