@modelcontextprotocol/server 2.0.0-alpha.2 → 2.0.0-alpha.3

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.
Files changed (36) hide show
  1. package/README.md +6 -2
  2. package/dist/{src-IKPjmxu7.mjs → ajvProvider-Birb50r-.mjs} +21 -3421
  3. package/dist/ajvProvider-Birb50r-.mjs.map +1 -0
  4. package/dist/ajvProvider-DZ_siXcF.d.mts +983 -0
  5. package/dist/ajvProvider-DZ_siXcF.d.mts.map +1 -0
  6. package/dist/cfWorkerProvider-BrJKpSFH.mjs +954 -0
  7. package/dist/cfWorkerProvider-BrJKpSFH.mjs.map +1 -0
  8. package/dist/cfWorkerProvider-DUhk5Ewx.d.mts +52 -0
  9. package/dist/cfWorkerProvider-DUhk5Ewx.d.mts.map +1 -0
  10. package/dist/chunk-BRhqBsOc.mjs +42 -0
  11. package/dist/index.d.mts +1526 -334
  12. package/dist/index.d.mts.map +1 -1
  13. package/dist/index.mjs +91 -766
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/shimsNode.d.mts +1 -1
  16. package/dist/shimsNode.mjs +1 -1
  17. package/dist/shimsWorkerd.d.mts +1 -1
  18. package/dist/shimsWorkerd.mjs +1 -1
  19. package/dist/shimsWorkerd.mjs.map +1 -1
  20. package/dist/src-Pa1iAvsj.mjs +3386 -0
  21. package/dist/src-Pa1iAvsj.mjs.map +1 -0
  22. package/dist/stdio.d.mts +49 -0
  23. package/dist/stdio.d.mts.map +1 -0
  24. package/dist/stdio.mjs +106 -0
  25. package/dist/stdio.mjs.map +1 -0
  26. package/dist/{index-Bhfkexnj.d.mts → transport-DMKhEchd.d.mts} +636 -1907
  27. package/dist/transport-DMKhEchd.d.mts.map +1 -0
  28. package/dist/types-R2RTIcjk.d.mts +66 -0
  29. package/dist/types-R2RTIcjk.d.mts.map +1 -0
  30. package/dist/validators/ajv.d.mts +2 -0
  31. package/dist/validators/ajv.mjs +4 -0
  32. package/dist/validators/cfWorker.d.mts +2 -0
  33. package/dist/validators/cfWorker.mjs +3 -0
  34. package/package.json +35 -16
  35. package/dist/index-Bhfkexnj.d.mts.map +0 -1
  36. package/dist/src-IKPjmxu7.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["COMPLETABLE_SYMBOL: unique symbol","task: Task","_mcpServer: McpServer","execution: ToolExecution","_server: Server","_serverInfo: Implementation","transportSessionId: string | undefined","formParams: ElicitRequestFormParams","toolDefinition: Tool","templateResources: Resource[]","registeredResource: RegisteredResource","registeredResourceTemplate: RegisteredResourceTemplate","registeredPrompt: RegisteredPrompt","registeredTool: RegisteredTool","_callbacks: {\n /**\n * A callback to list all resources matching this template. This is required to be specified, even if `undefined`, to avoid accidentally forgetting resource listing.\n */\n list: ListResourcesCallback | undefined;\n\n /**\n * An optional callback to autocomplete variables within the URI template. Useful for clients and users to discover possible values.\n */\n complete?: {\n [variable: string]: CompleteResourceTemplateCallback;\n };\n }","taskCtx: CreateTaskServerContext","callback","EMPTY_COMPLETION_RESULT: CompleteResult","hostname: string","_stdin: Readable","_stdout: Writable","error: { code: number; message: string; data?: string }","streamController: ReadableStreamDefaultController<Uint8Array>","headers: Record<string, string>","streamId: string | undefined","messages: JSONRPCMessage[]","closeSSEStream: (() => void) | undefined","closeStandaloneSSEStream: (() => void) | undefined","eventId: string | undefined","_defaultValidator: jsonSchemaValidator | undefined","coreFromJsonSchema"],"sources":["../src/server/completable.ts","../../core/src/experimental/tasks/helpers.ts","../../core/src/experimental/tasks/stores/inMemory.ts","../src/experimental/tasks/mcpServer.ts","../src/experimental/tasks/server.ts","../src/server/server.ts","../src/server/mcp.ts","../src/server/middleware/hostHeaderValidation.ts","../src/server/stdio.ts","../src/server/streamableHttp.ts","../src/fromJsonSchema.ts"],"sourcesContent":["import type { StandardSchemaWithJSON } from '@modelcontextprotocol/core';\n\nexport const COMPLETABLE_SYMBOL: unique symbol = Symbol.for('mcp.completable');\n\nexport type CompleteCallback<T extends StandardSchemaWithJSON = StandardSchemaWithJSON> = (\n value: StandardSchemaWithJSON.InferInput<T>,\n context?: {\n arguments?: Record<string, string>;\n }\n) => StandardSchemaWithJSON.InferInput<T>[] | Promise<StandardSchemaWithJSON.InferInput<T>[]>;\n\nexport type CompletableMeta<T extends StandardSchemaWithJSON = StandardSchemaWithJSON> = {\n complete: CompleteCallback<T>;\n};\n\nexport type CompletableSchema<T extends StandardSchemaWithJSON> = T & {\n [COMPLETABLE_SYMBOL]: CompletableMeta<T>;\n};\n\n/**\n * Wraps a schema to provide autocompletion capabilities. Useful for, e.g., prompt arguments in MCP.\n *\n * @example\n * ```ts source=\"./completable.examples.ts#completable_basicUsage\"\n * server.registerPrompt(\n * 'review-code',\n * {\n * title: 'Code Review',\n * argsSchema: z.object({\n * language: completable(z.string().describe('Programming language'), value =>\n * ['typescript', 'javascript', 'python', 'rust', 'go'].filter(lang => lang.startsWith(value))\n * )\n * })\n * },\n * ({ language }) => ({\n * messages: [\n * {\n * role: 'user' as const,\n * content: {\n * type: 'text' as const,\n * text: `Review this ${language} code.`\n * }\n * }\n * ]\n * })\n * );\n * ```\n *\n * @see {@linkcode server/mcp.McpServer.registerPrompt | McpServer.registerPrompt} for using completable schemas in prompt argument definitions\n */\nexport function completable<T extends StandardSchemaWithJSON>(schema: T, complete: CompleteCallback<T>): CompletableSchema<T> {\n Object.defineProperty(schema as object, COMPLETABLE_SYMBOL, {\n value: { complete } as CompletableMeta<T>,\n enumerable: false,\n writable: false,\n configurable: false\n });\n return schema as CompletableSchema<T>;\n}\n\n/**\n * Checks if a schema is completable (has completion metadata).\n */\nexport function isCompletable(schema: unknown): schema is CompletableSchema<StandardSchemaWithJSON> {\n return !!schema && typeof schema === 'object' && COMPLETABLE_SYMBOL in (schema as object);\n}\n\n/**\n * Gets the completer callback from a completable schema, if it exists.\n */\nexport function getCompleter<T extends StandardSchemaWithJSON>(schema: T): CompleteCallback<T> | undefined {\n const meta = (schema as unknown as { [COMPLETABLE_SYMBOL]?: CompletableMeta<T> })[COMPLETABLE_SYMBOL];\n return meta?.complete as CompleteCallback<T> | undefined;\n}\n","/**\n * Experimental task capability assertion helpers.\n * WARNING: These APIs are experimental and may change without notice.\n *\n * @experimental\n */\n\nimport { SdkError, SdkErrorCode } from '../../errors/sdkErrors.js';\n\n/**\n * Type representing the task requests capability structure.\n * This is derived from `ClientTasksCapability.requests` and `ServerTasksCapability.requests`.\n */\ninterface TaskRequestsCapability {\n tools?: { call?: object };\n sampling?: { createMessage?: object };\n elicitation?: { create?: object };\n}\n\n/**\n * Asserts that task creation is supported for `tools/call`.\n * Used to implement the `assertTaskCapability` or `assertTaskHandlerCapability` abstract methods on Protocol.\n *\n * @param requests - The task requests capability object\n * @param method - The method being checked\n * @param entityName - `'Server'` or `'Client'` for error messages\n * @throws {@linkcode SdkError} with {@linkcode SdkErrorCode.CapabilityNotSupported} if the capability is not supported\n *\n * @experimental\n */\nexport function assertToolsCallTaskCapability(\n requests: TaskRequestsCapability | undefined,\n method: string,\n entityName: 'Server' | 'Client'\n): void {\n if (!requests) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `${entityName} does not support task creation (required for ${method})`);\n }\n\n switch (method) {\n case 'tools/call': {\n if (!requests.tools?.call) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `${entityName} does not support task creation for tools/call (required for ${method})`\n );\n }\n break;\n }\n\n default: {\n // Method doesn't support tasks, which is fine - no error\n break;\n }\n }\n}\n\n/**\n * Asserts that task creation is supported for `sampling/createMessage` or `elicitation/create`.\n * Used to implement the `assertTaskCapability` or `assertTaskHandlerCapability` abstract methods on Protocol.\n *\n * @param requests - The task requests capability object\n * @param method - The method being checked\n * @param entityName - `'Server'` or `'Client'` for error messages\n * @throws {@linkcode SdkError} with {@linkcode SdkErrorCode.CapabilityNotSupported} if the capability is not supported\n *\n * @experimental\n */\nexport function assertClientRequestTaskCapability(\n requests: TaskRequestsCapability | undefined,\n method: string,\n entityName: 'Server' | 'Client'\n): void {\n if (!requests) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `${entityName} does not support task creation (required for ${method})`);\n }\n\n switch (method) {\n case 'sampling/createMessage': {\n if (!requests.sampling?.createMessage) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `${entityName} does not support task creation for sampling/createMessage (required for ${method})`\n );\n }\n break;\n }\n\n case 'elicitation/create': {\n if (!requests.elicitation?.create) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `${entityName} does not support task creation for elicitation/create (required for ${method})`\n );\n }\n break;\n }\n\n default: {\n // Method doesn't support tasks, which is fine - no error\n break;\n }\n }\n}\n","/**\n * In-memory implementations of {@linkcode TaskStore} and {@linkcode TaskMessageQueue}.\n * @experimental\n */\n\nimport type { Request, RequestId, Result, Task } from '../../../types/index.js';\nimport type { CreateTaskOptions, QueuedMessage, TaskMessageQueue, TaskStore } from '../interfaces.js';\nimport { isTerminal } from '../interfaces.js';\n\ninterface StoredTask {\n task: Task;\n request: Request;\n requestId: RequestId;\n sessionId?: string;\n result?: Result;\n}\n\n/**\n * In-memory {@linkcode TaskStore} implementation for development and testing.\n * For production, use a database or distributed cache.\n * @experimental\n */\nexport class InMemoryTaskStore implements TaskStore {\n private tasks = new Map<string, StoredTask>();\n private cleanupTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n /**\n * Generates a unique task ID using Web Crypto API.\n */\n private generateTaskId(): string {\n return crypto.randomUUID().replaceAll('-', '');\n }\n\n /** {@inheritDoc TaskStore.createTask} */\n async createTask(taskParams: CreateTaskOptions, requestId: RequestId, request: Request, sessionId?: string): Promise<Task> {\n // Generate a unique task ID\n const taskId = this.generateTaskId();\n\n // Ensure uniqueness\n if (this.tasks.has(taskId)) {\n throw new Error(`Task with ID ${taskId} already exists`);\n }\n\n const actualTtl = taskParams.ttl ?? null;\n\n // Create task with generated ID and timestamps\n const createdAt = new Date().toISOString();\n const task: Task = {\n taskId,\n status: 'working',\n ttl: actualTtl,\n createdAt,\n lastUpdatedAt: createdAt,\n pollInterval: taskParams.pollInterval ?? 1000\n };\n\n this.tasks.set(taskId, {\n task,\n request,\n requestId,\n sessionId\n });\n\n // Schedule cleanup if ttl is specified\n // Cleanup occurs regardless of task status\n if (actualTtl) {\n const timer = setTimeout(() => {\n this.tasks.delete(taskId);\n this.cleanupTimers.delete(taskId);\n }, actualTtl);\n\n this.cleanupTimers.set(taskId, timer);\n }\n\n return task;\n }\n\n /**\n * Retrieves a stored task, enforcing session ownership when a sessionId is provided.\n * Returns undefined if the task does not exist or belongs to a different session.\n */\n private getStoredTask(taskId: string, sessionId?: string): StoredTask | undefined {\n const stored = this.tasks.get(taskId);\n if (!stored) {\n return undefined;\n }\n // Enforce session isolation: if a sessionId is provided and the task\n // was created with a sessionId, they must match.\n if (sessionId !== undefined && stored.sessionId !== undefined && stored.sessionId !== sessionId) {\n return undefined;\n }\n return stored;\n }\n\n async getTask(taskId: string, sessionId?: string): Promise<Task | null> {\n const stored = this.getStoredTask(taskId, sessionId);\n return stored ? { ...stored.task } : null;\n }\n\n /** {@inheritDoc TaskStore.storeTaskResult} */\n async storeTaskResult(taskId: string, status: 'completed' | 'failed', result: Result, sessionId?: string): Promise<void> {\n const stored = this.getStoredTask(taskId, sessionId);\n if (!stored) {\n throw new Error(`Task with ID ${taskId} not found`);\n }\n\n // Don't allow storing results for tasks already in terminal state\n if (isTerminal(stored.task.status)) {\n throw new Error(\n `Cannot store result for task ${taskId} in terminal status '${stored.task.status}'. Task results can only be stored once.`\n );\n }\n\n stored.result = result;\n stored.task.status = status;\n stored.task.lastUpdatedAt = new Date().toISOString();\n\n // Reset cleanup timer to start from now (if ttl is set)\n if (stored.task.ttl) {\n const existingTimer = this.cleanupTimers.get(taskId);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n const timer = setTimeout(() => {\n this.tasks.delete(taskId);\n this.cleanupTimers.delete(taskId);\n }, stored.task.ttl);\n\n this.cleanupTimers.set(taskId, timer);\n }\n }\n\n /** {@inheritDoc TaskStore.getTaskResult} */\n async getTaskResult(taskId: string, sessionId?: string): Promise<Result> {\n const stored = this.getStoredTask(taskId, sessionId);\n if (!stored) {\n throw new Error(`Task with ID ${taskId} not found`);\n }\n\n if (!stored.result) {\n throw new Error(`Task ${taskId} has no result stored`);\n }\n\n return stored.result;\n }\n\n /** {@inheritDoc TaskStore.updateTaskStatus} */\n async updateTaskStatus(taskId: string, status: Task['status'], statusMessage?: string, sessionId?: string): Promise<void> {\n const stored = this.getStoredTask(taskId, sessionId);\n if (!stored) {\n throw new Error(`Task with ID ${taskId} not found`);\n }\n\n // Don't allow transitions from terminal states\n if (isTerminal(stored.task.status)) {\n throw new Error(\n `Cannot update task ${taskId} from terminal status '${stored.task.status}' to '${status}'. Terminal states (completed, failed, cancelled) cannot transition to other states.`\n );\n }\n\n stored.task.status = status;\n if (statusMessage) {\n stored.task.statusMessage = statusMessage;\n }\n\n stored.task.lastUpdatedAt = new Date().toISOString();\n\n // If task is in a terminal state and has ttl, start cleanup timer\n if (isTerminal(status) && stored.task.ttl) {\n const existingTimer = this.cleanupTimers.get(taskId);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n const timer = setTimeout(() => {\n this.tasks.delete(taskId);\n this.cleanupTimers.delete(taskId);\n }, stored.task.ttl);\n\n this.cleanupTimers.set(taskId, timer);\n }\n }\n\n /** {@inheritDoc TaskStore.listTasks} */\n async listTasks(cursor?: string, sessionId?: string): Promise<{ tasks: Task[]; nextCursor?: string }> {\n const PAGE_SIZE = 10;\n\n // Filter tasks by session ownership before pagination\n const filteredTaskIds = [...this.tasks.entries()]\n .filter(([, stored]) => {\n if (sessionId === undefined || stored.sessionId === undefined) {\n return true;\n }\n return stored.sessionId === sessionId;\n })\n .map(([taskId]) => taskId);\n\n let startIndex = 0;\n if (cursor) {\n const cursorIndex = filteredTaskIds.indexOf(cursor);\n if (cursorIndex === -1) {\n // Invalid cursor - throw error\n throw new Error(`Invalid cursor: ${cursor}`);\n } else {\n startIndex = cursorIndex + 1;\n }\n }\n\n const pageTaskIds = filteredTaskIds.slice(startIndex, startIndex + PAGE_SIZE);\n const tasks = pageTaskIds.map(taskId => {\n const stored = this.tasks.get(taskId)!;\n return { ...stored.task };\n });\n\n const nextCursor = startIndex + PAGE_SIZE < filteredTaskIds.length ? pageTaskIds.at(-1) : undefined;\n\n return { tasks, nextCursor };\n }\n\n /**\n * Cleanup all timers (useful for testing or graceful shutdown)\n */\n cleanup(): void {\n for (const timer of this.cleanupTimers.values()) {\n clearTimeout(timer);\n }\n this.cleanupTimers.clear();\n this.tasks.clear();\n }\n\n /**\n * Get all tasks (useful for debugging)\n */\n getAllTasks(): Task[] {\n return [...this.tasks.values()].map(stored => ({ ...stored.task }));\n }\n}\n\n/**\n * In-memory {@linkcode TaskMessageQueue} implementation for development and testing.\n * For production, use Redis or another distributed queue.\n * @experimental\n */\nexport class InMemoryTaskMessageQueue implements TaskMessageQueue {\n private queues = new Map<string, QueuedMessage[]>();\n\n /**\n * Generates a queue key from taskId.\n * SessionId is intentionally ignored because taskIds are globally unique\n * and tasks need to be accessible across HTTP requests/sessions.\n */\n private getQueueKey(taskId: string, _sessionId?: string): string {\n return taskId;\n }\n\n /**\n * Gets or creates a queue for the given task and session.\n */\n private getQueue(taskId: string, sessionId?: string): QueuedMessage[] {\n const key = this.getQueueKey(taskId, sessionId);\n let queue = this.queues.get(key);\n if (!queue) {\n queue = [];\n this.queues.set(key, queue);\n }\n return queue;\n }\n\n /**\n * Adds a message to the end of the queue for a specific task.\n * Atomically checks queue size and throws if maxSize would be exceeded.\n * @param taskId The task identifier\n * @param message The message to enqueue\n * @param sessionId Optional session ID for binding the operation to a specific session\n * @param maxSize Optional maximum queue size - if specified and queue is full, throws an error\n * @throws Error if maxSize is specified and would be exceeded\n */\n async enqueue(taskId: string, message: QueuedMessage, sessionId?: string, maxSize?: number): Promise<void> {\n const queue = this.getQueue(taskId, sessionId);\n\n // Atomically check size and enqueue\n if (maxSize !== undefined && queue.length >= maxSize) {\n throw new Error(`Task message queue overflow: queue size (${queue.length}) exceeds maximum (${maxSize})`);\n }\n\n queue.push(message);\n }\n\n /**\n * Removes and returns the first message from the queue for a specific task.\n * @param taskId The task identifier\n * @param sessionId Optional session ID for binding the query to a specific session\n * @returns The first message, or `undefined` if the queue is empty\n */\n async dequeue(taskId: string, sessionId?: string): Promise<QueuedMessage | undefined> {\n const queue = this.getQueue(taskId, sessionId);\n return queue.shift();\n }\n\n /**\n * Removes and returns all messages from the queue for a specific task.\n * @param taskId The task identifier\n * @param sessionId Optional session ID for binding the query to a specific session\n * @returns Array of all messages that were in the queue\n */\n async dequeueAll(taskId: string, sessionId?: string): Promise<QueuedMessage[]> {\n const key = this.getQueueKey(taskId, sessionId);\n const queue = this.queues.get(key) ?? [];\n this.queues.delete(key);\n return queue;\n }\n}\n","/**\n * Experimental {@linkcode McpServer} task features for MCP SDK.\n * WARNING: These APIs are experimental and may change without notice.\n *\n * @experimental\n */\n\nimport type { StandardSchemaWithJSON, TaskToolExecution, ToolAnnotations, ToolExecution } from '@modelcontextprotocol/core';\n\nimport type { AnyToolHandler, McpServer, RegisteredTool } from '../../server/mcp.js';\nimport type { ToolTaskHandler } from './interfaces.js';\n\n/**\n * Internal interface for accessing {@linkcode McpServer}'s private _createRegisteredTool method.\n * @internal\n */\ninterface McpServerInternal {\n _createRegisteredTool(\n name: string,\n title: string | undefined,\n description: string | undefined,\n inputSchema: StandardSchemaWithJSON | undefined,\n outputSchema: StandardSchemaWithJSON | undefined,\n annotations: ToolAnnotations | undefined,\n execution: ToolExecution | undefined,\n _meta: Record<string, unknown> | undefined,\n handler: AnyToolHandler<StandardSchemaWithJSON | undefined>\n ): RegisteredTool;\n}\n\n/**\n * Experimental task features for {@linkcode McpServer}.\n *\n * Access via `server.experimental.tasks`:\n * ```typescript\n * server.experimental.tasks.registerToolTask('long-running', config, handler);\n * ```\n *\n * @experimental\n */\nexport class ExperimentalMcpServerTasks {\n constructor(private readonly _mcpServer: McpServer) {}\n\n /**\n * Registers a task-based tool with a config object and handler.\n *\n * Task-based tools support long-running operations that can be polled for status\n * and results. The handler must implement {@linkcode ToolTaskHandler.createTask | createTask}, {@linkcode ToolTaskHandler.getTask | getTask}, and {@linkcode ToolTaskHandler.getTaskResult | getTaskResult}\n * methods.\n *\n * @example\n * ```typescript\n * server.experimental.tasks.registerToolTask('long-computation', {\n * description: 'Performs a long computation',\n * inputSchema: z.object({ input: z.string() }),\n * execution: { taskSupport: 'required' }\n * }, {\n * createTask: async (args, ctx) => {\n * const task = await ctx.task.store.createTask({ ttl: 300000 });\n * startBackgroundWork(task.taskId, args);\n * return { task };\n * },\n * getTask: async (args, ctx) => {\n * return ctx.task.store.getTask(ctx.task.id);\n * },\n * getTaskResult: async (args, ctx) => {\n * return ctx.task.store.getTaskResult(ctx.task.id);\n * }\n * });\n * ```\n *\n * @param name - The tool name\n * @param config - Tool configuration (description, schemas, etc.)\n * @param handler - Task handler with {@linkcode ToolTaskHandler.createTask | createTask}, {@linkcode ToolTaskHandler.getTask | getTask}, {@linkcode ToolTaskHandler.getTaskResult | getTaskResult} methods\n * @returns {@linkcode server/mcp.RegisteredTool | RegisteredTool} for managing the tool's lifecycle\n *\n * @experimental\n */\n registerToolTask<OutputArgs extends StandardSchemaWithJSON | undefined>(\n name: string,\n config: {\n title?: string;\n description?: string;\n outputSchema?: OutputArgs;\n annotations?: ToolAnnotations;\n execution?: TaskToolExecution;\n _meta?: Record<string, unknown>;\n },\n handler: ToolTaskHandler<undefined>\n ): RegisteredTool;\n\n registerToolTask<InputArgs extends StandardSchemaWithJSON, OutputArgs extends StandardSchemaWithJSON | undefined>(\n name: string,\n config: {\n title?: string;\n description?: string;\n inputSchema: InputArgs;\n outputSchema?: OutputArgs;\n annotations?: ToolAnnotations;\n execution?: TaskToolExecution;\n _meta?: Record<string, unknown>;\n },\n handler: ToolTaskHandler<InputArgs>\n ): RegisteredTool;\n\n registerToolTask<InputArgs extends StandardSchemaWithJSON | undefined, OutputArgs extends StandardSchemaWithJSON | undefined>(\n name: string,\n config: {\n title?: string;\n description?: string;\n inputSchema?: InputArgs;\n outputSchema?: OutputArgs;\n annotations?: ToolAnnotations;\n execution?: TaskToolExecution;\n _meta?: Record<string, unknown>;\n },\n handler: ToolTaskHandler<InputArgs>\n ): RegisteredTool {\n // Validate that taskSupport is not 'forbidden' for task-based tools\n const execution: ToolExecution = { taskSupport: 'required', ...config.execution };\n if (execution.taskSupport === 'forbidden') {\n throw new Error(`Cannot register task-based tool '${name}' with taskSupport 'forbidden'. Use registerTool() instead.`);\n }\n\n // Access McpServer's internal _createRegisteredTool method\n const mcpServerInternal = this._mcpServer as unknown as McpServerInternal;\n return mcpServerInternal._createRegisteredTool(\n name,\n config.title,\n config.description,\n config.inputSchema,\n config.outputSchema,\n config.annotations,\n execution,\n config._meta,\n handler as AnyToolHandler<StandardSchemaWithJSON | undefined>\n );\n }\n}\n","/**\n * Experimental server task features for MCP SDK.\n * WARNING: These APIs are experimental and may change without notice.\n *\n * @experimental\n */\n\nimport type {\n AnyObjectSchema,\n CancelTaskResult,\n CreateMessageRequestParams,\n CreateMessageResult,\n ElicitRequestFormParams,\n ElicitRequestURLParams,\n ElicitResult,\n GetTaskPayloadResult,\n GetTaskResult,\n ListTasksResult,\n Request,\n RequestMethod,\n RequestOptions,\n ResponseMessage,\n ResultTypeMap\n} from '@modelcontextprotocol/core';\nimport { getResultSchema, GetTaskPayloadResultSchema, SdkError, SdkErrorCode } from '@modelcontextprotocol/core';\n\nimport type { Server } from '../../server/server.js';\n\n/**\n * Experimental task features for low-level MCP servers.\n *\n * Access via `server.experimental.tasks`:\n * ```typescript\n * const stream = server.experimental.tasks.requestStream(request, options);\n * ```\n *\n * For high-level server usage with task-based tools, use {@linkcode index.McpServer | McpServer}.experimental.tasks instead.\n *\n * @experimental\n */\nexport class ExperimentalServerTasks {\n constructor(private readonly _server: Server) {}\n\n private get _module() {\n return this._server.taskManager;\n }\n\n /**\n * Sends a request and returns an AsyncGenerator that yields response messages.\n * The generator is guaranteed to end with either a `'result'` or `'error'` message.\n *\n * This method provides streaming access to request processing, allowing you to\n * observe intermediate task status updates for task-augmented requests.\n *\n * @param request - The request to send (method name determines the result schema)\n * @param options - Optional request options (timeout, signal, task creation params, etc.)\n * @returns AsyncGenerator that yields {@linkcode ResponseMessage} objects\n *\n * @experimental\n */\n requestStream<M extends RequestMethod>(\n request: { method: M; params?: Record<string, unknown> },\n options?: RequestOptions\n ): AsyncGenerator<ResponseMessage<ResultTypeMap[M]>, void, void> {\n const resultSchema = getResultSchema(request.method) as unknown as AnyObjectSchema;\n return this._module.requestStream(request as Request, resultSchema, options) as AsyncGenerator<\n ResponseMessage<ResultTypeMap[M]>,\n void,\n void\n >;\n }\n\n /**\n * Sends a sampling request and returns an AsyncGenerator that yields response messages.\n * The generator is guaranteed to end with either a 'result' or 'error' message.\n *\n * For task-augmented requests, yields 'taskCreated' and 'taskStatus' messages\n * before the final result.\n *\n * @example\n * ```typescript\n * const stream = server.experimental.tasks.createMessageStream({\n * messages: [{ role: 'user', content: { type: 'text', text: 'Hello' } }],\n * maxTokens: 100\n * }, {\n * onprogress: (progress) => {\n * // Handle streaming tokens via progress notifications\n * console.log('Progress:', progress.message);\n * }\n * });\n *\n * for await (const message of stream) {\n * switch (message.type) {\n * case 'taskCreated':\n * console.log('Task created:', message.task.taskId);\n * break;\n * case 'taskStatus':\n * console.log('Task status:', message.task.status);\n * break;\n * case 'result':\n * console.log('Final result:', message.result);\n * break;\n * case 'error':\n * console.error('Error:', message.error);\n * break;\n * }\n * }\n * ```\n *\n * @param params - The sampling request parameters\n * @param options - Optional request options (timeout, signal, task creation params, onprogress, etc.)\n * @returns AsyncGenerator that yields ResponseMessage objects\n *\n * @experimental\n */\n createMessageStream(\n params: CreateMessageRequestParams,\n options?: RequestOptions\n ): AsyncGenerator<ResponseMessage<CreateMessageResult>, void, void> {\n // Access client capabilities via the server\n const clientCapabilities = this._server.getClientCapabilities();\n\n // Capability check - only required when tools/toolChoice are provided\n if ((params.tools || params.toolChoice) && !clientCapabilities?.sampling?.tools) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support sampling tools capability.');\n }\n\n // Message structure validation - always validate tool_use/tool_result pairs.\n // These may appear even without tools/toolChoice in the current request when\n // a previous sampling request returned tool_use and this is a follow-up with results.\n if (params.messages.length > 0) {\n const lastMessage = params.messages.at(-1)!;\n const lastContent = Array.isArray(lastMessage.content) ? lastMessage.content : [lastMessage.content];\n const hasToolResults = lastContent.some(c => c.type === 'tool_result');\n\n const previousMessage = params.messages.length > 1 ? params.messages.at(-2) : undefined;\n const previousContent = previousMessage\n ? Array.isArray(previousMessage.content)\n ? previousMessage.content\n : [previousMessage.content]\n : [];\n const hasPreviousToolUse = previousContent.some(c => c.type === 'tool_use');\n\n if (hasToolResults) {\n if (lastContent.some(c => c.type !== 'tool_result')) {\n throw new Error('The last message must contain only tool_result content if any is present');\n }\n if (!hasPreviousToolUse) {\n throw new Error('tool_result blocks are not matching any tool_use from the previous message');\n }\n }\n if (hasPreviousToolUse) {\n const toolUseIds = new Set(previousContent.filter(c => c.type === 'tool_use').map(c => c.id));\n const toolResultIds = new Set(lastContent.filter(c => c.type === 'tool_result').map(c => c.toolUseId));\n if (toolUseIds.size !== toolResultIds.size || ![...toolUseIds].every(id => toolResultIds.has(id))) {\n throw new Error('ids of tool_result blocks and tool_use blocks from previous message do not match');\n }\n }\n }\n\n return this.requestStream(\n {\n method: 'sampling/createMessage',\n params\n },\n options\n ) as AsyncGenerator<ResponseMessage<CreateMessageResult>, void, void>;\n }\n\n /**\n * Sends an elicitation request and returns an AsyncGenerator that yields response messages.\n * The generator is guaranteed to end with either a 'result' or 'error' message.\n *\n * For task-augmented requests (especially URL-based elicitation), yields 'taskCreated'\n * and 'taskStatus' messages before the final result.\n *\n * @example\n * ```typescript\n * const stream = server.experimental.tasks.elicitInputStream({\n * mode: 'url',\n * message: 'Please authenticate',\n * elicitationId: 'auth-123',\n * url: 'https://example.com/auth'\n * }, {\n * task: { ttl: 300000 } // Task-augmented for long-running auth flow\n * });\n *\n * for await (const message of stream) {\n * switch (message.type) {\n * case 'taskCreated':\n * console.log('Task created:', message.task.taskId);\n * break;\n * case 'taskStatus':\n * console.log('Task status:', message.task.status);\n * break;\n * case 'result':\n * console.log('User action:', message.result.action);\n * break;\n * case 'error':\n * console.error('Error:', message.error);\n * break;\n * }\n * }\n * ```\n *\n * @param params - The elicitation request parameters\n * @param options - Optional request options (timeout, signal, task creation params, etc.)\n * @returns AsyncGenerator that yields ResponseMessage objects\n *\n * @experimental\n */\n elicitInputStream(\n params: ElicitRequestFormParams | ElicitRequestURLParams,\n options?: RequestOptions\n ): AsyncGenerator<ResponseMessage<ElicitResult>, void, void> {\n // Access client capabilities via the server\n const clientCapabilities = this._server.getClientCapabilities();\n const mode = params.mode ?? 'form';\n\n // Capability check based on mode\n switch (mode) {\n case 'url': {\n if (!clientCapabilities?.elicitation?.url) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support url elicitation.');\n }\n break;\n }\n case 'form': {\n if (!clientCapabilities?.elicitation?.form) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support form elicitation.');\n }\n break;\n }\n }\n\n // Normalize params to ensure mode is set\n const normalizedParams = mode === 'form' && params.mode !== 'form' ? { ...params, mode: 'form' } : params;\n return this.requestStream(\n {\n method: 'elicitation/create',\n params: normalizedParams\n },\n options\n ) as AsyncGenerator<ResponseMessage<ElicitResult>, void, void>;\n }\n\n /**\n * Gets the current status of a task.\n *\n * @param taskId - The task identifier\n * @param options - Optional request options\n * @returns The task status\n *\n * @experimental\n */\n async getTask(taskId: string, options?: RequestOptions): Promise<GetTaskResult> {\n return this._module.getTask({ taskId }, options);\n }\n\n /**\n * Retrieves the result of a completed task.\n *\n * @param taskId - The task identifier\n * @param options - Optional request options\n * @returns The task result. The payload structure matches the result type of the\n * original request (e.g., a `tools/call` task returns a `CallToolResult`).\n *\n * @experimental\n */\n async getTaskResult(taskId: string, options?: RequestOptions): Promise<GetTaskPayloadResult> {\n return this._module.getTaskResult({ taskId }, GetTaskPayloadResultSchema, options);\n }\n\n /**\n * Lists tasks with optional pagination.\n *\n * @param cursor - Optional pagination cursor\n * @param options - Optional request options\n * @returns List of tasks with optional next cursor\n *\n * @experimental\n */\n async listTasks(cursor?: string, options?: RequestOptions): Promise<ListTasksResult> {\n return this._module.listTasks(cursor ? { cursor } : undefined, options);\n }\n\n /**\n * Cancels a running task.\n *\n * @param taskId - The task identifier\n * @param options - Optional request options\n *\n * @experimental\n */\n async cancelTask(taskId: string, options?: RequestOptions): Promise<CancelTaskResult> {\n return this._module.cancelTask({ taskId }, options);\n }\n}\n","import type {\n BaseContext,\n ClientCapabilities,\n CreateMessageRequest,\n CreateMessageRequestParamsBase,\n CreateMessageRequestParamsWithTools,\n CreateMessageResult,\n CreateMessageResultWithTools,\n ElicitRequestFormParams,\n ElicitRequestURLParams,\n ElicitResult,\n Implementation,\n InitializeRequest,\n InitializeResult,\n JsonSchemaType,\n jsonSchemaValidator,\n ListRootsRequest,\n LoggingLevel,\n LoggingMessageNotification,\n MessageExtraInfo,\n NotificationMethod,\n NotificationOptions,\n ProtocolOptions,\n RequestMethod,\n RequestOptions,\n RequestTypeMap,\n ResourceUpdatedNotification,\n ResultTypeMap,\n ServerCapabilities,\n ServerContext,\n ServerResult,\n TaskManagerOptions,\n ToolResultContent,\n ToolUseContent\n} from '@modelcontextprotocol/core';\nimport {\n assertClientRequestTaskCapability,\n assertToolsCallTaskCapability,\n CallToolRequestSchema,\n CallToolResultSchema,\n CreateMessageResultSchema,\n CreateMessageResultWithToolsSchema,\n CreateTaskResultSchema,\n ElicitResultSchema,\n EmptyResultSchema,\n extractTaskManagerOptions,\n LATEST_PROTOCOL_VERSION,\n ListRootsResultSchema,\n LoggingLevelSchema,\n mergeCapabilities,\n parseSchema,\n Protocol,\n ProtocolError,\n ProtocolErrorCode,\n SdkError,\n SdkErrorCode\n} from '@modelcontextprotocol/core';\nimport { DefaultJsonSchemaValidator } from '@modelcontextprotocol/server/_shims';\n\nimport { ExperimentalServerTasks } from '../experimental/tasks/server.js';\n\n/**\n * Extended tasks capability that includes runtime configuration (store, messageQueue).\n * The runtime-only fields are stripped before advertising capabilities to clients.\n */\nexport type ServerTasksCapabilityWithRuntime = NonNullable<ServerCapabilities['tasks']> & TaskManagerOptions;\n\nexport type ServerOptions = ProtocolOptions & {\n /**\n * Capabilities to advertise as being supported by this server.\n */\n capabilities?: Omit<ServerCapabilities, 'tasks'> & {\n tasks?: ServerTasksCapabilityWithRuntime;\n };\n\n /**\n * Optional instructions describing how to use the server and its features.\n */\n instructions?: string;\n\n /**\n * JSON Schema validator for elicitation response validation.\n *\n * The validator is used to validate user input returned from elicitation\n * requests against the requested schema.\n *\n * @default {@linkcode DefaultJsonSchemaValidator} ({@linkcode index.AjvJsonSchemaValidator | AjvJsonSchemaValidator} on Node.js, {@linkcode index.CfWorkerJsonSchemaValidator | CfWorkerJsonSchemaValidator} on Cloudflare Workers)\n */\n jsonSchemaValidator?: jsonSchemaValidator;\n};\n\n/**\n * An MCP server on top of a pluggable transport.\n *\n * This server will automatically respond to the initialization flow as initiated from the client.\n *\n * @deprecated Use {@linkcode server/mcp.McpServer | McpServer} instead for the high-level API. Only use `Server` for advanced use cases.\n */\nexport class Server extends Protocol<ServerContext> {\n private _clientCapabilities?: ClientCapabilities;\n private _clientVersion?: Implementation;\n private _capabilities: ServerCapabilities;\n private _instructions?: string;\n private _jsonSchemaValidator: jsonSchemaValidator;\n private _experimental?: { tasks: ExperimentalServerTasks };\n\n /**\n * Callback for when initialization has fully completed (i.e., the client has sent an `notifications/initialized` notification).\n */\n oninitialized?: () => void;\n\n /**\n * Initializes this server with the given name and version information.\n */\n constructor(\n private _serverInfo: Implementation,\n options?: ServerOptions\n ) {\n super({\n ...options,\n tasks: extractTaskManagerOptions(options?.capabilities?.tasks)\n });\n this._capabilities = options?.capabilities ? { ...options.capabilities } : {};\n this._instructions = options?.instructions;\n this._jsonSchemaValidator = options?.jsonSchemaValidator ?? new DefaultJsonSchemaValidator();\n\n // Strip runtime-only fields from advertised capabilities\n if (options?.capabilities?.tasks) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { taskStore, taskMessageQueue, defaultTaskPollInterval, maxTaskQueueSize, ...wireCapabilities } =\n options.capabilities.tasks;\n this._capabilities.tasks = wireCapabilities;\n }\n\n this.setRequestHandler('initialize', request => this._oninitialize(request));\n this.setNotificationHandler('notifications/initialized', () => this.oninitialized?.());\n\n if (this._capabilities.logging) {\n this._registerLoggingHandler();\n }\n }\n\n private _registerLoggingHandler(): void {\n this.setRequestHandler('logging/setLevel', async (request, ctx) => {\n const transportSessionId: string | undefined =\n ctx.sessionId || (ctx.http?.req?.headers.get('mcp-session-id') as string) || undefined;\n const { level } = request.params;\n const parseResult = parseSchema(LoggingLevelSchema, level);\n if (parseResult.success) {\n this._loggingLevels.set(transportSessionId, parseResult.data);\n }\n return {};\n });\n }\n\n protected override buildContext(ctx: BaseContext, transportInfo?: MessageExtraInfo): ServerContext {\n // Only create http when there's actual HTTP transport info or auth info\n const hasHttpInfo = ctx.http || transportInfo?.request || transportInfo?.closeSSEStream || transportInfo?.closeStandaloneSSEStream;\n return {\n ...ctx,\n mcpReq: {\n ...ctx.mcpReq,\n log: (level, data, logger) => this.sendLoggingMessage({ level, data, logger }),\n elicitInput: (params, options) => this.elicitInput(params, options),\n requestSampling: (params, options) => this.createMessage(params, options)\n },\n http: hasHttpInfo\n ? {\n ...ctx.http,\n req: transportInfo?.request,\n closeSSE: transportInfo?.closeSSEStream,\n closeStandaloneSSE: transportInfo?.closeStandaloneSSEStream\n }\n : undefined\n };\n }\n\n /**\n * Access experimental features.\n *\n * WARNING: These APIs are experimental and may change without notice.\n *\n * @experimental\n */\n get experimental(): { tasks: ExperimentalServerTasks } {\n if (!this._experimental) {\n this._experimental = {\n tasks: new ExperimentalServerTasks(this)\n };\n }\n return this._experimental;\n }\n\n // Map log levels by session id\n private _loggingLevels = new Map<string | undefined, LoggingLevel>();\n\n // Map LogLevelSchema to severity index\n private readonly LOG_LEVEL_SEVERITY = new Map(LoggingLevelSchema.options.map((level, index) => [level, index]));\n\n // Is a message with the given level ignored in the log level set for the given session id?\n private isMessageIgnored = (level: LoggingLevel, sessionId?: string): boolean => {\n const currentLevel = this._loggingLevels.get(sessionId);\n return currentLevel ? this.LOG_LEVEL_SEVERITY.get(level)! < this.LOG_LEVEL_SEVERITY.get(currentLevel)! : false;\n };\n\n /**\n * Registers new capabilities. This can only be called before connecting to a transport.\n *\n * The new capabilities will be merged with any existing capabilities previously given (e.g., at initialization).\n */\n public registerCapabilities(capabilities: ServerCapabilities): void {\n if (this.transport) {\n throw new SdkError(SdkErrorCode.AlreadyConnected, 'Cannot register capabilities after connecting to transport');\n }\n const hadLogging = !!this._capabilities.logging;\n this._capabilities = mergeCapabilities(this._capabilities, capabilities);\n if (!hadLogging && this._capabilities.logging) {\n this._registerLoggingHandler();\n }\n }\n\n /**\n * Override request handler registration to enforce server-side validation for `tools/call`.\n */\n public override setRequestHandler<M extends RequestMethod>(\n method: M,\n handler: (request: RequestTypeMap[M], ctx: ServerContext) => ResultTypeMap[M] | Promise<ResultTypeMap[M]>\n ): void {\n if (method === 'tools/call') {\n const wrappedHandler = async (request: RequestTypeMap[M], ctx: ServerContext): Promise<ServerResult> => {\n const validatedRequest = parseSchema(CallToolRequestSchema, request);\n if (!validatedRequest.success) {\n const errorMessage =\n validatedRequest.error instanceof Error ? validatedRequest.error.message : String(validatedRequest.error);\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid tools/call request: ${errorMessage}`);\n }\n\n const { params } = validatedRequest.data;\n\n const result = await Promise.resolve(handler(request, ctx));\n\n // When task creation is requested, validate and return CreateTaskResult\n if (params.task) {\n const taskValidationResult = parseSchema(CreateTaskResultSchema, result);\n if (!taskValidationResult.success) {\n const errorMessage =\n taskValidationResult.error instanceof Error\n ? taskValidationResult.error.message\n : String(taskValidationResult.error);\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid task creation result: ${errorMessage}`);\n }\n return taskValidationResult.data;\n }\n\n // For non-task requests, validate against CallToolResultSchema\n const validationResult = parseSchema(CallToolResultSchema, result);\n if (!validationResult.success) {\n const errorMessage =\n validationResult.error instanceof Error ? validationResult.error.message : String(validationResult.error);\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid tools/call result: ${errorMessage}`);\n }\n\n return validationResult.data;\n };\n\n // Install the wrapped handler\n return super.setRequestHandler(method, wrappedHandler);\n }\n\n // Other handlers use default behavior\n return super.setRequestHandler(method, handler);\n }\n\n protected assertCapabilityForMethod(method: RequestMethod): void {\n switch (method) {\n case 'sampling/createMessage': {\n if (!this._clientCapabilities?.sampling) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Client does not support sampling (required for ${method})`);\n }\n break;\n }\n\n case 'elicitation/create': {\n if (!this._clientCapabilities?.elicitation) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Client does not support elicitation (required for ${method})`);\n }\n break;\n }\n\n case 'roots/list': {\n if (!this._clientCapabilities?.roots) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Client does not support listing roots (required for ${method})`\n );\n }\n break;\n }\n\n case 'ping': {\n // No specific capability required for ping\n break;\n }\n }\n }\n\n protected assertNotificationCapability(method: NotificationMethod): void {\n switch (method) {\n case 'notifications/message': {\n if (!this._capabilities.logging) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support logging (required for ${method})`);\n }\n break;\n }\n\n case 'notifications/resources/updated':\n case 'notifications/resources/list_changed': {\n if (!this._capabilities.resources) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Server does not support notifying about resources (required for ${method})`\n );\n }\n break;\n }\n\n case 'notifications/tools/list_changed': {\n if (!this._capabilities.tools) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Server does not support notifying of tool list changes (required for ${method})`\n );\n }\n break;\n }\n\n case 'notifications/prompts/list_changed': {\n if (!this._capabilities.prompts) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Server does not support notifying of prompt list changes (required for ${method})`\n );\n }\n break;\n }\n\n case 'notifications/elicitation/complete': {\n if (!this._clientCapabilities?.elicitation?.url) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Client does not support URL elicitation (required for ${method})`\n );\n }\n break;\n }\n\n case 'notifications/cancelled': {\n // Cancellation notifications are always allowed\n break;\n }\n\n case 'notifications/progress': {\n // Progress notifications are always allowed\n break;\n }\n }\n }\n\n protected assertRequestHandlerCapability(method: string): void {\n switch (method) {\n case 'completion/complete': {\n if (!this._capabilities.completions) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support completions (required for ${method})`);\n }\n break;\n }\n\n case 'logging/setLevel': {\n if (!this._capabilities.logging) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support logging (required for ${method})`);\n }\n break;\n }\n\n case 'prompts/get':\n case 'prompts/list': {\n if (!this._capabilities.prompts) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support prompts (required for ${method})`);\n }\n break;\n }\n\n case 'resources/list':\n case 'resources/templates/list':\n case 'resources/read': {\n if (!this._capabilities.resources) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support resources (required for ${method})`);\n }\n break;\n }\n\n case 'tools/call':\n case 'tools/list': {\n if (!this._capabilities.tools) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support tools (required for ${method})`);\n }\n break;\n }\n\n case 'ping':\n case 'initialize': {\n // No specific capability required for these methods\n break;\n }\n }\n }\n\n protected assertTaskCapability(method: string): void {\n assertClientRequestTaskCapability(this._clientCapabilities?.tasks?.requests, method, 'Client');\n }\n\n protected assertTaskHandlerCapability(method: string): void {\n assertToolsCallTaskCapability(this._capabilities?.tasks?.requests, method, 'Server');\n }\n\n private async _oninitialize(request: InitializeRequest): Promise<InitializeResult> {\n const requestedVersion = request.params.protocolVersion;\n\n this._clientCapabilities = request.params.capabilities;\n this._clientVersion = request.params.clientInfo;\n\n const protocolVersion = this._supportedProtocolVersions.includes(requestedVersion)\n ? requestedVersion\n : (this._supportedProtocolVersions[0] ?? LATEST_PROTOCOL_VERSION);\n\n this.transport?.setProtocolVersion?.(protocolVersion);\n\n return {\n protocolVersion,\n capabilities: this.getCapabilities(),\n serverInfo: this._serverInfo,\n ...(this._instructions && { instructions: this._instructions })\n };\n }\n\n /**\n * After initialization has completed, this will be populated with the client's reported capabilities.\n */\n getClientCapabilities(): ClientCapabilities | undefined {\n return this._clientCapabilities;\n }\n\n /**\n * After initialization has completed, this will be populated with information about the client's name and version.\n */\n getClientVersion(): Implementation | undefined {\n return this._clientVersion;\n }\n\n /**\n * Returns the current server capabilities.\n */\n public getCapabilities(): ServerCapabilities {\n return this._capabilities;\n }\n\n async ping() {\n return this._requestWithSchema({ method: 'ping' }, EmptyResultSchema);\n }\n\n /**\n * Request LLM sampling from the client (without tools).\n * Returns single content block for backwards compatibility.\n */\n async createMessage(params: CreateMessageRequestParamsBase, options?: RequestOptions): Promise<CreateMessageResult>;\n\n /**\n * Request LLM sampling from the client with tool support.\n * Returns content that may be a single block or array (for parallel tool calls).\n */\n async createMessage(params: CreateMessageRequestParamsWithTools, options?: RequestOptions): Promise<CreateMessageResultWithTools>;\n\n /**\n * Request LLM sampling from the client.\n * When tools may or may not be present, returns the union type.\n */\n async createMessage(\n params: CreateMessageRequest['params'],\n options?: RequestOptions\n ): Promise<CreateMessageResult | CreateMessageResultWithTools>;\n\n // Implementation\n async createMessage(\n params: CreateMessageRequest['params'],\n options?: RequestOptions\n ): Promise<CreateMessageResult | CreateMessageResultWithTools> {\n // Capability check - only required when tools/toolChoice are provided\n if ((params.tools || params.toolChoice) && !this._clientCapabilities?.sampling?.tools) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support sampling tools capability.');\n }\n\n // Message structure validation - always validate tool_use/tool_result pairs.\n // These may appear even without tools/toolChoice in the current request when\n // a previous sampling request returned tool_use and this is a follow-up with results.\n if (params.messages.length > 0) {\n const lastMessage = params.messages.at(-1)!;\n const lastContent = Array.isArray(lastMessage.content) ? lastMessage.content : [lastMessage.content];\n const hasToolResults = lastContent.some(c => c.type === 'tool_result');\n\n const previousMessage = params.messages.length > 1 ? params.messages.at(-2) : undefined;\n const previousContent = previousMessage\n ? Array.isArray(previousMessage.content)\n ? previousMessage.content\n : [previousMessage.content]\n : [];\n const hasPreviousToolUse = previousContent.some(c => c.type === 'tool_use');\n\n if (hasToolResults) {\n if (lastContent.some(c => c.type !== 'tool_result')) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n 'The last message must contain only tool_result content if any is present'\n );\n }\n if (!hasPreviousToolUse) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n 'tool_result blocks are not matching any tool_use from the previous message'\n );\n }\n }\n if (hasPreviousToolUse) {\n const toolUseIds = new Set(previousContent.filter(c => c.type === 'tool_use').map(c => (c as ToolUseContent).id));\n const toolResultIds = new Set(\n lastContent.filter(c => c.type === 'tool_result').map(c => (c as ToolResultContent).toolUseId)\n );\n if (toolUseIds.size !== toolResultIds.size || ![...toolUseIds].every(id => toolResultIds.has(id))) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n 'ids of tool_result blocks and tool_use blocks from previous message do not match'\n );\n }\n }\n }\n\n // Use different schemas based on whether tools are provided\n if (params.tools) {\n return this._requestWithSchema({ method: 'sampling/createMessage', params }, CreateMessageResultWithToolsSchema, options);\n }\n return this._requestWithSchema({ method: 'sampling/createMessage', params }, CreateMessageResultSchema, options);\n }\n\n /**\n * Creates an elicitation request for the given parameters.\n * For backwards compatibility, `mode` may be omitted for form requests and will default to `\"form\"`.\n * @param params The parameters for the elicitation request.\n * @param options Optional request options.\n * @returns The result of the elicitation request.\n */\n async elicitInput(params: ElicitRequestFormParams | ElicitRequestURLParams, options?: RequestOptions): Promise<ElicitResult> {\n const mode = (params.mode ?? 'form') as 'form' | 'url';\n\n switch (mode) {\n case 'url': {\n if (!this._clientCapabilities?.elicitation?.url) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support url elicitation.');\n }\n\n const urlParams = params as ElicitRequestURLParams;\n return this._requestWithSchema({ method: 'elicitation/create', params: urlParams }, ElicitResultSchema, options);\n }\n case 'form': {\n if (!this._clientCapabilities?.elicitation?.form) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support form elicitation.');\n }\n\n const formParams: ElicitRequestFormParams =\n params.mode === 'form' ? (params as ElicitRequestFormParams) : { ...(params as ElicitRequestFormParams), mode: 'form' };\n\n const result = await this._requestWithSchema(\n { method: 'elicitation/create', params: formParams },\n ElicitResultSchema,\n options\n );\n\n if (result.action === 'accept' && result.content && formParams.requestedSchema) {\n try {\n const validator = this._jsonSchemaValidator.getValidator(formParams.requestedSchema as JsonSchemaType);\n const validationResult = validator(result.content);\n\n if (!validationResult.valid) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Elicitation response content does not match requested schema: ${validationResult.errorMessage}`\n );\n }\n } catch (error) {\n if (error instanceof ProtocolError) {\n throw error;\n }\n throw new ProtocolError(\n ProtocolErrorCode.InternalError,\n `Error validating elicitation response: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n return result;\n }\n }\n }\n\n /**\n * Creates a reusable callback that, when invoked, will send a `notifications/elicitation/complete`\n * notification for the specified elicitation ID.\n *\n * @param elicitationId The ID of the elicitation to mark as complete.\n * @param options Optional notification options. Useful when the completion notification should be related to a prior request.\n * @returns A function that emits the completion notification when awaited.\n */\n createElicitationCompletionNotifier(elicitationId: string, options?: NotificationOptions): () => Promise<void> {\n if (!this._clientCapabilities?.elicitation?.url) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n 'Client does not support URL elicitation (required for notifications/elicitation/complete)'\n );\n }\n\n return () =>\n this.notification(\n {\n method: 'notifications/elicitation/complete',\n params: {\n elicitationId\n }\n },\n options\n );\n }\n\n async listRoots(params?: ListRootsRequest['params'], options?: RequestOptions) {\n return this._requestWithSchema({ method: 'roots/list', params }, ListRootsResultSchema, options);\n }\n\n /**\n * Sends a logging message to the client, if connected.\n * Note: You only need to send the parameters object, not the entire JSON-RPC message.\n * @see {@linkcode LoggingMessageNotification}\n * @param params\n * @param sessionId Optional for stateless transports and backward compatibility.\n */\n async sendLoggingMessage(params: LoggingMessageNotification['params'], sessionId?: string) {\n if (this._capabilities.logging && !this.isMessageIgnored(params.level, sessionId)) {\n return this.notification({ method: 'notifications/message', params });\n }\n }\n\n async sendResourceUpdated(params: ResourceUpdatedNotification['params']) {\n return this.notification({\n method: 'notifications/resources/updated',\n params\n });\n }\n\n async sendResourceListChanged() {\n return this.notification({\n method: 'notifications/resources/list_changed'\n });\n }\n\n async sendToolListChanged() {\n return this.notification({ method: 'notifications/tools/list_changed' });\n }\n\n async sendPromptListChanged() {\n return this.notification({ method: 'notifications/prompts/list_changed' });\n }\n}\n","import type {\n BaseMetadata,\n CallToolRequest,\n CallToolResult,\n CompleteRequestPrompt,\n CompleteRequestResourceTemplate,\n CompleteResult,\n CreateTaskResult,\n CreateTaskServerContext,\n GetPromptResult,\n Implementation,\n ListPromptsResult,\n ListResourcesResult,\n ListToolsResult,\n LoggingMessageNotification,\n Prompt,\n PromptReference,\n ReadResourceResult,\n Resource,\n ResourceTemplateReference,\n Result,\n ServerContext,\n StandardSchemaWithJSON,\n Tool,\n ToolAnnotations,\n ToolExecution,\n Transport,\n Variables\n} from '@modelcontextprotocol/core';\nimport {\n assertCompleteRequestPrompt,\n assertCompleteRequestResourceTemplate,\n promptArgumentsFromStandardSchema,\n ProtocolError,\n ProtocolErrorCode,\n standardSchemaToJsonSchema,\n UriTemplate,\n validateAndWarnToolName,\n validateStandardSchema\n} from '@modelcontextprotocol/core';\n\nimport type { ToolTaskHandler } from '../experimental/tasks/interfaces.js';\nimport { ExperimentalMcpServerTasks } from '../experimental/tasks/mcpServer.js';\nimport { getCompleter, isCompletable } from './completable.js';\nimport type { ServerOptions } from './server.js';\nimport { Server } from './server.js';\n\n/**\n * High-level MCP server that provides a simpler API for working with resources, tools, and prompts.\n * For advanced usage (like sending notifications or setting custom request handlers), use the underlying\n * {@linkcode Server} instance available via the {@linkcode McpServer.server | server} property.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_basicUsage\"\n * const server = new McpServer({\n * name: 'my-server',\n * version: '1.0.0'\n * });\n * ```\n */\nexport class McpServer {\n /**\n * The underlying {@linkcode Server} instance, useful for advanced operations like sending notifications.\n */\n public readonly server: Server;\n\n private _registeredResources: { [uri: string]: RegisteredResource } = {};\n private _registeredResourceTemplates: {\n [name: string]: RegisteredResourceTemplate;\n } = {};\n private _registeredTools: { [name: string]: RegisteredTool } = {};\n private _registeredPrompts: { [name: string]: RegisteredPrompt } = {};\n private _experimental?: { tasks: ExperimentalMcpServerTasks };\n\n constructor(serverInfo: Implementation, options?: ServerOptions) {\n this.server = new Server(serverInfo, options);\n }\n\n /**\n * Access experimental features.\n *\n * WARNING: These APIs are experimental and may change without notice.\n *\n * @experimental\n */\n get experimental(): { tasks: ExperimentalMcpServerTasks } {\n if (!this._experimental) {\n this._experimental = {\n tasks: new ExperimentalMcpServerTasks(this)\n };\n }\n return this._experimental;\n }\n\n /**\n * Attaches to the given transport, starts it, and starts listening for messages.\n *\n * The `server` object assumes ownership of the {@linkcode Transport}, replacing any callbacks that have already been set, and expects that it is the only user of the {@linkcode Transport} instance going forward.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_connect_stdio\"\n * const server = new McpServer({ name: 'my-server', version: '1.0.0' });\n * const transport = new StdioServerTransport();\n * await server.connect(transport);\n * ```\n */\n async connect(transport: Transport): Promise<void> {\n return await this.server.connect(transport);\n }\n\n /**\n * Closes the connection.\n */\n async close(): Promise<void> {\n await this.server.close();\n }\n\n private _toolHandlersInitialized = false;\n\n private setToolRequestHandlers() {\n if (this._toolHandlersInitialized) {\n return;\n }\n\n this.server.assertCanSetRequestHandler('tools/list');\n this.server.assertCanSetRequestHandler('tools/call');\n\n this.server.registerCapabilities({\n tools: {\n listChanged: this.server.getCapabilities().tools?.listChanged ?? true\n }\n });\n\n this.server.setRequestHandler(\n 'tools/list',\n (): ListToolsResult => ({\n tools: Object.entries(this._registeredTools)\n .filter(([, tool]) => tool.enabled)\n .map(([name, tool]): Tool => {\n const toolDefinition: Tool = {\n name,\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema\n ? (standardSchemaToJsonSchema(tool.inputSchema, 'input') as Tool['inputSchema'])\n : EMPTY_OBJECT_JSON_SCHEMA,\n annotations: tool.annotations,\n execution: tool.execution,\n _meta: tool._meta\n };\n\n if (tool.outputSchema) {\n toolDefinition.outputSchema = standardSchemaToJsonSchema(tool.outputSchema, 'output') as Tool['outputSchema'];\n }\n\n return toolDefinition;\n })\n })\n );\n\n this.server.setRequestHandler('tools/call', async (request, ctx): Promise<CallToolResult | CreateTaskResult> => {\n const tool = this._registeredTools[request.params.name];\n if (!tool) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Tool ${request.params.name} not found`);\n }\n if (!tool.enabled) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Tool ${request.params.name} disabled`);\n }\n\n try {\n const isTaskRequest = !!request.params.task;\n const taskSupport = tool.execution?.taskSupport;\n const isTaskHandler = 'createTask' in (tool.handler as AnyToolHandler<StandardSchemaWithJSON>);\n\n // Validate task hint configuration\n if ((taskSupport === 'required' || taskSupport === 'optional') && !isTaskHandler) {\n throw new ProtocolError(\n ProtocolErrorCode.InternalError,\n `Tool ${request.params.name} has taskSupport '${taskSupport}' but was not registered with registerToolTask`\n );\n }\n\n // Handle taskSupport 'required' without task augmentation\n if (taskSupport === 'required' && !isTaskRequest) {\n throw new ProtocolError(\n ProtocolErrorCode.MethodNotFound,\n `Tool ${request.params.name} requires task augmentation (taskSupport: 'required')`\n );\n }\n\n // Handle taskSupport 'optional' without task augmentation - automatic polling\n if (taskSupport === 'optional' && !isTaskRequest && isTaskHandler) {\n return await this.handleAutomaticTaskPolling(tool, request, ctx);\n }\n\n // Normal execution path\n const args = await this.validateToolInput(tool, request.params.arguments, request.params.name);\n const result = await this.executeToolHandler(tool, args, ctx);\n\n // Return CreateTaskResult immediately for task requests\n if (isTaskRequest) {\n return result;\n }\n\n // Validate output schema for non-task requests\n await this.validateToolOutput(tool, result, request.params.name);\n return result;\n } catch (error) {\n if (error instanceof ProtocolError && error.code === ProtocolErrorCode.UrlElicitationRequired) {\n throw error; // Return the error to the caller without wrapping in CallToolResult\n }\n return this.createToolError(error instanceof Error ? error.message : String(error));\n }\n });\n\n this._toolHandlersInitialized = true;\n }\n\n /**\n * Creates a tool error result.\n *\n * @param errorMessage - The error message.\n * @returns The tool error result.\n */\n private createToolError(errorMessage: string): CallToolResult {\n return {\n content: [\n {\n type: 'text',\n text: errorMessage\n }\n ],\n isError: true\n };\n }\n\n /**\n * Validates tool input arguments against the tool's input schema.\n */\n private async validateToolInput<\n ToolType extends RegisteredTool,\n Args extends ToolType['inputSchema'] extends infer InputSchema\n ? InputSchema extends StandardSchemaWithJSON\n ? StandardSchemaWithJSON.InferOutput<InputSchema>\n : undefined\n : undefined\n >(tool: ToolType, args: Args, toolName: string): Promise<Args> {\n if (!tool.inputSchema) {\n return undefined as Args;\n }\n\n const parseResult = await validateStandardSchema(tool.inputSchema, args ?? {});\n if (!parseResult.success) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Input validation error: Invalid arguments for tool ${toolName}: ${parseResult.error}`\n );\n }\n\n return parseResult.data as unknown as Args;\n }\n\n /**\n * Validates tool output against the tool's output schema.\n */\n private async validateToolOutput(tool: RegisteredTool, result: CallToolResult | CreateTaskResult, toolName: string): Promise<void> {\n if (!tool.outputSchema) {\n return;\n }\n\n // Only validate CallToolResult, not CreateTaskResult\n if (!('content' in result)) {\n return;\n }\n\n if (result.isError) {\n return;\n }\n\n if (!result.structuredContent) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Output validation error: Tool ${toolName} has an output schema but no structured content was provided`\n );\n }\n\n // if the tool has an output schema, validate structured content\n const parseResult = await validateStandardSchema(tool.outputSchema, result.structuredContent);\n if (!parseResult.success) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Output validation error: Invalid structured content for tool ${toolName}: ${parseResult.error}`\n );\n }\n }\n\n /**\n * Executes a tool handler (either regular or task-based).\n */\n private async executeToolHandler(tool: RegisteredTool, args: unknown, ctx: ServerContext): Promise<CallToolResult | CreateTaskResult> {\n // Executor encapsulates handler invocation with proper types\n return tool.executor(args, ctx);\n }\n\n /**\n * Handles automatic task polling for tools with `taskSupport` `'optional'`.\n */\n private async handleAutomaticTaskPolling<RequestT extends CallToolRequest>(\n tool: RegisteredTool,\n request: RequestT,\n ctx: ServerContext\n ): Promise<CallToolResult> {\n if (!ctx.task?.store) {\n throw new Error('No task store provided for task-capable tool.');\n }\n\n // Validate input and create task using the executor\n const args = await this.validateToolInput(tool, request.params.arguments, request.params.name);\n const createTaskResult = (await tool.executor(args, ctx)) as CreateTaskResult;\n\n // Poll until completion\n const taskId = createTaskResult.task.taskId;\n let task = createTaskResult.task;\n const pollInterval = task.pollInterval ?? 5000;\n\n while (task.status !== 'completed' && task.status !== 'failed' && task.status !== 'cancelled') {\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n const updatedTask = await ctx.task.store.getTask(taskId);\n if (!updatedTask) {\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Task ${taskId} not found during polling`);\n }\n task = updatedTask;\n }\n\n // Return the final result\n return (await ctx.task.store.getTaskResult(taskId)) as CallToolResult;\n }\n\n private _completionHandlerInitialized = false;\n\n private setCompletionRequestHandler() {\n if (this._completionHandlerInitialized) {\n return;\n }\n\n this.server.assertCanSetRequestHandler('completion/complete');\n\n this.server.registerCapabilities({\n completions: {}\n });\n\n this.server.setRequestHandler('completion/complete', async (request): Promise<CompleteResult> => {\n switch (request.params.ref.type) {\n case 'ref/prompt': {\n assertCompleteRequestPrompt(request);\n return this.handlePromptCompletion(request, request.params.ref);\n }\n\n case 'ref/resource': {\n assertCompleteRequestResourceTemplate(request);\n return this.handleResourceCompletion(request, request.params.ref);\n }\n\n default: {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid completion reference: ${request.params.ref}`);\n }\n }\n });\n\n this._completionHandlerInitialized = true;\n }\n\n private async handlePromptCompletion(request: CompleteRequestPrompt, ref: PromptReference): Promise<CompleteResult> {\n const prompt = this._registeredPrompts[ref.name];\n if (!prompt) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Prompt ${ref.name} not found`);\n }\n\n if (!prompt.enabled) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Prompt ${ref.name} disabled`);\n }\n\n if (!prompt.argsSchema) {\n return EMPTY_COMPLETION_RESULT;\n }\n\n const promptShape = getSchemaShape(prompt.argsSchema);\n const field = unwrapOptionalSchema(promptShape?.[request.params.argument.name]);\n if (!isCompletable(field)) {\n return EMPTY_COMPLETION_RESULT;\n }\n\n const completer = getCompleter(field);\n if (!completer) {\n return EMPTY_COMPLETION_RESULT;\n }\n\n const suggestions = await completer(request.params.argument.value, request.params.context);\n return createCompletionResult(suggestions);\n }\n\n private async handleResourceCompletion(\n request: CompleteRequestResourceTemplate,\n ref: ResourceTemplateReference\n ): Promise<CompleteResult> {\n const template = Object.values(this._registeredResourceTemplates).find(t => t.resourceTemplate.uriTemplate.toString() === ref.uri);\n\n if (!template) {\n if (this._registeredResources[ref.uri]) {\n // Attempting to autocomplete a fixed resource URI is not an error in the spec (but probably should be).\n return EMPTY_COMPLETION_RESULT;\n }\n\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Resource template ${request.params.ref.uri} not found`);\n }\n\n const completer = template.resourceTemplate.completeCallback(request.params.argument.name);\n if (!completer) {\n return EMPTY_COMPLETION_RESULT;\n }\n\n const suggestions = await completer(request.params.argument.value, request.params.context);\n return createCompletionResult(suggestions);\n }\n\n private _resourceHandlersInitialized = false;\n\n private setResourceRequestHandlers() {\n if (this._resourceHandlersInitialized) {\n return;\n }\n\n this.server.assertCanSetRequestHandler('resources/list');\n this.server.assertCanSetRequestHandler('resources/templates/list');\n this.server.assertCanSetRequestHandler('resources/read');\n\n this.server.registerCapabilities({\n resources: {\n listChanged: this.server.getCapabilities().resources?.listChanged ?? true\n }\n });\n\n this.server.setRequestHandler('resources/list', async (_request, ctx) => {\n const resources = Object.entries(this._registeredResources)\n .filter(([_, resource]) => resource.enabled)\n .map(([uri, resource]) => ({\n uri,\n name: resource.name,\n ...resource.metadata\n }));\n\n const templateResources: Resource[] = [];\n for (const template of Object.values(this._registeredResourceTemplates)) {\n if (!template.resourceTemplate.listCallback) {\n continue;\n }\n\n const result = await template.resourceTemplate.listCallback(ctx);\n for (const resource of result.resources) {\n templateResources.push({\n ...template.metadata,\n // the defined resource metadata should override the template metadata if present\n ...resource\n });\n }\n }\n\n return { resources: [...resources, ...templateResources] };\n });\n\n this.server.setRequestHandler('resources/templates/list', async () => {\n const resourceTemplates = Object.entries(this._registeredResourceTemplates).map(([name, template]) => ({\n name,\n uriTemplate: template.resourceTemplate.uriTemplate.toString(),\n ...template.metadata\n }));\n\n return { resourceTemplates };\n });\n\n this.server.setRequestHandler('resources/read', async (request, ctx) => {\n const uri = new URL(request.params.uri);\n\n // First check for exact resource match\n const resource = this._registeredResources[uri.toString()];\n if (resource) {\n if (!resource.enabled) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Resource ${uri} disabled`);\n }\n return resource.readCallback(uri, ctx);\n }\n\n // Then check templates\n for (const template of Object.values(this._registeredResourceTemplates)) {\n const variables = template.resourceTemplate.uriTemplate.match(uri.toString());\n if (variables) {\n return template.readCallback(uri, variables, ctx);\n }\n }\n\n throw new ProtocolError(ProtocolErrorCode.ResourceNotFound, `Resource ${uri} not found`);\n });\n\n this._resourceHandlersInitialized = true;\n }\n\n private _promptHandlersInitialized = false;\n\n private setPromptRequestHandlers() {\n if (this._promptHandlersInitialized) {\n return;\n }\n\n this.server.assertCanSetRequestHandler('prompts/list');\n this.server.assertCanSetRequestHandler('prompts/get');\n\n this.server.registerCapabilities({\n prompts: {\n listChanged: this.server.getCapabilities().prompts?.listChanged ?? true\n }\n });\n\n this.server.setRequestHandler(\n 'prompts/list',\n (): ListPromptsResult => ({\n prompts: Object.entries(this._registeredPrompts)\n .filter(([, prompt]) => prompt.enabled)\n .map(([name, prompt]): Prompt => {\n return {\n name,\n title: prompt.title,\n description: prompt.description,\n arguments: prompt.argsSchema ? promptArgumentsFromStandardSchema(prompt.argsSchema) : undefined,\n _meta: prompt._meta\n };\n })\n })\n );\n\n this.server.setRequestHandler('prompts/get', async (request, ctx): Promise<GetPromptResult> => {\n const prompt = this._registeredPrompts[request.params.name];\n if (!prompt) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Prompt ${request.params.name} not found`);\n }\n\n if (!prompt.enabled) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Prompt ${request.params.name} disabled`);\n }\n\n // Handler encapsulates parsing and callback invocation with proper types\n return prompt.handler(request.params.arguments, ctx);\n });\n\n this._promptHandlersInitialized = true;\n }\n\n /**\n * Registers a resource with a config object and callback.\n * For static resources, use a URI string. For dynamic resources, use a {@linkcode ResourceTemplate}.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_registerResource_static\"\n * server.registerResource(\n * 'config',\n * 'config://app',\n * {\n * title: 'Application Config',\n * mimeType: 'text/plain'\n * },\n * async uri => ({\n * contents: [{ uri: uri.href, text: 'App configuration here' }]\n * })\n * );\n * ```\n */\n registerResource(name: string, uriOrTemplate: string, config: ResourceMetadata, readCallback: ReadResourceCallback): RegisteredResource;\n registerResource(\n name: string,\n uriOrTemplate: ResourceTemplate,\n config: ResourceMetadata,\n readCallback: ReadResourceTemplateCallback\n ): RegisteredResourceTemplate;\n registerResource(\n name: string,\n uriOrTemplate: string | ResourceTemplate,\n config: ResourceMetadata,\n readCallback: ReadResourceCallback | ReadResourceTemplateCallback\n ): RegisteredResource | RegisteredResourceTemplate {\n if (typeof uriOrTemplate === 'string') {\n if (this._registeredResources[uriOrTemplate]) {\n throw new Error(`Resource ${uriOrTemplate} is already registered`);\n }\n\n const registeredResource = this._createRegisteredResource(\n name,\n (config as BaseMetadata).title,\n uriOrTemplate,\n config,\n readCallback as ReadResourceCallback\n );\n\n this.setResourceRequestHandlers();\n this.sendResourceListChanged();\n return registeredResource;\n } else {\n if (this._registeredResourceTemplates[name]) {\n throw new Error(`Resource template ${name} is already registered`);\n }\n\n const registeredResourceTemplate = this._createRegisteredResourceTemplate(\n name,\n (config as BaseMetadata).title,\n uriOrTemplate,\n config,\n readCallback as ReadResourceTemplateCallback\n );\n\n this.setResourceRequestHandlers();\n this.sendResourceListChanged();\n return registeredResourceTemplate;\n }\n }\n\n private _createRegisteredResource(\n name: string,\n title: string | undefined,\n uri: string,\n metadata: ResourceMetadata | undefined,\n readCallback: ReadResourceCallback\n ): RegisteredResource {\n const registeredResource: RegisteredResource = {\n name,\n title,\n metadata,\n readCallback,\n enabled: true,\n disable: () => registeredResource.update({ enabled: false }),\n enable: () => registeredResource.update({ enabled: true }),\n remove: () => registeredResource.update({ uri: null }),\n update: updates => {\n if (updates.uri !== undefined && updates.uri !== uri) {\n delete this._registeredResources[uri];\n if (updates.uri) this._registeredResources[updates.uri] = registeredResource;\n }\n if (updates.name !== undefined) registeredResource.name = updates.name;\n if (updates.title !== undefined) registeredResource.title = updates.title;\n if (updates.metadata !== undefined) registeredResource.metadata = updates.metadata;\n if (updates.callback !== undefined) registeredResource.readCallback = updates.callback;\n if (updates.enabled !== undefined) registeredResource.enabled = updates.enabled;\n this.sendResourceListChanged();\n }\n };\n this._registeredResources[uri] = registeredResource;\n return registeredResource;\n }\n\n private _createRegisteredResourceTemplate(\n name: string,\n title: string | undefined,\n template: ResourceTemplate,\n metadata: ResourceMetadata | undefined,\n readCallback: ReadResourceTemplateCallback\n ): RegisteredResourceTemplate {\n const registeredResourceTemplate: RegisteredResourceTemplate = {\n resourceTemplate: template,\n title,\n metadata,\n readCallback,\n enabled: true,\n disable: () => registeredResourceTemplate.update({ enabled: false }),\n enable: () => registeredResourceTemplate.update({ enabled: true }),\n remove: () => registeredResourceTemplate.update({ name: null }),\n update: updates => {\n if (updates.name !== undefined && updates.name !== name) {\n delete this._registeredResourceTemplates[name];\n if (updates.name) this._registeredResourceTemplates[updates.name] = registeredResourceTemplate;\n }\n if (updates.title !== undefined) registeredResourceTemplate.title = updates.title;\n if (updates.template !== undefined) registeredResourceTemplate.resourceTemplate = updates.template;\n if (updates.metadata !== undefined) registeredResourceTemplate.metadata = updates.metadata;\n if (updates.callback !== undefined) registeredResourceTemplate.readCallback = updates.callback;\n if (updates.enabled !== undefined) registeredResourceTemplate.enabled = updates.enabled;\n this.sendResourceListChanged();\n }\n };\n this._registeredResourceTemplates[name] = registeredResourceTemplate;\n\n // If the resource template has any completion callbacks, enable completions capability\n const variableNames = template.uriTemplate.variableNames;\n const hasCompleter = Array.isArray(variableNames) && variableNames.some(v => !!template.completeCallback(v));\n if (hasCompleter) {\n this.setCompletionRequestHandler();\n }\n\n return registeredResourceTemplate;\n }\n\n private _createRegisteredPrompt(\n name: string,\n title: string | undefined,\n description: string | undefined,\n argsSchema: StandardSchemaWithJSON | undefined,\n callback: PromptCallback<StandardSchemaWithJSON | undefined>,\n _meta: Record<string, unknown> | undefined\n ): RegisteredPrompt {\n // Track current schema and callback for handler regeneration\n let currentArgsSchema = argsSchema;\n let currentCallback = callback;\n\n const registeredPrompt: RegisteredPrompt = {\n title,\n description,\n argsSchema,\n _meta,\n handler: createPromptHandler(name, argsSchema, callback),\n enabled: true,\n disable: () => registeredPrompt.update({ enabled: false }),\n enable: () => registeredPrompt.update({ enabled: true }),\n remove: () => registeredPrompt.update({ name: null }),\n update: updates => {\n if (updates.name !== undefined && updates.name !== name) {\n delete this._registeredPrompts[name];\n if (updates.name) this._registeredPrompts[updates.name] = registeredPrompt;\n }\n if (updates.title !== undefined) registeredPrompt.title = updates.title;\n if (updates.description !== undefined) registeredPrompt.description = updates.description;\n if (updates._meta !== undefined) registeredPrompt._meta = updates._meta;\n\n // Track if we need to regenerate the handler\n let needsHandlerRegen = false;\n if (updates.argsSchema !== undefined) {\n registeredPrompt.argsSchema = updates.argsSchema;\n currentArgsSchema = updates.argsSchema;\n needsHandlerRegen = true;\n }\n if (updates.callback !== undefined) {\n currentCallback = updates.callback as PromptCallback<StandardSchemaWithJSON | undefined>;\n needsHandlerRegen = true;\n }\n if (needsHandlerRegen) {\n registeredPrompt.handler = createPromptHandler(name, currentArgsSchema, currentCallback);\n }\n\n if (updates.enabled !== undefined) registeredPrompt.enabled = updates.enabled;\n this.sendPromptListChanged();\n }\n };\n this._registeredPrompts[name] = registeredPrompt;\n\n // If any argument uses a Completable schema, enable completions capability\n if (argsSchema) {\n const shape = getSchemaShape(argsSchema);\n if (shape) {\n const hasCompletable = Object.values(shape).some(field => {\n const inner = unwrapOptionalSchema(field);\n return isCompletable(inner);\n });\n if (hasCompletable) {\n this.setCompletionRequestHandler();\n }\n }\n }\n\n return registeredPrompt;\n }\n\n private _createRegisteredTool(\n name: string,\n title: string | undefined,\n description: string | undefined,\n inputSchema: StandardSchemaWithJSON | undefined,\n outputSchema: StandardSchemaWithJSON | undefined,\n annotations: ToolAnnotations | undefined,\n execution: ToolExecution | undefined,\n _meta: Record<string, unknown> | undefined,\n handler: AnyToolHandler<StandardSchemaWithJSON | undefined>\n ): RegisteredTool {\n // Validate tool name according to SEP specification\n validateAndWarnToolName(name);\n\n // Track current handler for executor regeneration\n let currentHandler = handler;\n\n const registeredTool: RegisteredTool = {\n title,\n description,\n inputSchema,\n outputSchema,\n annotations,\n execution,\n _meta,\n handler: handler,\n executor: createToolExecutor(inputSchema, handler),\n enabled: true,\n disable: () => registeredTool.update({ enabled: false }),\n enable: () => registeredTool.update({ enabled: true }),\n remove: () => registeredTool.update({ name: null }),\n update: updates => {\n if (updates.name !== undefined && updates.name !== name) {\n if (typeof updates.name === 'string') {\n validateAndWarnToolName(updates.name);\n }\n delete this._registeredTools[name];\n if (updates.name) this._registeredTools[updates.name] = registeredTool;\n }\n if (updates.title !== undefined) registeredTool.title = updates.title;\n if (updates.description !== undefined) registeredTool.description = updates.description;\n\n // Track if we need to regenerate the executor\n let needsExecutorRegen = false;\n if (updates.paramsSchema !== undefined) {\n registeredTool.inputSchema = updates.paramsSchema;\n needsExecutorRegen = true;\n }\n if (updates.callback !== undefined) {\n registeredTool.handler = updates.callback;\n currentHandler = updates.callback as AnyToolHandler<StandardSchemaWithJSON | undefined>;\n needsExecutorRegen = true;\n }\n if (needsExecutorRegen) {\n registeredTool.executor = createToolExecutor(registeredTool.inputSchema, currentHandler);\n }\n\n if (updates.outputSchema !== undefined) registeredTool.outputSchema = updates.outputSchema;\n if (updates.annotations !== undefined) registeredTool.annotations = updates.annotations;\n if (updates._meta !== undefined) registeredTool._meta = updates._meta;\n if (updates.enabled !== undefined) registeredTool.enabled = updates.enabled;\n this.sendToolListChanged();\n }\n };\n this._registeredTools[name] = registeredTool;\n\n this.setToolRequestHandlers();\n this.sendToolListChanged();\n\n return registeredTool;\n }\n\n /**\n * Registers a tool with a config object and callback.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_registerTool_basic\"\n * server.registerTool(\n * 'calculate-bmi',\n * {\n * title: 'BMI Calculator',\n * description: 'Calculate Body Mass Index',\n * inputSchema: z.object({\n * weightKg: z.number(),\n * heightM: z.number()\n * }),\n * outputSchema: z.object({ bmi: z.number() })\n * },\n * async ({ weightKg, heightM }) => {\n * const output = { bmi: weightKg / (heightM * heightM) };\n * return {\n * content: [{ type: 'text', text: JSON.stringify(output) }],\n * structuredContent: output\n * };\n * }\n * );\n * ```\n */\n registerTool<OutputArgs extends StandardSchemaWithJSON, InputArgs extends StandardSchemaWithJSON | undefined = undefined>(\n name: string,\n config: {\n title?: string;\n description?: string;\n inputSchema?: InputArgs;\n outputSchema?: OutputArgs;\n annotations?: ToolAnnotations;\n _meta?: Record<string, unknown>;\n },\n cb: ToolCallback<InputArgs>\n ): RegisteredTool {\n if (this._registeredTools[name]) {\n throw new Error(`Tool ${name} is already registered`);\n }\n\n const { title, description, inputSchema, outputSchema, annotations, _meta } = config;\n\n return this._createRegisteredTool(\n name,\n title,\n description,\n inputSchema,\n outputSchema,\n annotations,\n { taskSupport: 'forbidden' },\n _meta,\n cb as ToolCallback<StandardSchemaWithJSON | undefined>\n );\n }\n\n /**\n * Registers a prompt with a config object and callback.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_registerPrompt_basic\"\n * server.registerPrompt(\n * 'review-code',\n * {\n * title: 'Code Review',\n * description: 'Review code for best practices',\n * argsSchema: z.object({ code: z.string() })\n * },\n * ({ code }) => ({\n * messages: [\n * {\n * role: 'user' as const,\n * content: {\n * type: 'text' as const,\n * text: `Please review this code:\\n\\n${code}`\n * }\n * }\n * ]\n * })\n * );\n * ```\n */\n registerPrompt<Args extends StandardSchemaWithJSON>(\n name: string,\n config: {\n title?: string;\n description?: string;\n argsSchema?: Args;\n _meta?: Record<string, unknown>;\n },\n cb: PromptCallback<Args>\n ): RegisteredPrompt {\n if (this._registeredPrompts[name]) {\n throw new Error(`Prompt ${name} is already registered`);\n }\n\n const { title, description, argsSchema, _meta } = config;\n\n const registeredPrompt = this._createRegisteredPrompt(\n name,\n title,\n description,\n argsSchema,\n cb as PromptCallback<StandardSchemaWithJSON | undefined>,\n _meta\n );\n\n this.setPromptRequestHandlers();\n this.sendPromptListChanged();\n\n return registeredPrompt;\n }\n\n /**\n * Checks if the server is connected to a transport.\n * @returns `true` if the server is connected\n */\n isConnected() {\n return this.server.transport !== undefined;\n }\n\n /**\n * Sends a logging message to the client, if connected.\n * Note: You only need to send the parameters object, not the entire JSON-RPC message.\n * @see {@linkcode LoggingMessageNotification}\n * @param params\n * @param sessionId Optional for stateless transports and backward compatibility.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_sendLoggingMessage_basic\"\n * await server.sendLoggingMessage({\n * level: 'info',\n * data: 'Processing complete'\n * });\n * ```\n */\n async sendLoggingMessage(params: LoggingMessageNotification['params'], sessionId?: string) {\n return this.server.sendLoggingMessage(params, sessionId);\n }\n /**\n * Sends a resource list changed event to the client, if connected.\n */\n sendResourceListChanged() {\n if (this.isConnected()) {\n this.server.sendResourceListChanged();\n }\n }\n\n /**\n * Sends a tool list changed event to the client, if connected.\n */\n sendToolListChanged() {\n if (this.isConnected()) {\n this.server.sendToolListChanged();\n }\n }\n\n /**\n * Sends a prompt list changed event to the client, if connected.\n */\n sendPromptListChanged() {\n if (this.isConnected()) {\n this.server.sendPromptListChanged();\n }\n }\n}\n\n/**\n * A callback to complete one variable within a resource template's URI template.\n */\nexport type CompleteResourceTemplateCallback = (\n value: string,\n context?: {\n arguments?: Record<string, string>;\n }\n) => string[] | Promise<string[]>;\n\n/**\n * A resource template combines a URI pattern with optional functionality to enumerate\n * all resources matching that pattern.\n */\nexport class ResourceTemplate {\n private _uriTemplate: UriTemplate;\n\n constructor(\n uriTemplate: string | UriTemplate,\n private _callbacks: {\n /**\n * A callback to list all resources matching this template. This is required to be specified, even if `undefined`, to avoid accidentally forgetting resource listing.\n */\n list: ListResourcesCallback | undefined;\n\n /**\n * An optional callback to autocomplete variables within the URI template. Useful for clients and users to discover possible values.\n */\n complete?: {\n [variable: string]: CompleteResourceTemplateCallback;\n };\n }\n ) {\n this._uriTemplate = typeof uriTemplate === 'string' ? new UriTemplate(uriTemplate) : uriTemplate;\n }\n\n /**\n * Gets the URI template pattern.\n */\n get uriTemplate(): UriTemplate {\n return this._uriTemplate;\n }\n\n /**\n * Gets the list callback, if one was provided.\n */\n get listCallback(): ListResourcesCallback | undefined {\n return this._callbacks.list;\n }\n\n /**\n * Gets the callback for completing a specific URI template variable, if one was provided.\n */\n completeCallback(variable: string): CompleteResourceTemplateCallback | undefined {\n return this._callbacks.complete?.[variable];\n }\n}\n\nexport type BaseToolCallback<\n SendResultT extends Result,\n Ctx extends ServerContext,\n Args extends StandardSchemaWithJSON | undefined\n> = Args extends StandardSchemaWithJSON\n ? (args: StandardSchemaWithJSON.InferOutput<Args>, ctx: Ctx) => SendResultT | Promise<SendResultT>\n : (ctx: Ctx) => SendResultT | Promise<SendResultT>;\n\n/**\n * Callback for a tool handler registered with {@linkcode McpServer.registerTool}.\n */\nexport type ToolCallback<Args extends StandardSchemaWithJSON | undefined = undefined> = BaseToolCallback<\n CallToolResult,\n ServerContext,\n Args\n>;\n\n/**\n * Supertype that can handle both regular tools (simple callback) and task-based tools (task handler object).\n */\nexport type AnyToolHandler<Args extends StandardSchemaWithJSON | undefined = undefined> = ToolCallback<Args> | ToolTaskHandler<Args>;\n\n/**\n * Internal executor type that encapsulates handler invocation with proper types.\n */\ntype ToolExecutor = (args: unknown, ctx: ServerContext) => Promise<CallToolResult | CreateTaskResult>;\n\nexport type RegisteredTool = {\n title?: string;\n description?: string;\n inputSchema?: StandardSchemaWithJSON;\n outputSchema?: StandardSchemaWithJSON;\n annotations?: ToolAnnotations;\n execution?: ToolExecution;\n _meta?: Record<string, unknown>;\n handler: AnyToolHandler<StandardSchemaWithJSON | undefined>;\n /** @hidden */\n executor: ToolExecutor;\n enabled: boolean;\n enable(): void;\n disable(): void;\n update(updates: {\n name?: string | null;\n title?: string;\n description?: string;\n paramsSchema?: StandardSchemaWithJSON;\n outputSchema?: StandardSchemaWithJSON;\n annotations?: ToolAnnotations;\n _meta?: Record<string, unknown>;\n callback?: ToolCallback<StandardSchemaWithJSON>;\n enabled?: boolean;\n }): void;\n remove(): void;\n};\n\n/**\n * Creates an executor that invokes the handler with the appropriate arguments.\n * When `inputSchema` is defined, the handler is called with `(args, ctx)`.\n * When `inputSchema` is undefined, the handler is called with just `(ctx)`.\n */\nfunction createToolExecutor(\n inputSchema: StandardSchemaWithJSON | undefined,\n handler: AnyToolHandler<StandardSchemaWithJSON | undefined>\n): ToolExecutor {\n const isTaskHandler = 'createTask' in handler;\n\n if (isTaskHandler) {\n const taskHandler = handler as TaskHandlerInternal;\n return async (args, ctx) => {\n if (!ctx.task?.store) {\n throw new Error('No task store provided.');\n }\n const taskCtx: CreateTaskServerContext = { ...ctx, task: { store: ctx.task.store, requestedTtl: ctx.task?.requestedTtl } };\n if (inputSchema) {\n return taskHandler.createTask(args, taskCtx);\n }\n // When no inputSchema, call with just ctx (the handler expects (ctx) signature)\n return (taskHandler.createTask as (ctx: CreateTaskServerContext) => CreateTaskResult | Promise<CreateTaskResult>)(taskCtx);\n };\n }\n\n if (inputSchema) {\n const callback = handler as ToolCallbackInternal;\n return async (args, ctx) => callback(args, ctx);\n }\n\n // When no inputSchema, call with just ctx (the handler expects (ctx) signature)\n const callback = handler as (ctx: ServerContext) => CallToolResult | Promise<CallToolResult>;\n return async (_args, ctx) => callback(ctx);\n}\n\nconst EMPTY_OBJECT_JSON_SCHEMA = {\n type: 'object' as const,\n properties: {}\n};\n\n/**\n * Additional, optional information for annotating a resource.\n */\nexport type ResourceMetadata = Omit<Resource, 'uri' | 'name'>;\n\n/**\n * Callback to list all resources matching a given template.\n */\nexport type ListResourcesCallback = (ctx: ServerContext) => ListResourcesResult | Promise<ListResourcesResult>;\n\n/**\n * Callback to read a resource at a given URI.\n */\nexport type ReadResourceCallback = (uri: URL, ctx: ServerContext) => ReadResourceResult | Promise<ReadResourceResult>;\n\nexport type RegisteredResource = {\n name: string;\n title?: string;\n metadata?: ResourceMetadata;\n readCallback: ReadResourceCallback;\n enabled: boolean;\n enable(): void;\n disable(): void;\n update(updates: {\n name?: string;\n title?: string;\n uri?: string | null;\n metadata?: ResourceMetadata;\n callback?: ReadResourceCallback;\n enabled?: boolean;\n }): void;\n remove(): void;\n};\n\n/**\n * Callback to read a resource at a given URI, following a filled-in URI template.\n */\nexport type ReadResourceTemplateCallback = (\n uri: URL,\n variables: Variables,\n ctx: ServerContext\n) => ReadResourceResult | Promise<ReadResourceResult>;\n\nexport type RegisteredResourceTemplate = {\n resourceTemplate: ResourceTemplate;\n title?: string;\n metadata?: ResourceMetadata;\n readCallback: ReadResourceTemplateCallback;\n enabled: boolean;\n enable(): void;\n disable(): void;\n update(updates: {\n name?: string | null;\n title?: string;\n template?: ResourceTemplate;\n metadata?: ResourceMetadata;\n callback?: ReadResourceTemplateCallback;\n enabled?: boolean;\n }): void;\n remove(): void;\n};\n\nexport type PromptCallback<Args extends StandardSchemaWithJSON | undefined = undefined> = Args extends StandardSchemaWithJSON\n ? (args: StandardSchemaWithJSON.InferOutput<Args>, ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>\n : (ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>;\n\n/**\n * Internal handler type that encapsulates parsing and callback invocation.\n * This allows type-safe handling without runtime type assertions.\n */\ntype PromptHandler = (args: Record<string, unknown> | undefined, ctx: ServerContext) => Promise<GetPromptResult>;\n\ntype ToolCallbackInternal = (args: unknown, ctx: ServerContext) => CallToolResult | Promise<CallToolResult>;\n\ntype TaskHandlerInternal = {\n createTask: (args: unknown, ctx: CreateTaskServerContext) => CreateTaskResult | Promise<CreateTaskResult>;\n};\n\nexport type RegisteredPrompt = {\n title?: string;\n description?: string;\n argsSchema?: StandardSchemaWithJSON;\n _meta?: Record<string, unknown>;\n /** @hidden */\n handler: PromptHandler;\n enabled: boolean;\n enable(): void;\n disable(): void;\n update<Args extends StandardSchemaWithJSON>(updates: {\n name?: string | null;\n title?: string;\n description?: string;\n argsSchema?: Args;\n _meta?: Record<string, unknown>;\n callback?: PromptCallback<Args>;\n enabled?: boolean;\n }): void;\n remove(): void;\n};\n\n/**\n * Creates a type-safe prompt handler that captures the schema and callback in a closure.\n * This eliminates the need for type assertions at the call site.\n */\nfunction createPromptHandler(\n name: string,\n argsSchema: StandardSchemaWithJSON | undefined,\n callback: PromptCallback<StandardSchemaWithJSON | undefined>\n): PromptHandler {\n if (argsSchema) {\n const typedCallback = callback as (args: unknown, ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>;\n\n return async (args, ctx) => {\n const parseResult = await validateStandardSchema(argsSchema, args);\n if (!parseResult.success) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid arguments for prompt ${name}: ${parseResult.error}`);\n }\n return typedCallback(parseResult.data, ctx);\n };\n } else {\n const typedCallback = callback as (ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>;\n\n return async (_args, ctx) => {\n return typedCallback(ctx);\n };\n }\n}\n\nfunction createCompletionResult(suggestions: readonly unknown[]): CompleteResult {\n const values = suggestions.map(String).slice(0, 100);\n return {\n completion: {\n values,\n total: suggestions.length,\n hasMore: suggestions.length > 100\n }\n };\n}\n\nconst EMPTY_COMPLETION_RESULT: CompleteResult = {\n completion: {\n values: [],\n hasMore: false\n }\n};\n\n/** @internal Gets the shape of a Zod object schema */\nfunction getSchemaShape(schema: unknown): Record<string, unknown> | undefined {\n const candidate = schema as { shape?: unknown };\n if (candidate.shape && typeof candidate.shape === 'object') {\n return candidate.shape as Record<string, unknown>;\n }\n return undefined;\n}\n\n/** @internal Checks if a Zod schema is optional */\nfunction isOptionalSchema(schema: unknown): boolean {\n const candidate = schema as { type?: string } | null | undefined;\n return candidate?.type === 'optional';\n}\n\n/** @internal Unwraps an optional Zod schema */\nfunction unwrapOptionalSchema(schema: unknown): unknown {\n if (!isOptionalSchema(schema)) {\n return schema;\n }\n const candidate = schema as { def?: { innerType?: unknown } };\n return candidate.def?.innerType ?? schema;\n}\n","export type HostHeaderValidationResult =\n | { ok: true; hostname: string }\n | {\n ok: false;\n errorCode: 'missing_host' | 'invalid_host_header' | 'invalid_host';\n message: string;\n hostHeader?: string;\n hostname?: string;\n };\n\n/**\n * Parse and validate a `Host` header against an allowlist of hostnames (port-agnostic).\n *\n * - Input host header may include a port (e.g. `localhost:3000`) or IPv6 brackets (e.g. `[::1]:3000`).\n * - Allowlist items should be hostnames only (no ports). For IPv6, include brackets (e.g. `[::1]`).\n */\nexport function validateHostHeader(hostHeader: string | null | undefined, allowedHostnames: string[]): HostHeaderValidationResult {\n if (!hostHeader) {\n return { ok: false, errorCode: 'missing_host', message: 'Missing Host header' };\n }\n\n // Use URL API to parse hostname (handles IPv4, IPv6, and regular hostnames)\n let hostname: string;\n try {\n hostname = new URL(`http://${hostHeader}`).hostname;\n } catch {\n return { ok: false, errorCode: 'invalid_host_header', message: `Invalid Host header: ${hostHeader}`, hostHeader };\n }\n\n if (!allowedHostnames.includes(hostname)) {\n return { ok: false, errorCode: 'invalid_host', message: `Invalid Host: ${hostname}`, hostHeader, hostname };\n }\n\n return { ok: true, hostname };\n}\n\n/**\n * Convenience allowlist for `localhost` DNS rebinding protection.\n */\nexport function localhostAllowedHostnames(): string[] {\n return ['localhost', '127.0.0.1', '[::1]'];\n}\n\n/**\n * Web-standard `Request` helper for DNS rebinding protection.\n * @example\n * ```ts source=\"./hostHeaderValidation.examples.ts#hostHeaderValidationResponse_basicUsage\"\n * const result = validateHostHeader(req.headers.get('host'), ['localhost']);\n * ```\n */\nexport function hostHeaderValidationResponse(req: Request, allowedHostnames: string[]): Response | undefined {\n const result = validateHostHeader(req.headers.get('host'), allowedHostnames);\n if (result.ok) return undefined;\n\n return Response.json(\n {\n jsonrpc: '2.0',\n error: {\n code: -32_000,\n message: result.message\n },\n id: null\n },\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n}\n","import type { Readable, Writable } from 'node:stream';\n\nimport type { JSONRPCMessage, Transport } from '@modelcontextprotocol/core';\nimport { ReadBuffer, serializeMessage } from '@modelcontextprotocol/core';\nimport { process } from '@modelcontextprotocol/server/_shims';\n\n/**\n * Server transport for stdio: this communicates with an MCP client by reading from the current process' `stdin` and writing to `stdout`.\n *\n * This transport is only available in Node.js environments.\n *\n * @example\n * ```ts source=\"./stdio.examples.ts#StdioServerTransport_basicUsage\"\n * const server = new McpServer({ name: 'my-server', version: '1.0.0' });\n * const transport = new StdioServerTransport();\n * await server.connect(transport);\n * ```\n */\nexport class StdioServerTransport implements Transport {\n private _readBuffer: ReadBuffer = new ReadBuffer();\n private _started = false;\n private _closed = false;\n\n constructor(\n private _stdin: Readable = process.stdin,\n private _stdout: Writable = process.stdout\n ) {}\n\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n\n // Arrow functions to bind `this` properly, while maintaining function identity.\n _ondata = (chunk: Buffer) => {\n this._readBuffer.append(chunk);\n this.processReadBuffer();\n };\n _onerror = (error: Error) => {\n this.onerror?.(error);\n };\n _onstdouterror = (error: Error) => {\n this.onerror?.(error);\n this.close().catch(() => {\n // Ignore errors during close — we're already in an error path\n });\n };\n\n /**\n * Starts listening for messages on `stdin`.\n */\n async start(): Promise<void> {\n if (this._started) {\n throw new Error(\n 'StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.'\n );\n }\n\n this._started = true;\n this._stdin.on('data', this._ondata);\n this._stdin.on('error', this._onerror);\n this._stdout.on('error', this._onstdouterror);\n }\n\n private processReadBuffer() {\n while (true) {\n try {\n const message = this._readBuffer.readMessage();\n if (message === null) {\n break;\n }\n\n this.onmessage?.(message);\n } catch (error) {\n this.onerror?.(error as Error);\n }\n }\n }\n\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n this._closed = true;\n\n // Remove our event listeners first\n this._stdin.off('data', this._ondata);\n this._stdin.off('error', this._onerror);\n this._stdout.off('error', this._onstdouterror);\n\n // Check if we were the only data listener\n const remainingDataListeners = this._stdin.listenerCount('data');\n if (remainingDataListeners === 0) {\n // Only pause stdin if we were the only listener\n // This prevents interfering with other parts of the application that might be using stdin\n this._stdin.pause();\n }\n\n // Clear the buffer and notify closure\n this._readBuffer.clear();\n this.onclose?.();\n }\n\n send(message: JSONRPCMessage): Promise<void> {\n if (this._closed) {\n return Promise.reject(new Error('StdioServerTransport is closed'));\n }\n return new Promise((resolve, reject) => {\n const json = serializeMessage(message);\n\n let settled = false;\n const onError = (error: Error) => {\n if (settled) return;\n settled = true;\n this._stdout.off('error', onError);\n this._stdout.off('drain', onDrain);\n reject(error);\n };\n const onDrain = () => {\n if (settled) return;\n settled = true;\n this._stdout.off('error', onError);\n this._stdout.off('drain', onDrain);\n resolve();\n };\n\n this._stdout.once('error', onError);\n\n if (this._stdout.write(json)) {\n if (settled) return;\n settled = true;\n this._stdout.off('error', onError);\n resolve();\n } else if (!settled) {\n this._stdout.once('drain', onDrain);\n }\n });\n }\n}\n","/**\n * Web Standards Streamable HTTP Server Transport\n *\n * This is the core transport implementation using Web Standard APIs (`Request`, `Response`, `ReadableStream`).\n * It can run on any runtime that supports Web Standards: Node.js 18+, Cloudflare Workers, Deno, Bun, etc.\n *\n * For Node.js Express/HTTP compatibility, use {@linkcode @modelcontextprotocol/node!NodeStreamableHTTPServerTransport | NodeStreamableHTTPServerTransport} which wraps this transport.\n */\n\nimport type { AuthInfo, JSONRPCMessage, MessageExtraInfo, RequestId, Transport } from '@modelcontextprotocol/core';\nimport {\n DEFAULT_NEGOTIATED_PROTOCOL_VERSION,\n isInitializeRequest,\n isJSONRPCErrorResponse,\n isJSONRPCRequest,\n isJSONRPCResultResponse,\n JSONRPCMessageSchema,\n SUPPORTED_PROTOCOL_VERSIONS\n} from '@modelcontextprotocol/core';\n\nexport type StreamId = string;\nexport type EventId = string;\n\n/**\n * Interface for resumability support via event storage\n */\nexport interface EventStore {\n /**\n * Stores an event for later retrieval\n * @param streamId ID of the stream the event belongs to\n * @param message The JSON-RPC message to store\n * @returns The generated event ID for the stored event\n */\n storeEvent(streamId: StreamId, message: JSONRPCMessage): Promise<EventId>;\n\n /**\n * Get the stream ID associated with a given event ID.\n * @param eventId The event ID to look up\n * @returns The stream ID, or `undefined` if not found\n *\n * Optional: If not provided, the SDK will use the `streamId` returned by\n * {@linkcode replayEventsAfter} for stream mapping.\n */\n getStreamIdForEventId?(eventId: EventId): Promise<StreamId | undefined>;\n\n replayEventsAfter(\n lastEventId: EventId,\n {\n send\n }: {\n send: (eventId: EventId, message: JSONRPCMessage) => Promise<void>;\n }\n ): Promise<StreamId>;\n}\n\n/**\n * Internal stream mapping for managing SSE connections\n */\ninterface StreamMapping {\n /** Stream controller for pushing SSE data - only used with `ReadableStream` approach */\n controller?: ReadableStreamDefaultController<Uint8Array>;\n /** Text encoder for SSE formatting */\n encoder?: InstanceType<typeof TextEncoder>;\n /** Promise resolver for JSON response mode */\n resolveJson?: (response: Response) => void;\n /** Cleanup function to close stream and remove mapping */\n cleanup: () => void;\n}\n\n/**\n * Configuration options for {@linkcode WebStandardStreamableHTTPServerTransport}\n */\nexport interface WebStandardStreamableHTTPServerTransportOptions {\n /**\n * Function that generates a session ID for the transport.\n * The session ID SHOULD be globally unique and cryptographically secure (e.g., a securely generated UUID, a JWT, or a cryptographic hash)\n *\n * If not provided, session management is disabled (stateless mode).\n */\n sessionIdGenerator?: () => string;\n\n /**\n * A callback for session initialization events\n * This is called when the server initializes a new session.\n * Useful in cases when you need to register multiple mcp sessions\n * and need to keep track of them.\n * @param sessionId The generated session ID\n */\n onsessioninitialized?: (sessionId: string) => void | Promise<void>;\n\n /**\n * A callback for session close events\n * This is called when the server closes a session due to a `DELETE` request.\n * Useful in cases when you need to clean up resources associated with the session.\n * Note that this is different from the transport closing, if you are handling\n * HTTP requests from multiple nodes you might want to close each\n * {@linkcode WebStandardStreamableHTTPServerTransport} after a request is completed while still keeping the\n * session open/running.\n * @param sessionId The session ID that was closed\n */\n onsessionclosed?: (sessionId: string) => void | Promise<void>;\n\n /**\n * If `true`, the server will return JSON responses instead of starting an SSE stream.\n * This can be useful for simple request/response scenarios without streaming.\n * Default is `false` (SSE streams are preferred).\n */\n enableJsonResponse?: boolean;\n\n /**\n * Event store for resumability support\n * If provided, resumability will be enabled, allowing clients to reconnect and resume messages\n */\n eventStore?: EventStore;\n\n /**\n * List of allowed `Host` header values for DNS rebinding protection.\n * If not specified, host validation is disabled.\n * @deprecated Use external middleware for host validation instead.\n */\n allowedHosts?: string[];\n\n /**\n * List of allowed `Origin` header values for DNS rebinding protection.\n * If not specified, origin validation is disabled.\n * @deprecated Use external middleware for origin validation instead.\n */\n allowedOrigins?: string[];\n\n /**\n * Enable DNS rebinding protection (requires `allowedHosts` and/or `allowedOrigins` to be configured).\n * Default is `false` for backwards compatibility.\n * @deprecated Use external middleware for DNS rebinding protection instead.\n */\n enableDnsRebindingProtection?: boolean;\n\n /**\n * Retry interval in milliseconds to suggest to clients in SSE `retry` field.\n * When set, the server will send a `retry` field in SSE priming events to control\n * client reconnection timing for polling behavior.\n */\n retryInterval?: number;\n\n /**\n * List of protocol versions that this transport will accept.\n * Used to validate the `mcp-protocol-version` header in incoming requests.\n *\n * Note: When using {@linkcode server/server.Server.connect | Server.connect()}, the server automatically passes its\n * `supportedProtocolVersions` to the transport, so you typically don't need\n * to set this option directly.\n *\n * @default {@linkcode SUPPORTED_PROTOCOL_VERSIONS}\n */\n supportedProtocolVersions?: string[];\n}\n\n/**\n * Options for handling a request\n */\nexport interface HandleRequestOptions {\n /**\n * Pre-parsed request body. If provided, the transport will use this instead of parsing `req.json()`.\n * Useful when using body-parser middleware that has already parsed the body.\n */\n parsedBody?: unknown;\n\n /**\n * Authentication info from middleware. If provided, will be passed to message handlers.\n */\n authInfo?: AuthInfo;\n}\n\n/**\n * Server transport for Web Standards Streamable HTTP: this implements the MCP Streamable HTTP transport specification\n * using Web Standard APIs (`Request`, `Response`, `ReadableStream`).\n *\n * This transport works on any runtime that supports Web Standards: Node.js 18+, Cloudflare Workers, Deno, Bun, etc.\n *\n * In stateful mode:\n * - Session ID is generated and included in response headers\n * - Session ID is always included in initialization responses\n * - Requests with invalid session IDs are rejected with `404 Not Found`\n * - Non-initialization requests without a session ID are rejected with `400 Bad Request`\n * - State is maintained in-memory (connections, message history)\n *\n * In stateless mode:\n * - No Session ID is included in any responses\n * - No session validation is performed\n *\n * @example Stateful setup\n * ```ts source=\"./streamableHttp.examples.ts#WebStandardStreamableHTTPServerTransport_stateful\"\n * const server = new McpServer({ name: 'my-server', version: '1.0.0' });\n *\n * const transport = new WebStandardStreamableHTTPServerTransport({\n * sessionIdGenerator: () => crypto.randomUUID()\n * });\n *\n * await server.connect(transport);\n * ```\n *\n * @example Stateless setup\n * ```ts source=\"./streamableHttp.examples.ts#WebStandardStreamableHTTPServerTransport_stateless\"\n * const transport = new WebStandardStreamableHTTPServerTransport({\n * sessionIdGenerator: undefined\n * });\n * ```\n *\n * @example Hono.js\n * ```ts source=\"./streamableHttp.examples.ts#WebStandardStreamableHTTPServerTransport_hono\"\n * app.all('/mcp', async c => {\n * return transport.handleRequest(c.req.raw);\n * });\n * ```\n *\n * @example Cloudflare Workers\n * ```ts source=\"./streamableHttp.examples.ts#WebStandardStreamableHTTPServerTransport_workers\"\n * const worker = {\n * async fetch(request: Request): Promise<Response> {\n * return transport.handleRequest(request);\n * }\n * };\n * ```\n */\nexport class WebStandardStreamableHTTPServerTransport implements Transport {\n // when sessionId is not set (undefined), it means the transport is in stateless mode\n private sessionIdGenerator: (() => string) | undefined;\n private _started: boolean = false;\n private _streamMapping: Map<string, StreamMapping> = new Map();\n private _requestToStreamMapping: Map<RequestId, string> = new Map();\n private _requestResponseMap: Map<RequestId, JSONRPCMessage> = new Map();\n private _initialized: boolean = false;\n private _enableJsonResponse: boolean = false;\n private _standaloneSseStreamId: string = '_GET_stream';\n private _eventStore?: EventStore;\n private _onsessioninitialized?: (sessionId: string) => void | Promise<void>;\n private _onsessionclosed?: (sessionId: string) => void | Promise<void>;\n private _allowedHosts?: string[];\n private _allowedOrigins?: string[];\n private _enableDnsRebindingProtection: boolean;\n private _retryInterval?: number;\n private _supportedProtocolVersions: string[];\n\n sessionId?: string;\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void;\n\n constructor(options: WebStandardStreamableHTTPServerTransportOptions = {}) {\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 this._allowedHosts = options.allowedHosts;\n this._allowedOrigins = options.allowedOrigins;\n this._enableDnsRebindingProtection = options.enableDnsRebindingProtection ?? false;\n this._retryInterval = options.retryInterval;\n this._supportedProtocolVersions = options.supportedProtocolVersions ?? SUPPORTED_PROTOCOL_VERSIONS;\n }\n\n /**\n * Starts the transport. This is required by the {@linkcode Transport} interface but is a no-op\n * for the Streamable HTTP transport as connections are managed per-request.\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 * Sets the supported protocol versions for header validation.\n * Called by the server during {@linkcode server/server.Server.connect | connect()} to pass its supported versions.\n */\n setSupportedProtocolVersions(versions: string[]): void {\n this._supportedProtocolVersions = versions;\n }\n\n /**\n * Helper to create a JSON error response\n */\n private createJsonErrorResponse(\n status: number,\n code: number,\n message: string,\n options?: { headers?: Record<string, string>; data?: string }\n ): Response {\n const error: { code: number; message: string; data?: string } = { code, message };\n if (options?.data !== undefined) {\n error.data = options.data;\n }\n return Response.json(\n {\n jsonrpc: '2.0',\n error,\n id: null\n },\n {\n status,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n }\n );\n }\n\n /**\n * Validates request headers for DNS rebinding protection.\n * @returns Error response if validation fails, `undefined` if validation passes.\n */\n private validateRequestHeaders(req: Request): Response | undefined {\n // Skip validation if protection is not enabled\n if (!this._enableDnsRebindingProtection) {\n return undefined;\n }\n\n // Validate Host header if allowedHosts is configured\n if (this._allowedHosts && this._allowedHosts.length > 0) {\n const hostHeader = req.headers.get('host');\n if (!hostHeader || !this._allowedHosts.includes(hostHeader)) {\n const error = `Invalid Host header: ${hostHeader}`;\n this.onerror?.(new Error(error));\n return this.createJsonErrorResponse(403, -32_000, error);\n }\n }\n\n // Validate Origin header if allowedOrigins is configured\n if (this._allowedOrigins && this._allowedOrigins.length > 0) {\n const originHeader = req.headers.get('origin');\n if (originHeader && !this._allowedOrigins.includes(originHeader)) {\n const error = `Invalid Origin header: ${originHeader}`;\n this.onerror?.(new Error(error));\n return this.createJsonErrorResponse(403, -32_000, error);\n }\n }\n\n return undefined;\n }\n\n /**\n * Handles an incoming HTTP request, whether `GET`, `POST`, or `DELETE`\n * Returns a `Response` object (Web Standard)\n */\n async handleRequest(req: Request, options?: HandleRequestOptions): Promise<Response> {\n // Validate request headers for DNS rebinding protection\n const validationError = this.validateRequestHeaders(req);\n if (validationError) {\n return validationError;\n }\n\n switch (req.method) {\n case 'POST': {\n return this.handlePostRequest(req, options);\n }\n case 'GET': {\n return this.handleGetRequest(req);\n }\n case 'DELETE': {\n return this.handleDeleteRequest(req);\n }\n default: {\n return this.handleUnsupportedRequest();\n }\n }\n }\n\n /**\n * Writes a priming event to establish resumption capability.\n * Only sends if `eventStore` is configured (opt-in for resumability) and\n * the client's protocol version supports empty SSE data (>= `2025-11-25`).\n */\n private async writePrimingEvent(\n controller: ReadableStreamDefaultController<Uint8Array>,\n encoder: InstanceType<typeof TextEncoder>,\n streamId: string,\n protocolVersion: string\n ): Promise<void> {\n if (!this._eventStore) {\n return;\n }\n\n // Priming events have empty data which older clients cannot handle.\n // Only send priming events to clients with protocol version >= 2025-11-25\n // which includes the fix for handling empty SSE data.\n if (protocolVersion < '2025-11-25') {\n return;\n }\n\n const primingEventId = await this._eventStore.storeEvent(streamId, {} as JSONRPCMessage);\n\n let primingEvent = `id: ${primingEventId}\\ndata: \\n\\n`;\n if (this._retryInterval !== undefined) {\n primingEvent = `id: ${primingEventId}\\nretry: ${this._retryInterval}\\ndata: \\n\\n`;\n }\n controller.enqueue(encoder.encode(primingEvent));\n }\n\n /**\n * Handles `GET` requests for SSE stream\n */\n private async handleGetRequest(req: Request): Promise<Response> {\n // The client MUST include an Accept header, listing text/event-stream as a supported content type.\n const acceptHeader = req.headers.get('accept');\n if (!acceptHeader?.includes('text/event-stream')) {\n this.onerror?.(new Error('Not Acceptable: Client must accept text/event-stream'));\n return this.createJsonErrorResponse(406, -32_000, 'Not Acceptable: Client must accept text/event-stream');\n }\n\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it\n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n const sessionError = this.validateSession(req);\n if (sessionError) {\n return sessionError;\n }\n const protocolError = this.validateProtocolVersion(req);\n if (protocolError) {\n return protocolError;\n }\n\n // Handle resumability: check for Last-Event-ID header\n if (this._eventStore) {\n const lastEventId = req.headers.get('last-event-id');\n if (lastEventId) {\n return this.replayEvents(lastEventId);\n }\n }\n\n // Check if there's already an active standalone SSE stream for this session\n if (this._streamMapping.get(this._standaloneSseStreamId) !== undefined) {\n // Only one GET SSE stream is allowed per session\n this.onerror?.(new Error('Conflict: Only one SSE stream is allowed per session'));\n return this.createJsonErrorResponse(409, -32_000, 'Conflict: Only one SSE stream is allowed per session');\n }\n\n const encoder = new TextEncoder();\n let streamController: ReadableStreamDefaultController<Uint8Array>;\n\n // Create a ReadableStream with a controller we can use to push SSE events\n const readable = new ReadableStream<Uint8Array>({\n start: controller => {\n streamController = controller;\n },\n cancel: () => {\n // Stream was cancelled by client\n this._streamMapping.delete(this._standaloneSseStreamId);\n }\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive'\n };\n\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n // Store the stream mapping with the controller for pushing data\n this._streamMapping.set(this._standaloneSseStreamId, {\n controller: streamController!,\n encoder,\n cleanup: () => {\n this._streamMapping.delete(this._standaloneSseStreamId);\n try {\n streamController!.close();\n } catch {\n // Controller might already be closed\n }\n }\n });\n\n return new Response(readable, { headers });\n }\n\n /**\n * Replays events that would have been sent after the specified event ID\n * Only used when resumability is enabled\n */\n private async replayEvents(lastEventId: string): Promise<Response> {\n if (!this._eventStore) {\n this.onerror?.(new Error('Event store not configured'));\n return this.createJsonErrorResponse(400, -32_000, 'Event store not configured');\n }\n\n try {\n // If getStreamIdForEventId is available, use it for conflict checking\n let streamId: string | undefined;\n if (this._eventStore.getStreamIdForEventId) {\n streamId = await this._eventStore.getStreamIdForEventId(lastEventId);\n\n if (!streamId) {\n this.onerror?.(new Error('Invalid event ID format'));\n return this.createJsonErrorResponse(400, -32_000, 'Invalid event ID format');\n }\n\n // Check conflict with the SAME streamId we'll use for mapping\n if (this._streamMapping.get(streamId) !== undefined) {\n this.onerror?.(new Error('Conflict: Stream already has an active connection'));\n return this.createJsonErrorResponse(409, -32_000, 'Conflict: Stream already has an active connection');\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive'\n };\n\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n // Create a ReadableStream with controller for SSE\n const encoder = new TextEncoder();\n let streamController: ReadableStreamDefaultController<Uint8Array>;\n\n const readable = new ReadableStream<Uint8Array>({\n start: controller => {\n streamController = controller;\n },\n cancel: () => {\n // Stream was cancelled by client\n // Cleanup will be handled by the mapping\n }\n });\n\n // Replay events - returns the streamId for backwards compatibility\n const replayedStreamId = await this._eventStore.replayEventsAfter(lastEventId, {\n send: async (eventId: string, message: JSONRPCMessage) => {\n const success = this.writeSSEEvent(streamController!, encoder, message, eventId);\n if (!success) {\n try {\n streamController!.close();\n } catch {\n // Controller might already be closed\n }\n }\n }\n });\n\n this._streamMapping.set(replayedStreamId, {\n controller: streamController!,\n encoder,\n cleanup: () => {\n this._streamMapping.delete(replayedStreamId);\n try {\n streamController!.close();\n } catch {\n // Controller might already be closed\n }\n }\n });\n\n return new Response(readable, { headers });\n } catch (error) {\n this.onerror?.(error as Error);\n return this.createJsonErrorResponse(500, -32_000, 'Error replaying events');\n }\n }\n\n /**\n * Writes an event to an SSE stream via controller with proper formatting\n */\n private writeSSEEvent(\n controller: ReadableStreamDefaultController<Uint8Array>,\n encoder: InstanceType<typeof TextEncoder>,\n message: JSONRPCMessage,\n eventId?: string\n ): boolean {\n try {\n let eventData = `event: message\\n`;\n // Include event ID if provided - this is important for resumability\n if (eventId) {\n eventData += `id: ${eventId}\\n`;\n }\n eventData += `data: ${JSON.stringify(message)}\\n\\n`;\n controller.enqueue(encoder.encode(eventData));\n return true;\n } catch (error) {\n this.onerror?.(error as Error);\n return false;\n }\n }\n\n /**\n * Handles unsupported requests (`PUT`, `PATCH`, etc.)\n */\n private handleUnsupportedRequest(): Response {\n this.onerror?.(new Error('Method not allowed.'));\n return Response.json(\n {\n jsonrpc: '2.0',\n error: {\n code: -32_000,\n message: 'Method not allowed.'\n },\n id: null\n },\n {\n status: 405,\n headers: {\n Allow: 'GET, POST, DELETE',\n 'Content-Type': 'application/json'\n }\n }\n );\n }\n\n /**\n * Handles `POST` requests containing JSON-RPC messages\n */\n private async handlePostRequest(req: Request, options?: HandleRequestOptions): Promise<Response> {\n try {\n // Validate the Accept header\n const acceptHeader = req.headers.get('accept');\n // The client MUST include an Accept header, listing both application/json and text/event-stream as supported content types.\n if (!acceptHeader?.includes('application/json') || !acceptHeader.includes('text/event-stream')) {\n this.onerror?.(new Error('Not Acceptable: Client must accept both application/json and text/event-stream'));\n return this.createJsonErrorResponse(\n 406,\n -32_000,\n 'Not Acceptable: Client must accept both application/json and text/event-stream'\n );\n }\n\n const ct = req.headers.get('content-type');\n if (!ct || !ct.includes('application/json')) {\n this.onerror?.(new Error('Unsupported Media Type: Content-Type must be application/json'));\n return this.createJsonErrorResponse(415, -32_000, 'Unsupported Media Type: Content-Type must be application/json');\n }\n\n const request = req;\n\n let rawMessage;\n if (options?.parsedBody === undefined) {\n try {\n rawMessage = await req.json();\n } catch (error) {\n this.onerror?.(error as Error);\n return this.createJsonErrorResponse(400, -32_700, 'Parse error: Invalid JSON');\n }\n } else {\n rawMessage = options.parsedBody;\n }\n\n let messages: JSONRPCMessage[];\n\n // handle batch and single messages\n try {\n messages = Array.isArray(rawMessage)\n ? rawMessage.map(msg => JSONRPCMessageSchema.parse(msg))\n : [JSONRPCMessageSchema.parse(rawMessage)];\n } catch (error) {\n this.onerror?.(error as Error);\n return this.createJsonErrorResponse(400, -32_700, 'Parse error: Invalid JSON-RPC message');\n }\n\n // Check if this is an initialization request\n // https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/lifecycle/\n const isInitializationRequest = messages.some(element => isInitializeRequest(element));\n if (isInitializationRequest) {\n // If it's a server with session management and the session ID is already set we should reject the request\n // to avoid re-initialization.\n if (this._initialized && this.sessionId !== undefined) {\n this.onerror?.(new Error('Invalid Request: Server already initialized'));\n return this.createJsonErrorResponse(400, -32_600, 'Invalid Request: Server already initialized');\n }\n if (messages.length > 1) {\n this.onerror?.(new Error('Invalid Request: Only one initialization request is allowed'));\n return this.createJsonErrorResponse(400, -32_600, 'Invalid Request: Only one initialization request is allowed');\n }\n this.sessionId = this.sessionIdGenerator?.();\n this._initialized = true;\n\n // If we have a session ID and an onsessioninitialized handler, call it immediately\n // This is needed in cases where the server needs to keep track of multiple sessions\n if (this.sessionId && this._onsessioninitialized) {\n await Promise.resolve(this._onsessioninitialized(this.sessionId));\n }\n }\n if (!isInitializationRequest) {\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it\n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n const sessionError = this.validateSession(req);\n if (sessionError) {\n return sessionError;\n }\n // Mcp-Protocol-Version header is required for all requests after initialization.\n const protocolError = this.validateProtocolVersion(req);\n if (protocolError) {\n return protocolError;\n }\n }\n\n // check if it contains requests\n const hasRequests = messages.some(element => isJSONRPCRequest(element));\n\n if (!hasRequests) {\n // if it only contains notifications or responses, return 202\n for (const message of messages) {\n this.onmessage?.(message, { authInfo: options?.authInfo, request });\n }\n return new Response(null, { status: 202 });\n }\n\n // The default behavior is to use SSE streaming\n // but in some cases server will return JSON responses\n const streamId = crypto.randomUUID();\n\n // Extract protocol version for priming event decision.\n // For initialize requests, get from request params.\n // For other requests, get from header (already validated).\n const initRequest = messages.find(m => isInitializeRequest(m));\n const clientProtocolVersion = initRequest\n ? initRequest.params.protocolVersion\n : (req.headers.get('mcp-protocol-version') ?? DEFAULT_NEGOTIATED_PROTOCOL_VERSION);\n\n if (this._enableJsonResponse) {\n // For JSON response mode, return a Promise that resolves when all responses are ready\n return new Promise<Response>(resolve => {\n this._streamMapping.set(streamId, {\n resolveJson: resolve,\n cleanup: () => {\n this._streamMapping.delete(streamId);\n }\n });\n\n for (const message of messages) {\n if (isJSONRPCRequest(message)) {\n this._requestToStreamMapping.set(message.id, streamId);\n }\n }\n\n for (const message of messages) {\n this.onmessage?.(message, { authInfo: options?.authInfo, request });\n }\n });\n }\n\n // SSE streaming mode - use ReadableStream with controller for more reliable data pushing\n const encoder = new TextEncoder();\n let streamController: ReadableStreamDefaultController<Uint8Array>;\n\n const readable = new ReadableStream<Uint8Array>({\n start: controller => {\n streamController = controller;\n },\n cancel: () => {\n // Stream was cancelled by client\n this._streamMapping.delete(streamId);\n }\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive'\n };\n\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n // Store the response for this request to send messages back through this connection\n // We need to track by request ID to maintain the connection\n for (const message of messages) {\n if (isJSONRPCRequest(message)) {\n this._streamMapping.set(streamId, {\n controller: streamController!,\n encoder,\n cleanup: () => {\n this._streamMapping.delete(streamId);\n try {\n streamController!.close();\n } catch {\n // Controller might already be closed\n }\n }\n });\n this._requestToStreamMapping.set(message.id, streamId);\n }\n }\n\n // Write priming event if event store is configured (after mapping is set up)\n await this.writePrimingEvent(streamController!, encoder, streamId, clientProtocolVersion);\n\n // handle each message\n for (const message of messages) {\n // Build closeSSEStream callback for requests when eventStore is configured\n // AND client supports resumability (protocol version >= 2025-11-25).\n // Old clients can't resume if the stream is closed early because they\n // didn't receive a priming event with an event ID.\n let closeSSEStream: (() => void) | undefined;\n let closeStandaloneSSEStream: (() => void) | undefined;\n if (isJSONRPCRequest(message) && this._eventStore && clientProtocolVersion >= '2025-11-25') {\n closeSSEStream = () => {\n this.closeSSEStream(message.id);\n };\n closeStandaloneSSEStream = () => {\n this.closeStandaloneSSEStream();\n };\n }\n\n this.onmessage?.(message, { authInfo: options?.authInfo, request, closeSSEStream, closeStandaloneSSEStream });\n }\n // The server SHOULD NOT close the SSE stream before sending all JSON-RPC responses\n // This will be handled by the send() method when responses are ready\n\n return new Response(readable, { status: 200, headers });\n } catch (error) {\n // return JSON-RPC formatted error\n this.onerror?.(error as Error);\n return this.createJsonErrorResponse(400, -32_700, 'Parse error', { data: String(error) });\n }\n }\n\n /**\n * Handles `DELETE` requests to terminate sessions\n */\n private async handleDeleteRequest(req: Request): Promise<Response> {\n const sessionError = this.validateSession(req);\n if (sessionError) {\n return sessionError;\n }\n const protocolError = this.validateProtocolVersion(req);\n if (protocolError) {\n return protocolError;\n }\n\n await Promise.resolve(this._onsessionclosed?.(this.sessionId!));\n await this.close();\n return new Response(null, { status: 200 });\n }\n\n /**\n * Validates session ID for non-initialization requests.\n * Returns `Response` error if invalid, `undefined` otherwise\n */\n private validateSession(req: Request): Response | undefined {\n if (this.sessionIdGenerator === undefined) {\n // If the sessionIdGenerator ID is not set, the session management is disabled\n // and we don't need to validate the session ID\n return undefined;\n }\n if (!this._initialized) {\n // If the server has not been initialized yet, reject all requests\n this.onerror?.(new Error('Bad Request: Server not initialized'));\n return this.createJsonErrorResponse(400, -32_000, 'Bad Request: Server not initialized');\n }\n\n const sessionId = req.headers.get('mcp-session-id');\n\n if (!sessionId) {\n // Non-initialization requests without a session ID should return 400 Bad Request\n this.onerror?.(new Error('Bad Request: Mcp-Session-Id header is required'));\n return this.createJsonErrorResponse(400, -32_000, 'Bad Request: Mcp-Session-Id header is required');\n }\n\n if (sessionId !== this.sessionId) {\n // Reject requests with invalid session ID with 404 Not Found\n this.onerror?.(new Error('Session not found'));\n return this.createJsonErrorResponse(404, -32_001, 'Session not found');\n }\n\n return undefined;\n }\n\n /**\n * Validates the `MCP-Protocol-Version` header on incoming requests.\n *\n * For initialization: Version negotiation handles unknown versions gracefully\n * (server responds with its supported version).\n *\n * For subsequent requests with `MCP-Protocol-Version` header:\n * - Accept if in supported list\n * - 400 if unsupported\n *\n * For HTTP requests without the `MCP-Protocol-Version` header:\n * - Accept and default to the version negotiated at initialization\n */\n private validateProtocolVersion(req: Request): Response | undefined {\n const protocolVersion = req.headers.get('mcp-protocol-version');\n\n if (protocolVersion !== null && !this._supportedProtocolVersions.includes(protocolVersion)) {\n const error = `Bad Request: Unsupported protocol version: ${protocolVersion} (supported versions: ${this._supportedProtocolVersions.join(', ')})`;\n this.onerror?.(new Error(error));\n return this.createJsonErrorResponse(400, -32_000, error);\n }\n return undefined;\n }\n\n async close(): Promise<void> {\n // Close all SSE connections\n for (const { cleanup } of this._streamMapping.values()) {\n cleanup();\n }\n this._streamMapping.clear();\n\n // Clear any pending responses\n this._requestResponseMap.clear();\n this.onclose?.();\n }\n\n /**\n * Close an SSE stream for a specific request, triggering client reconnection.\n * Use this to implement polling behavior during long-running operations -\n * client will reconnect after the retry interval specified in the priming event.\n */\n closeSSEStream(requestId: RequestId): void {\n const streamId = this._requestToStreamMapping.get(requestId);\n if (!streamId) return;\n\n const stream = this._streamMapping.get(streamId);\n if (stream) {\n stream.cleanup();\n }\n }\n\n /**\n * Close the standalone `GET` SSE stream, triggering client reconnection.\n * Use this to implement polling behavior for server-initiated notifications.\n */\n closeStandaloneSSEStream(): void {\n const stream = this._streamMapping.get(this._standaloneSseStreamId);\n if (stream) {\n stream.cleanup();\n }\n }\n\n async send(message: JSONRPCMessage, options?: { relatedRequestId?: RequestId }): Promise<void> {\n let requestId = options?.relatedRequestId;\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n // If the message is a response, use the request ID from the message\n requestId = message.id;\n }\n\n // Check if this message should be sent on the standalone SSE stream (no request ID)\n // Ignore notifications from tools (which have relatedRequestId set)\n // Those will be sent via dedicated response SSE streams\n if (requestId === undefined) {\n // For standalone SSE streams, we can only send requests and notifications\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n throw new Error('Cannot send a response on a standalone SSE stream unless resuming a previous client request');\n }\n\n // Generate and store event ID if event store is provided\n // Store even if stream is disconnected so events can be replayed on reconnect\n let eventId: string | undefined;\n if (this._eventStore) {\n // Stores the event and gets the generated event ID\n eventId = await this._eventStore.storeEvent(this._standaloneSseStreamId, message);\n }\n\n const standaloneSse = this._streamMapping.get(this._standaloneSseStreamId);\n if (standaloneSse === undefined) {\n // Stream is disconnected - event is stored for replay, nothing more to do\n return;\n }\n\n // Send the message to the standalone SSE stream\n if (standaloneSse.controller && standaloneSse.encoder) {\n this.writeSSEEvent(standaloneSse.controller, standaloneSse.encoder, message, eventId);\n }\n return;\n }\n\n // Get the response for this request\n const streamId = this._requestToStreamMapping.get(requestId);\n if (!streamId) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`);\n }\n\n const stream = this._streamMapping.get(streamId);\n\n if (!this._enableJsonResponse && stream?.controller && stream?.encoder) {\n // For SSE responses, generate event ID if event store is provided\n let eventId: string | undefined;\n\n if (this._eventStore) {\n eventId = await this._eventStore.storeEvent(streamId, message);\n }\n // Write the event to the response stream\n this.writeSSEEvent(stream.controller, stream.encoder, message, eventId);\n }\n\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n this._requestResponseMap.set(requestId, message);\n const relatedIds = [...this._requestToStreamMapping.entries()].filter(([_, sid]) => sid === streamId).map(([id]) => id);\n\n // Check if we have responses for all requests using this connection\n const allResponsesReady = relatedIds.every(id => this._requestResponseMap.has(id));\n\n if (allResponsesReady) {\n if (!stream) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`);\n }\n if (this._enableJsonResponse && stream.resolveJson) {\n // All responses ready, send as JSON\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n const responses = relatedIds.map(id => this._requestResponseMap.get(id)!);\n\n if (responses.length === 1) {\n stream.resolveJson(Response.json(responses[0], { status: 200, headers }));\n } else {\n stream.resolveJson(Response.json(responses, { status: 200, headers }));\n }\n } else {\n // End the SSE stream\n stream.cleanup();\n }\n // Clean up\n for (const id of relatedIds) {\n this._requestResponseMap.delete(id);\n this._requestToStreamMapping.delete(id);\n }\n }\n }\n }\n}\n","import type { JsonSchemaType, jsonSchemaValidator, StandardSchemaWithJSON } from '@modelcontextprotocol/core';\nimport { fromJsonSchema as coreFromJsonSchema } from '@modelcontextprotocol/core';\nimport { DefaultJsonSchemaValidator } from '@modelcontextprotocol/server/_shims';\n\nlet _defaultValidator: jsonSchemaValidator | undefined;\n\nexport function fromJsonSchema<T = unknown>(schema: JsonSchemaType, validator?: jsonSchemaValidator): StandardSchemaWithJSON<T, T> {\n return coreFromJsonSchema<T>(schema, validator ?? (_defaultValidator ??= new DefaultJsonSchemaValidator()));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["COMPLETABLE_SYMBOL: unique symbol","_serverInfo: Implementation","transportSessionId: string | undefined","formParams: ElicitRequestFormParams","toolDefinition: Tool","templateResources: Resource[]","registeredResource: RegisteredResource","registeredResourceTemplate: RegisteredResourceTemplate","registeredPrompt: RegisteredPrompt","registeredTool: RegisteredTool","_callbacks: {\n /**\n * A callback to list all resources matching this template. This is required to be specified, even if `undefined`, to avoid accidentally forgetting resource listing.\n */\n list: ListResourcesCallback | undefined;\n\n /**\n * An optional callback to autocomplete variables within the URI template. Useful for clients and users to discover possible values.\n */\n complete?: {\n [variable: string]: CompleteResourceTemplateCallback;\n };\n }","callback","EMPTY_COMPLETION_RESULT: CompleteResult","hostname: string","error: { code: number; message: string; data?: string }","streamController: ReadableStreamDefaultController<Uint8Array>","headers: Record<string, string>","streamId: string | undefined","messages: JSONRPCMessage[]","closeSSEStream: (() => void) | undefined","closeStandaloneSSEStream: (() => void) | undefined","eventId: string | undefined","_defaultValidator: jsonSchemaValidator | undefined","coreFromJsonSchema"],"sources":["../src/server/completable.ts","../src/server/server.ts","../src/server/mcp.ts","../src/server/middleware/hostHeaderValidation.ts","../src/server/streamableHttp.ts","../src/fromJsonSchema.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@modelcontextprotocol/core-internal';\n\nexport const COMPLETABLE_SYMBOL: unique symbol = Symbol.for('mcp.completable');\n\nexport type CompleteCallback<T extends StandardSchemaV1 = StandardSchemaV1> = (\n value: StandardSchemaV1.InferInput<T>,\n context?: {\n arguments?: Record<string, string>;\n }\n) => StandardSchemaV1.InferInput<T>[] | Promise<StandardSchemaV1.InferInput<T>[]>;\n\nexport type CompletableMeta<T extends StandardSchemaV1 = StandardSchemaV1> = {\n complete: CompleteCallback<T>;\n};\n\nexport type CompletableSchema<T extends StandardSchemaV1> = T & {\n [COMPLETABLE_SYMBOL]: CompletableMeta<T>;\n};\n\n/**\n * Wraps a schema to provide autocompletion capabilities. Useful for, e.g., prompt arguments in MCP.\n *\n * @example\n * ```ts source=\"./completable.examples.ts#completable_basicUsage\"\n * server.registerPrompt(\n * 'review-code',\n * {\n * title: 'Code Review',\n * argsSchema: z.object({\n * language: completable(z.string().describe('Programming language'), value =>\n * ['typescript', 'javascript', 'python', 'rust', 'go'].filter(lang => lang.startsWith(value))\n * )\n * })\n * },\n * ({ language }) => ({\n * messages: [\n * {\n * role: 'user' as const,\n * content: {\n * type: 'text' as const,\n * text: `Review this ${language} code.`\n * }\n * }\n * ]\n * })\n * );\n * ```\n *\n * @see {@linkcode server/mcp.McpServer.registerPrompt | McpServer.registerPrompt} for using completable schemas in prompt argument definitions\n */\nexport function completable<T extends StandardSchemaV1>(schema: T, complete: CompleteCallback<T>): CompletableSchema<T> {\n Object.defineProperty(schema as object, COMPLETABLE_SYMBOL, {\n value: { complete } as CompletableMeta<T>,\n enumerable: false,\n writable: false,\n configurable: false\n });\n return schema as CompletableSchema<T>;\n}\n\n/**\n * Checks if a schema is completable (has completion metadata).\n */\nexport function isCompletable(schema: unknown): schema is CompletableSchema<StandardSchemaV1> {\n return !!schema && typeof schema === 'object' && COMPLETABLE_SYMBOL in (schema as object);\n}\n\n/**\n * Gets the completer callback from a completable schema, if it exists.\n */\nexport function getCompleter<T extends StandardSchemaV1>(schema: T): CompleteCallback<T> | undefined {\n const meta = (schema as unknown as { [COMPLETABLE_SYMBOL]?: CompletableMeta<T> })[COMPLETABLE_SYMBOL];\n return meta?.complete as CompleteCallback<T> | undefined;\n}\n","import type {\n BaseContext,\n ClientCapabilities,\n CreateMessageRequest,\n CreateMessageRequestParamsBase,\n CreateMessageRequestParamsWithTools,\n CreateMessageResult,\n CreateMessageResultWithTools,\n ElicitRequestFormParams,\n ElicitRequestURLParams,\n ElicitResult,\n Implementation,\n InitializeRequest,\n InitializeResult,\n JSONRPCRequest,\n JsonSchemaType,\n jsonSchemaValidator,\n ListRootsRequest,\n LoggingLevel,\n LoggingMessageNotification,\n MessageExtraInfo,\n NotificationMethod,\n NotificationOptions,\n ProtocolOptions,\n RequestMethod,\n RequestOptions,\n ResourceUpdatedNotification,\n Result,\n ServerCapabilities,\n ServerContext,\n ToolResultContent,\n ToolUseContent\n} from '@modelcontextprotocol/core-internal';\nimport {\n CallToolRequestSchema,\n CallToolResultSchema,\n CreateMessageResultSchema,\n CreateMessageResultWithToolsSchema,\n ElicitResultSchema,\n EmptyResultSchema,\n LATEST_PROTOCOL_VERSION,\n ListRootsResultSchema,\n LoggingLevelSchema,\n mergeCapabilities,\n parseSchema,\n Protocol,\n ProtocolError,\n ProtocolErrorCode,\n SdkError,\n SdkErrorCode\n} from '@modelcontextprotocol/core-internal';\nimport { DefaultJsonSchemaValidator } from '@modelcontextprotocol/server/_shims';\n\nexport type ServerOptions = ProtocolOptions & {\n /**\n * Capabilities to advertise as being supported by this server.\n *\n * Note: per the MCP spec, a server that declares a capability MUST respond to that\n * capability's requests (e.g. `tools/list` for `tools`) — potentially with an empty\n * result — rather than with a \"Method not found\" error. {@linkcode server/mcp.McpServer | McpServer}\n * handles this automatically for capabilities declared here; when using the low-level\n * {@linkcode Server} directly, you are responsible for registering a request handler for\n * every capability you declare.\n */\n capabilities?: ServerCapabilities;\n\n /**\n * Optional instructions describing how to use the server and its features.\n */\n instructions?: string;\n\n /**\n * JSON Schema validator for elicitation response validation.\n *\n * The validator is used to validate user input returned from elicitation\n * requests against the requested schema.\n *\n * @default Runtime-selected validator (AJV-backed on Node.js, `@cfworker/json-schema`-backed on browser/workerd runtimes)\n */\n jsonSchemaValidator?: jsonSchemaValidator;\n};\n\n/**\n * An MCP server on top of a pluggable transport.\n *\n * This server will automatically respond to the initialization flow as initiated from the client.\n *\n * @deprecated Use {@linkcode server/mcp.McpServer | McpServer} instead for the high-level API. Only use `Server` for advanced use cases.\n */\nexport class Server extends Protocol<ServerContext> {\n private _clientCapabilities?: ClientCapabilities;\n private _clientVersion?: Implementation;\n private _negotiatedProtocolVersion?: string;\n private _capabilities: ServerCapabilities;\n private _instructions?: string;\n private _jsonSchemaValidator: jsonSchemaValidator;\n\n /**\n * Callback for when initialization has fully completed (i.e., the client has sent an `notifications/initialized` notification).\n */\n oninitialized?: () => void;\n\n /**\n * Initializes this server with the given name and version information.\n */\n constructor(\n private _serverInfo: Implementation,\n options?: ServerOptions\n ) {\n super(options);\n this._capabilities = options?.capabilities ? { ...options.capabilities } : {};\n this._instructions = options?.instructions;\n this._jsonSchemaValidator = options?.jsonSchemaValidator ?? new DefaultJsonSchemaValidator();\n\n this.setRequestHandler('initialize', request => this._oninitialize(request));\n this.setNotificationHandler('notifications/initialized', () => this.oninitialized?.());\n\n if (this._capabilities.logging) {\n this._registerLoggingHandler();\n }\n }\n\n /**\n * Registers the built-in `logging/setLevel` request handler.\n *\n * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577).\n * Remains functional during the deprecation window (at least twelve months).\n * Migrate to stderr logging (STDIO servers) or OpenTelemetry.\n */\n private _registerLoggingHandler(): void {\n this.setRequestHandler('logging/setLevel', async (request, ctx) => {\n const transportSessionId: string | undefined =\n ctx.sessionId || (ctx.http?.req?.headers.get('mcp-session-id') as string) || undefined;\n const { level } = request.params;\n const parseResult = parseSchema(LoggingLevelSchema, level);\n if (parseResult.success) {\n this._loggingLevels.set(transportSessionId, parseResult.data);\n }\n return {};\n });\n }\n\n protected override buildContext(ctx: BaseContext, transportInfo?: MessageExtraInfo): ServerContext {\n // Only create http when there's actual HTTP transport info or auth info\n const hasHttpInfo = ctx.http || transportInfo?.request || transportInfo?.closeSSEStream || transportInfo?.closeStandaloneSSEStream;\n return {\n ...ctx,\n mcpReq: {\n ...ctx.mcpReq,\n // Deprecated as of protocol version 2026-07-28 (SEP-2577): `log` and\n // `requestSampling` remain functional during the deprecation window\n // (at least twelve months). See ServerContext for migration guidance.\n log: (level, data, logger) => this.sendLoggingMessage({ level, data, logger }),\n elicitInput: (params, options) => this.elicitInput(params, options),\n requestSampling: (params, options) => this.createMessage(params, options)\n },\n http: hasHttpInfo\n ? {\n ...ctx.http,\n req: transportInfo?.request,\n closeSSE: transportInfo?.closeSSEStream,\n closeStandaloneSSE: transportInfo?.closeStandaloneSSEStream\n }\n : undefined\n };\n }\n\n // Map log levels by session id\n private _loggingLevels = new Map<string | undefined, LoggingLevel>();\n\n // Map LogLevelSchema to severity index\n private readonly LOG_LEVEL_SEVERITY = new Map(LoggingLevelSchema.options.map((level, index) => [level, index]));\n\n // Is a message with the given level ignored in the log level set for the given session id?\n private isMessageIgnored = (level: LoggingLevel, sessionId?: string): boolean => {\n const currentLevel = this._loggingLevels.get(sessionId);\n return currentLevel ? this.LOG_LEVEL_SEVERITY.get(level)! < this.LOG_LEVEL_SEVERITY.get(currentLevel)! : false;\n };\n\n /**\n * Registers new capabilities. This can only be called before connecting to a transport.\n *\n * The new capabilities will be merged with any existing capabilities previously given (e.g., at initialization).\n */\n public registerCapabilities(capabilities: ServerCapabilities): void {\n if (this.transport) {\n throw new SdkError(SdkErrorCode.AlreadyConnected, 'Cannot register capabilities after connecting to transport');\n }\n const hadLogging = !!this._capabilities.logging;\n this._capabilities = mergeCapabilities(this._capabilities, capabilities);\n if (!hadLogging && this._capabilities.logging) {\n this._registerLoggingHandler();\n }\n }\n\n /**\n * Enforces server-side validation for `tools/call` results regardless of how the\n * handler was registered.\n */\n protected override _wrapHandler(\n method: string,\n handler: (request: JSONRPCRequest, ctx: ServerContext) => Promise<Result>\n ): (request: JSONRPCRequest, ctx: ServerContext) => Promise<Result> {\n if (method !== 'tools/call') {\n return handler;\n }\n return async (request, ctx) => {\n const validatedRequest = parseSchema(CallToolRequestSchema, request);\n if (!validatedRequest.success) {\n const errorMessage =\n validatedRequest.error instanceof Error ? validatedRequest.error.message : String(validatedRequest.error);\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid tools/call request: ${errorMessage}`);\n }\n\n const result = await handler(request, ctx);\n\n const validationResult = parseSchema(CallToolResultSchema, result);\n if (!validationResult.success) {\n const errorMessage =\n validationResult.error instanceof Error ? validationResult.error.message : String(validationResult.error);\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid tools/call result: ${errorMessage}`);\n }\n\n return validationResult.data;\n };\n }\n\n protected assertCapabilityForMethod(method: RequestMethod | string): void {\n switch (method) {\n case 'sampling/createMessage': {\n if (!this._clientCapabilities?.sampling) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Client does not support sampling (required for ${method})`);\n }\n break;\n }\n\n case 'elicitation/create': {\n if (!this._clientCapabilities?.elicitation) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Client does not support elicitation (required for ${method})`);\n }\n break;\n }\n\n case 'roots/list': {\n if (!this._clientCapabilities?.roots) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Client does not support listing roots (required for ${method})`\n );\n }\n break;\n }\n\n case 'ping': {\n // No specific capability required for ping\n break;\n }\n }\n }\n\n protected assertNotificationCapability(method: NotificationMethod | string): void {\n switch (method) {\n case 'notifications/message': {\n if (!this._capabilities.logging) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support logging (required for ${method})`);\n }\n break;\n }\n\n case 'notifications/resources/updated':\n case 'notifications/resources/list_changed': {\n if (!this._capabilities.resources) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Server does not support notifying about resources (required for ${method})`\n );\n }\n break;\n }\n\n case 'notifications/tools/list_changed': {\n if (!this._capabilities.tools) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Server does not support notifying of tool list changes (required for ${method})`\n );\n }\n break;\n }\n\n case 'notifications/prompts/list_changed': {\n if (!this._capabilities.prompts) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Server does not support notifying of prompt list changes (required for ${method})`\n );\n }\n break;\n }\n\n case 'notifications/elicitation/complete': {\n if (!this._clientCapabilities?.elicitation?.url) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n `Client does not support URL elicitation (required for ${method})`\n );\n }\n break;\n }\n\n case 'notifications/cancelled': {\n // Cancellation notifications are always allowed\n break;\n }\n\n case 'notifications/progress': {\n // Progress notifications are always allowed\n break;\n }\n }\n }\n\n protected assertRequestHandlerCapability(method: string): void {\n switch (method) {\n case 'completion/complete': {\n if (!this._capabilities.completions) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support completions (required for ${method})`);\n }\n break;\n }\n\n case 'logging/setLevel': {\n if (!this._capabilities.logging) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support logging (required for ${method})`);\n }\n break;\n }\n\n case 'prompts/get':\n case 'prompts/list': {\n if (!this._capabilities.prompts) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support prompts (required for ${method})`);\n }\n break;\n }\n\n case 'resources/list':\n case 'resources/templates/list':\n case 'resources/read': {\n if (!this._capabilities.resources) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support resources (required for ${method})`);\n }\n break;\n }\n\n case 'tools/call':\n case 'tools/list': {\n if (!this._capabilities.tools) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, `Server does not support tools (required for ${method})`);\n }\n break;\n }\n\n case 'ping':\n case 'initialize': {\n // No specific capability required for these methods\n break;\n }\n }\n }\n\n private async _oninitialize(request: InitializeRequest): Promise<InitializeResult> {\n const requestedVersion = request.params.protocolVersion;\n\n this._clientCapabilities = request.params.capabilities;\n this._clientVersion = request.params.clientInfo;\n\n const protocolVersion = this._supportedProtocolVersions.includes(requestedVersion)\n ? requestedVersion\n : (this._supportedProtocolVersions[0] ?? LATEST_PROTOCOL_VERSION);\n\n this._negotiatedProtocolVersion = protocolVersion;\n this.transport?.setProtocolVersion?.(protocolVersion);\n\n return {\n protocolVersion,\n capabilities: this.getCapabilities(),\n serverInfo: this._serverInfo,\n ...(this._instructions && { instructions: this._instructions })\n };\n }\n\n /**\n * After initialization has completed, this will be populated with the client's reported capabilities.\n */\n getClientCapabilities(): ClientCapabilities | undefined {\n return this._clientCapabilities;\n }\n\n /**\n * After initialization has completed, this will be populated with information about the client's name and version.\n */\n getClientVersion(): Implementation | undefined {\n return this._clientVersion;\n }\n\n /**\n * After initialization has completed, this will be populated with the protocol version negotiated\n * with the client (the version the server responded with during the initialize handshake), or\n * `undefined` before initialization.\n */\n getNegotiatedProtocolVersion(): string | undefined {\n return this._negotiatedProtocolVersion;\n }\n\n /**\n * Returns the current server capabilities.\n */\n public getCapabilities(): ServerCapabilities {\n return this._capabilities;\n }\n\n async ping() {\n return this._requestWithSchema({ method: 'ping' }, EmptyResultSchema);\n }\n\n /**\n * Request LLM sampling from the client (without tools).\n * Returns single content block for backwards compatibility.\n *\n * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577).\n * Remains functional during the deprecation window (at least twelve months).\n * Migrate to calling LLM provider APIs directly.\n */\n async createMessage(params: CreateMessageRequestParamsBase, options?: RequestOptions): Promise<CreateMessageResult>;\n\n /**\n * Request LLM sampling from the client with tool support.\n * Returns content that may be a single block or array (for parallel tool calls).\n *\n * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577).\n * Remains functional during the deprecation window (at least twelve months).\n * Migrate to calling LLM provider APIs directly.\n */\n async createMessage(params: CreateMessageRequestParamsWithTools, options?: RequestOptions): Promise<CreateMessageResultWithTools>;\n\n /**\n * Request LLM sampling from the client.\n * When tools may or may not be present, returns the union type.\n *\n * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577).\n * Remains functional during the deprecation window (at least twelve months).\n * Migrate to calling LLM provider APIs directly.\n */\n async createMessage(\n params: CreateMessageRequest['params'],\n options?: RequestOptions\n ): Promise<CreateMessageResult | CreateMessageResultWithTools>;\n\n // Implementation\n async createMessage(\n params: CreateMessageRequest['params'],\n options?: RequestOptions\n ): Promise<CreateMessageResult | CreateMessageResultWithTools> {\n // Capability check - only required when tools/toolChoice are provided\n if ((params.tools || params.toolChoice) && !this._clientCapabilities?.sampling?.tools) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support sampling tools capability.');\n }\n\n // Message structure validation - always validate tool_use/tool_result pairs.\n // These may appear even without tools/toolChoice in the current request when\n // a previous sampling request returned tool_use and this is a follow-up with results.\n if (params.messages.length > 0) {\n const lastMessage = params.messages.at(-1)!;\n const lastContent = Array.isArray(lastMessage.content) ? lastMessage.content : [lastMessage.content];\n const hasToolResults = lastContent.some(c => c.type === 'tool_result');\n\n const previousMessage = params.messages.length > 1 ? params.messages.at(-2) : undefined;\n const previousContent = previousMessage\n ? Array.isArray(previousMessage.content)\n ? previousMessage.content\n : [previousMessage.content]\n : [];\n const hasPreviousToolUse = previousContent.some(c => c.type === 'tool_use');\n\n if (hasToolResults) {\n if (lastContent.some(c => c.type !== 'tool_result')) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n 'The last message must contain only tool_result content if any is present'\n );\n }\n if (!hasPreviousToolUse) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n 'tool_result blocks are not matching any tool_use from the previous message'\n );\n }\n }\n if (hasPreviousToolUse) {\n const toolUseIds = new Set(previousContent.filter(c => c.type === 'tool_use').map(c => (c as ToolUseContent).id));\n const toolResultIds = new Set(\n lastContent.filter(c => c.type === 'tool_result').map(c => (c as ToolResultContent).toolUseId)\n );\n if (toolUseIds.size !== toolResultIds.size || ![...toolUseIds].every(id => toolResultIds.has(id))) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n 'ids of tool_result blocks and tool_use blocks from previous message do not match'\n );\n }\n }\n }\n\n // Use different schemas based on whether tools are provided\n if (params.tools) {\n return this._requestWithSchema({ method: 'sampling/createMessage', params }, CreateMessageResultWithToolsSchema, options);\n }\n return this._requestWithSchema({ method: 'sampling/createMessage', params }, CreateMessageResultSchema, options);\n }\n\n /**\n * Creates an elicitation request for the given parameters.\n * For backwards compatibility, `mode` may be omitted for form requests and will default to `\"form\"`.\n * @param params The parameters for the elicitation request.\n * @param options Optional request options.\n * @returns The result of the elicitation request.\n */\n async elicitInput(params: ElicitRequestFormParams | ElicitRequestURLParams, options?: RequestOptions): Promise<ElicitResult> {\n const mode = (params.mode ?? 'form') as 'form' | 'url';\n\n switch (mode) {\n case 'url': {\n if (!this._clientCapabilities?.elicitation?.url) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support url elicitation.');\n }\n\n const urlParams = params as ElicitRequestURLParams;\n return this._requestWithSchema({ method: 'elicitation/create', params: urlParams }, ElicitResultSchema, options);\n }\n case 'form': {\n if (!this._clientCapabilities?.elicitation?.form) {\n throw new SdkError(SdkErrorCode.CapabilityNotSupported, 'Client does not support form elicitation.');\n }\n\n const formParams: ElicitRequestFormParams =\n params.mode === 'form' ? (params as ElicitRequestFormParams) : { ...(params as ElicitRequestFormParams), mode: 'form' };\n\n const result = await this._requestWithSchema(\n { method: 'elicitation/create', params: formParams },\n ElicitResultSchema,\n options\n );\n\n if (result.action === 'accept' && result.content && formParams.requestedSchema) {\n try {\n const validator = this._jsonSchemaValidator.getValidator(formParams.requestedSchema as JsonSchemaType);\n const validationResult = validator(result.content);\n\n if (!validationResult.valid) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Elicitation response content does not match requested schema: ${validationResult.errorMessage}`\n );\n }\n } catch (error) {\n if (error instanceof ProtocolError) {\n throw error;\n }\n throw new ProtocolError(\n ProtocolErrorCode.InternalError,\n `Error validating elicitation response: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n return result;\n }\n }\n }\n\n /**\n * Creates a reusable callback that, when invoked, will send a `notifications/elicitation/complete`\n * notification for the specified elicitation ID.\n *\n * @param elicitationId The ID of the elicitation to mark as complete.\n * @param options Optional notification options. Useful when the completion notification should be related to a prior request.\n * @returns A function that emits the completion notification when awaited.\n */\n createElicitationCompletionNotifier(elicitationId: string, options?: NotificationOptions): () => Promise<void> {\n if (!this._clientCapabilities?.elicitation?.url) {\n throw new SdkError(\n SdkErrorCode.CapabilityNotSupported,\n 'Client does not support URL elicitation (required for notifications/elicitation/complete)'\n );\n }\n\n return () =>\n this.notification(\n {\n method: 'notifications/elicitation/complete',\n params: {\n elicitationId\n }\n },\n options\n );\n }\n\n /**\n * Requests the list of roots from the client.\n *\n * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577).\n * Remains functional during the deprecation window (at least twelve months).\n * Migrate to passing paths via tool parameters, resource URIs, or configuration.\n */\n async listRoots(params?: ListRootsRequest['params'], options?: RequestOptions) {\n return this._requestWithSchema({ method: 'roots/list', params }, ListRootsResultSchema, options);\n }\n\n /**\n * Sends a logging message to the client, if connected.\n * Note: You only need to send the parameters object, not the entire JSON-RPC message.\n * @see {@linkcode LoggingMessageNotification}\n * @param params\n * @param sessionId Optional for stateless transports and backward compatibility.\n *\n * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577).\n * Remains functional during the deprecation window (at least twelve months).\n * Migrate to stderr logging (STDIO servers) or OpenTelemetry.\n */\n async sendLoggingMessage(params: LoggingMessageNotification['params'], sessionId?: string) {\n if (this._capabilities.logging && !this.isMessageIgnored(params.level, sessionId)) {\n return this.notification({ method: 'notifications/message', params });\n }\n }\n\n async sendResourceUpdated(params: ResourceUpdatedNotification['params']) {\n return this.notification({\n method: 'notifications/resources/updated',\n params\n });\n }\n\n async sendResourceListChanged() {\n return this.notification({\n method: 'notifications/resources/list_changed'\n });\n }\n\n async sendToolListChanged() {\n return this.notification({ method: 'notifications/tools/list_changed' });\n }\n\n async sendPromptListChanged() {\n return this.notification({ method: 'notifications/prompts/list_changed' });\n }\n}\n","import type {\n BaseMetadata,\n CallToolResult,\n CompleteRequestPrompt,\n CompleteRequestResourceTemplate,\n CompleteResult,\n GetPromptResult,\n Icon,\n Implementation,\n ListPromptsResult,\n ListResourcesResult,\n ListToolsResult,\n LoggingMessageNotification,\n Prompt,\n PromptReference,\n ReadResourceResult,\n Resource,\n ResourceTemplateReference,\n Result,\n ServerContext,\n StandardSchemaWithJSON,\n Tool,\n ToolAnnotations,\n ToolExecution,\n Transport,\n Variables\n} from '@modelcontextprotocol/core-internal';\nimport {\n assertCompleteRequestPrompt,\n assertCompleteRequestResourceTemplate,\n normalizeRawShapeSchema,\n promptArgumentsFromStandardSchema,\n ProtocolError,\n ProtocolErrorCode,\n standardSchemaToJsonSchema,\n UriTemplate,\n validateAndWarnToolName,\n validateStandardSchema\n} from '@modelcontextprotocol/core-internal';\nimport type * as z from 'zod/v4';\n\nimport { getCompleter, isCompletable } from './completable';\nimport type { ServerOptions } from './server';\nimport { Server } from './server';\n\n/**\n * High-level MCP server that provides a simpler API for working with resources, tools, and prompts.\n * For advanced usage (like sending notifications or setting custom request handlers), use the underlying\n * {@linkcode Server} instance available via the {@linkcode McpServer.server | server} property.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_basicUsage\"\n * const server = new McpServer({\n * name: 'my-server',\n * version: '1.0.0'\n * });\n * ```\n */\nexport class McpServer {\n /**\n * The underlying {@linkcode Server} instance, useful for advanced operations like sending notifications.\n */\n public readonly server: Server;\n\n private _registeredResources: { [uri: string]: RegisteredResource } = {};\n private _registeredResourceTemplates: {\n [name: string]: RegisteredResourceTemplate;\n } = {};\n private _registeredTools: { [name: string]: RegisteredTool } = {};\n private _registeredPrompts: { [name: string]: RegisteredPrompt } = {};\n\n constructor(serverInfo: Implementation, options?: ServerOptions) {\n this.server = new Server(serverInfo, options);\n\n // Per the MCP spec, a server that declares a primitive capability MUST respond to its\n // list method (potentially with an empty result) rather than \"Method not found\" — even\n // if nothing has been registered yet. Handlers are normally installed lazily on first\n // registration, so eagerly install them here for any capability declared up front.\n // (Users of the low-level `Server` class remain responsible for their own handlers.)\n if (options?.capabilities?.tools) {\n this.setToolRequestHandlers();\n }\n if (options?.capabilities?.resources) {\n this.setResourceRequestHandlers();\n }\n if (options?.capabilities?.prompts) {\n this.setPromptRequestHandlers();\n }\n }\n\n /**\n * Attaches to the given transport, starts it, and starts listening for messages.\n *\n * The `server` object assumes ownership of the {@linkcode Transport}, replacing any callbacks that have already been set, and expects that it is the only user of the {@linkcode Transport} instance going forward.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_connect_stdio\"\n * const server = new McpServer({ name: 'my-server', version: '1.0.0' });\n * const transport = new StdioServerTransport();\n * await server.connect(transport);\n * ```\n */\n async connect(transport: Transport): Promise<void> {\n return await this.server.connect(transport);\n }\n\n /**\n * Closes the connection.\n */\n async close(): Promise<void> {\n await this.server.close();\n }\n\n private _toolHandlersInitialized = false;\n\n private setToolRequestHandlers() {\n if (this._toolHandlersInitialized) {\n return;\n }\n\n this.server.assertCanSetRequestHandler('tools/list');\n this.server.assertCanSetRequestHandler('tools/call');\n\n this.server.registerCapabilities({\n tools: {\n listChanged: this.server.getCapabilities().tools?.listChanged ?? true\n }\n });\n\n // Note: tools are listed in registration (insertion) order, which keeps the ordering\n // deterministic across requests when the underlying tool set has not changed, as\n // recommended by the spec.\n this.server.setRequestHandler(\n 'tools/list',\n (): ListToolsResult => ({\n tools: Object.entries(this._registeredTools)\n .filter(([, tool]) => tool.enabled)\n .map(([name, tool]): Tool => {\n const toolDefinition: Tool = {\n name,\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema\n ? (standardSchemaToJsonSchema(tool.inputSchema, 'input') as Tool['inputSchema'])\n : EMPTY_OBJECT_JSON_SCHEMA,\n annotations: tool.annotations,\n icons: tool.icons,\n execution: tool.execution,\n _meta: tool._meta\n };\n\n if (tool.outputSchema) {\n toolDefinition.outputSchema = standardSchemaToJsonSchema(tool.outputSchema, 'output') as Tool['outputSchema'];\n }\n\n return toolDefinition;\n })\n })\n );\n\n this.server.setRequestHandler('tools/call', async (request, ctx): Promise<CallToolResult> => {\n const tool = this._registeredTools[request.params.name];\n if (!tool) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Tool ${request.params.name} not found`);\n }\n if (!tool.enabled) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Tool ${request.params.name} disabled`);\n }\n\n try {\n const args = await this.validateToolInput(tool, request.params.arguments, request.params.name);\n const result = await this.executeToolHandler(tool, args, ctx);\n await this.validateToolOutput(tool, result, request.params.name);\n return result;\n } catch (error) {\n if (error instanceof ProtocolError && error.code === ProtocolErrorCode.UrlElicitationRequired) {\n throw error; // Return the error to the caller without wrapping in CallToolResult\n }\n return this.createToolError(error instanceof Error ? error.message : String(error));\n }\n });\n\n this._toolHandlersInitialized = true;\n }\n\n /**\n * Creates a tool error result.\n *\n * @param errorMessage - The error message.\n * @returns The tool error result.\n */\n private createToolError(errorMessage: string): CallToolResult {\n return {\n content: [\n {\n type: 'text',\n text: errorMessage\n }\n ],\n isError: true\n };\n }\n\n /**\n * Validates tool input arguments against the tool's input schema.\n */\n private async validateToolInput<\n ToolType extends RegisteredTool,\n Args extends ToolType['inputSchema'] extends infer InputSchema\n ? InputSchema extends StandardSchemaWithJSON\n ? StandardSchemaWithJSON.InferOutput<InputSchema>\n : undefined\n : undefined\n >(tool: ToolType, args: Args, toolName: string): Promise<Args> {\n if (!tool.inputSchema) {\n return undefined as Args;\n }\n\n const parseResult = await validateStandardSchema(tool.inputSchema, args ?? {});\n if (!parseResult.success) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Input validation error: Invalid arguments for tool ${toolName}: ${parseResult.error}`\n );\n }\n\n return parseResult.data as unknown as Args;\n }\n\n /**\n * Validates tool output against the tool's output schema.\n */\n private async validateToolOutput(tool: RegisteredTool, result: CallToolResult, toolName: string): Promise<void> {\n if (!tool.outputSchema) {\n return;\n }\n\n if (result.isError) {\n return;\n }\n\n if (!result.structuredContent) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Output validation error: Tool ${toolName} has an output schema but no structured content was provided`\n );\n }\n\n // if the tool has an output schema, validate structured content\n const parseResult = await validateStandardSchema(tool.outputSchema, result.structuredContent);\n if (!parseResult.success) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Output validation error: Invalid structured content for tool ${toolName}: ${parseResult.error}`\n );\n }\n }\n\n /**\n * Executes a tool handler.\n */\n private async executeToolHandler(tool: RegisteredTool, args: unknown, ctx: ServerContext): Promise<CallToolResult> {\n // Executor encapsulates handler invocation with proper types\n return tool.executor(args, ctx);\n }\n\n private _completionHandlerInitialized = false;\n\n private setCompletionRequestHandler() {\n if (this._completionHandlerInitialized) {\n return;\n }\n\n this.server.assertCanSetRequestHandler('completion/complete');\n\n this.server.registerCapabilities({\n completions: {}\n });\n\n this.server.setRequestHandler('completion/complete', async (request): Promise<CompleteResult> => {\n switch (request.params.ref.type) {\n case 'ref/prompt': {\n assertCompleteRequestPrompt(request);\n return this.handlePromptCompletion(request, request.params.ref);\n }\n\n case 'ref/resource': {\n assertCompleteRequestResourceTemplate(request);\n return this.handleResourceCompletion(request, request.params.ref);\n }\n\n default: {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid completion reference: ${request.params.ref}`);\n }\n }\n });\n\n this._completionHandlerInitialized = true;\n }\n\n private async handlePromptCompletion(request: CompleteRequestPrompt, ref: PromptReference): Promise<CompleteResult> {\n const prompt = this._registeredPrompts[ref.name];\n if (!prompt) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Prompt ${ref.name} not found`);\n }\n\n if (!prompt.enabled) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Prompt ${ref.name} disabled`);\n }\n\n if (!prompt.argsSchema) {\n return EMPTY_COMPLETION_RESULT;\n }\n\n const promptShape = getSchemaShape(prompt.argsSchema);\n const field = unwrapOptionalSchema(promptShape?.[request.params.argument.name]);\n if (!isCompletable(field)) {\n return EMPTY_COMPLETION_RESULT;\n }\n\n const completer = getCompleter(field);\n if (!completer) {\n return EMPTY_COMPLETION_RESULT;\n }\n\n const suggestions = await completer(request.params.argument.value, request.params.context);\n return createCompletionResult(suggestions);\n }\n\n private async handleResourceCompletion(\n request: CompleteRequestResourceTemplate,\n ref: ResourceTemplateReference\n ): Promise<CompleteResult> {\n const template = Object.values(this._registeredResourceTemplates).find(t => t.resourceTemplate.uriTemplate.toString() === ref.uri);\n\n if (!template) {\n if (this._registeredResources[ref.uri]) {\n // Attempting to autocomplete a fixed resource URI is not an error in the spec (but probably should be).\n return EMPTY_COMPLETION_RESULT;\n }\n\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Resource template ${request.params.ref.uri} not found`);\n }\n\n const completer = template.resourceTemplate.completeCallback(request.params.argument.name);\n if (!completer) {\n return EMPTY_COMPLETION_RESULT;\n }\n\n const suggestions = await completer(request.params.argument.value, request.params.context);\n return createCompletionResult(suggestions);\n }\n\n private _resourceHandlersInitialized = false;\n\n private setResourceRequestHandlers() {\n if (this._resourceHandlersInitialized) {\n return;\n }\n\n this.server.assertCanSetRequestHandler('resources/list');\n this.server.assertCanSetRequestHandler('resources/templates/list');\n this.server.assertCanSetRequestHandler('resources/read');\n\n this.server.registerCapabilities({\n resources: {\n listChanged: this.server.getCapabilities().resources?.listChanged ?? true\n }\n });\n\n this.server.setRequestHandler('resources/list', async (_request, ctx) => {\n const resources = Object.entries(this._registeredResources)\n .filter(([_, resource]) => resource.enabled)\n .map(([uri, resource]) => ({\n uri,\n name: resource.name,\n ...resource.metadata\n }));\n\n const templateResources: Resource[] = [];\n for (const template of Object.values(this._registeredResourceTemplates)) {\n if (!template.resourceTemplate.listCallback) {\n continue;\n }\n\n const result = await template.resourceTemplate.listCallback(ctx);\n for (const resource of result.resources) {\n templateResources.push({\n ...template.metadata,\n // the defined resource metadata should override the template metadata if present\n ...resource\n });\n }\n }\n\n return { resources: [...resources, ...templateResources] };\n });\n\n this.server.setRequestHandler('resources/templates/list', async () => {\n const resourceTemplates = Object.entries(this._registeredResourceTemplates).map(([name, template]) => ({\n name,\n uriTemplate: template.resourceTemplate.uriTemplate.toString(),\n ...template.metadata\n }));\n\n return { resourceTemplates };\n });\n\n this.server.setRequestHandler('resources/read', async (request, ctx) => {\n const uri = new URL(request.params.uri);\n\n // First check for exact resource match\n const resource = this._registeredResources[uri.toString()];\n if (resource) {\n if (!resource.enabled) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Resource ${uri} disabled`);\n }\n return resource.readCallback(uri, ctx);\n }\n\n // Then check templates\n for (const template of Object.values(this._registeredResourceTemplates)) {\n const variables = template.resourceTemplate.uriTemplate.match(uri.toString());\n if (variables) {\n return template.readCallback(uri, variables, ctx);\n }\n }\n\n throw new ProtocolError(ProtocolErrorCode.ResourceNotFound, `Resource ${uri} not found`);\n });\n\n this._resourceHandlersInitialized = true;\n }\n\n private _promptHandlersInitialized = false;\n\n private setPromptRequestHandlers() {\n if (this._promptHandlersInitialized) {\n return;\n }\n\n this.server.assertCanSetRequestHandler('prompts/list');\n this.server.assertCanSetRequestHandler('prompts/get');\n\n this.server.registerCapabilities({\n prompts: {\n listChanged: this.server.getCapabilities().prompts?.listChanged ?? true\n }\n });\n\n this.server.setRequestHandler(\n 'prompts/list',\n (): ListPromptsResult => ({\n prompts: Object.entries(this._registeredPrompts)\n .filter(([, prompt]) => prompt.enabled)\n .map(([name, prompt]): Prompt => {\n return {\n name,\n title: prompt.title,\n description: prompt.description,\n arguments: prompt.argsSchema ? promptArgumentsFromStandardSchema(prompt.argsSchema) : undefined,\n icons: prompt.icons,\n _meta: prompt._meta\n };\n })\n })\n );\n\n this.server.setRequestHandler('prompts/get', async (request, ctx): Promise<GetPromptResult> => {\n const prompt = this._registeredPrompts[request.params.name];\n if (!prompt) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Prompt ${request.params.name} not found`);\n }\n\n if (!prompt.enabled) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Prompt ${request.params.name} disabled`);\n }\n\n // Handler encapsulates parsing and callback invocation with proper types\n return prompt.handler(request.params.arguments, ctx);\n });\n\n this._promptHandlersInitialized = true;\n }\n\n /**\n * Registers a resource with a config object and callback.\n * For static resources, use a URI string. For dynamic resources, use a {@linkcode ResourceTemplate}.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_registerResource_static\"\n * server.registerResource(\n * 'config',\n * 'config://app',\n * {\n * title: 'Application Config',\n * mimeType: 'text/plain'\n * },\n * async uri => ({\n * contents: [{ uri: uri.href, text: 'App configuration here' }]\n * })\n * );\n * ```\n */\n registerResource(name: string, uriOrTemplate: string, config: ResourceMetadata, readCallback: ReadResourceCallback): RegisteredResource;\n registerResource(\n name: string,\n uriOrTemplate: ResourceTemplate,\n config: ResourceMetadata,\n readCallback: ReadResourceTemplateCallback\n ): RegisteredResourceTemplate;\n registerResource(\n name: string,\n uriOrTemplate: string | ResourceTemplate,\n config: ResourceMetadata,\n readCallback: ReadResourceCallback | ReadResourceTemplateCallback\n ): RegisteredResource | RegisteredResourceTemplate {\n if (typeof uriOrTemplate === 'string') {\n if (this._registeredResources[uriOrTemplate]) {\n throw new Error(`Resource ${uriOrTemplate} is already registered`);\n }\n\n const registeredResource = this._createRegisteredResource(\n name,\n (config as BaseMetadata).title,\n uriOrTemplate,\n config,\n readCallback as ReadResourceCallback\n );\n\n this.setResourceRequestHandlers();\n this.sendResourceListChanged();\n return registeredResource;\n } else {\n if (this._registeredResourceTemplates[name]) {\n throw new Error(`Resource template ${name} is already registered`);\n }\n\n const registeredResourceTemplate = this._createRegisteredResourceTemplate(\n name,\n (config as BaseMetadata).title,\n uriOrTemplate,\n config,\n readCallback as ReadResourceTemplateCallback\n );\n\n this.setResourceRequestHandlers();\n this.sendResourceListChanged();\n return registeredResourceTemplate;\n }\n }\n\n private _createRegisteredResource(\n name: string,\n title: string | undefined,\n uri: string,\n metadata: ResourceMetadata | undefined,\n readCallback: ReadResourceCallback\n ): RegisteredResource {\n const registeredResource: RegisteredResource = {\n name,\n title,\n metadata,\n readCallback,\n enabled: true,\n disable: () => registeredResource.update({ enabled: false }),\n enable: () => registeredResource.update({ enabled: true }),\n remove: () => registeredResource.update({ uri: null }),\n update: updates => {\n if (updates.uri !== undefined && updates.uri !== uri) {\n delete this._registeredResources[uri];\n if (updates.uri) this._registeredResources[updates.uri] = registeredResource;\n }\n if (updates.name !== undefined) registeredResource.name = updates.name;\n if (updates.title !== undefined) registeredResource.title = updates.title;\n if (updates.metadata !== undefined) registeredResource.metadata = updates.metadata;\n if (updates.callback !== undefined) registeredResource.readCallback = updates.callback;\n if (updates.enabled !== undefined) registeredResource.enabled = updates.enabled;\n this.sendResourceListChanged();\n }\n };\n this._registeredResources[uri] = registeredResource;\n return registeredResource;\n }\n\n private _createRegisteredResourceTemplate(\n name: string,\n title: string | undefined,\n template: ResourceTemplate,\n metadata: ResourceMetadata | undefined,\n readCallback: ReadResourceTemplateCallback\n ): RegisteredResourceTemplate {\n const registeredResourceTemplate: RegisteredResourceTemplate = {\n resourceTemplate: template,\n title,\n metadata,\n readCallback,\n enabled: true,\n disable: () => registeredResourceTemplate.update({ enabled: false }),\n enable: () => registeredResourceTemplate.update({ enabled: true }),\n remove: () => registeredResourceTemplate.update({ name: null }),\n update: updates => {\n if (updates.name !== undefined && updates.name !== name) {\n delete this._registeredResourceTemplates[name];\n if (updates.name) this._registeredResourceTemplates[updates.name] = registeredResourceTemplate;\n }\n if (updates.title !== undefined) registeredResourceTemplate.title = updates.title;\n if (updates.template !== undefined) registeredResourceTemplate.resourceTemplate = updates.template;\n if (updates.metadata !== undefined) registeredResourceTemplate.metadata = updates.metadata;\n if (updates.callback !== undefined) registeredResourceTemplate.readCallback = updates.callback;\n if (updates.enabled !== undefined) registeredResourceTemplate.enabled = updates.enabled;\n this.sendResourceListChanged();\n }\n };\n this._registeredResourceTemplates[name] = registeredResourceTemplate;\n\n // If the resource template has any completion callbacks, enable completions capability\n const variableNames = template.uriTemplate.variableNames;\n const hasCompleter = Array.isArray(variableNames) && variableNames.some(v => !!template.completeCallback(v));\n if (hasCompleter) {\n this.setCompletionRequestHandler();\n }\n\n return registeredResourceTemplate;\n }\n\n private _createRegisteredPrompt(\n name: string,\n title: string | undefined,\n description: string | undefined,\n argsSchema: StandardSchemaWithJSON | undefined,\n callback: PromptCallback<StandardSchemaWithJSON | undefined>,\n icons: Icon[] | undefined,\n _meta: Record<string, unknown> | undefined\n ): RegisteredPrompt {\n // Track current schema and callback for handler regeneration\n let currentArgsSchema = argsSchema;\n let currentCallback = callback;\n\n const registeredPrompt: RegisteredPrompt = {\n title,\n description,\n argsSchema,\n icons,\n _meta,\n handler: createPromptHandler(name, argsSchema, callback),\n enabled: true,\n disable: () => registeredPrompt.update({ enabled: false }),\n enable: () => registeredPrompt.update({ enabled: true }),\n remove: () => registeredPrompt.update({ name: null }),\n update: updates => {\n if (updates.name !== undefined && updates.name !== name) {\n delete this._registeredPrompts[name];\n if (updates.name) this._registeredPrompts[updates.name] = registeredPrompt;\n }\n if (updates.title !== undefined) registeredPrompt.title = updates.title;\n if (updates.description !== undefined) registeredPrompt.description = updates.description;\n if (updates.icons !== undefined) registeredPrompt.icons = updates.icons;\n if (updates._meta !== undefined) registeredPrompt._meta = updates._meta;\n\n // Track if we need to regenerate the handler\n let needsHandlerRegen = false;\n if (updates.argsSchema !== undefined) {\n registeredPrompt.argsSchema = updates.argsSchema;\n currentArgsSchema = updates.argsSchema;\n needsHandlerRegen = true;\n }\n if (updates.callback !== undefined) {\n currentCallback = updates.callback as PromptCallback<StandardSchemaWithJSON | undefined>;\n needsHandlerRegen = true;\n }\n if (needsHandlerRegen) {\n registeredPrompt.handler = createPromptHandler(name, currentArgsSchema, currentCallback);\n }\n\n if (updates.enabled !== undefined) registeredPrompt.enabled = updates.enabled;\n this.sendPromptListChanged();\n }\n };\n this._registeredPrompts[name] = registeredPrompt;\n\n // If any argument uses a Completable schema, enable completions capability\n if (argsSchema) {\n const shape = getSchemaShape(argsSchema);\n if (shape) {\n const hasCompletable = Object.values(shape).some(field => {\n const inner = unwrapOptionalSchema(field);\n return isCompletable(inner);\n });\n if (hasCompletable) {\n this.setCompletionRequestHandler();\n }\n }\n }\n\n return registeredPrompt;\n }\n\n private _createRegisteredTool(\n name: string,\n title: string | undefined,\n description: string | undefined,\n inputSchema: StandardSchemaWithJSON | undefined,\n outputSchema: StandardSchemaWithJSON | undefined,\n annotations: ToolAnnotations | undefined,\n icons: Icon[] | undefined,\n execution: ToolExecution | undefined,\n _meta: Record<string, unknown> | undefined,\n handler: AnyToolHandler<StandardSchemaWithJSON | undefined>\n ): RegisteredTool {\n // Validate tool name according to SEP specification\n validateAndWarnToolName(name);\n\n // Track current handler for executor regeneration\n let currentHandler = handler;\n\n const registeredTool: RegisteredTool = {\n title,\n description,\n inputSchema,\n outputSchema,\n annotations,\n icons,\n execution,\n _meta,\n handler: handler,\n executor: createToolExecutor(inputSchema, handler),\n enabled: true,\n disable: () => registeredTool.update({ enabled: false }),\n enable: () => registeredTool.update({ enabled: true }),\n remove: () => registeredTool.update({ name: null }),\n update: updates => {\n if (updates.name !== undefined && updates.name !== name) {\n if (typeof updates.name === 'string') {\n validateAndWarnToolName(updates.name);\n }\n delete this._registeredTools[name];\n if (updates.name) this._registeredTools[updates.name] = registeredTool;\n }\n if (updates.title !== undefined) registeredTool.title = updates.title;\n if (updates.description !== undefined) registeredTool.description = updates.description;\n\n // Track if we need to regenerate the executor\n let needsExecutorRegen = false;\n if (updates.paramsSchema !== undefined) {\n registeredTool.inputSchema = updates.paramsSchema;\n needsExecutorRegen = true;\n }\n if (updates.callback !== undefined) {\n registeredTool.handler = updates.callback;\n currentHandler = updates.callback as AnyToolHandler<StandardSchemaWithJSON | undefined>;\n needsExecutorRegen = true;\n }\n if (needsExecutorRegen) {\n registeredTool.executor = createToolExecutor(registeredTool.inputSchema, currentHandler);\n }\n\n if (updates.outputSchema !== undefined) registeredTool.outputSchema = updates.outputSchema;\n if (updates.annotations !== undefined) registeredTool.annotations = updates.annotations;\n if (updates.icons !== undefined) registeredTool.icons = updates.icons;\n if (updates._meta !== undefined) registeredTool._meta = updates._meta;\n if (updates.enabled !== undefined) registeredTool.enabled = updates.enabled;\n this.sendToolListChanged();\n }\n };\n this._registeredTools[name] = registeredTool;\n\n this.setToolRequestHandlers();\n this.sendToolListChanged();\n\n return registeredTool;\n }\n\n /**\n * Registers a tool with a config object and callback.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_registerTool_basic\"\n * server.registerTool(\n * 'calculate-bmi',\n * {\n * title: 'BMI Calculator',\n * description: 'Calculate Body Mass Index',\n * inputSchema: z.object({\n * weightKg: z.number(),\n * heightM: z.number()\n * }),\n * outputSchema: z.object({ bmi: z.number() })\n * },\n * async ({ weightKg, heightM }) => {\n * const output = { bmi: weightKg / (heightM * heightM) };\n * return {\n * content: [{ type: 'text', text: JSON.stringify(output) }],\n * structuredContent: output\n * };\n * }\n * );\n * ```\n */\n registerTool<OutputArgs extends StandardSchemaWithJSON, InputArgs extends StandardSchemaWithJSON | undefined = undefined>(\n name: string,\n config: {\n title?: string;\n description?: string;\n inputSchema?: InputArgs;\n outputSchema?: OutputArgs;\n annotations?: ToolAnnotations;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n },\n cb: ToolCallback<InputArgs>\n ): RegisteredTool;\n /** @deprecated Wrap with `z.object({...})` instead. Raw-shape form: `inputSchema`/`outputSchema` may be a plain `{ field: z.string() }` record; it is auto-wrapped with `z.object()`. */\n registerTool<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape | StandardSchemaWithJSON | undefined = undefined>(\n name: string,\n config: {\n title?: string;\n description?: string;\n inputSchema?: InputArgs;\n outputSchema?: OutputArgs;\n annotations?: ToolAnnotations;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n },\n cb: LegacyToolCallback<InputArgs>\n ): RegisteredTool;\n registerTool(\n name: string,\n config: {\n title?: string;\n description?: string;\n inputSchema?: StandardSchemaWithJSON | ZodRawShape;\n outputSchema?: StandardSchemaWithJSON | ZodRawShape;\n annotations?: ToolAnnotations;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n },\n cb: ToolCallback<StandardSchemaWithJSON | undefined> | LegacyToolCallback<ZodRawShape>\n ): RegisteredTool {\n if (this._registeredTools[name]) {\n throw new Error(`Tool ${name} is already registered`);\n }\n\n const { title, description, inputSchema, outputSchema, annotations, icons, _meta } = config;\n\n return this._createRegisteredTool(\n name,\n title,\n description,\n normalizeRawShapeSchema(inputSchema),\n normalizeRawShapeSchema(outputSchema),\n annotations,\n icons,\n undefined,\n _meta,\n cb as ToolCallback<StandardSchemaWithJSON | undefined>\n );\n }\n\n /**\n * Registers a prompt with a config object and callback.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_registerPrompt_basic\"\n * server.registerPrompt(\n * 'review-code',\n * {\n * title: 'Code Review',\n * description: 'Review code for best practices',\n * argsSchema: z.object({ code: z.string() })\n * },\n * ({ code }) => ({\n * messages: [\n * {\n * role: 'user' as const,\n * content: {\n * type: 'text' as const,\n * text: `Please review this code:\\n\\n${code}`\n * }\n * }\n * ]\n * })\n * );\n * ```\n */\n registerPrompt<Args extends StandardSchemaWithJSON>(\n name: string,\n config: {\n title?: string;\n description?: string;\n argsSchema?: Args;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n },\n cb: PromptCallback<Args>\n ): RegisteredPrompt;\n /** @deprecated Wrap with `z.object({...})` instead. Raw-shape form: `argsSchema` may be a plain `{ field: z.string() }` record; it is auto-wrapped with `z.object()`. */\n registerPrompt<Args extends ZodRawShape>(\n name: string,\n config: {\n title?: string;\n description?: string;\n argsSchema?: Args;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n },\n cb: LegacyPromptCallback<Args>\n ): RegisteredPrompt;\n registerPrompt(\n name: string,\n config: {\n title?: string;\n description?: string;\n argsSchema?: StandardSchemaWithJSON | ZodRawShape;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n },\n cb: PromptCallback<StandardSchemaWithJSON> | LegacyPromptCallback<ZodRawShape>\n ): RegisteredPrompt {\n if (this._registeredPrompts[name]) {\n throw new Error(`Prompt ${name} is already registered`);\n }\n\n const { title, description, argsSchema, icons, _meta } = config;\n\n const registeredPrompt = this._createRegisteredPrompt(\n name,\n title,\n description,\n normalizeRawShapeSchema(argsSchema),\n cb as PromptCallback<StandardSchemaWithJSON | undefined>,\n icons,\n _meta\n );\n\n this.setPromptRequestHandlers();\n this.sendPromptListChanged();\n\n return registeredPrompt;\n }\n\n /**\n * Checks if the server is connected to a transport.\n * @returns `true` if the server is connected\n */\n isConnected() {\n return this.server.transport !== undefined;\n }\n\n /**\n * Sends a logging message to the client, if connected.\n * Note: You only need to send the parameters object, not the entire JSON-RPC message.\n * @see {@linkcode LoggingMessageNotification}\n * @param params\n * @param sessionId Optional for stateless transports and backward compatibility.\n *\n * @example\n * ```ts source=\"./mcp.examples.ts#McpServer_sendLoggingMessage_basic\"\n * await server.sendLoggingMessage({\n * level: 'info',\n * data: 'Processing complete'\n * });\n * ```\n *\n * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577).\n * Remains functional during the deprecation window (at least twelve months).\n * Migrate to stderr logging (STDIO servers) or OpenTelemetry.\n */\n async sendLoggingMessage(params: LoggingMessageNotification['params'], sessionId?: string) {\n return this.server.sendLoggingMessage(params, sessionId);\n }\n /**\n * Sends a resource list changed event to the client, if connected.\n */\n sendResourceListChanged() {\n if (this.isConnected()) {\n this.server.sendResourceListChanged();\n }\n }\n\n /**\n * Sends a tool list changed event to the client, if connected.\n */\n sendToolListChanged() {\n if (this.isConnected()) {\n this.server.sendToolListChanged();\n }\n }\n\n /**\n * Sends a prompt list changed event to the client, if connected.\n */\n sendPromptListChanged() {\n if (this.isConnected()) {\n this.server.sendPromptListChanged();\n }\n }\n}\n\n/**\n * A callback to complete one variable within a resource template's URI template.\n */\nexport type CompleteResourceTemplateCallback = (\n value: string,\n context?: {\n arguments?: Record<string, string>;\n }\n) => string[] | Promise<string[]>;\n\n/**\n * A resource template combines a URI pattern with optional functionality to enumerate\n * all resources matching that pattern.\n */\nexport class ResourceTemplate {\n private _uriTemplate: UriTemplate;\n\n constructor(\n uriTemplate: string | UriTemplate,\n private _callbacks: {\n /**\n * A callback to list all resources matching this template. This is required to be specified, even if `undefined`, to avoid accidentally forgetting resource listing.\n */\n list: ListResourcesCallback | undefined;\n\n /**\n * An optional callback to autocomplete variables within the URI template. Useful for clients and users to discover possible values.\n */\n complete?: {\n [variable: string]: CompleteResourceTemplateCallback;\n };\n }\n ) {\n this._uriTemplate = typeof uriTemplate === 'string' ? new UriTemplate(uriTemplate) : uriTemplate;\n }\n\n /**\n * Gets the URI template pattern.\n */\n get uriTemplate(): UriTemplate {\n return this._uriTemplate;\n }\n\n /**\n * Gets the list callback, if one was provided.\n */\n get listCallback(): ListResourcesCallback | undefined {\n return this._callbacks.list;\n }\n\n /**\n * Gets the callback for completing a specific URI template variable, if one was provided.\n */\n completeCallback(variable: string): CompleteResourceTemplateCallback | undefined {\n return this._callbacks.complete?.[variable];\n }\n}\n\n/**\n * A plain record of Zod field schemas, e.g. `{ name: z.string() }`. Accepted by\n * `registerTool`/`registerPrompt` as a shorthand; auto-wrapped with `z.object()`.\n * Zod schemas only — `z.object()` cannot wrap other Standard Schema libraries.\n */\nexport type ZodRawShape = Record<string, z.ZodType>;\n\n/** Infers the parsed-output type of a {@linkcode ZodRawShape}. */\nexport type InferRawShape<S extends ZodRawShape> = z.infer<z.ZodObject<S>>;\n\n/** {@linkcode ToolCallback} variant used when `inputSchema` is a {@linkcode ZodRawShape}. */\nexport type LegacyToolCallback<Args extends ZodRawShape | undefined> = Args extends ZodRawShape\n ? (args: InferRawShape<Args>, ctx: ServerContext) => CallToolResult | Promise<CallToolResult>\n : (ctx: ServerContext) => CallToolResult | Promise<CallToolResult>;\n\n/** {@linkcode PromptCallback} variant used when `argsSchema` is a {@linkcode ZodRawShape}. */\nexport type LegacyPromptCallback<Args extends ZodRawShape | undefined> = Args extends ZodRawShape\n ? (args: InferRawShape<Args>, ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>\n : (ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>;\n\nexport type BaseToolCallback<\n SendResultT extends Result,\n Ctx extends ServerContext,\n Args extends StandardSchemaWithJSON | undefined\n> = Args extends StandardSchemaWithJSON\n ? (args: StandardSchemaWithJSON.InferOutput<Args>, ctx: Ctx) => SendResultT | Promise<SendResultT>\n : (ctx: Ctx) => SendResultT | Promise<SendResultT>;\n\n/**\n * Callback for a tool handler registered with {@linkcode McpServer.registerTool}.\n */\nexport type ToolCallback<Args extends StandardSchemaWithJSON | undefined = undefined> = BaseToolCallback<\n CallToolResult,\n ServerContext,\n Args\n>;\n\n/**\n * Tool handler callback type.\n */\nexport type AnyToolHandler<Args extends StandardSchemaWithJSON | undefined = undefined> = ToolCallback<Args>;\n\n/**\n * Internal executor type that encapsulates handler invocation with proper types.\n */\ntype ToolExecutor = (args: unknown, ctx: ServerContext) => Promise<CallToolResult>;\n\nexport type RegisteredTool = {\n title?: string;\n description?: string;\n inputSchema?: StandardSchemaWithJSON;\n outputSchema?: StandardSchemaWithJSON;\n annotations?: ToolAnnotations;\n icons?: Icon[];\n execution?: ToolExecution;\n _meta?: Record<string, unknown>;\n handler: AnyToolHandler<StandardSchemaWithJSON | undefined>;\n /** @hidden */\n executor: ToolExecutor;\n enabled: boolean;\n enable(): void;\n disable(): void;\n update(updates: {\n name?: string | null;\n title?: string;\n description?: string;\n paramsSchema?: StandardSchemaWithJSON;\n outputSchema?: StandardSchemaWithJSON;\n annotations?: ToolAnnotations;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n callback?: ToolCallback<StandardSchemaWithJSON>;\n enabled?: boolean;\n }): void;\n remove(): void;\n};\n\n/**\n * Creates an executor that invokes the handler with the appropriate arguments.\n * When `inputSchema` is defined, the handler is called with `(args, ctx)`.\n * When `inputSchema` is undefined, the handler is called with just `(ctx)`.\n */\nfunction createToolExecutor(\n inputSchema: StandardSchemaWithJSON | undefined,\n handler: AnyToolHandler<StandardSchemaWithJSON | undefined>\n): ToolExecutor {\n if (inputSchema) {\n const callback = handler as ToolCallbackInternal;\n return async (args, ctx) => callback(args, ctx);\n }\n\n // When no inputSchema, call with just ctx (the handler expects (ctx) signature)\n const callback = handler as (ctx: ServerContext) => CallToolResult | Promise<CallToolResult>;\n return async (_args, ctx) => callback(ctx);\n}\n\nconst EMPTY_OBJECT_JSON_SCHEMA = {\n type: 'object' as const,\n properties: {}\n};\n\n/**\n * Additional, optional information for annotating a resource.\n */\nexport type ResourceMetadata = Omit<Resource, 'uri' | 'name'>;\n\n/**\n * Callback to list all resources matching a given template.\n */\nexport type ListResourcesCallback = (ctx: ServerContext) => ListResourcesResult | Promise<ListResourcesResult>;\n\n/**\n * Callback to read a resource at a given URI.\n */\nexport type ReadResourceCallback = (uri: URL, ctx: ServerContext) => ReadResourceResult | Promise<ReadResourceResult>;\n\nexport type RegisteredResource = {\n name: string;\n title?: string;\n metadata?: ResourceMetadata;\n readCallback: ReadResourceCallback;\n enabled: boolean;\n enable(): void;\n disable(): void;\n update(updates: {\n name?: string;\n title?: string;\n uri?: string | null;\n metadata?: ResourceMetadata;\n callback?: ReadResourceCallback;\n enabled?: boolean;\n }): void;\n remove(): void;\n};\n\n/**\n * Callback to read a resource at a given URI, following a filled-in URI template.\n */\nexport type ReadResourceTemplateCallback = (\n uri: URL,\n variables: Variables,\n ctx: ServerContext\n) => ReadResourceResult | Promise<ReadResourceResult>;\n\nexport type RegisteredResourceTemplate = {\n resourceTemplate: ResourceTemplate;\n title?: string;\n metadata?: ResourceMetadata;\n readCallback: ReadResourceTemplateCallback;\n enabled: boolean;\n enable(): void;\n disable(): void;\n update(updates: {\n name?: string | null;\n title?: string;\n template?: ResourceTemplate;\n metadata?: ResourceMetadata;\n callback?: ReadResourceTemplateCallback;\n enabled?: boolean;\n }): void;\n remove(): void;\n};\n\nexport type PromptCallback<Args extends StandardSchemaWithJSON | undefined = undefined> = Args extends StandardSchemaWithJSON\n ? (args: StandardSchemaWithJSON.InferOutput<Args>, ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>\n : (ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>;\n\n/**\n * Internal handler type that encapsulates parsing and callback invocation.\n * This allows type-safe handling without runtime type assertions.\n */\ntype PromptHandler = (args: Record<string, unknown> | undefined, ctx: ServerContext) => Promise<GetPromptResult>;\n\ntype ToolCallbackInternal = (args: unknown, ctx: ServerContext) => CallToolResult | Promise<CallToolResult>;\n\nexport type RegisteredPrompt = {\n title?: string;\n description?: string;\n argsSchema?: StandardSchemaWithJSON;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n /** @hidden */\n handler: PromptHandler;\n enabled: boolean;\n enable(): void;\n disable(): void;\n update<Args extends StandardSchemaWithJSON>(updates: {\n name?: string | null;\n title?: string;\n description?: string;\n argsSchema?: Args;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n callback?: PromptCallback<Args>;\n enabled?: boolean;\n }): void;\n remove(): void;\n};\n\n/**\n * Creates a type-safe prompt handler that captures the schema and callback in a closure.\n * This eliminates the need for type assertions at the call site.\n */\nfunction createPromptHandler(\n name: string,\n argsSchema: StandardSchemaWithJSON | undefined,\n callback: PromptCallback<StandardSchemaWithJSON | undefined>\n): PromptHandler {\n if (argsSchema) {\n const typedCallback = callback as (args: unknown, ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>;\n\n return async (args, ctx) => {\n const parseResult = await validateStandardSchema(argsSchema, args);\n if (!parseResult.success) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid arguments for prompt ${name}: ${parseResult.error}`);\n }\n return typedCallback(parseResult.data, ctx);\n };\n } else {\n const typedCallback = callback as (ctx: ServerContext) => GetPromptResult | Promise<GetPromptResult>;\n\n return async (_args, ctx) => {\n return typedCallback(ctx);\n };\n }\n}\n\nfunction createCompletionResult(suggestions: readonly unknown[]): CompleteResult {\n const values = suggestions.map(String).slice(0, 100);\n return {\n completion: {\n values,\n total: suggestions.length,\n hasMore: suggestions.length > 100\n }\n };\n}\n\nconst EMPTY_COMPLETION_RESULT: CompleteResult = {\n completion: {\n values: [],\n hasMore: false\n }\n};\n\n/** @internal Gets the shape of a Zod object schema */\nfunction getSchemaShape(schema: unknown): Record<string, unknown> | undefined {\n const candidate = schema as { shape?: unknown };\n if (candidate.shape && typeof candidate.shape === 'object') {\n return candidate.shape as Record<string, unknown>;\n }\n return undefined;\n}\n\n/** @internal Checks if a Zod schema is optional */\nfunction isOptionalSchema(schema: unknown): boolean {\n const candidate = schema as { type?: string } | null | undefined;\n return candidate?.type === 'optional';\n}\n\n/** @internal Unwraps an optional Zod schema */\nfunction unwrapOptionalSchema(schema: unknown): unknown {\n if (!isOptionalSchema(schema)) {\n return schema;\n }\n const candidate = schema as { def?: { innerType?: unknown } };\n return candidate.def?.innerType ?? schema;\n}\n","export type HostHeaderValidationResult =\n | { ok: true; hostname: string }\n | {\n ok: false;\n errorCode: 'missing_host' | 'invalid_host_header' | 'invalid_host';\n message: string;\n hostHeader?: string;\n hostname?: string;\n };\n\n/**\n * Parse and validate a `Host` header against an allowlist of hostnames (port-agnostic).\n *\n * - Input host header may include a port (e.g. `localhost:3000`) or IPv6 brackets (e.g. `[::1]:3000`).\n * - Allowlist items should be hostnames only (no ports). For IPv6, include brackets (e.g. `[::1]`).\n */\nexport function validateHostHeader(hostHeader: string | null | undefined, allowedHostnames: string[]): HostHeaderValidationResult {\n if (!hostHeader) {\n return { ok: false, errorCode: 'missing_host', message: 'Missing Host header' };\n }\n\n // Use URL API to parse hostname (handles IPv4, IPv6, and regular hostnames)\n let hostname: string;\n try {\n hostname = new URL(`http://${hostHeader}`).hostname;\n } catch {\n return { ok: false, errorCode: 'invalid_host_header', message: `Invalid Host header: ${hostHeader}`, hostHeader };\n }\n\n if (!allowedHostnames.includes(hostname)) {\n return { ok: false, errorCode: 'invalid_host', message: `Invalid Host: ${hostname}`, hostHeader, hostname };\n }\n\n return { ok: true, hostname };\n}\n\n/**\n * Convenience allowlist for `localhost` DNS rebinding protection.\n */\nexport function localhostAllowedHostnames(): string[] {\n return ['localhost', '127.0.0.1', '[::1]'];\n}\n\n/**\n * Web-standard `Request` helper for DNS rebinding protection.\n * @example\n * ```ts source=\"./hostHeaderValidation.examples.ts#hostHeaderValidationResponse_basicUsage\"\n * const result = validateHostHeader(req.headers.get('host'), ['localhost']);\n * ```\n */\nexport function hostHeaderValidationResponse(req: Request, allowedHostnames: string[]): Response | undefined {\n const result = validateHostHeader(req.headers.get('host'), allowedHostnames);\n if (result.ok) return undefined;\n\n return Response.json(\n {\n jsonrpc: '2.0',\n error: {\n code: -32_000,\n message: result.message\n },\n id: null\n },\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n}\n","/**\n * Web Standards Streamable HTTP Server Transport\n *\n * This is the core transport implementation using Web Standard APIs (`Request`, `Response`, `ReadableStream`).\n * It can run on any runtime that supports Web Standards: Node.js 18+, Cloudflare Workers, Deno, Bun, etc.\n *\n * For Node.js Express/HTTP compatibility, use {@linkcode @modelcontextprotocol/node!NodeStreamableHTTPServerTransport | NodeStreamableHTTPServerTransport} which wraps this transport.\n */\n\nimport type { AuthInfo, JSONRPCMessage, MessageExtraInfo, RequestId, Transport } from '@modelcontextprotocol/core-internal';\nimport {\n DEFAULT_NEGOTIATED_PROTOCOL_VERSION,\n isInitializeRequest,\n isJSONRPCErrorResponse,\n isJSONRPCRequest,\n isJSONRPCResultResponse,\n JSONRPCMessageSchema,\n SUPPORTED_PROTOCOL_VERSIONS\n} from '@modelcontextprotocol/core-internal';\n\nexport type StreamId = string;\nexport type EventId = string;\n\n/**\n * Interface for resumability support via event storage\n */\nexport interface EventStore {\n /**\n * Stores an event for later retrieval\n * @param streamId ID of the stream the event belongs to\n * @param message The JSON-RPC message to store\n * @returns The generated event ID for the stored event\n */\n storeEvent(streamId: StreamId, message: JSONRPCMessage): Promise<EventId>;\n\n /**\n * Get the stream ID associated with a given event ID.\n * @param eventId The event ID to look up\n * @returns The stream ID, or `undefined` if not found\n *\n * Optional: If not provided, the SDK will use the `streamId` returned by\n * {@linkcode replayEventsAfter} for stream mapping.\n */\n getStreamIdForEventId?(eventId: EventId): Promise<StreamId | undefined>;\n\n replayEventsAfter(\n lastEventId: EventId,\n {\n send\n }: {\n send: (eventId: EventId, message: JSONRPCMessage) => Promise<void>;\n }\n ): Promise<StreamId>;\n}\n\n/**\n * Internal stream mapping for managing SSE connections\n */\ninterface StreamMapping {\n /** Stream controller for pushing SSE data - only used with `ReadableStream` approach */\n controller?: ReadableStreamDefaultController<Uint8Array>;\n /** Text encoder for SSE formatting */\n encoder?: InstanceType<typeof TextEncoder>;\n /** Promise resolver for JSON response mode */\n resolveJson?: (response: Response) => void;\n /** Cleanup function to close stream and remove mapping */\n cleanup: () => void;\n}\n\n/**\n * Configuration options for {@linkcode WebStandardStreamableHTTPServerTransport}\n */\nexport interface WebStandardStreamableHTTPServerTransportOptions {\n /**\n * Function that generates a session ID for the transport.\n * The session ID SHOULD be globally unique and cryptographically secure (e.g., a securely generated UUID, a JWT, or a cryptographic hash)\n *\n * If not provided, session management is disabled (stateless mode).\n */\n sessionIdGenerator?: (() => string) | undefined;\n\n /**\n * A callback for session initialization events\n * This is called when the server initializes a new session.\n * Useful in cases when you need to register multiple mcp sessions\n * and need to keep track of them.\n * @param sessionId The generated session ID\n */\n onsessioninitialized?: ((sessionId: string) => void | Promise<void>) | undefined;\n\n /**\n * A callback for session close events\n * This is called when the server closes a session due to a `DELETE` request.\n * Useful in cases when you need to clean up resources associated with the session.\n * Note that this is different from the transport closing, if you are handling\n * HTTP requests from multiple nodes you might want to close each\n * {@linkcode WebStandardStreamableHTTPServerTransport} after a request is completed while still keeping the\n * session open/running.\n * @param sessionId The session ID that was closed\n */\n onsessionclosed?: ((sessionId: string) => void | Promise<void>) | undefined;\n\n /**\n * If `true`, the server will return JSON responses instead of starting an SSE stream.\n * This can be useful for simple request/response scenarios without streaming.\n * Default is `false` (SSE streams are preferred).\n */\n enableJsonResponse?: boolean;\n\n /**\n * Event store for resumability support\n * If provided, resumability will be enabled, allowing clients to reconnect and resume messages\n */\n eventStore?: EventStore;\n\n /**\n * List of allowed `Host` header values for DNS rebinding protection.\n * If not specified, host validation is disabled.\n * @deprecated Use external middleware for host validation instead.\n */\n allowedHosts?: string[];\n\n /**\n * List of allowed `Origin` header values for DNS rebinding protection.\n * If not specified, origin validation is disabled.\n * @deprecated Use external middleware for origin validation instead.\n */\n allowedOrigins?: string[];\n\n /**\n * Enable DNS rebinding protection (requires `allowedHosts` and/or `allowedOrigins` to be configured).\n * Default is `false` for backwards compatibility.\n * @deprecated Use external middleware for DNS rebinding protection instead.\n */\n enableDnsRebindingProtection?: boolean;\n\n /**\n * Retry interval in milliseconds to suggest to clients in SSE `retry` field.\n * When set, the server will send a `retry` field in SSE priming events to control\n * client reconnection timing for polling behavior.\n */\n retryInterval?: number;\n\n /**\n * List of protocol versions that this transport will accept.\n * Used to validate the `mcp-protocol-version` header in incoming requests.\n *\n * Note: When using {@linkcode server/server.Server.connect | Server.connect()}, the server automatically passes its\n * `supportedProtocolVersions` to the transport, so you typically don't need\n * to set this option directly.\n *\n * @default {@linkcode SUPPORTED_PROTOCOL_VERSIONS}\n */\n supportedProtocolVersions?: string[];\n}\n\n/**\n * Options for handling a request\n */\nexport interface HandleRequestOptions {\n /**\n * Pre-parsed request body. If provided, the transport will use this instead of parsing `req.json()`.\n * Useful when using body-parser middleware that has already parsed the body.\n */\n parsedBody?: unknown;\n\n /**\n * Authentication info from middleware. If provided, will be passed to message handlers.\n */\n authInfo?: AuthInfo;\n}\n\n/**\n * Server transport for Web Standards Streamable HTTP: this implements the MCP Streamable HTTP transport specification\n * using Web Standard APIs (`Request`, `Response`, `ReadableStream`).\n *\n * This transport works on any runtime that supports Web Standards: Node.js 18+, Cloudflare Workers, Deno, Bun, etc.\n *\n * In stateful mode:\n * - Session ID is generated and included in response headers\n * - Session ID is always included in initialization responses\n * - Requests with invalid session IDs are rejected with `404 Not Found`\n * - Non-initialization requests without a session ID are rejected with `400 Bad Request`\n * - State is maintained in-memory (connections, message history)\n *\n * In stateless mode:\n * - No Session ID is included in any responses\n * - No session validation is performed\n *\n * @example Stateful setup\n * ```ts source=\"./streamableHttp.examples.ts#WebStandardStreamableHTTPServerTransport_stateful\"\n * const server = new McpServer({ name: 'my-server', version: '1.0.0' });\n *\n * const transport = new WebStandardStreamableHTTPServerTransport({\n * sessionIdGenerator: () => crypto.randomUUID()\n * });\n *\n * await server.connect(transport);\n * ```\n *\n * @example Stateless setup\n * ```ts source=\"./streamableHttp.examples.ts#WebStandardStreamableHTTPServerTransport_stateless\"\n * const transport = new WebStandardStreamableHTTPServerTransport({\n * sessionIdGenerator: undefined\n * });\n * ```\n *\n * @example Hono.js\n * ```ts source=\"./streamableHttp.examples.ts#WebStandardStreamableHTTPServerTransport_hono\"\n * app.all('/mcp', async c => {\n * return transport.handleRequest(c.req.raw);\n * });\n * ```\n *\n * @example Cloudflare Workers\n * ```ts source=\"./streamableHttp.examples.ts#WebStandardStreamableHTTPServerTransport_workers\"\n * const worker = {\n * async fetch(request: Request): Promise<Response> {\n * return transport.handleRequest(request);\n * }\n * };\n * ```\n */\nexport class WebStandardStreamableHTTPServerTransport implements Transport {\n // when sessionId is not set (undefined), it means the transport is in stateless mode\n private sessionIdGenerator: (() => string) | undefined;\n private _started: boolean = false;\n private _closed: boolean = false;\n private _streamMapping: Map<string, StreamMapping> = new Map();\n private _requestToStreamMapping: Map<RequestId, string> = new Map();\n private _requestResponseMap: Map<RequestId, JSONRPCMessage> = new Map();\n private _initialized: boolean = false;\n private _enableJsonResponse: boolean = false;\n private _standaloneSseStreamId: string = '_GET_stream';\n private _eventStore?: EventStore;\n private _onsessioninitialized?: ((sessionId: string) => void | Promise<void>) | undefined;\n private _onsessionclosed?: ((sessionId: string) => void | Promise<void>) | undefined;\n private _allowedHosts?: string[];\n private _allowedOrigins?: string[];\n private _enableDnsRebindingProtection: boolean;\n private _retryInterval?: number;\n private _supportedProtocolVersions: string[];\n\n sessionId?: string;\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void;\n\n constructor(options: WebStandardStreamableHTTPServerTransportOptions = {}) {\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 this._allowedHosts = options.allowedHosts;\n this._allowedOrigins = options.allowedOrigins;\n this._enableDnsRebindingProtection = options.enableDnsRebindingProtection ?? false;\n this._retryInterval = options.retryInterval;\n this._supportedProtocolVersions = options.supportedProtocolVersions ?? SUPPORTED_PROTOCOL_VERSIONS;\n }\n\n /**\n * Starts the transport. This is required by the {@linkcode Transport} interface but is a no-op\n * for the Streamable HTTP transport as connections are managed per-request.\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 * Sets the supported protocol versions for header validation.\n * Called by the server during {@linkcode server/server.Server.connect | connect()} to pass its supported versions.\n */\n setSupportedProtocolVersions(versions: string[]): void {\n this._supportedProtocolVersions = versions;\n }\n\n /**\n * Helper to create a JSON error response\n */\n private createJsonErrorResponse(\n status: number,\n code: number,\n message: string,\n options?: { headers?: Record<string, string>; data?: string }\n ): Response {\n const error: { code: number; message: string; data?: string } = { code, message };\n if (options?.data !== undefined) {\n error.data = options.data;\n }\n return Response.json(\n {\n jsonrpc: '2.0',\n error,\n id: null\n },\n {\n status,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers\n }\n }\n );\n }\n\n /**\n * Validates request headers for DNS rebinding protection.\n * @returns Error response if validation fails, `undefined` if validation passes.\n */\n private validateRequestHeaders(req: Request): Response | undefined {\n // Skip validation if protection is not enabled\n if (!this._enableDnsRebindingProtection) {\n return undefined;\n }\n\n // Validate Host header if allowedHosts is configured\n if (this._allowedHosts && this._allowedHosts.length > 0) {\n const hostHeader = req.headers.get('host');\n if (!hostHeader || !this._allowedHosts.includes(hostHeader)) {\n const error = `Invalid Host header: ${hostHeader}`;\n this.onerror?.(new Error(error));\n return this.createJsonErrorResponse(403, -32_000, error);\n }\n }\n\n // Validate Origin header if allowedOrigins is configured\n if (this._allowedOrigins && this._allowedOrigins.length > 0) {\n const originHeader = req.headers.get('origin');\n if (originHeader && !this._allowedOrigins.includes(originHeader)) {\n const error = `Invalid Origin header: ${originHeader}`;\n this.onerror?.(new Error(error));\n return this.createJsonErrorResponse(403, -32_000, error);\n }\n }\n\n return undefined;\n }\n\n /**\n * Handles an incoming HTTP request, whether `GET`, `POST`, or `DELETE`\n * Returns a `Response` object (Web Standard)\n */\n async handleRequest(req: Request, options?: HandleRequestOptions): Promise<Response> {\n // Validate request headers for DNS rebinding protection\n const validationError = this.validateRequestHeaders(req);\n if (validationError) {\n return validationError;\n }\n\n switch (req.method) {\n case 'POST': {\n return this.handlePostRequest(req, options);\n }\n case 'GET': {\n return this.handleGetRequest(req);\n }\n case 'DELETE': {\n return this.handleDeleteRequest(req);\n }\n default: {\n return this.handleUnsupportedRequest();\n }\n }\n }\n\n /**\n * Returns true if the client's protocol version supports empty SSE data in\n * priming events (the fix shipped with protocol version `2025-11-25`).\n *\n * The version is checked for membership in this transport instance's\n * supported protocol versions rather than with an open-ended\n * `>= '2025-11-25'` comparison: the value may come from an `initialize`\n * request body, which (unlike the `MCP-Protocol-Version` header) is not\n * validated against `supportedProtocolVersions` before reaching this\n * check. An unknown future version string must not silently enable\n * behavior reserved for versions this transport actually supports.\n */\n private supportsEmptySSEData(protocolVersion: string): boolean {\n return this._supportedProtocolVersions.includes(protocolVersion) && protocolVersion >= '2025-11-25';\n }\n\n /**\n * Writes a priming event to establish resumption capability.\n * Only sends if `eventStore` is configured (opt-in for resumability) and\n * the client's protocol version supports empty SSE data (a supported\n * version that is >= `2025-11-25`).\n */\n private async writePrimingEvent(\n controller: ReadableStreamDefaultController<Uint8Array>,\n encoder: InstanceType<typeof TextEncoder>,\n streamId: string,\n protocolVersion: string\n ): Promise<void> {\n if (!this._eventStore) {\n return;\n }\n\n // Priming events have empty data which older clients cannot handle.\n // Only send priming events to clients whose protocol version includes\n // the fix for handling empty SSE data.\n if (!this.supportsEmptySSEData(protocolVersion)) {\n return;\n }\n\n const primingEventId = await this._eventStore.storeEvent(streamId, {} as JSONRPCMessage);\n\n let primingEvent = `id: ${primingEventId}\\ndata: \\n\\n`;\n if (this._retryInterval !== undefined) {\n primingEvent = `id: ${primingEventId}\\nretry: ${this._retryInterval}\\ndata: \\n\\n`;\n }\n controller.enqueue(encoder.encode(primingEvent));\n }\n\n /**\n * Handles `GET` requests for SSE stream\n */\n private async handleGetRequest(req: Request): Promise<Response> {\n // The client MUST include an Accept header, listing text/event-stream as a supported content type.\n const acceptHeader = req.headers.get('accept');\n if (!acceptHeader?.includes('text/event-stream')) {\n this.onerror?.(new Error('Not Acceptable: Client must accept text/event-stream'));\n return this.createJsonErrorResponse(406, -32_000, 'Not Acceptable: Client must accept text/event-stream');\n }\n\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it\n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n const sessionError = this.validateSession(req);\n if (sessionError) {\n return sessionError;\n }\n const protocolError = this.validateProtocolVersion(req);\n if (protocolError) {\n return protocolError;\n }\n\n // Handle resumability: check for Last-Event-ID header\n if (this._eventStore) {\n const lastEventId = req.headers.get('last-event-id');\n if (lastEventId) {\n return this.replayEvents(lastEventId);\n }\n }\n\n // Check if there's already an active standalone SSE stream for this session\n if (this._streamMapping.get(this._standaloneSseStreamId) !== undefined) {\n // Only one GET SSE stream is allowed per session\n this.onerror?.(new Error('Conflict: Only one SSE stream is allowed per session'));\n return this.createJsonErrorResponse(409, -32_000, 'Conflict: Only one SSE stream is allowed per session');\n }\n\n const encoder = new TextEncoder();\n let streamController: ReadableStreamDefaultController<Uint8Array>;\n\n // Create a ReadableStream with a controller we can use to push SSE events\n const readable = new ReadableStream<Uint8Array>({\n start: controller => {\n streamController = controller;\n },\n cancel: () => {\n // Stream was cancelled by client\n this._streamMapping.delete(this._standaloneSseStreamId);\n }\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive'\n };\n\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n // Store the stream mapping with the controller for pushing data\n this._streamMapping.set(this._standaloneSseStreamId, {\n controller: streamController!,\n encoder,\n cleanup: () => {\n this._streamMapping.delete(this._standaloneSseStreamId);\n try {\n streamController!.close();\n } catch {\n // Controller might already be closed\n }\n }\n });\n\n return new Response(readable, { headers });\n }\n\n /**\n * Replays events that would have been sent after the specified event ID\n * Only used when resumability is enabled\n */\n private async replayEvents(lastEventId: string): Promise<Response> {\n if (!this._eventStore) {\n this.onerror?.(new Error('Event store not configured'));\n return this.createJsonErrorResponse(400, -32_000, 'Event store not configured');\n }\n\n try {\n // If getStreamIdForEventId is available, use it for conflict checking\n let streamId: string | undefined;\n if (this._eventStore.getStreamIdForEventId) {\n streamId = await this._eventStore.getStreamIdForEventId(lastEventId);\n\n if (!streamId) {\n this.onerror?.(new Error('Invalid event ID format'));\n return this.createJsonErrorResponse(400, -32_000, 'Invalid event ID format');\n }\n\n // Check conflict with the SAME streamId we'll use for mapping\n if (this._streamMapping.get(streamId) !== undefined) {\n this.onerror?.(new Error('Conflict: Stream already has an active connection'));\n return this.createJsonErrorResponse(409, -32_000, 'Conflict: Stream already has an active connection');\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive'\n };\n\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n // Create a ReadableStream with controller for SSE\n const encoder = new TextEncoder();\n let streamController: ReadableStreamDefaultController<Uint8Array>;\n\n const readable = new ReadableStream<Uint8Array>({\n start: controller => {\n streamController = controller;\n },\n cancel: () => {\n // Stream was cancelled by client\n // Cleanup will be handled by the mapping\n }\n });\n\n // Replay events - returns the streamId for backwards compatibility\n const replayedStreamId = await this._eventStore.replayEventsAfter(lastEventId, {\n send: async (eventId: string, message: JSONRPCMessage) => {\n const success = this.writeSSEEvent(streamController!, encoder, message, eventId);\n if (!success) {\n try {\n streamController!.close();\n } catch {\n // Controller might already be closed\n }\n }\n }\n });\n\n this._streamMapping.set(replayedStreamId, {\n controller: streamController!,\n encoder,\n cleanup: () => {\n this._streamMapping.delete(replayedStreamId);\n try {\n streamController!.close();\n } catch {\n // Controller might already be closed\n }\n }\n });\n\n return new Response(readable, { headers });\n } catch (error) {\n this.onerror?.(error as Error);\n return this.createJsonErrorResponse(500, -32_000, 'Error replaying events');\n }\n }\n\n /**\n * Writes an event to an SSE stream via controller with proper formatting\n */\n private writeSSEEvent(\n controller: ReadableStreamDefaultController<Uint8Array>,\n encoder: InstanceType<typeof TextEncoder>,\n message: JSONRPCMessage,\n eventId?: string\n ): boolean {\n try {\n let eventData = `event: message\\n`;\n // Include event ID if provided - this is important for resumability\n if (eventId) {\n eventData += `id: ${eventId}\\n`;\n }\n eventData += `data: ${JSON.stringify(message)}\\n\\n`;\n controller.enqueue(encoder.encode(eventData));\n return true;\n } catch (error) {\n this.onerror?.(error as Error);\n return false;\n }\n }\n\n /**\n * Handles unsupported requests (`PUT`, `PATCH`, etc.)\n */\n private handleUnsupportedRequest(): Response {\n this.onerror?.(new Error('Method not allowed.'));\n return Response.json(\n {\n jsonrpc: '2.0',\n error: {\n code: -32_000,\n message: 'Method not allowed.'\n },\n id: null\n },\n {\n status: 405,\n headers: {\n Allow: 'GET, POST, DELETE',\n 'Content-Type': 'application/json'\n }\n }\n );\n }\n\n /**\n * Handles `POST` requests containing JSON-RPC messages\n */\n private async handlePostRequest(req: Request, options?: HandleRequestOptions): Promise<Response> {\n try {\n // Validate the Accept header\n const acceptHeader = req.headers.get('accept');\n // The client MUST include an Accept header, listing both application/json and text/event-stream as supported content types.\n if (!acceptHeader?.includes('application/json') || !acceptHeader.includes('text/event-stream')) {\n this.onerror?.(new Error('Not Acceptable: Client must accept both application/json and text/event-stream'));\n return this.createJsonErrorResponse(\n 406,\n -32_000,\n 'Not Acceptable: Client must accept both application/json and text/event-stream'\n );\n }\n\n const ct = req.headers.get('content-type');\n if (!ct || !ct.includes('application/json')) {\n this.onerror?.(new Error('Unsupported Media Type: Content-Type must be application/json'));\n return this.createJsonErrorResponse(415, -32_000, 'Unsupported Media Type: Content-Type must be application/json');\n }\n\n const request = req;\n\n let rawMessage;\n if (options?.parsedBody === undefined) {\n try {\n rawMessage = await req.json();\n } catch (error) {\n this.onerror?.(error as Error);\n return this.createJsonErrorResponse(400, -32_700, 'Parse error: Invalid JSON');\n }\n } else {\n rawMessage = options.parsedBody;\n }\n\n let messages: JSONRPCMessage[];\n\n // handle batch and single messages\n try {\n messages = Array.isArray(rawMessage)\n ? rawMessage.map(msg => JSONRPCMessageSchema.parse(msg))\n : [JSONRPCMessageSchema.parse(rawMessage)];\n } catch (error) {\n this.onerror?.(error as Error);\n return this.createJsonErrorResponse(400, -32_700, 'Parse error: Invalid JSON-RPC message');\n }\n\n // Check if this is an initialization request\n // https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/lifecycle/\n const isInitializationRequest = messages.some(element => isInitializeRequest(element));\n if (isInitializationRequest) {\n // If it's a server with session management and the session ID is already set we should reject the request\n // to avoid re-initialization.\n if (this._initialized && this.sessionId !== undefined) {\n this.onerror?.(new Error('Invalid Request: Server already initialized'));\n return this.createJsonErrorResponse(400, -32_600, 'Invalid Request: Server already initialized');\n }\n if (messages.length > 1) {\n this.onerror?.(new Error('Invalid Request: Only one initialization request is allowed'));\n return this.createJsonErrorResponse(400, -32_600, 'Invalid Request: Only one initialization request is allowed');\n }\n this.sessionId = this.sessionIdGenerator?.();\n this._initialized = true;\n\n // If we have a session ID and an onsessioninitialized handler, call it immediately\n // This is needed in cases where the server needs to keep track of multiple sessions\n if (this.sessionId && this._onsessioninitialized) {\n await Promise.resolve(this._onsessioninitialized(this.sessionId));\n }\n }\n if (!isInitializationRequest) {\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it\n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n const sessionError = this.validateSession(req);\n if (sessionError) {\n return sessionError;\n }\n // Mcp-Protocol-Version header is required for all requests after initialization.\n const protocolError = this.validateProtocolVersion(req);\n if (protocolError) {\n return protocolError;\n }\n }\n\n // check if it contains requests\n const hasRequests = messages.some(element => isJSONRPCRequest(element));\n\n if (!hasRequests) {\n // if it only contains notifications or responses, return 202\n for (const message of messages) {\n this.onmessage?.(message, { authInfo: options?.authInfo, request });\n }\n return new Response(null, { status: 202 });\n }\n\n // The default behavior is to use SSE streaming\n // but in some cases server will return JSON responses\n const streamId = crypto.randomUUID();\n\n // Extract protocol version for priming event decision.\n // For initialize requests, get from request params.\n // For other requests, get from header (already validated).\n const initRequest = messages.find(m => isInitializeRequest(m));\n const clientProtocolVersion = initRequest\n ? initRequest.params.protocolVersion\n : (req.headers.get('mcp-protocol-version') ?? DEFAULT_NEGOTIATED_PROTOCOL_VERSION);\n\n if (this._enableJsonResponse) {\n // For JSON response mode, return a Promise that resolves when all responses are ready\n return new Promise<Response>(resolve => {\n this._streamMapping.set(streamId, {\n resolveJson: resolve,\n cleanup: () => {\n this._streamMapping.delete(streamId);\n }\n });\n\n for (const message of messages) {\n if (isJSONRPCRequest(message)) {\n this._requestToStreamMapping.set(message.id, streamId);\n }\n }\n\n for (const message of messages) {\n this.onmessage?.(message, { authInfo: options?.authInfo, request });\n }\n });\n }\n\n // SSE streaming mode - use ReadableStream with controller for more reliable data pushing\n const encoder = new TextEncoder();\n let streamController: ReadableStreamDefaultController<Uint8Array>;\n\n const readable = new ReadableStream<Uint8Array>({\n start: controller => {\n streamController = controller;\n },\n cancel: () => {\n // Stream was cancelled by client\n this._streamMapping.delete(streamId);\n }\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive'\n };\n\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n // Store the response for this request to send messages back through this connection\n // We need to track by request ID to maintain the connection\n for (const message of messages) {\n if (isJSONRPCRequest(message)) {\n this._streamMapping.set(streamId, {\n controller: streamController!,\n encoder,\n cleanup: () => {\n this._streamMapping.delete(streamId);\n try {\n streamController!.close();\n } catch {\n // Controller might already be closed\n }\n }\n });\n this._requestToStreamMapping.set(message.id, streamId);\n }\n }\n\n // Write priming event if event store is configured (after mapping is set up)\n await this.writePrimingEvent(streamController!, encoder, streamId, clientProtocolVersion);\n\n // handle each message\n for (const message of messages) {\n // Build closeSSEStream callback for requests when eventStore is configured\n // AND client supports resumability (a supported protocol version >= 2025-11-25).\n // Old clients can't resume if the stream is closed early because they\n // didn't receive a priming event with an event ID.\n let closeSSEStream: (() => void) | undefined;\n let closeStandaloneSSEStream: (() => void) | undefined;\n if (isJSONRPCRequest(message) && this._eventStore && this.supportsEmptySSEData(clientProtocolVersion)) {\n closeSSEStream = () => {\n this.closeSSEStream(message.id);\n };\n closeStandaloneSSEStream = () => {\n this.closeStandaloneSSEStream();\n };\n }\n\n this.onmessage?.(message, { authInfo: options?.authInfo, request, closeSSEStream, closeStandaloneSSEStream });\n }\n // The server SHOULD NOT close the SSE stream before sending all JSON-RPC responses\n // This will be handled by the send() method when responses are ready\n\n return new Response(readable, { status: 200, headers });\n } catch (error) {\n // return JSON-RPC formatted error\n this.onerror?.(error as Error);\n return this.createJsonErrorResponse(400, -32_700, 'Parse error', { data: String(error) });\n }\n }\n\n /**\n * Handles `DELETE` requests to terminate sessions\n */\n private async handleDeleteRequest(req: Request): Promise<Response> {\n const sessionError = this.validateSession(req);\n if (sessionError) {\n return sessionError;\n }\n const protocolError = this.validateProtocolVersion(req);\n if (protocolError) {\n return protocolError;\n }\n\n await Promise.resolve(this._onsessionclosed?.(this.sessionId!));\n await this.close();\n return new Response(null, { status: 200 });\n }\n\n /**\n * Validates session ID for non-initialization requests.\n * Returns `Response` error if invalid, `undefined` otherwise\n */\n private validateSession(req: Request): Response | undefined {\n if (this.sessionIdGenerator === undefined) {\n // If the sessionIdGenerator ID is not set, the session management is disabled\n // and we don't need to validate the session ID\n return undefined;\n }\n if (!this._initialized) {\n // If the server has not been initialized yet, reject all requests\n this.onerror?.(new Error('Bad Request: Server not initialized'));\n return this.createJsonErrorResponse(400, -32_000, 'Bad Request: Server not initialized');\n }\n\n const sessionId = req.headers.get('mcp-session-id');\n\n if (!sessionId) {\n // Non-initialization requests without a session ID should return 400 Bad Request\n this.onerror?.(new Error('Bad Request: Mcp-Session-Id header is required'));\n return this.createJsonErrorResponse(400, -32_000, 'Bad Request: Mcp-Session-Id header is required');\n }\n\n if (sessionId !== this.sessionId) {\n // Reject requests with invalid session ID with 404 Not Found\n this.onerror?.(new Error('Session not found'));\n return this.createJsonErrorResponse(404, -32_001, 'Session not found');\n }\n\n return undefined;\n }\n\n /**\n * Validates the `MCP-Protocol-Version` header on incoming requests.\n *\n * For initialization: Version negotiation handles unknown versions gracefully\n * (server responds with its supported version).\n *\n * For subsequent requests with `MCP-Protocol-Version` header:\n * - Accept if in supported list\n * - 400 if unsupported\n *\n * For HTTP requests without the `MCP-Protocol-Version` header:\n * - Accept and default to the version negotiated at initialization\n */\n private validateProtocolVersion(req: Request): Response | undefined {\n const protocolVersion = req.headers.get('mcp-protocol-version');\n\n if (protocolVersion !== null && !this._supportedProtocolVersions.includes(protocolVersion)) {\n const error = `Bad Request: Unsupported protocol version: ${protocolVersion} (supported versions: ${this._supportedProtocolVersions.join(', ')})`;\n this.onerror?.(new Error(error));\n return this.createJsonErrorResponse(400, -32_000, error);\n }\n return undefined;\n }\n\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n this._closed = true;\n\n // Close all SSE connections\n for (const { cleanup } of this._streamMapping.values()) {\n cleanup();\n }\n this._streamMapping.clear();\n\n // Clear any pending responses\n this._requestResponseMap.clear();\n this.onclose?.();\n }\n\n /**\n * Close an SSE stream for a specific request, triggering client reconnection.\n * Use this to implement polling behavior during long-running operations -\n * client will reconnect after the retry interval specified in the priming event.\n */\n closeSSEStream(requestId: RequestId): void {\n const streamId = this._requestToStreamMapping.get(requestId);\n if (!streamId) return;\n\n const stream = this._streamMapping.get(streamId);\n if (stream) {\n stream.cleanup();\n }\n }\n\n /**\n * Close the standalone `GET` SSE stream, triggering client reconnection.\n * Use this to implement polling behavior for server-initiated notifications.\n */\n closeStandaloneSSEStream(): void {\n const stream = this._streamMapping.get(this._standaloneSseStreamId);\n if (stream) {\n stream.cleanup();\n }\n }\n\n async send(message: JSONRPCMessage, options?: { relatedRequestId?: RequestId }): Promise<void> {\n let requestId = options?.relatedRequestId;\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n // If the message is a response, use the request ID from the message\n requestId = message.id;\n }\n\n // Check if this message should be sent on the standalone SSE stream (no request ID)\n // Ignore notifications from tools (which have relatedRequestId set)\n // Those will be sent via dedicated response SSE streams\n if (requestId === undefined) {\n // For standalone SSE streams, we can only send requests and notifications\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n throw new Error('Cannot send a response on a standalone SSE stream unless resuming a previous client request');\n }\n\n // Generate and store event ID if event store is provided\n // Store even if stream is disconnected so events can be replayed on reconnect\n let eventId: string | undefined;\n if (this._eventStore) {\n // Stores the event and gets the generated event ID\n eventId = await this._eventStore.storeEvent(this._standaloneSseStreamId, message);\n }\n\n const standaloneSse = this._streamMapping.get(this._standaloneSseStreamId);\n if (standaloneSse === undefined) {\n // Stream is disconnected - event is stored for replay, nothing more to do\n return;\n }\n\n // Send the message to the standalone SSE stream\n if (standaloneSse.controller && standaloneSse.encoder) {\n this.writeSSEEvent(standaloneSse.controller, standaloneSse.encoder, message, eventId);\n }\n return;\n }\n\n // Get the response for this request\n const streamId = this._requestToStreamMapping.get(requestId);\n if (!streamId) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`);\n }\n\n const stream = this._streamMapping.get(streamId);\n\n if (!this._enableJsonResponse && stream?.controller && stream?.encoder) {\n // For SSE responses, generate event ID if event store is provided\n let eventId: string | undefined;\n\n if (this._eventStore) {\n eventId = await this._eventStore.storeEvent(streamId, message);\n }\n // Write the event to the response stream\n this.writeSSEEvent(stream.controller, stream.encoder, message, eventId);\n }\n\n if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) {\n this._requestResponseMap.set(requestId, message);\n const relatedIds = [...this._requestToStreamMapping.entries()].filter(([_, sid]) => sid === streamId).map(([id]) => id);\n\n // Check if we have responses for all requests using this connection\n const allResponsesReady = relatedIds.every(id => this._requestResponseMap.has(id));\n\n if (allResponsesReady) {\n if (!stream) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`);\n }\n if (this._enableJsonResponse && stream.resolveJson) {\n // All responses ready, send as JSON\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n const responses = relatedIds.map(id => this._requestResponseMap.get(id)!);\n\n if (responses.length === 1) {\n stream.resolveJson(Response.json(responses[0], { status: 200, headers }));\n } else {\n stream.resolveJson(Response.json(responses, { status: 200, headers }));\n }\n } else {\n // End the SSE stream\n stream.cleanup();\n }\n // Clean up\n for (const id of relatedIds) {\n this._requestResponseMap.delete(id);\n this._requestToStreamMapping.delete(id);\n }\n }\n }\n }\n}\n","import type { JsonSchemaType, jsonSchemaValidator, StandardSchemaWithJSON } from '@modelcontextprotocol/core-internal';\nimport { fromJsonSchema as coreFromJsonSchema } from '@modelcontextprotocol/core-internal';\nimport { DefaultJsonSchemaValidator } from '@modelcontextprotocol/server/_shims';\n\nlet _defaultValidator: jsonSchemaValidator | undefined;\n\nexport function fromJsonSchema<T = unknown>(schema: JsonSchemaType, validator?: jsonSchemaValidator): StandardSchemaWithJSON<T, T> {\n return coreFromJsonSchema<T>(schema, validator ?? (_defaultValidator ??= new DefaultJsonSchemaValidator()));\n}\n"],"mappings":"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"}