@poe-platform/safe-js 0.1.731 → 0.1.732
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.
- package/dist/safe-js/chunks/{chunk-MGHE7ZFI.js → chunk-3ITVV2R6.js} +6 -6
- package/dist/safe-js/chunks/chunk-3ITVV2R6.js.map +7 -0
- package/dist/safe-js/chunks/{chunk-IRDQDZ5R.js → chunk-P64CQIUA.js} +2 -2
- package/dist/safe-js/chunks/{cli-runtime-NUEFUM64.js → cli-runtime-ZSOTNIVC.js} +3 -3
- package/dist/safe-js/chunks/{mcp-S672263Q.js → mcp-2Z4XWHKW.js} +3 -3
- package/dist/safe-js/cli.js +2 -2
- package/dist/safe-js/index.js +2 -2
- package/package.json +2 -2
- package/dist/safe-js/chunks/chunk-MGHE7ZFI.js.map +0 -7
- /package/dist/safe-js/chunks/{chunk-IRDQDZ5R.js.map → chunk-P64CQIUA.js.map} +0 -0
- /package/dist/safe-js/chunks/{cli-runtime-NUEFUM64.js.map → cli-runtime-ZSOTNIVC.js.map} +0 -0
- /package/dist/safe-js/chunks/{mcp-S672263Q.js.map → mcp-2Z4XWHKW.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../tiny-mcp-client/src/http-json-budget.ts", "../../../tiny-mcp-client/src/internal.ts", "../../../tiny-mcp-client/src/http-message-validation.ts", "../../../toolcraft-schema/src/json.ts", "../../../toolcraft-schema/src/json-schema/utils.ts", "../../../toolcraft-schema/src/json-schema/compiler.ts", "../../../toolcraft-schema/src/json-schema/evaluate.ts", "../../../toolcraft-schema/src/json-schema/index.ts", "../../../tiny-stdio-mcp-server/src/metadata.ts", "../../../tiny-stdio-mcp-server/src/types.ts", "../../../tiny-stdio-mcp-server/src/base64.ts", "../../../tiny-stdio-mcp-server/src/uri.ts", "../../../tiny-stdio-mcp-server/src/input-request-schema.ts", "../../../tiny-stdio-mcp-server/src/protocol-validation.ts", "../../../tiny-stdio-mcp-server/src/sampling-messages.ts", "../../../tiny-stdio-mcp-server/src/protocol.ts", "../../../tiny-mcp-client/src/subscriptions.ts", "../../../mcp-oauth/src/client/persistence-options.ts", "../../../mcp-oauth/src/client/scope.ts", "../../../mcp-oauth/src/client/cancellable-operation.ts", "../../../mcp-oauth/src/client/bounded-json.ts", "../../../mcp-oauth/src/client/loopback-authorization.ts", "../../../mcp-oauth/src/client/authorization-state.ts", "../../../mcp-oauth/src/client/token-auth-method.ts", "../../../mcp-oauth/src/client/client-registration.ts", "../../../mcp-oauth/src/client/auth-store-session-store.ts", "../../../auth-store/src/encrypted-file-store.ts", "../../../auth-store/src/error-codes.ts", "../../../auth-store/src/transaction-lock.ts", "../../../auth-store/src/keychain-store.ts", "../../../auth-store/src/create-secret-store.ts", "../../../mcp-oauth/src/resource-indicator.ts", "../../../mcp-oauth/src/client/resource-bound-store.ts", "../../../mcp-oauth/src/client/default-oauth-client-provider.ts", "../../../mcp-oauth/src/http-fetch.ts", "../../../mcp-oauth/src/client/pkce.ts", "../../../mcp-oauth/src/http-response.ts", "../../../mcp-oauth/src/client/token-endpoint.ts", "../../../mcp-oauth/src/client/session-transaction.ts", "../../../mcp-oauth/src/server/jwks-token-verifier.ts", "../../../tiny-stdio-mcp-server/src/headers.ts", "../../../tiny-mcp-client/src/oauth-discovery.ts", "../../src/modules/mcp-transport.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Admission scan only: native JSON.parse still owns JSON grammar validation.\n * No strings or object graph are materialized here. Count keys as well as values,\n * including duplicate keys, and reserve 128 bytes per token/container plus UTF-16\n * string storage. These conservative estimates are ceilings, not heap guarantees.\n * Fixed per-message limits also protect Worker hosts using the default transport.\n */\nexport function assertHttpJsonBudget(text: string): void {\n let nodes = 0;\n let allocation = 0;\n let decodedBytes = 0;\n const stack: string[] = [];\n const whitespace = (c: string) => c === \" \" || c === \"\\t\" || c === \"\\r\" || c === \"\\n\";\n const check = () => {\n if (nodes > 100_000 || stack.length > 64 || allocation > 8 * 1024 * 1024 || decodedBytes > 4 * 1024 * 1024)\n throw new Error(\"MCP HTTP JSON structural budget exceeded\");\n };\n for (let i = 0; i < text.length;) {\n const c = text[i++];\n if (whitespace(c) || c === \",\" || c === \":\") continue;\n if (c === \"}\" || c === \"]\") {\n if (stack.pop() !== c) throw new SyntaxError(\"Malformed MCP HTTP JSON nesting\");\n continue;\n }\n nodes++;\n allocation += 128;\n if (c === \"{\" || c === \"[\") {\n stack.push(c === \"{\" ? \"}\" : \"]\");\n check();\n continue;\n }\n check();\n if (c === '\"') {\n let closed = false;\n while (i < text.length) {\n const character = text[i++];\n if (character === '\"') { closed = true; break; }\n if (character.charCodeAt(0) < 32) throw new SyntaxError(\"Malformed MCP HTTP JSON string\");\n if (character === \"\\\\\") {\n const escape = text[i++];\n if (escape === \"u\") {\n for (let digit = 0; digit < 4; digit++) {\n const hex = text[i++];\n if (hex === undefined || !\"0123456789abcdefABCDEF\".includes(hex))\n throw new SyntaxError(\"Malformed MCP HTTP JSON escape\");\n }\n } else if (escape === undefined || !'\"\\\\/bfnrt'.includes(escape)) {\n throw new SyntaxError(\"Malformed MCP HTTP JSON escape\");\n }\n }\n decodedBytes += 2;\n allocation += 2;\n check();\n }\n if (!closed) throw new SyntaxError(\"Unterminated MCP HTTP JSON string\");\n } else {\n // Scalars cannot allocate nested objects; JSON.parse validates their syntax.\n while (i < text.length && !whitespace(text[i]) && !'{}[],:\"'.includes(text[i])) i++;\n }\n }\n if (stack.length !== 0) throw new SyntaxError(\"Unterminated MCP HTTP JSON container\");\n}\n", "import { assertHttpJsonBudget } from \"./http-json-budget.js\";\nimport { spawn } from \"node:child_process\";\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from \"node:child_process\";\nimport { PassThrough } from \"node:stream\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { HttpResponseMessages } from \"./http-message-validation.js\";\nimport { SubscriptionManager, type NotificationFilter, type SubscriptionOptions, type McpSubscription } from \"./subscriptions.js\";\nexport type { NotificationFilter, SubscriptionOptions, McpSubscription } from \"./subscriptions.js\";\nimport { isBase64, isJsonValue, isValidUri, isValidMetadata, validateCacheMetadata, validateProtocolValue, validateServerResult, validateInputRequiredResult } from \"tiny-stdio-mcp-server/protocol\";\nimport { readBoundedResponseText } from \"./http-response.js\";\nimport type { JSONRPCMessage as SdkJsonRpcMessage } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n createOAuthClientProvider,\n fetchMcpResponse,\n OAuthError,\n type OAuthClientProvider,\n type OAuthClientProviderOptions,\n type StoredOAuthTokens,\n} from \"mcp-oauth\";\nexport { fetchMcpResponse } from \"mcp-oauth\";\nimport type { Tool as CoreTool, ContentItem as CoreContentItem, ResourceContents as CoreResourceContents, Server as TinyStdioMcpServer } from \"tiny-stdio-mcp-server\";\nexport type { Implementation, ResourceLink, Resource, ResourceTemplate, Prompt, PromptArgument, ToolAnnotations, Icon, ContentAnnotations, ToolExecution } from \"tiny-stdio-mcp-server\";\nimport type { Implementation, Resource, ResourceTemplate, Prompt } from \"tiny-stdio-mcp-server\";\nimport {\n encodeHeaderValue,\n getParameterHeaders,\n createParameterHeaders,\n type ParameterHeader\n} from \"tiny-stdio-mcp-server/headers\";\nimport {\n OAuthMetadataDiscovery,\n parseBearerWwwAuthenticateHeader,\n} from \"./oauth-discovery.js\";\nimport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\n\nexport {\n OAuthMetadataDiscovery,\n OAuthMetadataError,\n discoverOAuthMetadata,\n parseBearerWwwAuthenticateHeader,\n resolveAuthorizationServerMetadataUrl,\n resolveProtectedResourceMetadataUrl,\n} from \"./oauth-discovery.js\";\nexport {\n createAuthStoreSessionStore,\n createDefaultOAuthClientProvider,\n} from \"mcp-oauth\";\nexport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\nexport type { OAuthAuthorizationServerMetadata, OAuthDiscoveryResult, OAuthMetadataFetch, OAuthProtectedResourceMetadata, OAuthUnauthorizedChallenge } from \"./oauth-discovery.js\";\nexport type {\n DefaultOAuthClientProviderOptions,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthSessionStore,\n StoredOAuthSession,\n} from \"mcp-oauth\";\n\nfunction isValidParamsMetadata(params: unknown): boolean {\n const property = isObjectRecord(params) ? Object.getOwnPropertyDescriptor(params, \"_meta\") : undefined;\n return property === undefined || property.enumerable !== true ||\n (\"value\" in property && isValidMetadata(property.value));\n}\n\nexport type RequestId = number | string;\n\nconst inputResponseTypes = {\n \"roots/list\": \"ListRootsResult\",\n \"sampling/createMessage\": \"CreateMessageResult\",\n \"elicitation/create\": \"ElicitResult\"\n} as const;\n\n\nexport interface ClientCapabilities {\n extensions?: Record<string, Record<string, unknown>>;\n elicitation?: { form?: Record<string, unknown>; url?: Record<string, unknown> };\n roots?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n sampling?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface ServerCapabilities {\n extensions?: Record<string, Record<string, unknown>>;\n prompts?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n resources?: {\n subscribe?: boolean;\n listChanged?: boolean;\n [key: string]: unknown;\n };\n tools?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n logging?: {\n [key: string]: unknown;\n };\n completions?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface InitializeParams {\n protocolVersion: string;\n capabilities: ClientCapabilities;\n clientInfo: Implementation;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: ServerCapabilities;\n serverInfo: Implementation;\n instructions?: string;\n}\n\nexport interface ConnectResult {\n protocolVersion: string;\n capabilities: ServerCapabilities;\n serverInfo?: Implementation;\n instructions?: string;\n}\n\nexport type ElicitationParams =\n | { mode?: \"form\"; message: string; requestedSchema: Record<string, unknown> }\n | { mode: \"url\"; message: string; url: string; elicitationId: string };\n\nexport interface ElicitationResult {\n _meta?: Record<string, unknown>;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: Record<string, string | number | boolean | string[]>;\n}\n\nexport const MCP_PROTOCOL_VERSIONS = Object.freeze([\"2025-03-26\", \"2025-06-18\", \"2025-11-25\", \"2026-07-28\"] as const);\nexport type McpProtocolVersion = typeof MCP_PROTOCOL_VERSIONS[number];\n\nexport interface McpClientOptions {\n clientInfo: Implementation;\n requestTimeoutMs?: number;\n maxConcurrentRequests?: number;\n protocolVersion?: McpProtocolVersion;\n capabilities?: ClientCapabilities;\n onToolsChanged?: () => void | Promise<void>;\n onResourcesChanged?: () => void | Promise<void>;\n onResourceUpdated?: (uri: string) => void | Promise<void>;\n onPromptsChanged?: () => void | Promise<void>;\n onLog?: (message: LogMessage) => void | Promise<void>;\n onProgress?: (params: ProgressParams) => void | Promise<void>;\n onSamplingRequest?: (\n params: CreateMessageParams,\n context: McpRequestContext\n ) => CreateMessageResult | Promise<CreateMessageResult>;\n onRootsList?: (context: McpRequestContext) => Root[] | Promise<Root[]>;\n onElicitationRequest?: (params: ElicitationParams, context: McpRequestContext) => ElicitationResult | Promise<ElicitationResult>;\n}\n\nconst MCP_PROTOCOL_VERSION = \"2025-03-26\";\n\nexport class McpClient {\n private currentState: \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" = \"disconnected\";\n private currentServerCapabilities: ServerCapabilities | null = null;\n private currentClientCapabilities: ClientCapabilities | null = null;\n private currentServerInfo: Implementation | null = null;\n private currentInstructions: string | undefined;\n private readonly subscribedResourceUris = new Set<string>();\n private readonly activeProgressTokens = new Map<ProgressToken, number>();\n private readonly options: McpClientOptions;\n private transport: McpTransport | null = null;\n private messageLayer: JsonRpcMessageLayer | null = null;\n private subscriptions: SubscriptionManager | null = null;\n private readonly resourceSubscriptions = new Map<string, { controller: AbortController; subscription: Promise<McpSubscription> }>();\n\n constructor(options: McpClientOptions) {\n this.options = options;\n }\n\n get state(): \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" {\n return this.currentState;\n }\n\n get serverCapabilities(): ServerCapabilities | null {\n return this.currentServerCapabilities === null\n ? null\n : structuredClone(this.currentServerCapabilities);\n }\n\n get serverInfo(): Implementation | null {\n return this.currentServerInfo === null ? null : structuredClone(this.currentServerInfo);\n }\n\n get instructions(): string | undefined {\n return this.currentInstructions;\n }\n\n private getMessageLayerOrThrow(): JsonRpcMessageLayer {\n if (this.currentState === \"disconnected\") {\n throw new Error(\"MCP client is disconnected\");\n }\n\n if (this.currentState === \"closed\") {\n throw new Error(\"MCP client is closed\");\n }\n\n if (this.messageLayer === null) {\n throw new Error(\"MCP client is disconnected\");\n }\n\n return this.messageLayer;\n }\n\n async connect(transport: McpTransport, options: { signal?: AbortSignal } = {}): Promise<ConnectResult> {\n options.signal?.throwIfAborted();\n if (this.options.protocolVersion !== undefined && !MCP_PROTOCOL_VERSIONS.includes(this.options.protocolVersion))\n throw new Error(`Unsupported protocolVersion; use ${MCP_PROTOCOL_VERSIONS.join(\", \")}`);\n if (this.currentState !== \"disconnected\" && this.currentState !== \"closed\") {\n throw new Error(\"MCP client is already connected\");\n }\n\n this.currentServerCapabilities = null;\n this.currentClientCapabilities = null;\n this.currentServerInfo = null;\n this.currentInstructions = undefined;\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n\n const transportClosedReason = (transport.closeReason ?? transport.closed\n .then((closedEvent) => closedEvent.reason))\n .catch((error: unknown) =>\n error instanceof Error ? error : new Error(String(error))\n );\n let primaryCloseReason: Error | undefined;\n void transportClosedReason.then(reason => { primaryCloseReason = reason; });\n const messageLayer = new JsonRpcMessageLayer(\n transport.readable,\n transport.writable,\n this.options.requestTimeoutMs,\n transportClosedReason,\n this.options.maxConcurrentRequests\n );\n this.subscriptions = null;\n this.resourceSubscriptions.clear();\n const {\n onSamplingRequest,\n onRootsList,\n onToolsChanged,\n onResourcesChanged,\n onResourceUpdated,\n onPromptsChanged,\n onLog,\n onProgress,\n } = this.options;\n\n messageLayer.onRequest(\"ping\", () => ({}));\n\n if (onSamplingRequest !== undefined) {\n messageLayer.onRequest(\"sampling/createMessage\", (params, context) =>\n onSamplingRequest(params as CreateMessageParams, context)\n );\n }\n\n messageLayer.onNotification(\"notifications/tools/list_changed\", async (params) => {\n if (onToolsChanged === undefined) return;\n if (messageLayer.requestMetadata !== undefined) {\n if (!this.subscriptions?.accepts(\"notifications/tools/list_changed\", params)) return;\n } else if (this.currentServerCapabilities?.tools?.listChanged !== true) return;\n await onToolsChanged();\n });\n messageLayer.onNotification(\"notifications/resources/list_changed\", async (params) => {\n if (onResourcesChanged === undefined) return;\n if (messageLayer.requestMetadata !== undefined) {\n if (!this.subscriptions?.accepts(\"notifications/resources/list_changed\", params)) return;\n } else if (this.currentServerCapabilities?.resources?.listChanged !== true) return;\n await onResourcesChanged();\n });\n messageLayer.onNotification(\"notifications/resources/updated\", async (params) => {\n if (onResourceUpdated === undefined) {\n return;\n }\n\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n return;\n }\n\n if (messageLayer.requestMetadata !== undefined && !this.subscriptions?.accepts(\"notifications/resources/updated\", params)) return;\n const { uri } = params as { uri?: unknown };\n if (typeof uri !== \"string\" || (messageLayer.requestMetadata === undefined && !this.subscribedResourceUris.has(uri))) {\n return;\n }\n\n await onResourceUpdated(uri);\n });\n messageLayer.onNotification(\"notifications/prompts/list_changed\", async (params) => {\n if (onPromptsChanged === undefined) return;\n if (messageLayer.requestMetadata !== undefined) {\n if (!this.subscriptions?.accepts(\"notifications/prompts/list_changed\", params)) return;\n } else if (this.currentServerCapabilities?.prompts?.listChanged !== true) return;\n await onPromptsChanged();\n });\n messageLayer.onNotification(\"notifications/message\", async (params) => {\n if (onLog === undefined || !isObjectRecord(params) || !isLogLevel(params.level)) {\n return;\n }\n\n if (!hasOwn(params, \"data\")) {\n return;\n }\n\n const message: LogMessage = {\n level: params.level,\n data: params.data,\n };\n\n if (params.logger !== undefined) {\n if (typeof params.logger !== \"string\") {\n return;\n }\n\n message.logger = params.logger;\n }\n\n await onLog(message);\n });\n messageLayer.onNotification(\"notifications/progress\", async (params) => {\n if (onProgress === undefined || !isObjectRecord(params)) {\n return;\n }\n\n const { progressToken, progress } = params;\n if (\n !isRequestId(progressToken) ||\n typeof progress !== \"number\" ||\n !this.activeProgressTokens.has(progressToken)\n ) {\n return;\n }\n\n const progressParams: ProgressParams = {\n progressToken,\n progress,\n };\n\n if (params.total !== undefined) {\n if (typeof params.total !== \"number\") {\n return;\n }\n\n progressParams.total = params.total;\n }\n\n if (params.message !== undefined) {\n if (typeof params.message !== \"string\") {\n return;\n }\n\n progressParams.message = params.message;\n }\n\n await onProgress(progressParams);\n });\n messageLayer.onNotification(\"notifications/cancelled\", () => undefined);\n\n this.transport = transport;\n this.messageLayer = messageLayer;\n this.currentState = \"initializing\";\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n transport.closed\n .then((closedEvent) => {\n if (this.transport !== transport) {\n return;\n }\n\n this.messageLayer?.dispose(primaryCloseReason ?? closedEvent.reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n })\n .catch((error: unknown) => {\n if (this.transport !== transport) {\n return;\n }\n\n const reason = error instanceof Error ? error : new Error(String(error));\n this.messageLayer?.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n });\n\n const capabilities: ClientCapabilities = {\n ...(this.options.capabilities ?? {}),\n };\n\n if (onSamplingRequest !== undefined && capabilities.sampling === undefined) {\n capabilities.sampling = {};\n }\n\n if (onRootsList !== undefined) {\n capabilities.roots = {\n ...(capabilities.roots ?? {}),\n };\n }\n\n if (this.options.onElicitationRequest !== undefined && capabilities.elicitation === undefined) capabilities.elicitation = {};\n this.currentClientCapabilities = structuredClone(capabilities);\n if (this.options.onElicitationRequest !== undefined) messageLayer.onInputRequest(\"elicitation/create\", async (params, context) => {\n return await this.options.onElicitationRequest!(params as ElicitationParams, context);\n });\n if (onRootsList !== undefined) messageLayer.onInputRequest(\"roots/list\", async (_params, context) => ({ roots: await onRootsList(context) }));\n if (onSamplingRequest !== undefined) messageLayer.onInputRequest(\"sampling/createMessage\", async (params, context) => {\n return await onSamplingRequest(params as CreateMessageParams, context);\n });\n\n try {\n if (!validateProtocolValue(\"ClientCapabilities\", capabilities)) {\n throw new McpError(ERROR_INVALID_PARAMS, \"Invalid client capabilities\");\n }\n let discovery: unknown;\n try {\n if (this.options.protocolVersion === undefined || this.options.protocolVersion === \"2026-07-28\") discovery = await messageLayer.sendRequest(\"server/discover\", {\n _meta: {\n \"io.modelcontextprotocol/protocolVersion\": \"2026-07-28\",\n \"io.modelcontextprotocol/clientCapabilities\": capabilities\n }\n }, { signal: options.signal, timeoutMs: this.options.protocolVersion === \"2026-07-28\"\n ? this.options.requestTimeoutMs ?? 30_000\n : Math.min(this.options.requestTimeoutMs ?? 30_000, 1000) });\n } catch (error) {\n options.signal?.throwIfAborted();\n if (this.options.protocolVersion === \"2026-07-28\") throw error;\n if (error instanceof McpError && [-32020, -32021, -32022].includes(error.code)) throw error;\n }\n if (discovery !== undefined) {\n if (!isObjectRecord(discovery) || discovery.resultType !== \"complete\" ||\n !Array.isArray(discovery.supportedVersions) ||\n !discovery.supportedVersions.every((version) => typeof version === \"string\") ||\n !isServerCapabilities(discovery.capabilities)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid server/discover result\");\n }\n const cacheError = validateCacheMetadata(\"server/discover\", discovery);\n if (cacheError !== undefined) throw new McpError(ERROR_INVALID_REQUEST, cacheError);\n if (!validateServerResult(\"server/discover\", discovery)) throw new McpError(ERROR_INVALID_REQUEST, \"Invalid server/discover result\");\n if (!discovery.supportedVersions.includes(\"2026-07-28\")) {\n throw new McpError(-32022, \"No mutually supported modern protocol version\");\n }\n const metadata = discovery._meta;\n const identity = isObjectRecord(metadata) ? metadata[\"io.modelcontextprotocol/serverInfo\"] : undefined;\n if (identity !== undefined && (!isObjectRecord(identity) ||\n typeof identity.name !== \"string\" || typeof identity.version !== \"string\")) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid discovery serverInfo\");\n }\n if (discovery.instructions !== undefined && typeof discovery.instructions !== \"string\") {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid discovery instructions\");\n }\n this.currentInstructions = discovery.instructions;\n this.currentServerCapabilities = structuredClone(discovery.capabilities);\n this.currentServerInfo = identity === undefined ? null : structuredClone(identity as unknown as Implementation);\n messageLayer.requestMetadata = {\n \"io.modelcontextprotocol/protocolVersion\": \"2026-07-28\",\n \"io.modelcontextprotocol/clientCapabilities\": structuredClone(capabilities)\n };\n this.subscriptions = new SubscriptionManager(messageLayer);\n this.currentState = \"ready\";\n const notificationFilter: NotificationFilter = {\n ...(onToolsChanged === undefined ? {} : { toolsListChanged: true }),\n ...(onPromptsChanged === undefined ? {} : { promptsListChanged: true }),\n ...(onResourcesChanged === undefined ? {} : { resourcesListChanged: true })\n };\n if (Object.keys(notificationFilter).length > 0) await this.subscriptions.listen(notificationFilter, options);\n return {\n protocolVersion: \"2026-07-28\", capabilities: structuredClone(discovery.capabilities),\n ...(this.currentInstructions === undefined ? {} : { instructions: this.currentInstructions }),\n ...(this.currentServerInfo === null ? {} : { serverInfo: structuredClone(this.currentServerInfo) })\n };\n }\n const initializeResultValue = await messageLayer.sendRequest(\"initialize\", {\n protocolVersion: this.options.protocolVersion ?? MCP_PROTOCOL_VERSION,\n clientInfo: this.options.clientInfo,\n capabilities,\n }, { signal: options.signal });\n\n if (!isInitializeResult(initializeResultValue)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid initialize result\");\n }\n\n const initializeResult = initializeResultValue;\n\n if (initializeResult.protocolVersion === \"2026-07-28\" || !MCP_PROTOCOL_VERSIONS.includes(initializeResult.protocolVersion as McpProtocolVersion)) {\n throw new McpError(\n ERROR_INVALID_REQUEST,\n `Unsupported protocol version: ${initializeResult.protocolVersion}`\n );\n }\n if (this.options.protocolVersion !== undefined && initializeResult.protocolVersion !== this.options.protocolVersion)\n throw new McpError(ERROR_INVALID_REQUEST, `Pinned protocol version ${this.options.protocolVersion} rejected: server selected ${initializeResult.protocolVersion}`);\n\n this.currentServerCapabilities = structuredClone(initializeResult.capabilities);\n this.currentServerInfo = structuredClone(initializeResult.serverInfo);\n this.currentInstructions = initializeResult.instructions;\n if (onRootsList !== undefined) {\n messageLayer.onRequest(\"roots/list\", async (_params, context) => ({\n roots: await onRootsList(context),\n }));\n }\n if (this.options.onElicitationRequest !== undefined) {\n messageLayer.onRequest(\"elicitation/create\", async (params, context) =>\n this.options.onElicitationRequest!(params as ElicitationParams, context)\n );\n }\n if (transport.completeInitialization === undefined) messageLayer.sendNotification(\"notifications/initialized\");\n else await transport.completeInitialization({ signal: options.signal, timeoutMs: this.options.requestTimeoutMs ?? 30_000, protocolVersion: initializeResult.protocolVersion });\n this.currentState = \"ready\";\n\n return initializeResult;\n } catch (error) {\n if (this.transport === transport) {\n const reason = error instanceof Error ? error : new Error(String(error));\n messageLayer.dispose(reason);\n transport.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"disconnected\";\n }\n\n throw error;\n }\n }\n\n private getServerCapabilitiesOrThrow(): ServerCapabilities {\n if (this.currentServerCapabilities === null) {\n throw new Error(\"MCP client has not completed initialization\");\n }\n\n return this.currentServerCapabilities;\n }\n\n async listTools(params: PaginatedParams = {}, options: { signal?: AbortSignal } = {}): Promise<PaginatedResult & { tools: Tool[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"tools/list\", requestParams, options);\n if (!isToolsListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid tools/list result\");\n }\n\n return {\n ...result,\n tools:\n this.transport?.filterTools?.(result.tools, params.cursor === undefined) ?? result.tools\n };\n }\n\n async callTool(params: CallToolParams, options: CallToolOptions = {}): Promise<CallToolResult> {\n options = { ...options };\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n if (options.signal?.aborted) {\n throw options.signal.reason;\n }\n\n const requestParams =\n options.progressToken === undefined\n ? params\n : {\n ...params,\n _meta: {\n progressToken: options.progressToken,\n },\n };\n\n if (options.progressToken !== undefined) {\n this.activeProgressTokens.set(\n options.progressToken,\n (this.activeProgressTokens.get(options.progressToken) ?? 0) + 1\n );\n }\n\n try {\n let requestId: RequestId | undefined;\n let cancellationSent = false;\n const sendCancellationNotification = () => {\n if (requestId === undefined || cancellationSent) {\n return;\n }\n cancellationSent = true;\n messageLayer.sendNotification(\"notifications/cancelled\", { requestId });\n };\n const requestPromise = messageLayer.sendRequest(\"tools/call\", requestParams, {\n signal: options.signal,\n onRequestId: (nextRequestId) => {\n requestId = nextRequestId;\n },\n onTimeout: sendCancellationNotification,\n }).then((result) => {\n if (!isCallToolResult(result, messageLayer.requestMetadata !== undefined)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid tool result\");\n }\n\n return result;\n });\n if (options.signal === undefined) {\n return await requestPromise;\n }\n const signal = options.signal;\n\n let abortListener: (() => void) | undefined;\n const abortPromise = new Promise<CallToolResult>((_, reject) => {\n const rejectWithAbortReason = () => {\n sendCancellationNotification();\n if (requestId !== undefined) {\n messageLayer.cancelRequest(requestId, signal.reason);\n }\n reject(signal.reason);\n };\n\n abortListener = rejectWithAbortReason;\n signal.addEventListener(\"abort\", abortListener, { once: true });\n if (signal.aborted) {\n signal.removeEventListener(\"abort\", abortListener);\n rejectWithAbortReason();\n }\n });\n\n try {\n return (await Promise.race([requestPromise, abortPromise])) as CallToolResult;\n } finally {\n if (abortListener !== undefined) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n } finally {\n if (options.progressToken !== undefined) {\n const activeCount = this.activeProgressTokens.get(options.progressToken);\n if (activeCount === 1) {\n this.activeProgressTokens.delete(options.progressToken);\n } else if (activeCount !== undefined) {\n this.activeProgressTokens.set(options.progressToken, activeCount - 1);\n }\n }\n }\n }\n\n async listResources(\n params: PaginatedParams = {}, options: { signal?: AbortSignal } = {}\n ): Promise<PaginatedResult & { resources: Resource[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"resources/list\", requestParams, options);\n if (!isResourcesListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/list result\");\n }\n\n return result;\n }\n\n async listResourceTemplates(\n params: PaginatedParams = {}, options: { signal?: AbortSignal } = {}\n ): Promise<PaginatedResult & { resourceTemplates: ResourceTemplate[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"resources/templates/list\", requestParams, options);\n if (!isResourceTemplatesListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/templates/list result\");\n }\n\n return result;\n }\n\n async readResource(params: ReadResourceParams, options: { signal?: AbortSignal } = {}): Promise<CacheableResultMetadata & { contents: ResourceContents[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const result = await messageLayer.sendRequest(\"resources/read\", params, options);\n if (!isReadResourceResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/read result\");\n }\n\n return result;\n }\n\n async listenNotifications(\n filter: NotificationFilter,\n options: SubscriptionOptions = {}\n ): Promise<McpSubscription> {\n const layer = this.getMessageLayerOrThrow();\n if (layer.requestMetadata === undefined || this.subscriptions === null)\n throw new Error(\"Notification streams require modern MCP\");\n return await this.subscriptions.listen(filter, options);\n }\n\n async subscribe(uri: string, options: { signal?: AbortSignal } = {}): Promise<void> {\n options.signal?.throwIfAborted();\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (messageLayer.requestMetadata !== undefined) {\n if (serverCapabilities.resources === undefined)\n throw new Error(\"Server does not support resources\");\n const existing = this.resourceSubscriptions.get(uri);\n if (existing !== undefined) {\n const signal = options.signal;\n if (signal === undefined) await existing.subscription;\n else {\n let abort: () => void;\n const canceled = new Promise<never>((_resolve, reject) => {\n abort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n });\n try {\n signal.throwIfAborted();\n await Promise.race([existing.subscription, canceled]);\n } finally { signal.removeEventListener(\"abort\", abort!); }\n }\n return;\n }\n const controller = new AbortController();\n const abortSetup = () => controller.abort(options.signal?.reason);\n options.signal?.addEventListener(\"abort\", abortSetup, { once: true });\n const subscribing = this.subscriptions!.listen(\n { resourceSubscriptions: [uri] },\n { signal: controller.signal }\n ).then((listening) => {\n if (this.resourceSubscriptions.get(uri)?.subscription !== subscribing) {\n listening.cancel();\n throw new Error(\"Resource subscription canceled\");\n }\n if (!listening.notifications.resourceSubscriptions?.includes(uri)) {\n listening.cancel();\n throw new Error(\"Server declined the resource subscription\");\n }\n this.subscribedResourceUris.add(uri);\n void listening.closed\n .finally(() => {\n if (this.resourceSubscriptions.get(uri)?.subscription === subscribing) {\n this.resourceSubscriptions.delete(uri);\n this.subscribedResourceUris.delete(uri);\n }\n })\n .catch(() => undefined);\n return listening;\n }).finally(() => options.signal?.removeEventListener(\"abort\", abortSetup));\n this.resourceSubscriptions.set(uri, { controller, subscription: subscribing });\n try {\n await subscribing;\n } catch (error) {\n if (this.resourceSubscriptions.get(uri)?.subscription === subscribing)\n this.resourceSubscriptions.delete(uri);\n throw error;\n }\n return;\n }\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/subscribe\", { uri }, options);\n this.subscribedResourceUris.add(uri);\n }\n\n async unsubscribe(uri: string, options: { signal?: AbortSignal } = {}): Promise<void> {\n options.signal?.throwIfAborted();\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (messageLayer.requestMetadata !== undefined) {\n if (serverCapabilities.resources === undefined)\n throw new Error(\"Server does not support resources\");\n const pending = this.resourceSubscriptions.get(uri);\n this.resourceSubscriptions.delete(uri);\n this.subscribedResourceUris.delete(uri);\n pending?.controller.abort(new Error(\"Resource subscription canceled\"));\n return;\n }\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/unsubscribe\", { uri }, options);\n this.subscribedResourceUris.delete(uri);\n }\n\n async listPrompts(params: PaginatedParams = {}, options: { signal?: AbortSignal } = {}): Promise<PaginatedResult & { prompts: Prompt[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"prompts/list\", requestParams, options)) as {\n prompts: Prompt[];\n nextCursor?: string;\n };\n }\n\n async getPrompt(params: GetPromptParams, options: { signal?: AbortSignal } = {}): Promise<GetPromptResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const result = await messageLayer.sendRequest(\"prompts/get\", params, options);\n if (!isGetPromptResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid prompts/get result\");\n }\n\n return result;\n }\n\n async complete(params: CompleteParams, options: { signal?: AbortSignal } = {}): Promise<CompleteResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.completions === undefined) {\n throw new Error(\"Server does not support completions\");\n }\n\n const result = await messageLayer.sendRequest(\"completion/complete\", params, options);\n if (!isCompleteResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid completion/complete result\");\n }\n\n return result;\n }\n\n async setLogLevel(level: LogLevel, options: { signal?: AbortSignal } = {}): Promise<void> {\n options.signal?.throwIfAborted();\n const messageLayer = this.getMessageLayerOrThrow();\n if (messageLayer.requestMetadata !== undefined) throw new Error(\"Log level changes require legacy MCP\");\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.logging === undefined) {\n throw new Error(\"Server does not support logging\");\n }\n\n await messageLayer.sendRequest(\"logging/setLevel\", { level }, options);\n }\n\n async cancel(requestId: RequestId, reason?: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const params: { requestId: RequestId; reason?: string } = { requestId };\n\n if (reason !== undefined) {\n params.reason = reason;\n }\n\n messageLayer.sendNotification(\"notifications/cancelled\", params);\n }\n\n async sendRootsChanged(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n if (this.currentClientCapabilities?.roots?.listChanged !== true) {\n throw new Error(\"Client did not advertise roots list changes\");\n }\n\n messageLayer.sendNotification(\"notifications/roots/list_changed\");\n }\n\n async ping(options: { signal?: AbortSignal } = {}): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n await messageLayer.sendRequest(messageLayer.requestMetadata === undefined ? \"ping\" : \"server/discover\", undefined, options);\n }\n\n async close(): Promise<void> {\n if (this.currentState === \"closed\") {\n return;\n }\n\n const closeError = new Error(\"MCP client closed\");\n this.subscriptions?.close();\n this.subscriptions = null;\n this.resourceSubscriptions.clear();\n this.messageLayer?.dispose(closeError);\n this.transport?.dispose(closeError);\n this.messageLayer = null;\n this.transport = null;\n this.currentServerCapabilities = null;\n this.currentClientCapabilities = null;\n this.currentServerInfo = null;\n this.currentInstructions = undefined;\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n this.currentState = \"closed\";\n }\n}\n\nexport interface Tool extends Omit<CoreTool, \"inputSchema\" | \"outputSchema\"> {\n inputSchema: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n}\n\nexport interface CallToolParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\nexport interface CallToolOptions {\n signal?: AbortSignal;\n progressToken?: ProgressToken;\n}\n\nexport interface ReadResourceParams {\n uri: string;\n}\n\nexport interface PaginatedParams {\n cursor?: string;\n}\n\nexport interface ResultMetadata {\n resultType?: \"complete\";\n _meta?: Record<string, unknown>;\n}\n\nexport interface CacheableResultMetadata extends ResultMetadata {\n ttlMs?: number;\n cacheScope?: \"public\" | \"private\";\n}\n\nexport interface PaginatedResult extends CacheableResultMetadata {\n nextCursor?: string;\n}\n\nexport type TextResourceContents = Extract<CoreResourceContents, { text: string }>;\nexport type BlobResourceContents = Extract<CoreResourceContents, { blob: string }>;\nexport type ResourceContents = CoreResourceContents;\nexport type TextContent = Extract<CoreContentItem, { type: \"text\" }>;\nexport type ImageContent = Extract<CoreContentItem, { type: \"image\" }>;\nexport type AudioContent = Extract<CoreContentItem, { type: \"audio\" }>;\nexport type EmbeddedResource = Extract<CoreContentItem, { type: \"resource\" }>;\nexport type ContentItem = CoreContentItem;\n\nexport interface PromptMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem;\n}\n\nexport interface GetPromptResult extends ResultMetadata {\n description?: string;\n messages: PromptMessage[];\n}\n\nexport interface GetPromptParams {\n name: string;\n arguments?: Record<string, string>;\n}\n\nexport interface CallToolResult extends ResultMetadata {\n content: ContentItem[];\n structuredContent?: unknown;\n isError?: boolean;\n}\n\nexport interface Root {\n _meta?: Record<string, unknown>;\n uri: string;\n name?: string;\n}\n\nexport type LogLevel =\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\";\n\nexport interface LogMessage {\n level: LogLevel;\n logger?: string;\n data: unknown;\n}\n\nexport type ProgressToken = RequestId;\n\nexport interface ProgressParams {\n progressToken: ProgressToken;\n progress: number;\n total?: number;\n message?: string;\n}\n\nexport interface ModelHint {\n name?: string;\n}\n\nexport interface ModelPreferences {\n hints?: ModelHint[];\n costPriority?: number;\n speedPriority?: number;\n intelligencePriority?: number;\n}\n\nexport interface ToolUseContent {\n _meta?: Record<string, unknown>;\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface ToolResultContent {\n _meta?: Record<string, unknown>;\n type: \"tool_result\";\n toolUseId: string;\n content: ContentItem[];\n structuredContent?: unknown;\n isError?: boolean;\n}\n\nexport type SamplingContent = TextContent | ImageContent | AudioContent | ToolUseContent | ToolResultContent;\n\nexport interface SamplingMessage {\n _meta?: Record<string, unknown>;\n role: \"user\" | \"assistant\";\n content: SamplingContent | SamplingContent[];\n}\n\nexport type IncludeContext = \"none\" | \"thisServer\" | \"allServers\";\n\nexport interface CreateMessageParams {\n messages: SamplingMessage[];\n modelPreferences?: ModelPreferences;\n systemPrompt?: string;\n includeContext?: IncludeContext;\n temperature?: number;\n maxTokens: number;\n tools?: Tool[];\n toolChoice?: { mode: \"auto\" | \"required\" | \"none\" };\n stopSequences?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMessageResult {\n _meta?: Record<string, unknown>;\n model: string;\n content: SamplingContent | SamplingContent[];\n role: \"user\" | \"assistant\";\n stopReason?: string;\n}\n\nexport interface PromptReference {\n type: \"ref/prompt\";\n name: string;\n}\n\nexport interface ResourceReference {\n type: \"ref/resource\";\n uri: string;\n}\n\nexport interface CompleteArgument {\n name: string;\n value: string;\n}\n\nexport interface CompleteParams {\n context?: { arguments?: Record<string, string> };\n ref: PromptReference | ResourceReference;\n argument: CompleteArgument;\n}\n\nexport interface Completion {\n values: string[];\n hasMore?: boolean;\n total?: number;\n}\n\nexport interface CompleteResult extends ResultMetadata {\n completion: Completion;\n}\n\nexport const ERROR_PARSE = -32700;\nexport const ERROR_INVALID_REQUEST = -32600;\nexport const ERROR_METHOD_NOT_FOUND = -32601;\nexport const ERROR_INVALID_PARAMS = -32602;\nexport const ERROR_INTERNAL = -32603;\n\nexport interface McpTransportClosedEvent {\n reason: Error;\n code?: number;\n signal?: NodeJS.Signals;\n}\n\nexport interface McpTransport {\n readable: Readable;\n writable: Writable;\n closed: Promise<McpTransportClosedEvent>;\n /** Primary close reason, available before asynchronous transport cleanup finishes. */\n readonly closeReason?: Promise<Error>;\n dispose(reason?: Error): void;\n filterTools?(tools: Tool[], reset?: boolean): Tool[];\n /** Complete a legacy initialization handshake before the client reports ready. */\n completeInitialization?(options: { signal?: AbortSignal; timeoutMs: number; protocolVersion?: string }): Promise<void>;\n}\n\nexport interface InMemoryServerTransport {\n readable: Readable;\n writable: Writable;\n}\n\nexport interface InMemoryTransportPair {\n clientTransport: McpTransport;\n serverTransport: InMemoryServerTransport;\n}\n\nexport function createInMemoryTransportPair(): InMemoryTransportPair {\n const clientToServer = new PassThrough();\n const serverToClient = new PassThrough();\n let disposed = false;\n let resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n\n const closed = new Promise<McpTransportClosedEvent>((resolve) => {\n resolveClosed = resolve;\n });\n\n const resolveClosedOnce = (reason: Error): void => {\n if (resolveClosed === undefined) {\n return;\n }\n\n const currentResolve = resolveClosed;\n resolveClosed = undefined;\n currentResolve({ reason });\n };\n\n const dispose = (reason = new Error(\"In-memory transport disposed\")): void => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n if (!clientToServer.destroyed && !clientToServer.writableEnded) {\n clientToServer.end();\n }\n\n if (!serverToClient.destroyed && !serverToClient.writableEnded) {\n serverToClient.end();\n }\n\n resolveClosedOnce(reason);\n };\n\n clientToServer.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n serverToClient.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n return {\n clientTransport: {\n readable: serverToClient,\n writable: clientToServer,\n closed,\n dispose,\n },\n serverTransport: {\n readable: clientToServer,\n writable: serverToClient,\n },\n };\n}\n\ninterface SdkTransportAdapterInput {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage, extra?: any) => void;\n start(): Promise<void>;\n close(): Promise<void>;\n send(message: SdkJsonRpcMessage): Promise<void>;\n}\n\nexport interface McpClientConnection {\n connect(transport: McpTransport): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface SdkServerConnection {\n connect(transport: unknown): Promise<void>;\n}\n\nexport interface SdkTestPair<TClient extends McpClientConnection> {\n client: TClient;\n cleanup: () => Promise<void>;\n}\n\nexport class SdkTransportAdapter implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly sdkTransport: SdkTransportAdapterInput;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private disposed = false;\n\n constructor(sdkTransport: SdkTransportAdapterInput) {\n this.sdkTransport = sdkTransport;\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.sdkTransport.onmessage = (message) => {\n this.readStream.write(serializeJsonRpcMessage(message as JsonRpcMessage));\n };\n this.sdkTransport.onclose = () => {\n this.dispose(new Error(\"SDK transport closed\"));\n };\n this.sdkTransport.onerror = (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n };\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.sdkTransport.start().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"SDK transport adapter disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n if (this.resolveClosed !== undefined) {\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed({ reason });\n }\n\n this.sdkTransport.close().catch(() => undefined);\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n let parsedMessage: unknown;\n try {\n parsedMessage = JSON.parse(line);\n } catch {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n if (typeof parsedMessage !== \"object\" || parsedMessage === null || Array.isArray(parsedMessage)) {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n await this.sdkTransport.send(parsedMessage as SdkJsonRpcMessage);\n }\n }\n}\n\nexport async function createSdkTestPair<TClient extends McpClientConnection>(\n server: SdkServerConnection,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { InMemoryTransport } = await import(\"@modelcontextprotocol/sdk/inMemory.js\");\n const [clientSdkTransport, serverSdkTransport] = InMemoryTransport.createLinkedPair();\n const clientTransport = new SdkTransportAdapter(clientSdkTransport);\n const serverPromise = server.connect(serverSdkTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"SDK test pair setup failed\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"SDK test pair cleanup\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport async function createMockEchoToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-echo-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const echoTool = {\n name: \"echo\",\n description: \"Echoes the provided message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n message: {\n type: \"string\",\n },\n },\n required: [\"message\"],\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [echoTool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"echo\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const message = request.params.arguments?.message;\n if (typeof message !== \"string\") {\n throw new Error(\"Echo tool requires a string message argument\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: message,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockMultiToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-multi-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"add\",\n description: \"Adds two numbers and returns the sum as text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n a: { type: \"number\" },\n b: { type: \"number\" },\n },\n required: [\"a\", \"b\"],\n },\n },\n {\n name: \"greet\",\n description: \"Greets a user with optional formal tone.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" },\n formal: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"fail\",\n description: \"Returns an intentional tool error payload.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"add\") {\n const a = request.params.arguments?.a;\n const b = request.params.arguments?.b;\n\n if (typeof a !== \"number\" || typeof b !== \"number\") {\n throw new Error(\"Add tool requires numeric a and b arguments\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: String(a + b),\n },\n ],\n };\n }\n\n if (request.params.name === \"greet\") {\n const name = request.params.arguments?.name;\n const formal = request.params.arguments?.formal;\n\n if (typeof name !== \"string\") {\n throw new Error(\"Greet tool requires a string name argument\");\n }\n if (formal !== undefined && typeof formal !== \"boolean\") {\n throw new Error(\"Greet tool formal argument must be boolean when provided\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formal ? `Good day, ${name}.` : `Hello, ${name}!`,\n },\n ],\n };\n }\n\n if (request.params.name === \"fail\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional tool failure.\",\n },\n ],\n };\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockPaginatedToolsServer(): Promise<SdkServerConnection> {\n const [{ Server }, { ListToolsRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-paginated-tools-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const pageSize = 5;\n const tools = Array.from({ length: 20 }, (_, index) => ({\n name: `tool-${index + 1}`,\n description: `Mock paginated tool ${index + 1}.`,\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n }));\n\n server.setRequestHandler(ListToolsRequestSchema, async (request) => {\n const cursor = request.params?.cursor;\n const startIndex = cursor === undefined ? 0 : Number(cursor);\n\n if (\n !Number.isInteger(startIndex) ||\n startIndex < 0 ||\n startIndex > tools.length ||\n startIndex % pageSize !== 0\n ) {\n throw new Error(`Invalid cursor: ${String(cursor)}`);\n }\n\n const pageTools = tools.slice(startIndex, startIndex + pageSize);\n const nextIndex = startIndex + pageSize;\n if (nextIndex >= tools.length) {\n return { tools: pageTools };\n }\n\n return {\n tools: pageTools,\n nextCursor: String(nextIndex),\n };\n });\n\n return server;\n}\n\nexport async function createMockResourceServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: {} } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n {\n uri: \"file:///image.png\",\n name: \"image.png\",\n mimeType: \"image/png\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"This is a mock README resource.\",\n },\n ],\n [\n \"file:///image.png\",\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgL9qj3QAAAAASUVORK5CYII=\",\n },\n ],\n ]);\n const resourceTemplates = [\n {\n uriTemplate: \"file:///{path}\",\n name: \"file-template\",\n },\n ];\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates,\n }));\n\n return server;\n}\n\nexport async function createMockSubscribableResourceServer(): Promise<\n SdkServerConnection & {\n triggerResourceUpdated: (uri: string, updatedText?: string) => Promise<void>;\n triggerResourceListChanged: () => Promise<void>;\n }\n> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n SubscribeRequestSchema,\n UnsubscribeRequestSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-subscribable-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: { subscribe: true, listChanged: true } } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"Initial subscribable resource text.\",\n },\n ],\n ]);\n const subscribedUris = new Set<string>();\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(SubscribeRequestSchema, async (request) => {\n subscribedUris.add(request.params.uri);\n return {};\n });\n\n server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {\n subscribedUris.delete(request.params.uri);\n return {};\n });\n\n return Object.assign(server, {\n triggerResourceUpdated: async (uri: string, updatedText?: string): Promise<void> => {\n if (updatedText !== undefined) {\n const existingContent = resourceContentsByUri.get(uri);\n if (existingContent === undefined || \"blob\" in existingContent) {\n throw new Error(`Unknown text resource: ${uri}`);\n }\n\n resourceContentsByUri.set(uri, {\n uri,\n mimeType: existingContent.mimeType,\n text: updatedText,\n });\n }\n\n if (!subscribedUris.has(uri)) {\n return;\n }\n\n await server.sendResourceUpdated({ uri });\n },\n triggerResourceListChanged: async (): Promise<void> => {\n await server.sendResourceListChanged();\n },\n });\n}\n\nexport async function createMockPromptServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, McpError: SdkMcpError },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-prompt-server\", version: \"1.0.0\" },\n { capabilities: { prompts: {} } }\n );\n const promptTemplates = [\n {\n prompt: {\n name: \"code_review\",\n description: \"Review code for correctness and maintainability.\",\n arguments: [\n {\n name: \"code\",\n description: \"Code to review.\",\n required: true,\n },\n ],\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please review the following code:\\n{{code}}\",\n },\n {\n role: \"assistant\" as const,\n textTemplate: \"I will review the code for potential issues and improvements.\",\n },\n ],\n },\n {\n prompt: {\n name: \"summarize\",\n description: \"Summarize the provided text.\",\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please summarize the provided text.\",\n },\n ],\n },\n ];\n const promptsByName = new Map(promptTemplates.map((template) => [template.prompt.name, template]));\n\n const renderPromptMessage = (\n textTemplate: string,\n argumentsMap: Record<string, unknown> | undefined\n ): string => {\n if (argumentsMap === undefined) {\n return textTemplate;\n }\n\n let renderedText = textTemplate;\n for (const [name, value] of Object.entries(argumentsMap)) {\n if (typeof value !== \"string\") {\n continue;\n }\n\n renderedText = renderedText.split(`{{${name}}}`).join(value);\n }\n\n return renderedText;\n };\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: promptTemplates.map((template) => template.prompt),\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const template = promptsByName.get(request.params.name);\n if (template === undefined) {\n throw new SdkMcpError(ErrorCode.InvalidParams, `Unknown prompt: ${request.params.name}`);\n }\n\n const requestArguments = request.params.arguments;\n for (const argument of template.prompt.arguments ?? []) {\n if (!argument.required) {\n continue;\n }\n\n const value = requestArguments?.[argument.name];\n if (typeof value !== \"string\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n `Missing required prompt argument: ${argument.name}`\n );\n }\n }\n\n return {\n description: template.prompt.description,\n messages: template.messages.map((message) => ({\n role: message.role,\n content: {\n type: \"text\" as const,\n text: renderPromptMessage(message.textTemplate, requestArguments),\n },\n })),\n };\n });\n\n return server;\n}\n\nexport async function createMockCompletionServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CompleteRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-completion-server\", version: \"1.0.0\" },\n { capabilities: { completions: {} } }\n );\n const promptArgumentCompletions = new Map<string, string[]>([\n [\"code_review:language\", [\"python\", \"pydantic\", \"pytest\", \"pytorch\", \"pyright\", \"rust\"]],\n ]);\n const maxValues = 3;\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (request.params.ref.type !== \"ref/prompt\") {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const completionKey = `${request.params.ref.name}:${request.params.argument.name}`;\n const candidates = promptArgumentCompletions.get(completionKey) ?? [];\n const partialValue = request.params.argument.value.toLowerCase();\n const matchingValues = candidates.filter((candidate) =>\n candidate.toLowerCase().startsWith(partialValue)\n );\n const values = matchingValues.slice(0, maxValues);\n\n if (values.length < matchingValues.length) {\n return {\n completion: {\n values,\n hasMore: true,\n total: matchingValues.length,\n },\n };\n }\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createMockProgressServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-progress-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const totalSteps = 4;\n const tool = {\n name: \"slow_task\",\n description: \"Runs a simulated slow task and streams progress updates.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow_task\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const progressToken = request.params._meta?.progressToken;\n if (progressToken !== undefined) {\n for (let step = 1; step <= totalSteps; step += 1) {\n await extra.sendNotification({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress: step,\n total: totalSteps,\n message: `Completed step ${step} of ${totalSteps}`,\n },\n });\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 5);\n });\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"slow_task complete\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport interface MockSlowToolServerOptions {\n delayMs?: number;\n pollIntervalMs?: number;\n}\n\nexport async function createMockSlowToolServer(\n options: MockSlowToolServerOptions = {}\n): Promise<\n SdkServerConnection & {\n wasStarted: () => boolean;\n getStartedRequestIds: () => RequestId[];\n wasCancelled: () => boolean;\n getCancelledRequestIds: () => RequestId[];\n }\n> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const defaultDelayMs = options.delayMs ?? 1_000;\n const pollIntervalMs = options.pollIntervalMs ?? 10;\n if (!Number.isFinite(defaultDelayMs) || defaultDelayMs < 0) {\n throw new Error(\"createMockSlowToolServer delayMs must be a finite non-negative number\");\n }\n if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {\n throw new Error(\"createMockSlowToolServer pollIntervalMs must be a finite positive number\");\n }\n\n const server = new Server(\n { name: \"mock-slow-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const startedRequestIds = new Set<RequestId>();\n const cancelledRequestIds = new Set<RequestId>();\n const tool = {\n name: \"slow\",\n description: \"Delays the response and supports cancellation.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n delayMs: {\n type: \"number\",\n },\n },\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n startedRequestIds.add(extra.requestId);\n\n const delayArgument = request.params.arguments?.delayMs;\n const delayMs =\n delayArgument === undefined\n ? defaultDelayMs\n : typeof delayArgument === \"number\" && Number.isFinite(delayArgument) && delayArgument >= 0\n ? delayArgument\n : NaN;\n if (!Number.isFinite(delayMs)) {\n throw new Error(\"slow tool delayMs argument must be a finite non-negative number\");\n }\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n const elapsedMs = Date.now() - startedAt;\n const remainingMs = delayMs - elapsedMs;\n await new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, Math.min(pollIntervalMs, remainingMs)));\n });\n }\n\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `slow complete after ${delayMs}ms`,\n },\n ],\n };\n });\n\n return Object.assign(server, {\n wasStarted: (): boolean => startedRequestIds.size > 0,\n getStartedRequestIds: (): RequestId[] => Array.from(startedRequestIds),\n wasCancelled: (): boolean => cancelledRequestIds.size > 0,\n getCancelledRequestIds: (): RequestId[] => Array.from(cancelledRequestIds),\n });\n}\n\nexport async function createMockErrorServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError: SdkMcpError },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-error-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"invalid_params\",\n description: \"Returns a JSON-RPC Invalid Params error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"is_error\",\n description: \"Returns a tools/call result with isError: true.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"internal_error\",\n description: \"Throws an internal server error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"invalid_params\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n \"Intentional invalid params error from mock-error-server.\"\n );\n }\n\n if (request.params.name === \"is_error\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional isError tool failure.\",\n },\n ],\n };\n }\n\n if (request.params.name === \"internal_error\") {\n throw new Error(\"Intentional internal error from mock-error-server.\");\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockSamplingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-sampling-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"sample_message\",\n description: \"Requests sampling/createMessage from the client and returns the sampled text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n },\n },\n required: [\"topic\"],\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"sample_message\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n if (typeof topic !== \"string\") {\n throw new Error(\"sample_message requires a string topic argument\");\n }\n\n const samplingResult = await server.createMessage({\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Provide a concise sentence about ${topic}.`,\n },\n },\n ],\n maxTokens: 64,\n modelPreferences: {\n hints: [{ name: \"mock-sampling-model\" }],\n speedPriority: 0.2,\n intelligencePriority: 0.9,\n },\n systemPrompt: \"Return exactly one concise sentence.\",\n });\n\n const sampledText =\n samplingResult.content.type === \"text\"\n ? samplingResult.content.text\n : JSON.stringify(samplingResult.content);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Sampled response: ${sampledText}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockRootsServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n RootsListChangedNotificationSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-roots-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"roots_summary\",\n description: \"Requests roots/list from the client and returns a summary of roots.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {\n await server.listRoots();\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"roots_summary\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const rootsResult = await server.listRoots();\n const rootSummary = rootsResult.roots\n .map((root) => (root.name === undefined ? root.uri : `${root.name} (${root.uri})`))\n .join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: rootSummary.length === 0 ? \"Roots: none\" : `Roots: ${rootSummary}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockLoggingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-logging-server\", version: \"1.0.0\" },\n { capabilities: { tools: {}, logging: {} } }\n );\n const tool = {\n name: \"emit_logs\",\n description: \"Emits mock log messages at multiple levels.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"emit_logs\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"debug\",\n logger: \"mock-logging-server\",\n data: { message: \"Debug message\" },\n });\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-logging-server\",\n data: { message: \"Info message\" },\n });\n await server.sendLoggingMessage({\n level: \"error\",\n logger: \"mock-logging-server\",\n data: { message: \"Error message\" },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Emitted log messages.\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockFullFeaturedServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n CompleteRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-full-featured-server\", version: \"1.0.0\" },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n logging: {},\n completions: {},\n },\n }\n );\n const tool = {\n name: \"full_featured_ping\",\n description: \"Returns a text response and emits an info log.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n const resources = [\n {\n uri: \"file:///full-featured.txt\",\n name: \"full-featured.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const prompts = [\n {\n name: \"full_featured_prompt\",\n description: \"Returns a short prompt message for a topic.\",\n arguments: [\n {\n name: \"topic\",\n description: \"Topic to include in the prompt output.\",\n required: false,\n },\n ],\n },\n ];\n const completionValues = [\"alpha\", \"beta\", \"gamma\"];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_ping\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-full-featured-server\",\n data: {\n message: \"full_featured_ping called\",\n },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"full_featured_ping ok\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (request.params.uri !== \"file:///full-featured.txt\") {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [\n {\n uri: \"file:///full-featured.txt\",\n mimeType: \"text/plain\",\n text: \"Mock full-featured resource\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts,\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_prompt\") {\n throw new Error(`Unknown prompt: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n const topicText = typeof topic === \"string\" && topic.length > 0 ? topic : \"general\";\n\n return {\n description: \"Mock prompt from full-featured server.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Provide a short summary for ${topicText}.`,\n },\n },\n ],\n };\n });\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (\n request.params.ref.type !== \"ref/prompt\" ||\n request.params.ref.name !== \"full_featured_prompt\" ||\n request.params.argument.name !== \"topic\"\n ) {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const partialValue = request.params.argument.value.toLowerCase();\n const values = completionValues.filter((value) => value.startsWith(partialValue));\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createTestPair<TClient extends McpClientConnection>(\n server: TinyStdioMcpServer,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { clientTransport, serverTransport } = createInMemoryTransportPair();\n const serverPromise = server.connect(serverTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair setup failed\"));\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair cleanup\"));\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport type StdioSpawn = (\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n) => ChildProcessWithoutNullStreams;\n\nexport interface StdioTransportOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n spawn?: StdioSpawn;\n}\n\nexport type HttpTransportFetch = (\n input: string | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport class HttpTransportError extends Error {\n constructor(message: string, readonly status: number, readonly method: \"GET\" | \"POST\" | \"DELETE\", readonly rpcMethod?: string) {\n super(message);\n this.name = \"HttpTransportError\";\n }\n}\n\nexport interface HttpTransportOptions {\n url: string;\n /** Legacy SSE uses a GET stream that announces the RPC POST endpoint. */\n mode?: \"streamable-http\" | \"sse\";\n headers?: RequestInit[\"headers\"];\n fetch?: HttpTransportFetch;\n oauth?: OAuthClientProviderOptions;\n oauthDiscoveryCache?: OAuthDiscoveryCache;\n onWarning?: (message: string) => void;\n /** Maximum JSON response bytes or individual SSE event bytes; not a stream lifetime cap. */\n maxResponseBytes?: number;\n}\n\nfunction defaultStdioSpawn(\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n): ChildProcessWithoutNullStreams {\n return spawn(command, args, options) as ChildProcessWithoutNullStreams;\n}\n\nfunction defaultHttpTransportFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nexport class StdioTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly child: ChildProcessWithoutNullStreams;\n private disposed = false;\n private stderrOutput = \"\";\n private static readonly STDERR_MAX_LENGTH = 65_536;\n\n constructor({\n command,\n args = [],\n cwd,\n env,\n spawn: spawnProcess = defaultStdioSpawn,\n }: StdioTransportOptions) {\n this.child = spawnProcess(command, args, {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const child = this.child;\n\n this.readable = child.stdout;\n this.writable = child.stdin;\n const stderrDecoder = new TextDecoder();\n child.stderr.on(\"data\", (chunk: unknown) => {\n const decoded =\n chunk instanceof Uint8Array\n ? stderrDecoder.decode(chunk, { stream: true })\n : `${stderrDecoder.decode()}${String(chunk)}`;\n this.appendStderrOutput(decoded);\n });\n child.stderr.once(\"end\", () => {\n this.appendStderrOutput(stderrDecoder.decode());\n });\n this.closed = new Promise((resolve) => {\n let settled = false;\n let streamError: Error | undefined;\n const resolveClosed = (event: McpTransportClosedEvent) => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(event);\n };\n\n for (const stream of [child.stdin, child.stdout, child.stderr]) {\n stream.once(\"error\", (reason: Error) => {\n streamError ??= reason;\n this.dispose(reason);\n });\n }\n\n child.once(\"exit\", (code, signal) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: streamError ?? new Error(\"Stdio transport process exited\"),\n };\n\n if (code !== null) {\n closedEvent.code = code;\n }\n\n if (signal !== null) {\n closedEvent.signal = signal;\n }\n\n resolveClosed(closedEvent);\n });\n\n child.once(\"error\", (error) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: error instanceof Error ? error : new Error(String(error)),\n };\n\n if (child.exitCode !== null) {\n closedEvent.code = child.exitCode;\n }\n\n if (child.signalCode !== null) {\n closedEvent.signal = child.signalCode;\n }\n\n resolveClosed(closedEvent);\n });\n });\n }\n\n getStderrOutput(): string {\n return this.stderrOutput;\n }\n\n private appendStderrOutput(chunk: string): void {\n if (chunk.length === 0) {\n return;\n }\n\n this.stderrOutput += chunk;\n if (this.stderrOutput.length > StdioTransport.STDERR_MAX_LENGTH) {\n this.stderrOutput = this.stderrOutput.slice(-StdioTransport.STDERR_MAX_LENGTH);\n }\n }\n\n dispose(reason = new Error(\"Stdio transport disposed\")): void {\n void reason;\n\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode === null && this.child.signalCode === null && !this.child.killed) {\n this.child.kill(\"SIGTERM\");\n }\n }\n}\n\n/** Own and validate static HTTP headers without reflecting malformed values. */\nexport function snapshotHttpTransportHeaders(headers?: RequestInit[\"headers\"]): Headers {\n try { return new Headers(headers); }\n catch { throw new Error(\"Invalid HTTP transport headers\"); }\n}\n\nexport class HttpTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n readonly closeReason: Promise<Error>;\n private resolveCloseReason: ((reason: Error) => void) | undefined;\n private readonly url: string;\n private readonly mode: \"streamable-http\" | \"sse\";\n private legacyEndpoint: string | undefined;\n private legacyEndpointReady: Promise<string> | undefined;\n private resolveLegacyEndpoint: ((endpoint: string) => void) | undefined;\n private rejectLegacyEndpoint: ((reason: Error) => void) | undefined;\n private readonly headers: Headers;\n private readonly fetchImpl: HttpTransportFetch;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private sessionId: string | undefined;\n private legacyProtocolVersion: string | undefined;\n private initializationRequestId: RequestId | undefined;\n private lastEventId: string | undefined;\n private getSseStreamStarted = false;\n private disposed = false;\n private readonly oauthProvider: OAuthClientProvider | undefined;\n private readonly oauthMetadataDiscovery: OAuthMetadataDiscovery | undefined;\n private readonly inFlightFetchAbortControllers = new Set<AbortController>();\n private readonly inFlightOAuthAbortControllers = new Set<AbortController>();\n private readonly oauthRequestTokens = new WeakMap<Headers, StoredOAuthTokens>();\n private readonly openResponseReaders = new Set<ReadableStreamDefaultReader<Uint8Array>>();\n private readonly modernRequests = new Map<RequestId, AbortController>();\n private modernMode = false;\n private readonly maxResponseBytes: number;\n private readonly toolParameterHeaders = new Map<string, ParameterHeader[]>();\n private readonly onWarning: ((message: string) => void) | undefined;\n\n constructor({\n url,\n mode = \"streamable-http\",\n headers = {},\n fetch: fetchImpl = defaultHttpTransportFetch,\n oauth,\n oauthDiscoveryCache,\n onWarning,\n maxResponseBytes = 16 * 1024 * 1024,\n }: HttpTransportOptions) {\n if (maxResponseBytes !== Infinity && (!Number.isSafeInteger(maxResponseBytes) || maxResponseBytes < 1))\n throw new Error(\"HTTP response byte limit must be a positive safe integer\");\n try {\n const target = new URL(url);\n if (![\"http:\", \"https:\"].includes(target.protocol) || target.username || target.password || target.href.includes(\"#\"))\n throw new Error(\"Invalid HTTP transport target\");\n } catch {\n throw new Error(\"HTTP transport URL must be an absolute HTTP URL without credentials or fragment\");\n }\n this.maxResponseBytes = maxResponseBytes;\n this.url = url;\n this.mode = mode;\n this.headers = snapshotHttpTransportHeaders(headers);\n this.fetchImpl = fetchImpl;\n this.onWarning = onWarning;\n this.oauthProvider = oauth === undefined\n ? undefined\n : createOAuthClientProvider(oauth);\n this.oauthMetadataDiscovery = oauth === undefined\n ? undefined\n : new OAuthMetadataDiscovery({\n fetch: (input, init) => this.fetchWithAbort(input, init ?? {}),\n cache: oauthDiscoveryCache,\n });\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closeReason = new Promise(resolve => { this.resolveCloseReason = resolve; });\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n async completeInitialization(options: { signal?: AbortSignal; timeoutMs: number; protocolVersion?: string }): Promise<void> {\n validateRequestTimer(options.timeoutMs, \"timeoutMs\");\n const deadline = options.timeoutMs > 0 ? AbortSignal.timeout(Math.ceil(options.timeoutMs)) : undefined;\n const signals = [options.signal, deadline].filter((signal): signal is AbortSignal => signal !== undefined);\n const signal = signals.length === 0 ? new AbortController().signal : AbortSignal.any(signals);\n signal.throwIfAborted();\n if (options.protocolVersion !== undefined) this.legacyProtocolVersion = options.protocolVersion;\n this.maybeOpenGetSseStream();\n try {\n await this.sendPost(serializeJsonRpcMessage({ jsonrpc: \"2.0\", method: \"notifications/initialized\" }), signal);\n signal.throwIfAborted();\n if (this.disposed) throw await this.closeReason;\n } catch (error) {\n if (error instanceof HttpTransportError)\n throw new HttpTransportError(error.message, error.status, error.method, \"notifications/initialized\");\n throw error;\n }\n }\n\n filterTools(tools: Tool[], reset = true): Tool[] {\n if (reset) this.toolParameterHeaders.clear();\n const accepted: Tool[] = [];\n for (const tool of tools) {\n try {\n this.toolParameterHeaders.set(tool.name, getParameterHeaders(tool.inputSchema));\n accepted.push(tool);\n } catch (error) {\n this.toolParameterHeaders.delete(tool.name);\n this.onWarning?.(\n `Rejected MCP tool ${tool.name}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n return accepted;\n }\n\n dispose(reason = new Error(\"HTTP transport disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.rejectLegacyEndpoint?.(reason);\n this.rejectLegacyEndpoint = undefined;\n this.resolveLegacyEndpoint = undefined;\n this.resolveCloseReason?.(reason);\n this.resolveCloseReason = undefined;\n this.toolParameterHeaders.clear();\n this.abortInFlightFetches(reason);\n this.cancelOpenResponseReaders();\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n void this.closeWithSessionTermination(reason);\n }\n\n private async closeWithSessionTermination(reason: Error): Promise<void> {\n let closeReason = reason;\n if (this.sessionId !== undefined) {\n const sessionId = this.sessionId;\n this.sessionId = undefined;\n const controller = new AbortController();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const expired = new Promise<never>((_resolve, reject) => {\n timeout = setTimeout(() => {\n const error = new Error(\"HTTP transport session termination timed out\");\n controller.abort(error);\n reject(error);\n }, 1000);\n });\n try {\n await Promise.race([this.sendSessionTerminationRequest(sessionId, controller.signal), expired]);\n } catch (error) {\n closeReason = error instanceof Error ? error : new Error(String(error));\n } finally { clearTimeout(timeout); }\n }\n\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed?.({ reason: closeReason });\n }\n\n private abortInFlightFetches(reason: Error): void {\n for (const controller of this.modernRequests.values()) controller.abort(reason);\n this.modernRequests.clear();\n for (const abortController of this.inFlightFetchAbortControllers) {\n abortController.abort(reason);\n }\n for (const controller of this.inFlightOAuthAbortControllers) controller.abort(reason);\n this.inFlightOAuthAbortControllers.clear();\n this.inFlightFetchAbortControllers.clear();\n }\n\n private cancelOpenResponseReaders(): void {\n for (const reader of this.openResponseReaders) {\n void reader.cancel().catch(() => undefined);\n }\n\n this.openResponseReaders.clear();\n }\n\n private async fetchWithAbort(\n input: string | URL,\n init: RequestInit,\n controller?: AbortController\n ): Promise<Response> {\n if (this.disposed) {\n throw new Error(\"HTTP transport disposed\");\n }\n\n const abortController = controller ?? new AbortController();\n abortController.signal.throwIfAborted();\n const signal = init.signal == null ? abortController.signal\n : AbortSignal.any([init.signal, abortController.signal]);\n signal.throwIfAborted();\n this.inFlightFetchAbortControllers.add(abortController);\n\n try {\n return await fetchMcpResponse(this.fetchImpl, input, {\n ...init,\n signal\n });\n } finally {\n this.inFlightFetchAbortControllers.delete(abortController);\n }\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n const parsed = parseJsonRpcMessage(line);\n const post = this.sendPost(line);\n if (\n (parsed.type === \"request\" && parsed.message.method === \"initialize\") ||\n (parsed.type === \"notification\" && parsed.message.method === \"notifications/initialized\")\n ) {\n try { await post; }\n catch (error) {\n // Preserve the HTTP failure before ending the iterator. Throwing here\n // destroys its writable with AbortError while session cleanup is pending.\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n }\n } else {\n void post.catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n }\n }\n\n private async sendPost(line: string, signal?: AbortSignal): Promise<void> {\n signal?.throwIfAborted();\n const parsed = parseJsonRpcMessage(line);\n const message =\n parsed.type === \"request\" || parsed.type === \"notification\" ? parsed.message : undefined;\n const metadata = isObjectRecord(message?.params) ? message.params._meta : undefined;\n const modern =\n isObjectRecord(metadata) &&\n typeof metadata[\"io.modelcontextprotocol/protocolVersion\"] === \"string\";\n if (modern) this.modernMode = true;\n if (parsed.type === \"request\" && parsed.message.method === \"initialize\") {\n this.modernMode = false;\n this.initializationRequestId = parsed.message.id;\n this.legacyProtocolVersion = MCP_PROTOCOL_VERSION;\n if (isObjectRecord(parsed.message.params) && typeof parsed.message.params.protocolVersion === \"string\")\n this.legacyProtocolVersion = parsed.message.params.protocolVersion;\n }\n if (\n this.modernMode &&\n parsed.type === \"notification\" &&\n parsed.message.method === \"notifications/cancelled\"\n ) {\n const requestId = isObjectRecord(parsed.message.params)\n ? parsed.message.params.requestId\n : undefined;\n if (typeof requestId === \"string\" || typeof requestId === \"number\")\n this.modernRequests.get(requestId)?.abort();\n return;\n }\n const controller = (modern && parsed.type === \"request\") || signal !== undefined ? new AbortController() : undefined;\n const aborted = () => controller?.abort(signal?.reason);\n signal?.addEventListener(\"abort\", aborted, { once: true });\n if (signal?.aborted) aborted();\n const id = parsed.type === \"request\" ? parsed.message.id : undefined;\n if (controller !== undefined && id !== undefined) this.modernRequests.set(id, controller);\n try {\n const postUrl = this.mode === \"sse\" ? await this.ensureLegacyEndpoint() : this.url;\n const hasSessionId = !modern && this.sessionId !== undefined;\n const response = await this.fetchWithOAuthRetry({\n url: postUrl,\n method: \"POST\",\n createHeaders: signal => this.createPostHeaders(message, modern, signal),\n body: line,\n controller\n });\n\n if (this.disposed || controller?.signal.aborted) {\n void response.body?.cancel().catch(() => undefined);\n return;\n }\n\n if (hasSessionId && response.status === 404) {\n void response.body?.cancel().catch(() => undefined);\n this.sessionId = undefined;\n this.dispose(new HttpTransportError(\"HTTP transport session expired (404 response)\", 404, \"POST\"));\n return;\n }\n\n if (\n await this.throwForPostHttpError(\n response,\n modern && parsed.type === \"request\" ? parsed.message : undefined,\n controller?.signal\n )\n )\n return;\n if (this.disposed || controller?.signal.aborted) {\n void response.body?.cancel().catch(() => undefined);\n return;\n }\n if (!modern && this.mode !== \"sse\") {\n this.captureSessionId(response);\n if (message?.method !== \"initialize\") this.maybeOpenGetSseStream();\n }\n if (controller !== undefined || message?.method === \"initialize\") {\n await this.forwardResponseMessages(response, controller?.signal, controller === undefined || parsed.type !== \"request\" ? undefined : new HttpResponseMessages(parsed.message), message?.method === \"initialize\");\n if (message?.method === \"initialize\") this.maybeOpenGetSseStream();\n } else\n void this.forwardResponseMessages(response).catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n } catch (error) {\n if (!controller?.signal.aborted) throw error;\n } finally {\n signal?.removeEventListener(\"abort\", aborted);\n if (id !== undefined && this.modernRequests.get(id) === controller)\n this.modernRequests.delete(id);\n }\n }\n\n private async createPostHeaders(\n message?: JsonRpcRequest | JsonRpcNotification,\n modern = false,\n signal?: AbortSignal\n ): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"application/json, text/event-stream\");\n headers.set(\"Content-Type\", \"application/json\");\n if (\n modern &&\n message !== undefined &&\n isObjectRecord(message.params) &&\n isObjectRecord(message.params._meta)\n ) {\n headers.delete(\"Mcp-Session-Id\");\n headers.delete(\"Last-Event-ID\");\n headers.set(\n \"MCP-Protocol-Version\",\n message.params._meta[\"io.modelcontextprotocol/protocolVersion\"] as string\n );\n if (\"id\" in message) {\n headers.set(\"Mcp-Method\", message.method);\n const name = message.method === \"resources/read\" ? message.params.uri : message.params.name;\n if (\n (message.method === \"tools/call\" ||\n message.method === \"resources/read\" ||\n message.method === \"prompts/get\") &&\n typeof name === \"string\"\n )\n headers.set(\"Mcp-Name\", encodeHeaderValue(name));\n else headers.delete(\"Mcp-Name\");\n if (message.method === \"tools/call\" && typeof message.params.name === \"string\") {\n const definitions = this.toolParameterHeaders.get(message.params.name) ?? [];\n for (const definition of definitions) headers.delete(definition.name);\n for (const [name, value] of Object.entries(\n createParameterHeaders(definitions, message.params.arguments)\n ))\n headers.set(name, value);\n }\n }\n } else if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n }\n if (!modern && message?.method !== \"initialize\" && this.legacyProtocolVersion !== undefined)\n headers.set(\"MCP-Protocol-Version\", this.legacyProtocolVersion);\n return this.authorizeRequestHeaders(headers, signal);\n }\n\n private async createGetHeaders(signal?: AbortSignal): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"text/event-stream\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n }\n if (this.legacyProtocolVersion !== undefined) headers.set(\"MCP-Protocol-Version\", this.legacyProtocolVersion);\n if (this.lastEventId !== undefined) {\n if (this.lastEventId === \"\") headers.delete(\"Last-Event-ID\");\n else headers.set(\"Last-Event-ID\", Buffer.from(this.lastEventId, \"utf8\").toString(\"latin1\"));\n }\n return this.authorizeRequestHeaders(headers, signal);\n }\n\n private async createDeleteHeaders(sessionId: string, signal?: AbortSignal): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Mcp-Session-Id\", sessionId);\n headers.set(\"MCP-Protocol-Version\", this.legacyProtocolVersion ?? MCP_PROTOCOL_VERSION);\n return this.authorizeRequestHeaders(headers, signal);\n }\n\n private async authorizeRequestHeaders(headers: Headers, signal?: AbortSignal): Promise<Headers> {\n signal?.throwIfAborted();\n const tokens = await this.oauthProvider?.authorizeRequest?.({\n requestUrl: new URL(this.url),\n headers, signal,\n fetch: (url, init) => fetchMcpResponse(this.fetchImpl, url, {\n ...init, signal: signal === undefined ? init?.signal : init?.signal == null ? signal : AbortSignal.any([signal, init.signal])\n }),\n });\n if (tokens !== undefined) this.oauthRequestTokens.set(headers, { ...tokens });\n signal?.throwIfAborted();\n return headers;\n }\n\n private captureSessionId(response: Response): void {\n const sessionId = response.headers.get(\"Mcp-Session-Id\");\n if (sessionId === null || sessionId.length === 0) {\n return;\n }\n\n if (this.sessionId !== undefined && this.sessionId !== sessionId) {\n throw new Error(\"HTTP transport response changed active session ID\");\n }\n\n this.sessionId = sessionId;\n }\n\n private maybeOpenGetSseStream(): void {\n if (this.disposed || this.sessionId === undefined || this.getSseStreamStarted) {\n return;\n }\n\n this.getSseStreamStarted = true;\n this.consumeGetSseStream().catch((error) => {\n if (error instanceof HttpTransportGetSseNotSupportedError || this.disposed) {\n return;\n }\n\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private ensureLegacyEndpoint(): Promise<string> {\n if (this.legacyEndpointReady !== undefined) return this.legacyEndpointReady;\n this.legacyEndpointReady = new Promise((resolve, reject) => {\n this.resolveLegacyEndpoint = resolve;\n this.rejectLegacyEndpoint = reject;\n });\n void this.consumeGetSseStream().catch((error: unknown) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n return this.legacyEndpointReady;\n }\n\n private async sendSessionTerminationRequest(sessionId: string, signal: AbortSignal): Promise<void> {\n const headers = await this.createDeleteHeaders(sessionId, signal);\n signal.throwIfAborted();\n const response = await fetchMcpResponse(this.fetchImpl, this.url, {\n method: \"DELETE\",\n headers, signal,\n });\n if (signal.aborted) {\n void response.body?.cancel().catch(() => undefined);\n signal.throwIfAborted();\n }\n\n if (response.status === 405 || response.ok) {\n void response.body?.cancel().catch(() => undefined);\n return;\n }\n\n const responseBody = (await readBoundedResponseText(response, this.maxResponseBytes, this.openResponseReaders, signal)).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport DELETE failed (${statusDescriptor})`\n : `HTTP transport DELETE failed (${statusDescriptor}): ${responseBody}`;\n throw new HttpTransportError(message, response.status, \"DELETE\");\n }\n\n private async consumeGetSseStream(): Promise<void> {\n const response = await this.fetchWithOAuthRetry({\n method: \"GET\",\n createHeaders: signal => this.createGetHeaders(signal),\n });\n if (this.disposed) {\n void response.body?.cancel().catch(() => undefined);\n return;\n }\n\n if (response.status === 405) {\n void response.body?.cancel().catch(() => undefined);\n if (this.mode === \"sse\") throw new HttpTransportError(\"Legacy SSE GET failed (405)\", 405, \"GET\");\n throw new HttpTransportGetSseNotSupportedError();\n }\n\n if (response.status === 404) {\n void response.body?.cancel().catch(() => undefined);\n this.sessionId = undefined;\n throw new HttpTransportError(\"HTTP transport session expired (GET 404 response)\", 404, \"GET\");\n }\n\n if (!response.ok) {\n const responseBody = (await readBoundedResponseText(response, this.maxResponseBytes, this.openResponseReaders)).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport GET failed (${statusDescriptor})`\n : `HTTP transport GET failed (${statusDescriptor}): ${responseBody}`;\n throw new HttpTransportError(message, response.status, \"GET\");\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n void response.body?.cancel().catch(() => undefined);\n if (this.mode === \"sse\") throw new Error(\"Legacy SSE GET returned an unsupported content type\");\n return;\n }\n\n if (contentType.split(\";\")[0]?.trim().toLowerCase() === \"text/event-stream\") {\n await this.forwardSseResponseMessages(response, undefined, undefined, { acceptEndpoint: this.mode === \"sse\" });\n if (this.mode === \"sse\") {\n if (!this.disposed) throw new Error(\"Legacy SSE stream ended\");\n return;\n }\n this.getSseStreamStarted = false;\n if (!this.disposed && this.sessionId !== undefined && this.lastEventId !== undefined) {\n this.maybeOpenGetSseStream();\n }\n return;\n }\n\n void response.body?.cancel().catch(() => undefined);\n if (this.mode === \"sse\") throw new Error(\"Legacy SSE GET returned an unsupported content type\");\n }\n\n private async throwForPostHttpError(\n response: Response,\n request?: JsonRpcRequest,\n signal?: AbortSignal\n ): Promise<boolean> {\n if (response.status < 400) {\n return false;\n }\n\n const responseBody = (\n await readBoundedResponseText(\n response,\n this.maxResponseBytes,\n this.openResponseReaders,\n signal\n )\n ).trim();\n if (request !== undefined && responseBody.length > 0) {\n assertHttpJsonBudget(responseBody);\n let parsed = parseJsonRpcMessage(responseBody);\n if (parsed.type === \"invalid\") {\n try {\n const raw: unknown = JSON.parse(responseBody);\n if (\n isObjectRecord(raw) &&\n raw.jsonrpc === \"2.0\" &&\n (!hasOwn(raw, \"id\") || raw.id === null) &&\n !hasOwn(raw, \"method\") &&\n !hasOwn(raw, \"result\") &&\n isJsonRpcErrorObject(raw.error)\n ) {\n parsed = parseJsonRpcMessage(JSON.stringify({ ...raw, id: request.id }));\n }\n } catch {\n /* Unrecognized HTTP error bodies use normal fallback rules. */\n }\n }\n if (\n parsed.type === \"response\" &&\n \"error\" in parsed.message &&\n parsed.message.id === request.id\n ) {\n this.writeReadableLine(serializeJsonRpcMessage(parsed.message));\n return true;\n }\n }\n if (request?.method === \"server/discover\" && response.status >= 400 && response.status < 500) {\n this.writeReadableLine(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: request.id,\n error: { code: ERROR_METHOD_NOT_FOUND, message: \"Modern discovery unavailable\" }\n })\n );\n return true;\n }\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message =\n responseBody.length === 0\n ? `HTTP transport POST failed (${statusDescriptor})`\n : `HTTP transport POST failed (${statusDescriptor}): ${responseBody}`;\n throw new HttpTransportError(message, response.status, \"POST\");\n }\n\n private async maybeHandleUnauthorizedResponse(response: Response, signal: AbortSignal, requestHeaders: Headers, presentedTokens: StoredOAuthTokens | null): Promise<boolean> {\n if (response.status !== 401 || this.oauthProvider === undefined) {\n return false;\n }\n\n const discoveryClient = this.oauthMetadataDiscovery;\n if (discoveryClient === undefined) {\n return false;\n }\n\n try {\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const resourceMetadataUrl = challenge?.params.resource_metadata;\n const discovery = await discoveryClient.discover(this.url, { resourceMetadataUrl, signal });\n const providerResponse = response.clone();\n let result;\n try {\n result = await this.oauthProvider.handleUnauthorized({\n requestUrl: new URL(this.url), response: providerResponse, challenge, discovery,\n signal,\n requestHeaders: new Headers(requestHeaders),\n presentedTokens,\n fetch: (url, init) => fetchMcpResponse(this.fetchImpl, url, {\n ...init, signal: init?.signal == null ? signal : AbortSignal.any([signal, init.signal])\n }),\n });\n signal.throwIfAborted();\n } finally {\n // Cancel both tee branches without awaiting adapter cleanup.\n void providerResponse.body?.cancel().catch(() => undefined);\n }\n if (result.action === \"retry\") {\n void response.body?.cancel().catch(() => undefined);\n return true;\n }\n if (result.error !== undefined) throw result.error;\n return false;\n } catch (error) {\n void response.body?.cancel().catch(() => undefined);\n throw error;\n }\n }\n\n private async forwardResponseMessages(response: Response, signal?: AbortSignal, context?: HttpResponseMessages, initialization = false): Promise<void> {\n if (response.status === 202) {\n void response.body?.cancel().catch(() => undefined);\n return;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n void response.body?.cancel().catch(() => undefined);\n return;\n }\n\n const normalizedContentType = contentType.split(\";\")[0]?.trim().toLowerCase();\n if (normalizedContentType === \"text/event-stream\") {\n await this.forwardSseResponseMessages(response, signal, context, { stopAfterInitialization: initialization });\n return;\n }\n\n if (normalizedContentType === \"application/json\") {\n await this.forwardJsonResponseMessage(response, signal, context);\n return;\n }\n\n void response.body?.cancel().catch(() => undefined);\n throw new Error(\"HTTP transport POST returned an unsupported response content type\");\n }\n\n private async forwardSseResponseMessages(\n response: Response,\n signal?: AbortSignal,\n context?: HttpResponseMessages,\n options: { acceptEndpoint?: boolean; stopAfterInitialization?: boolean } = {}\n ): Promise<void> {\n if (response.body === null) {\n return;\n }\n\n const parser = new SseParser(this.maxResponseBytes, options.acceptEndpoint);\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const reader = response.body.getReader();\n this.openResponseReaders.add(reader);\n const abort = (): void => {\n void reader.cancel().catch(() => undefined);\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) abort();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n signal?.throwIfAborted();\n if (done) {\n break;\n }\n\n if (value === undefined) {\n continue;\n }\n\n const messages = parser.push(decoder.decode(value, { stream: true }));\n this.writeSseMessages(messages, context);\n if (context?.completed || (options.stopAfterInitialization && this.initializationRequestId === undefined)) {\n void reader.cancel().catch(() => undefined); return;\n }\n this.lastEventId = parser.lastEventId ?? this.lastEventId;\n }\n\n const trailingChunk = decoder.decode();\n if (trailingChunk.length > 0) {\n this.writeSseMessages(parser.push(trailingChunk), context);\n this.lastEventId = parser.lastEventId ?? this.lastEventId;\n }\n\n this.writeSseMessages(parser.flush(), context);\n this.lastEventId = parser.lastEventId ?? this.lastEventId;\n if (context !== undefined && !context.completed) throw new Error(\"MCP HTTP stream ended before its final response\");\n } catch (error) {\n void reader.cancel().catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n this.openResponseReaders.delete(reader);\n reader.releaseLock();\n }\n }\n\n private async forwardJsonResponseMessage(\n response: Response,\n signal?: AbortSignal,\n context?: HttpResponseMessages\n ): Promise<void> {\n const payload = await readBoundedResponseText(\n response,\n this.maxResponseBytes,\n this.openResponseReaders,\n signal\n );\n if (payload.length === 0) {\n if (context !== undefined) throw new Error(\"MCP HTTP response body is empty\");\n return;\n }\n\n assertHttpJsonBudget(payload);\n if (context !== undefined) { this.writeReadableLine(context.validate(payload, false)); return; }\n const parsedPayload = JSON.parse(payload) as unknown;\n this.writeReadableLine(JSON.stringify(parsedPayload));\n }\n\n private writeSseMessages(messages: ParsedSseMessage[], context?: HttpResponseMessages): void {\n for (const message of messages) {\n if (message.event === \"endpoint\") {\n const endpoint = new URL(message.data, this.url);\n const resource = new URL(this.url);\n if ((endpoint.protocol !== \"http:\" && endpoint.protocol !== \"https:\") ||\n endpoint.origin !== resource.origin || endpoint.username || endpoint.password || endpoint.href.includes(\"#\"))\n throw new Error(\"Unsafe legacy SSE endpoint\");\n if (this.legacyEndpoint !== undefined && this.legacyEndpoint !== endpoint.href)\n throw new Error(\"Legacy SSE endpoint changed during the active connection\");\n this.legacyEndpoint = endpoint.href;\n this.resolveLegacyEndpoint?.(endpoint.href);\n this.resolveLegacyEndpoint = undefined;\n this.rejectLegacyEndpoint = undefined;\n continue;\n }\n assertHttpJsonBudget(message.data);\n this.writeReadableLine(context?.validate(message.data, true) ?? message.data);\n if (context?.completed) return;\n }\n }\n\n private writeReadableLine(line: string): void {\n if (this.disposed || this.readStream.destroyed || this.readStream.writableEnded) {\n return;\n }\n\n if (this.initializationRequestId !== undefined) {\n try {\n const payload: unknown = JSON.parse(line);\n for (const response of Array.isArray(payload) ? payload : [payload]) {\n if (!isObjectRecord(response) || response.id !== this.initializationRequestId || !isObjectRecord(response.result)) continue;\n const version = response.result.protocolVersion;\n if (typeof version === \"string\" && version !== \"2026-07-28\" && MCP_PROTOCOL_VERSIONS.includes(version as McpProtocolVersion))\n this.legacyProtocolVersion = version;\n this.initializationRequestId = undefined;\n this.maybeOpenGetSseStream();\n break;\n }\n } catch { /* The message layer owns malformed JSON diagnostics. */ }\n }\n\n this.readStream.write(`${line}\\n`);\n }\n\n private async fetchWithOAuthRetry(input: {\n url?: string;\n method: \"GET\" | \"POST\";\n createHeaders: (signal: AbortSignal) => Promise<Headers>;\n body?: BodyInit;\n controller?: AbortController;\n }): Promise<Response> {\n const controller = input.controller ?? new AbortController();\n this.inFlightOAuthAbortControllers.add(controller);\n const request = async (): Promise<{ response: Response; headers: Headers; tokens: StoredOAuthTokens | null }> => {\n controller.signal.throwIfAborted();\n const headers = await input.createHeaders(controller.signal);\n const headerSnapshot = new Headers(headers);\n const tokens = this.oauthRequestTokens.get(headers) ?? null;\n controller.signal.throwIfAborted();\n const response = await this.fetchWithAbort(input.url ?? this.url, {\n method: input.method, headers, body: input.body\n }, controller);\n return { response, headers: headerSnapshot, tokens };\n };\n try {\n let attempt = await request();\n if (await this.maybeHandleUnauthorizedResponse(attempt.response, controller.signal, attempt.headers, attempt.tokens)) attempt = await request();\n const response = attempt.response;\n try {\n const oauthError = this.oauthProvider === undefined ? null : this.readOAuthChallengeError(response);\n if (oauthError !== null) throw oauthError;\n } catch (error) {\n void response.body?.cancel().catch(() => undefined);\n throw error;\n }\n return response;\n } finally { this.inFlightOAuthAbortControllers.delete(controller); }\n }\n\n private readOAuthChallengeError(response: Response): OAuthError | null {\n if (response.status !== 401 && response.status !== 403) {\n return null;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const error = challenge?.params.error;\n if (error === undefined || error.length === 0) {\n return null;\n }\n\n return new OAuthError(\n {\n error,\n error_description: challenge?.params.error_description,\n error_uri: challenge?.params.error_uri,\n },\n response.status\n );\n }\n}\n\nclass HttpTransportGetSseNotSupportedError extends Error {\n constructor() {\n super(\"HTTP transport server does not support GET SSE streams\");\n }\n}\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport class McpError extends Error {\n readonly code: number;\n declare readonly data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"McpError\";\n this.code = code;\n if (data !== undefined) {\n this.data = data;\n }\n }\n}\n\nexport interface JsonRpcSuccessResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport type ParsedJsonRpcMessage =\n | {\n type: \"request\";\n message: JsonRpcRequest;\n }\n | {\n type: \"notification\";\n message: JsonRpcNotification;\n }\n | {\n type: \"response\";\n message: JsonRpcResponse;\n }\n | {\n type: \"invalid\";\n id: RequestId | null;\n error: McpError;\n };\n\nexport function serializeJsonRpcMessage(message: JsonRpcMessage): string {\n if (\"result\" in message && !isJsonValue(message.result)) {\n throw new McpError(ERROR_INTERNAL, \"Response result must contain only JSON values\");\n }\n if (\"params\" in message && message.params !== undefined && !isJsonValue(message.params)) {\n throw new McpError(ERROR_INVALID_PARAMS, \"Message params must contain only JSON values\");\n }\n return `${JSON.stringify(message)}\\n`;\n}\n\nfunction normalizeLine(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nexport async function* readLines(stream: Readable, maxLineBytes = 16 * 1024 * 1024): AsyncGenerator<string> {\n if (!Number.isSafeInteger(maxLineBytes) || maxLineBytes < 1) {\n throw new Error(\"Stdio line byte limit must be a positive safe integer\");\n }\n let parts: string[] = [];\n let bytes = 0;\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n const append = (part: string): void => {\n bytes += Buffer.byteLength(part, \"utf8\");\n if (bytes > maxLineBytes) throw new Error(`Stdio input line byte limit exceeded (${maxLineBytes} bytes)`);\n if (part.length > 0) parts.push(part);\n };\n\n for await (const chunk of stream as AsyncIterable<unknown>) {\n const text = chunk instanceof Uint8Array\n ? decoder.decode(chunk, { stream: true })\n : decoder.decode() + String(chunk);\n let start = 0;\n let newline = text.indexOf(\"\\n\", start);\n while (newline !== -1) {\n append(text.slice(start, newline));\n yield normalizeLine(parts.join(\"\"));\n parts = [];\n bytes = 0;\n start = newline + 1;\n newline = text.indexOf(\"\\n\", start);\n }\n append(text.slice(start));\n }\n append(decoder.decode());\n if (parts.length > 0) yield normalizeLine(parts.join(\"\"));\n}\n\nexport interface ParsedSseMessage {\n data: string;\n id?: string;\n event?: \"endpoint\";\n}\n\nexport class SseParser {\n private buffer = \"\";\n private skipLf = false;\n private eventType: string | undefined;\n private dataLines: string[] = [];\n private eventId = \"\";\n private hasEventId = false;\n private _lastEventId: string | undefined;\n private dataBytes = 0;\n\n constructor(private readonly maxEventBytes = 16 * 1024 * 1024, private readonly acceptEndpoint = false) {\n if (maxEventBytes !== Infinity && (!Number.isSafeInteger(maxEventBytes) || maxEventBytes < 1))\n throw new Error(\"SSE event byte limit must be a positive safe integer\");\n }\n\n get lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n push(chunk: string): ParsedSseMessage[] {\n if (chunk.length === 0) {\n return [];\n }\n\n if (this.skipLf) {\n this.skipLf = false;\n if (chunk.startsWith(\"\\n\")) chunk = chunk.slice(1);\n }\n this.buffer += chunk;\n const messages: ParsedSseMessage[] = [];\n let start = 0;\n for (let index = 0; index < this.buffer.length; index += 1) {\n const character = this.buffer[index];\n if (character !== \"\\n\" && character !== \"\\r\") continue;\n const line = this.buffer.slice(start, index);\n if (character === \"\\r\") {\n if (this.buffer[index + 1] === \"\\n\") index += 1;\n else if (index === this.buffer.length - 1) this.skipLf = true;\n }\n start = index + 1;\n if (Buffer.byteLength(line, \"utf8\") > this.maxEventBytes)\n throw new Error(`SSE event exceeds ${this.maxEventBytes} bytes`);\n this.consumeLine(line, messages);\n this.assertEventSize(\"\");\n }\n this.buffer = this.buffer.slice(start);\n\n this.assertEventSize(this.buffer);\n\n return messages;\n }\n\n flush(): ParsedSseMessage[] {\n this.buffer = \"\";\n this.skipLf = false;\n this.resetEvent();\n return [];\n }\n\n private consumeLine(line: string, messages: ParsedSseMessage[]): void {\n if (line.length === 0) {\n this.emitEvent(messages);\n return;\n }\n\n if (line.startsWith(\":\")) {\n return;\n }\n\n const separatorIndex = line.indexOf(\":\");\n const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);\n const rawValue = separatorIndex === -1 ? \"\" : line.slice(separatorIndex + 1);\n const value = rawValue.startsWith(\" \") ? rawValue.slice(1) : rawValue;\n\n if (field === \"event\") {\n this.eventType = value;\n return;\n }\n\n if (field === \"data\") {\n this.dataBytes += Buffer.byteLength(value, \"utf8\") + (this.dataLines.length > 0 ? 1 : 0);\n this.dataLines.push(value);\n return;\n }\n\n if (field === \"id\") {\n if (value.includes(\"\\0\")) {\n return;\n }\n\n this.eventId = value;\n this.hasEventId = true;\n }\n }\n\n private emitEvent(messages: ParsedSseMessage[]): void {\n const eventType = this.eventType ?? \"message\";\n\n if (this.hasEventId) {\n this._lastEventId = this.eventId;\n }\n\n if (this.dataLines.length === 0 || (eventType !== \"message\" && !(this.acceptEndpoint && eventType === \"endpoint\"))) {\n this.resetEvent();\n return;\n }\n\n const message: ParsedSseMessage = {\n data: this.dataLines.join(\"\\n\"),\n };\n if (eventType === \"endpoint\") message.event = \"endpoint\";\n\n if (this.hasEventId) {\n message.id = this.eventId;\n }\n\n messages.push(message);\n this.resetEvent();\n }\n\n private resetEvent(): void {\n this.eventType = undefined;\n this.dataLines = [];\n this.eventId = \"\";\n this.hasEventId = false;\n this.dataBytes = 0;\n }\n\n private assertEventSize(partialLine: string): void {\n if (this.dataBytes + Buffer.byteLength(this.eventType ?? \"\", \"utf8\") +\n Buffer.byteLength(this.eventId, \"utf8\") + Buffer.byteLength(partialLine, \"utf8\") > this.maxEventBytes)\n throw new Error(`SSE event exceeds ${this.maxEventBytes} bytes`);\n }\n}\n\nfunction validateRequestTimer(value: number, name: string): void {\n // Node reduces overflowing timers to 1ms rather than retaining the requested deadline.\n if (!Number.isFinite(value) || value < 0 || value > 2_147_483_647)\n throw new Error(`${name} must be a non-negative finite number no greater than 2147483647`);\n}\n\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: unknown) => void;\n}\n\ninterface ActiveIncomingRequest {\n controller: AbortController;\n}\n\nexport interface JsonRpcRequestOptions {\n signal?: AbortSignal;\n timeoutMs?: number | null;\n onRequestId?: (requestId: RequestId) => void;\n onTimeout?: (requestId: RequestId) => void;\n}\n\nexport interface McpRequestContext {\n readonly id: RequestId;\n readonly method: string;\n readonly signal: AbortSignal;\n}\n\ntype JsonRpcRequestHandler = (\n params: unknown,\n context: McpRequestContext\n) => unknown | Promise<unknown>;\n\ninterface JsonRpcNotificationContext {\n method: string;\n}\n\ntype JsonRpcNotificationHandler = (\n params: unknown,\n context: JsonRpcNotificationContext\n) => unknown | Promise<unknown>;\n\nexport class JsonRpcMessageLayer {\n requestMetadata?: Record<string, unknown>;\n readonly requestTimeoutMs: number;\n private readonly input: Readable;\n private readonly output: Writable;\n private readonly inputClosedReason: Promise<Error> | undefined;\n private nextRequestId = 1;\n private readonly exchangeControllers = new Set<AbortController>();\n private disposedError: Error | undefined;\n private readonly pendingRequests = new Map<RequestId, PendingRequest>();\n private readonly activeIncomingRequests = new Map<RequestId, ActiveIncomingRequest>();\n private readonly requestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly inputRequestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly notificationHandlers = new Map<string, JsonRpcNotificationHandler>();\n\n constructor(\n input: Readable,\n output: Writable,\n requestTimeoutMs = 30_000,\n inputClosedReason?: Promise<Error>,\n private readonly maxConcurrentRequests = 128\n ) {\n validateRequestTimer(requestTimeoutMs, \"requestTimeoutMs\");\n if (!Number.isSafeInteger(maxConcurrentRequests) || maxConcurrentRequests < 1)\n throw new Error(\"maxConcurrentRequests must be a positive safe integer\");\n\n this.input = input;\n this.output = output;\n this.inputClosedReason = inputClosedReason;\n this.requestTimeoutMs = requestTimeoutMs;\n output.once(\"error\", (reason: Error) => this.dispose(reason));\n output.once(\"close\", () => {\n if (this.disposedError !== undefined) return;\n void this.resolveInputStreamClosedReason(new Error(\"JSON-RPC output closed\"))\n .then((reason) => this.dispose(reason));\n });\n this.consumeInput().catch(() => undefined);\n }\n\n sendNotification(method: string, params?: unknown): void {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n if (params !== undefined && !isJsonValue(params)) {\n throw new McpError(ERROR_INVALID_PARAMS, \"Notification params must contain only JSON values\");\n }\n if (!isValidParamsMetadata(params)) {\n throw new McpError(ERROR_INVALID_PARAMS, \"Invalid notification metadata\");\n }\n\n const message: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n this.output.write(serializeJsonRpcMessage(message));\n }\n\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.requestHandlers.set(method, handler);\n }\n\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n onInputRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.inputRequestHandlers.set(method, handler);\n }\n\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposedError !== undefined) throw this.disposedError;\n const timeoutMs =\n options.timeoutMs === null ? null : (options.timeoutMs ?? this.requestTimeoutMs);\n if (timeoutMs !== null) validateRequestTimer(timeoutMs, \"timeoutMs\");\n if (this.exchangeControllers.size >= this.maxConcurrentRequests)\n throw new Error(\"JSON-RPC request capacity exceeded\");\n if (params !== undefined && !isJsonValue(params)) {\n return Promise.reject(new McpError(ERROR_INVALID_PARAMS, \"Request params must contain only JSON values\"));\n }\n if (!isValidParamsMetadata(params) ||\n (this.requestMetadata !== undefined && !isValidMetadata(this.requestMetadata))) {\n return Promise.reject(new McpError(ERROR_INVALID_PARAMS, \"Invalid request metadata\"));\n }\n const originalParams = this.requestMetadata === undefined ? params : structuredClone(params);\n const controller = new AbortController();\n const callerSignal = options.signal;\n const onRequestId = options.onRequestId;\n let currentRequestId: RequestId | undefined;\n let rejectAbort: (reason: unknown) => void;\n const aborted = new Promise<never>((_resolve, reject) => { rejectAbort = reject; });\n const cancel = () => {\n clearTimeout(deadline);\n if (currentRequestId !== undefined) this.cancelRequest(currentRequestId, controller.signal.reason);\n rejectAbort(controller.signal.reason);\n };\n const forwardAbort = () => controller.abort(callerSignal?.reason);\n controller.signal.addEventListener(\"abort\", cancel, { once: true });\n callerSignal?.addEventListener(\"abort\", forwardAbort, { once: true });\n this.exchangeControllers.add(controller);\n options = { ...options, signal: controller.signal, onRequestId: (id) => {\n currentRequestId = id;\n onRequestId?.(id);\n } };\n const deadline = timeoutMs === null ? undefined : setTimeout(() => {\n let reason: unknown = new Error(`JSON-RPC request \"${method}\" timed out after ${timeoutMs}ms`);\n try {\n if (currentRequestId !== undefined) options.onTimeout?.(currentRequestId);\n } catch (error) { reason = error; }\n controller.abort(reason);\n }, timeoutMs);\n if (callerSignal?.aborted) forwardAbort();\n const work = (async () => {\n let retryParams = originalParams;\n for (let round = 0; round <= 64; round += 1) {\n if (this.disposedError !== undefined) throw this.disposedError;\n if (options.signal?.aborted) throw options.signal.reason;\n const result = await this.sendRequestOnce(method, retryParams, options);\n if (this.requestMetadata === undefined) return result;\n if (\n !isObjectRecord(result) ||\n (result.resultType !== \"complete\" && result.resultType !== \"input_required\")\n ) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid modern resultType\");\n }\n if (result.resultType === \"complete\") {\n const cacheError = validateCacheMetadata(method, result);\n if (cacheError !== undefined) throw new McpError(ERROR_INVALID_REQUEST, cacheError);\n if (!validateServerResult(method, result)) throw new McpError(ERROR_INVALID_REQUEST, `Invalid ${method} result`);\n return result;\n }\n const validation = validateInputRequiredResult(\n method,\n result,\n this.requestMetadata[\"io.modelcontextprotocol/clientCapabilities\"] as Record<\n string,\n unknown\n >\n );\n if (validation?.error !== undefined) {\n const error = validation.error;\n throw new McpError(\n error.code === ERROR_INTERNAL ? ERROR_INVALID_REQUEST : error.code,\n error.message,\n error.data\n );\n }\n if (round === 64)\n throw new McpError(ERROR_INVALID_REQUEST, \"MCP input round limit exceeded\");\n const inputs = Object.entries(result.inputRequests ?? {});\n if (inputs.length > 64)\n throw new McpError(ERROR_INVALID_REQUEST, \"MCP input request limit exceeded\");\n for (const [, input] of inputs) {\n if (!this.inputRequestHandlers.has((input as { method: string }).method)) {\n throw new McpError(-32021, \"Unsupported MCP input request\");\n }\n }\n const inputResponses: Record<string, unknown> = Object.create(null);\n for (const [key, input] of inputs) {\n if (this.disposedError !== undefined) throw this.disposedError;\n if (options.signal?.aborted) throw options.signal.reason;\n const request = input as { method: keyof typeof inputResponseTypes; params?: unknown };\n const response = await this.inputRequestHandlers.get(request.method)!(request.params, {\n id: key,\n method: request.method,\n signal: controller.signal\n });\n if (!validateProtocolValue(inputResponseTypes[request.method], response)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid MCP input response\");\n }\n inputResponses[key] = response;\n }\n if (this.disposedError !== undefined) throw this.disposedError;\n if (options.signal?.aborted) throw options.signal.reason;\n const original = isObjectRecord(originalParams) ? originalParams : {};\n const {\n requestState: ignoredState,\n inputResponses: ignoredResponses,\n ...baseParams\n } = original;\n retryParams = {\n ...baseParams,\n ...(result.requestState === undefined ? {} : { requestState: result.requestState }),\n ...(result.inputRequests === undefined ? {} : { inputResponses })\n };\n }\n throw new McpError(ERROR_INTERNAL, \"Unreachable MCP retry state\");\n })();\n return Promise.race([work, aborted]).finally(() => {\n clearTimeout(deadline);\n callerSignal?.removeEventListener(\"abort\", forwardAbort);\n controller.signal.removeEventListener(\"abort\", cancel);\n this.exchangeControllers.delete(controller);\n });\n }\n\n private sendRequestOnce(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n if (options.onRequestId !== undefined) {\n options.onRequestId(id);\n }\n options.signal?.throwIfAborted();\n\n const message: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method\n };\n\n if (this.requestMetadata !== undefined) {\n if (params !== undefined && !isObjectRecord(params)) {\n throw new McpError(ERROR_INVALID_PARAMS, \"Modern request params must be an object\");\n }\n const supplied = isObjectRecord(params) && isObjectRecord(params._meta) ? params._meta : {};\n message.params = {\n ...(params ?? {}),\n _meta: { ...supplied, ...structuredClone(this.requestMetadata) }\n };\n } else if (params !== undefined) {\n message.params = params;\n }\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { resolve, reject });\n\n try {\n this.output.write(serializeJsonRpcMessage(message));\n } catch (error) {\n this.pendingRequests.delete(id);\n reject(error);\n }\n });\n }\n\n cancelRequest(requestId: RequestId, reason: unknown): boolean {\n const pending = this.pendingRequests.get(requestId);\n if (pending === undefined) {\n return false;\n }\n\n this.pendingRequests.delete(requestId);\n pending.reject(reason);\n return true;\n }\n\n dispose(reason = new Error(\"JSON-RPC message layer disposed\")): void {\n if (this.disposedError !== undefined) {\n return;\n }\n\n this.disposedError = reason;\n for (const controller of this.exchangeControllers) controller.abort(reason);\n\n for (const pending of this.pendingRequests.values()) {\n pending.reject(reason);\n }\n\n this.pendingRequests.clear();\n for (const request of this.activeIncomingRequests.values()) request.controller.abort(reason);\n this.activeIncomingRequests.clear();\n }\n\n private async consumeInput(): Promise<void> {\n try {\n for await (const line of readLines(this.input)) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n if (line.length === 0) {\n continue;\n }\n\n let parsedLine: unknown;\n try {\n parsedLine = JSON.parse(line);\n } catch {\n await this.processParsedMessage({\n type: \"invalid\",\n id: null,\n error: parseError(),\n });\n continue;\n }\n\n if (Array.isArray(parsedLine)) {\n for (const message of parsedLine) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(message));\n }\n continue;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(parsedLine));\n }\n } catch (error) {\n if (this.disposedError === undefined) {\n this.dispose(\n error instanceof Error\n ? error\n : new Error(`JSON-RPC input stream failed: ${String(error)}`)\n );\n }\n return;\n }\n\n if (this.disposedError === undefined) {\n const streamClosedReason = await this.resolveInputStreamClosedReason();\n if (this.disposedError === undefined) {\n this.dispose(streamClosedReason);\n }\n }\n }\n\n private async resolveInputStreamClosedReason(\n streamClosedError = new Error(\"JSON-RPC input stream closed\")\n ): Promise<Error> {\n if (this.inputClosedReason === undefined) {\n return streamClosedError;\n }\n\n try {\n return await Promise.race([\n this.inputClosedReason,\n new Promise<Error>((resolve) => {\n setTimeout(() => {\n resolve(streamClosedError);\n }, 50);\n }),\n ]);\n } catch {\n return streamClosedError;\n }\n }\n\n private async processParsedMessage(parsed: ParsedJsonRpcMessage): Promise<void> {\n if (parsed.type === \"request\") {\n if (this.requestMetadata !== undefined) {\n this.output.write(serializeJsonRpcMessage({\n jsonrpc: \"2.0\", id: parsed.message.id,\n error: { code: ERROR_INVALID_REQUEST, message: \"Modern MCP servers cannot initiate JSON-RPC requests\" }\n }));\n return;\n }\n const handler = this.requestHandlers.get(parsed.message.method);\n if (handler === undefined) {\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: parsed.message.id,\n error: {\n code: ERROR_METHOD_NOT_FOUND,\n message: `Method not found: ${parsed.message.method}`,\n },\n })\n );\n return;\n }\n\n this.handleIncomingRequest(parsed.message, handler);\n return;\n }\n\n if (parsed.type === \"notification\") {\n if (parsed.message.method === \"notifications/cancelled\") {\n this.handleCancellationNotification(parsed.message.params);\n }\n\n const handler = this.notificationHandlers.get(parsed.message.method);\n if (handler === undefined) {\n return;\n }\n\n try {\n await handler(parsed.message.params, {\n method: parsed.message.method,\n });\n } catch {\n return;\n }\n return;\n }\n\n if (parsed.type === \"invalid\") {\n const errorResponse: {\n jsonrpc: \"2.0\";\n id: RequestId | null;\n error: JsonRpcErrorObject;\n } = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: {\n code: parsed.error.code,\n message: parsed.error.message,\n },\n };\n\n if (parsed.error.data !== undefined) {\n errorResponse.error.data = parsed.error.data;\n }\n\n this.output.write(`${JSON.stringify(errorResponse)}\\n`);\n return;\n }\n\n if (parsed.type !== \"response\") {\n return;\n }\n\n const pending = this.pendingRequests.get(parsed.message.id);\n if (pending === undefined) {\n return;\n }\n\n this.pendingRequests.delete(parsed.message.id);\n if (\"result\" in parsed.message) {\n pending.resolve(parsed.message.result);\n return;\n }\n\n pending.reject(\n new McpError(\n parsed.message.error.code,\n parsed.message.error.message,\n parsed.message.error.data\n )\n );\n }\n\n private handleIncomingRequest(message: JsonRpcRequest, handler: JsonRpcRequestHandler): void {\n if (this.activeIncomingRequests.has(message.id) || this.activeIncomingRequests.size >= this.maxConcurrentRequests) {\n const duplicate = this.activeIncomingRequests.has(message.id);\n this.output.write(serializeJsonRpcMessage({\n jsonrpc: \"2.0\", id: message.id,\n error: { code: duplicate ? ERROR_INVALID_REQUEST : -32000,\n message: duplicate ? \"Duplicate active server request ID\" : \"Server request capacity exceeded\" }\n }));\n return;\n }\n const activeRequest: ActiveIncomingRequest = {\n controller: new AbortController(),\n };\n this.activeIncomingRequests.set(message.id, activeRequest);\n\n void (async () => {\n try {\n const responseType = inputResponseTypes[message.method as keyof typeof inputResponseTypes];\n if (responseType !== undefined && !validateProtocolValue(\"InputRequest\", {\n method: message.method,\n ...(message.params === undefined ? {} : { params: message.params })\n })) {\n throw new McpError(ERROR_INVALID_PARAMS, \"Invalid client input request\");\n }\n const result = await handler(message.params, {\n id: message.id,\n method: message.method,\n signal: activeRequest.controller.signal,\n });\n\n if (this.disposedError !== undefined || activeRequest.controller.signal.aborted) {\n return;\n }\n\n if (responseType !== undefined && !validateProtocolValue(responseType, result)) {\n throw new McpError(ERROR_INTERNAL, \"Invalid client input response\");\n }\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n result,\n })\n );\n } catch (error) {\n if (this.disposedError !== undefined || activeRequest.controller.signal.aborted) {\n return;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n error: {\n code: error instanceof McpError ? error.code : ERROR_INTERNAL,\n message: errorMessage,\n },\n })\n );\n } finally {\n const inFlightRequest = this.activeIncomingRequests.get(message.id);\n if (inFlightRequest === activeRequest) {\n this.activeIncomingRequests.delete(message.id);\n }\n }\n })();\n }\n\n private handleCancellationNotification(params: unknown): void {\n if (!isObjectRecord(params)) {\n return;\n }\n\n const requestId = params.requestId;\n if (!isRequestId(requestId)) {\n return;\n }\n\n const activeRequest = this.activeIncomingRequests.get(requestId);\n if (activeRequest === undefined) {\n return;\n }\n\n activeRequest.controller.abort(new Error(typeof params.reason === \"string\" ? params.reason : \"Server request cancelled\"));\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isInitializeResult(value: unknown): value is InitializeResult {\n if (!isObjectRecord(value) || typeof value.protocolVersion !== \"string\") {\n return false;\n }\n\n if (!isServerCapabilities(value.capabilities)) {\n return false;\n }\n\n if (\n !isObjectRecord(value.serverInfo)\n || typeof value.serverInfo.name !== \"string\"\n || value.serverInfo.name.length === 0\n || typeof value.serverInfo.version !== \"string\"\n || value.serverInfo.version.length === 0\n ) {\n return false;\n }\n\n return value.instructions === undefined || typeof value.instructions === \"string\";\n}\n\nfunction isServerCapabilities(value: unknown): value is ServerCapabilities {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n for (const capability of [\"prompts\", \"resources\", \"tools\", \"logging\", \"completions\", \"experimental\"] as const) {\n if (value[capability] !== undefined && !isObjectRecord(value[capability])) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isCallToolResult(value: unknown, modern = false): value is CallToolResult {\n if (!isObjectRecord(value) || !Array.isArray(value.content)) {\n return false;\n }\n\n if (!modern && value.structuredContent !== undefined && !isObjectRecord(value.structuredContent)) {\n return false;\n }\n\n if (value.isError !== undefined && typeof value.isError !== \"boolean\") {\n return false;\n }\n\n return value.content.every(isContentItem);\n}\n\nfunction isToolsListResult(value: unknown): value is { tools: Tool[]; nextCursor?: string } {\n return (\n isObjectRecord(value) &&\n Array.isArray(value.tools) &&\n value.tools.every(\n (tool) =>\n isObjectRecord(tool) &&\n typeof tool.name === \"string\" &&\n isObjectRecord(tool.inputSchema) &&\n tool.inputSchema.type === \"object\"\n ) &&\n (value.nextCursor === undefined || typeof value.nextCursor === \"string\")\n );\n}\n\nfunction isResourcesListResult(value: unknown): value is { resources: Resource[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.resources)\n && value.resources.every(isResource)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isResourceTemplatesListResult(\n value: unknown\n): value is { resourceTemplates: ResourceTemplate[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.resourceTemplates)\n && value.resourceTemplates.every(isResourceTemplate)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isReadResourceResult(value: unknown): value is { contents: ResourceContents[] } {\n return isObjectRecord(value)\n && Array.isArray(value.contents)\n && value.contents.every(isResourceContents);\n}\n\nfunction isGetPromptResult(value: unknown): value is GetPromptResult {\n return isObjectRecord(value)\n && (value.description === undefined || typeof value.description === \"string\")\n && Array.isArray(value.messages)\n && value.messages.every(isPromptMessage);\n}\n\nfunction isCompleteResult(value: unknown): value is CompleteResult {\n return isObjectRecord(value)\n && isObjectRecord(value.completion)\n && Array.isArray(value.completion.values)\n && value.completion.values.every((candidate) => typeof candidate === \"string\")\n && (value.completion.hasMore === undefined || typeof value.completion.hasMore === \"boolean\")\n && (value.completion.total === undefined || typeof value.completion.total === \"number\");\n}\n\nfunction isResource(value: unknown): value is Resource {\n return isObjectRecord(value)\n && typeof value.uri === \"string\"\n && isValidUri(value.uri)\n && typeof value.name === \"string\"\n && (value.description === undefined || typeof value.description === \"string\")\n && (value.mimeType === undefined || typeof value.mimeType === \"string\")\n && (value.size === undefined || typeof value.size === \"number\");\n}\n\nfunction isResourceTemplate(value: unknown): value is ResourceTemplate {\n return isObjectRecord(value)\n && typeof value.uriTemplate === \"string\"\n && typeof value.name === \"string\"\n && (value.description === undefined || typeof value.description === \"string\")\n && (value.mimeType === undefined || typeof value.mimeType === \"string\");\n}\n\nfunction isResourceContents(value: unknown): value is ResourceContents {\n if (!isObjectRecord(value) || typeof value.uri !== \"string\" || !isValidUri(value.uri)) {\n return false;\n }\n\n if (value.mimeType !== undefined && typeof value.mimeType !== \"string\") {\n return false;\n }\n\n const hasText = value.text !== undefined;\n const hasBlob = value.blob !== undefined;\n\n if (!hasText && !hasBlob) {\n return false;\n }\n\n return (!hasText || typeof value.text === \"string\")\n && (!hasBlob || (typeof value.blob === \"string\" && isBase64(value.blob)));\n}\n\nfunction isPromptMessage(value: unknown): value is PromptMessage {\n return isObjectRecord(value)\n && (value.role === \"user\" || value.role === \"assistant\")\n && isContentItem(value.content);\n}\n\nfunction isContentItem(value: unknown): value is ContentItem {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (value.type === \"text\") {\n return typeof value.text === \"string\";\n }\n\n if (value.type === \"image\" || value.type === \"audio\") {\n return typeof value.data === \"string\" && isBase64(value.data) && typeof value.mimeType === \"string\";\n }\n\n if (value.type === \"resource_link\") return isResource(value);\n\n if (value.type !== \"resource\" || !isObjectRecord(value.resource)) {\n return false;\n }\n\n return isResourceContents(value.resource);\n}\n\nfunction hasOwn(\n value: Record<string, unknown>,\n property: string\n): property is keyof typeof value {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n\nfunction isLogLevel(value: unknown): value is LogLevel {\n return (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"notice\" ||\n value === \"warning\" ||\n value === \"error\" ||\n value === \"critical\" ||\n value === \"alert\" ||\n value === \"emergency\"\n );\n}\n\nfunction toRequestId(value: unknown): RequestId | null {\n return isRequestId(value) ? value : null;\n}\n\nfunction parseError(): McpError {\n return new McpError(ERROR_PARSE, \"Parse error\");\n}\n\nfunction invalidRequest(): McpError {\n return new McpError(ERROR_INVALID_REQUEST, \"Invalid Request\");\n}\n\nfunction isJsonRpcErrorObject(value: unknown): value is JsonRpcErrorObject {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (!Number.isInteger(value.code) || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || hasOwn(value, \"data\");\n}\n\nexport function parseJsonRpcMessage(line: string): ParsedJsonRpcMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n type: \"invalid\",\n id: null,\n error: parseError(),\n };\n }\n\n return parseJsonRpcPayload(parsed);\n}\n\nfunction parseJsonRpcPayload(parsed: unknown): ParsedJsonRpcMessage {\n if (!isObjectRecord(parsed)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const id = toRequestId(parsed.id);\n\n if (parsed.jsonrpc !== \"2.0\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasMethod = hasOwn(parsed, \"method\");\n const hasId = hasOwn(parsed, \"id\");\n\n if (hasMethod) {\n if (typeof parsed.method !== \"string\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n if (hasId) {\n if (!isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n request.params = parsed.params;\n }\n\n return {\n type: \"request\",\n message: request,\n };\n }\n\n const notification: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n notification.params = parsed.params;\n }\n\n return {\n type: \"notification\",\n message: notification,\n };\n }\n\n if (!hasId || !isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasResult = hasOwn(parsed, \"result\");\n const hasError = hasOwn(parsed, \"error\");\n\n if (hasResult === hasError) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n if (hasResult) {\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n result: parsed.result,\n },\n };\n }\n\n if (!isJsonRpcErrorObject(parsed.error)) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: parsed.error,\n },\n };\n}\n", "import { parseJsonRpcMessage, type JsonRpcRequest } from \"./internal.js\";\n\nconst subscriptionMethods = new Set([\n \"notifications/subscriptions/acknowledged\",\n \"notifications/tools/list_changed\",\n \"notifications/prompts/list_changed\",\n \"notifications/resources/list_changed\",\n \"notifications/resources/updated\"\n]);\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport class HttpResponseMessages {\n completed = false;\n private acknowledged = false;\n\n constructor(private readonly request: JsonRpcRequest) {}\n\n validate(line: string, allowNotifications: boolean): string {\n if (this.completed) throw new Error(\"MCP HTTP message arrived after completion\");\n let parsed = parseJsonRpcMessage(line);\n if (parsed.type === \"invalid\") {\n try {\n const raw: unknown = JSON.parse(line);\n if (\n record(raw) &&\n raw.jsonrpc === \"2.0\" &&\n (!Object.prototype.hasOwnProperty.call(raw, \"id\") || raw.id === null) &&\n !Object.prototype.hasOwnProperty.call(raw, \"method\") &&\n !Object.prototype.hasOwnProperty.call(raw, \"result\")\n ) {\n const normalized = JSON.stringify({ ...raw, id: this.request.id });\n parsed = parseJsonRpcMessage(normalized);\n if (parsed.type === \"response\") line = normalized;\n }\n } catch {\n /* Invalid envelopes are rejected below. */\n }\n }\n if (parsed.type === \"response\") {\n if (parsed.message.id !== this.request.id)\n throw new Error(\"MCP HTTP response ID does not match its originating request\");\n if (this.request.method === \"subscriptions/listen\" && \"result\" in parsed.message) {\n const result = parsed.message.result;\n const metadata = record(result) && record(result._meta) ? result._meta : undefined;\n if (\n !this.acknowledged ||\n metadata?.[\"io.modelcontextprotocol/subscriptionId\"] !== this.request.id\n ) {\n throw new Error(\"Invalid MCP HTTP subscription completion\");\n }\n }\n this.completed = true;\n return line;\n }\n if (!allowNotifications || parsed.type !== \"notification\") {\n throw new Error(\"Modern MCP HTTP responses cannot contain requests or invalid messages\");\n }\n const params = parsed.message.params;\n const metadata = record(params) && record(params._meta) ? params._meta : undefined;\n const subscriptionId = metadata?.[\"io.modelcontextprotocol/subscriptionId\"];\n const method = parsed.message.method;\n if (this.request.method === \"subscriptions/listen\") {\n if (subscriptionId !== this.request.id || !subscriptionMethods.has(method)) {\n throw new Error(\"MCP HTTP notification does not match its originating subscription\");\n }\n if (!this.acknowledged) {\n if (method !== \"notifications/subscriptions/acknowledged\")\n throw new Error(\"MCP HTTP subscription notification arrived before acknowledgement\");\n this.acknowledged = true;\n } else if (method === \"notifications/subscriptions/acknowledged\") {\n throw new Error(\"MCP HTTP subscription was acknowledged more than once\");\n }\n } else {\n if (subscriptionId !== undefined || subscriptionMethods.has(method)) {\n throw new Error(\n \"Subscription notifications require their originating HTTP subscription stream\"\n );\n }\n if (method === \"notifications/progress\") {\n const requestedParams = this.request.params;\n const requestedMetadata =\n record(requestedParams) && record(requestedParams._meta)\n ? requestedParams._meta\n : undefined;\n const token = requestedMetadata?.progressToken;\n if (token === undefined || !record(params) || params.progressToken !== token) {\n throw new Error(\"MCP HTTP progress token does not match its originating request\");\n }\n }\n }\n return line;\n }\n}\n", "import { withStandardSchema, type Standardized } from \"./standard.js\";\nimport type { SchemaBase } from \"./index.js\";\n\ntype JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue = JsonPrimitive | { [key: string]: JsonValue } | JsonValue[];\n\nexport interface JsonValueSchema extends SchemaBase<\"json\", JsonValue> {\n readonly kind: \"json\";\n readonly const?: JsonValue;\n readonly enum?: readonly JsonValue[];\n}\n\ntype ConfiguredJson<TOptions> = JsonValueSchema & (TOptions extends { readonly default: infer Value }\n ? undefined extends Value ? unknown : { readonly default: JsonValue }\n : unknown);\n\nexport function Json<const TOptions extends Omit<JsonValueSchema, \"kind\"> = Record<never, never>>(\n options: TOptions = {} as TOptions\n): Standardized<ConfiguredJson<TOptions>> {\n return withStandardSchema({\n kind: \"json\",\n ...options,\n } as ConfiguredJson<TOptions>);\n}\n\nexport interface JsonValueValidationOptions {\n readonly maxNodes?: number;\n readonly maxDepth?: number;\n}\n\nexport function isJsonValue(value: unknown, options: JsonValueValidationOptions = {}): boolean {\n const maxNodes = options.maxNodes ?? 10_000;\n const maxDepth = options.maxDepth ?? 64;\n if (maxNodes !== Infinity && (!Number.isSafeInteger(maxNodes) || maxNodes < 1)) throw new Error(\"maxNodes must be a positive safe integer\");\n if (maxDepth !== Infinity && (!Number.isSafeInteger(maxDepth) || maxDepth < 0)) throw new Error(\"maxDepth must be a nonnegative safe integer\");\n const ancestors = new Set<object>();\n const stack: { owner: object; children: Generator<PropertyDescriptor | undefined>; depth: number }[] = [];\n function* properties(item: object): Generator<PropertyDescriptor | undefined> {\n if (Array.isArray(item)) {\n for (let index = 0; index < item.length; index++) yield Object.getOwnPropertyDescriptor(item, String(index));\n } else for (const key in item) {\n const property = Object.getOwnPropertyDescriptor(item, key);\n if (property !== undefined) yield property;\n }\n }\n let nodes = 0;\n let item = value, depth = 0;\n while (true) {\n if (++nodes > maxNodes || depth > maxDepth) return false;\n if (item !== null && typeof item !== \"string\" && typeof item !== \"boolean\") {\n if (typeof item === \"number\") {\n if (!Number.isFinite(item)) return false;\n } else {\n if (typeof item !== \"object\" || ancestors.has(item)) return false;\n if (!Array.isArray(item) && Object.getPrototypeOf(item) !== Object.prototype &&\n Object.getPrototypeOf(item) !== null) return false;\n let hookOwner: object | null = item;\n let prototypeDepth = 0;\n while (hookOwner !== null) {\n if (++prototypeDepth > 64) return false;\n const serializationHook = Object.getOwnPropertyDescriptor(hookOwner, \"toJSON\");\n if (serializationHook !== undefined) {\n if (!(\"value\" in serializationHook) || typeof serializationHook.value === \"function\") return false;\n break;\n }\n hookOwner = Object.getPrototypeOf(hookOwner) as object | null;\n }\n if (Array.isArray(item) && item.length > maxNodes) return false;\n ancestors.add(item);\n stack.push({ owner: item, children: properties(item), depth });\n }\n }\n let next: IteratorResult<PropertyDescriptor | undefined> | undefined;\n while (stack.length) {\n const frame = stack[stack.length - 1];\n next = frame.children.next();\n if (!next.done) {\n if (next.value === undefined || !(\"value\" in next.value)) return false;\n item = next.value.value;\n depth = frame.depth + 1;\n break;\n }\n ancestors.delete(frame.owner);\n stack.pop();\n }\n if (!stack.length) return true;\n }\n}\n", "import type { ValidationIssue } from \"../validate.js\";\nimport type { Dialect, EvaluationResult, JsonSchema, SchemaObject } from \"./types.js\";\n\nexport function isSchema(value: unknown): value is JsonSchema {\n return typeof value === \"boolean\" || isObject(value);\n}\n\nexport function isObject(value: unknown): value is SchemaObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function dialectFor(schema: SchemaObject, inherited: Dialect): Dialect {\n const dialect = schema.$schema;\n if (typeof dialect !== \"string\") {\n return inherited;\n }\n if (dialect.includes(\"draft-07\")) {\n return \"draft7\";\n }\n if (dialect.includes(\"2020-12\")) {\n return \"draft2020-12\";\n }\n return inherited;\n}\n\nexport function resolveUri(reference: string, baseUri: string): string {\n try {\n return new URL(reference, baseUri).href;\n } catch {\n throw new Error(`Invalid schema URI: ${reference}`);\n }\n}\n\nexport function withoutFragment(uri: string): string {\n const index = uri.indexOf(\"#\");\n return index === -1 ? uri : uri.slice(0, index);\n}\n\nexport function fragmentOf(uri: string): string {\n const index = uri.indexOf(\"#\");\n return index === -1 ? \"\" : uri.slice(index + 1);\n}\n\nexport function escapePointer(value: string): string {\n return value.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n}\n\nexport function decodePointer(value: string): string {\n return decodeURIComponent(value).replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n}\n\nexport function deepEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) {\n return true;\n }\n if (typeof left !== typeof right || left === null || right === null) {\n return false;\n }\n if (Array.isArray(left)) {\n return (\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((value, index) => deepEqual(value, right[index]))\n );\n }\n if (isObject(left) && isObject(right)) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(right, key) && deepEqual(left[key], right[key])\n )\n );\n }\n return false;\n}\n\nexport function receivedType(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (Array.isArray(value)) {\n return \"array\";\n }\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return \"integer\";\n }\n return typeof value;\n}\n\nexport function issue(\n path: readonly string[],\n expected: string,\n value: unknown,\n message: string,\n keyword: string = keywordFor(expected)\n): ValidationIssue {\n return { path, expected, received: receivedType(value), message, keyword };\n}\n\nfunction keywordFor(expected: string): string {\n if ([\"null\", \"boolean\", \"object\", \"array\", \"number\", \"integer\", \"string\"].includes(expected)) {\n return \"type\";\n }\n if (expected.startsWith(\"multiple of\")) return \"multipleOf\";\n if (expected.startsWith(\"length <=\")) return \"maxLength\";\n if (expected.startsWith(\"length >=\")) return \"minLength\";\n if (expected.startsWith(\"pattern \")) return \"pattern\";\n if (expected.startsWith(\"items <=\")) return \"maxItems\";\n if (expected.startsWith(\"items >=\")) return \"minItems\";\n if (expected === \"unique items\") return \"uniqueItems\";\n if (expected.startsWith(\"properties <=\")) return \"maxProperties\";\n if (expected.startsWith(\"properties >=\")) return \"minProperties\";\n if (expected.startsWith(\"<= \")) return \"maximum\";\n if (expected.startsWith(\">= \")) return \"minimum\";\n if (expected.startsWith(\"< \")) return \"exclusiveMaximum\";\n if (expected.startsWith(\"> \")) return \"exclusiveMinimum\";\n if (expected === \"valid schema\") return \"false schema\";\n return expected;\n}\n\nexport function validResult(): EvaluationResult {\n return {\n valid: true,\n issues: [],\n evaluatedProperties: new Set(),\n evaluatedItems: new Set()\n };\n}\n\nexport function invalidResult(problem: ValidationIssue): EvaluationResult {\n return {\n valid: false,\n issues: [problem],\n evaluatedProperties: new Set(),\n evaluatedItems: new Set()\n };\n}\n\nexport function mergeResults(results: readonly EvaluationResult[]): EvaluationResult {\n const merged = validResult();\n for (const result of results) {\n merged.valid &&= result.valid;\n merged.issues.push(...result.issues);\n for (const key of result.evaluatedProperties) {\n merged.evaluatedProperties.add(key);\n }\n for (const index of result.evaluatedItems) {\n merged.evaluatedItems.add(index);\n }\n }\n return merged;\n}\n\nexport function typeMatches(type: string, value: unknown): boolean {\n switch (type) {\n case \"null\":\n return value === null;\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"object\":\n return isObject(value);\n case \"array\":\n return Array.isArray(value);\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value);\n case \"string\":\n return typeof value === \"string\";\n default:\n return true;\n }\n}\n\nexport function unicodeLength(value: string): number {\n return [...value].length;\n}\n\nexport function isMultipleOf(value: number, divisor: number): boolean {\n if (divisor === 0) {\n return false;\n }\n const quotient = value / divisor;\n return (\n Math.abs(quotient - Math.round(quotient)) <=\n Number.EPSILON * Math.max(1, Math.abs(quotient)) * 4\n );\n}\n", "import type {\n CompileJsonSchemaOptions,\n Dialect,\n JsonSchema,\n SchemaNode,\n SchemaObject\n} from \"./types.js\";\nimport {\n dialectFor,\n escapePointer,\n fragmentOf,\n isObject,\n isSchema,\n resolveUri,\n withoutFragment\n} from \"./utils.js\";\n\nconst schemaMapKeywords = new Set([\n \"$defs\",\n \"definitions\",\n \"properties\",\n \"patternProperties\",\n \"dependentSchemas\",\n \"dependencies\"\n]);\nconst schemaArrayKeywords = new Set([\"allOf\", \"anyOf\", \"oneOf\", \"prefixItems\"]);\nconst schemaKeywords = new Set([\n \"additionalItems\",\n \"additionalProperties\",\n \"contains\",\n \"else\",\n \"if\",\n \"items\",\n \"not\",\n \"propertyNames\",\n \"then\",\n \"unevaluatedItems\",\n \"unevaluatedProperties\"\n]);\nconst draftTypes = [\"null\", \"boolean\", \"object\", \"array\", \"number\", \"integer\", \"string\"];\nconst draftTypeSet = new Set(draftTypes);\nconst metaSchemaKeywordProperties = {\n type: {\n anyOf: [\n { enum: draftTypes },\n { type: \"array\", items: { enum: draftTypes }, minItems: 1, uniqueItems: true }\n ]\n },\n minLength: { type: \"integer\", minimum: 0 },\n maxLength: { type: \"integer\", minimum: 0 },\n minItems: { type: \"integer\", minimum: 0 },\n maxItems: { type: \"integer\", minimum: 0 },\n minProperties: { type: \"integer\", minimum: 0 },\n maxProperties: { type: \"integer\", minimum: 0 }\n};\nconst builtInRegistry: Record<string, unknown> = {\n \"https://json-schema.org/draft/2020-12/schema\": {\n $id: \"https://json-schema.org/draft/2020-12/schema\",\n type: [\"object\", \"boolean\"],\n properties: {\n ...metaSchemaKeywordProperties,\n $defs: { type: \"object\", additionalProperties: { $ref: \"#\" } }\n }\n },\n \"http://json-schema.org/draft-07/schema\": {\n $id: \"http://json-schema.org/draft-07/schema#\",\n type: [\"object\", \"boolean\"],\n properties: {\n ...metaSchemaKeywordProperties,\n definitions: { type: \"object\", additionalProperties: { $ref: \"#\" } }\n }\n }\n};\n\nexport interface CompiledGraph {\n formats: ReadonlyMap<string, (value: string) => boolean>;\n root: SchemaNode;\n locations: Map<string, SchemaNode>;\n resources: Map<string, SchemaNode>;\n anchors: Map<string, SchemaNode>;\n dynamicAnchors: Map<string, SchemaNode>;\n resolve(node: SchemaNode, reference: string): SchemaNode;\n dynamicAnchor(scope: SchemaNode, name: string): SchemaNode | undefined;\n}\n\nfunction mapKey(dialect: Dialect, uri: string): string {\n return `${dialect}\\0${uri}`;\n}\n\nfunction assertSchemaArray(value: unknown, keyword: string): asserts value is JsonSchema[] {\n if (!Array.isArray(value) || value.length === 0 || !value.every(isSchema)) {\n throw new Error(`${keyword} must be a non-empty array of schemas.`);\n }\n}\n\nfunction assertStringArray(value: unknown, keyword: string): asserts value is string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`${keyword} must be an array of strings.`);\n }\n if (new Set(value).size !== value.length) {\n throw new Error(`${keyword} must contain unique strings.`);\n }\n}\n\nfunction assertSchemaMap(value: unknown, keyword: string): asserts value is SchemaObject {\n if (!isObject(value) || !Object.values(value).every(isSchema)) {\n throw new Error(`${keyword} must be an object containing schemas.`);\n }\n}\n\nfunction assertNonNegativeInteger(value: unknown, keyword: string): void {\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw new Error(`${keyword} must be a non-negative integer.`);\n }\n}\n\nfunction validateSchemaObject(schema: SchemaObject, dialect: Dialect): void {\n if (schema.type !== undefined) {\n const types = Array.isArray(schema.type) ? schema.type : [schema.type];\n if (\n types.length === 0 ||\n !types.every((type) => typeof type === \"string\" && draftTypeSet.has(type)) ||\n new Set(types).size !== types.length\n ) {\n throw new Error(\"type must be a JSON Schema type or a unique array of JSON Schema types.\");\n }\n }\n for (const keyword of [\"minimum\", \"maximum\", \"exclusiveMinimum\", \"exclusiveMaximum\"] as const) {\n if (schema[keyword] !== undefined && typeof schema[keyword] !== \"number\") {\n throw new Error(`${keyword} must be a number.`);\n }\n }\n if (\n schema.multipleOf !== undefined &&\n (typeof schema.multipleOf !== \"number\" || schema.multipleOf <= 0)\n ) {\n throw new Error(\"multipleOf must be a number greater than zero.\");\n }\n for (const keyword of [\n \"minLength\",\n \"maxLength\",\n \"minItems\",\n \"maxItems\",\n \"minContains\",\n \"maxContains\",\n \"minProperties\",\n \"maxProperties\"\n ] as const) {\n if (schema[keyword] !== undefined) {\n assertNonNegativeInteger(schema[keyword], keyword);\n }\n }\n if (schema.pattern !== undefined && typeof schema.pattern !== \"string\") {\n throw new Error(\"pattern must be a string.\");\n }\n for (const keyword of [\"uniqueItems\", \"$recursiveAnchor\"] as const) {\n if (schema[keyword] !== undefined && typeof schema[keyword] !== \"boolean\") {\n throw new Error(`${keyword} must be a boolean.`);\n }\n }\n if (schema.required !== undefined) {\n assertStringArray(schema.required, \"required\");\n }\n if (schema.dependentRequired !== undefined) {\n if (!isObject(schema.dependentRequired)) {\n throw new Error(\"dependentRequired must be an object containing string arrays.\");\n }\n for (const dependencies of Object.values(schema.dependentRequired)) {\n assertStringArray(dependencies, \"dependentRequired\");\n }\n }\n for (const keyword of schemaMapKeywords) {\n const value = schema[keyword];\n if (value === undefined || keyword === \"dependencies\") continue;\n assertSchemaMap(value, keyword);\n }\n if (schema.dependencies !== undefined) {\n if (!isObject(schema.dependencies)) {\n throw new Error(\"dependencies must be an object containing schemas or string arrays.\");\n }\n for (const dependency of Object.values(schema.dependencies)) {\n if (!isSchema(dependency)) assertStringArray(dependency, \"dependencies\");\n }\n }\n for (const keyword of [\"allOf\", \"anyOf\", \"oneOf\"] as const) {\n if (schema[keyword] !== undefined) assertSchemaArray(schema[keyword], keyword);\n }\n if (schema.prefixItems !== undefined) {\n if (!Array.isArray(schema.prefixItems) || !schema.prefixItems.every(isSchema)) {\n throw new Error(\"prefixItems must be an array of schemas.\");\n }\n }\n for (const keyword of schemaKeywords) {\n const value = schema[keyword];\n if (value === undefined) continue;\n if (keyword === \"items\" && dialect === \"draft7\" && Array.isArray(value)) {\n if (!value.every(isSchema)) throw new Error(\"items must contain only schemas.\");\n } else if (!isSchema(value)) {\n throw new Error(`${keyword} must be a schema.`);\n }\n }\n if (schema.enum !== undefined && !Array.isArray(schema.enum)) {\n throw new Error(\"enum must be an array.\");\n }\n}\n\nexport function compileGraph(\n schema: unknown,\n options: CompileJsonSchemaOptions = {}\n): CompiledGraph {\n const formats = new Map(Object.entries(options.formats ?? {}));\n for (const [name, validator] of formats) {\n if (typeof validator !== \"function\") throw new Error(`Format validator must be a function: ${name}`);\n }\n\n if (!isSchema(schema)) {\n throw new Error(\"JSON Schema must be a boolean or object.\");\n }\n\n const locations = new Map<string, SchemaNode>();\n const resources = new Map<string, SchemaNode>();\n const anchors = new Map<string, SchemaNode>();\n const dynamicAnchors = new Map<string, SchemaNode>();\n const nodesBySchema = new WeakMap<SchemaObject, SchemaNode[]>();\n const pendingReferences: Array<{ node: SchemaNode; reference: string }> = [];\n const registry = { ...builtInRegistry, ...options.registry };\n const rootBase = \"https://toolcraft.invalid/root\";\n\n function validationVocabularyFor(schemaObject: SchemaObject): boolean {\n const metaSchema = schemaObject.$schema;\n if (typeof metaSchema !== \"string\") {\n return true;\n }\n const registered = registry[metaSchema];\n if (!isObject(registered) || !isObject(registered.$vocabulary)) {\n return true;\n }\n return Object.prototype.hasOwnProperty.call(\n registered.$vocabulary,\n \"https://json-schema.org/draft/2020-12/vocab/validation\"\n );\n }\n\n function recordNode(schemaObject: SchemaObject | undefined, node: SchemaNode): void {\n if (schemaObject === undefined) {\n return;\n }\n const nodes = nodesBySchema.get(schemaObject) ?? [];\n nodes.push(node);\n nodesBySchema.set(schemaObject, nodes);\n }\n\n function setLocation(dialect: Dialect, uri: string, node: SchemaNode): void {\n locations.set(mapKey(dialect, uri), node);\n }\n\n function scan(\n currentSchema: JsonSchema,\n inheritedDialect: Dialect,\n inheritedBase: string,\n resourceRoot: SchemaNode | undefined,\n pointer: string,\n validationVocabulary: boolean,\n documentId: string\n ): SchemaNode {\n const schemaObject = isObject(currentSchema) ? currentSchema : undefined;\n const dialect =\n schemaObject === undefined ? inheritedDialect : dialectFor(schemaObject, inheritedDialect);\n if (schemaObject !== undefined) {\n validateSchemaObject(schemaObject, dialect);\n }\n const declaredId =\n dialect === \"draft7\" ? (schemaObject?.$id ?? schemaObject?.id) : schemaObject?.$id;\n const effectiveId =\n dialect === \"draft7\" && typeof schemaObject?.$ref === \"string\" ? undefined : declaredId;\n const baseUri =\n typeof effectiveId === \"string\" ? resolveUri(effectiveId, inheritedBase) : inheritedBase;\n const node = {\n schema: currentSchema,\n documentId,\n dialect,\n baseUri,\n resourceUri: resourceRoot?.resourceUri ?? withoutFragment(baseUri),\n resourceRoot: undefined as unknown as SchemaNode,\n pointer,\n validationVocabulary,\n children: new Map<string, SchemaNode>()\n };\n recordNode(schemaObject, node);\n\n if (resourceRoot !== undefined) {\n setLocation(\n resourceRoot.dialect,\n resolveUri(`#${encodeURI(pointer)}`, resourceRoot.resourceUri),\n node\n );\n }\n\n const startsResource =\n resourceRoot === undefined || withoutFragment(baseUri) !== resourceRoot.resourceUri;\n node.resourceRoot = startsResource ? node : resourceRoot;\n node.resourceUri = startsResource ? withoutFragment(baseUri) : resourceRoot.resourceUri;\n const resourcePointer = startsResource ? \"\" : pointer;\n node.pointer = resourcePointer;\n\n if (startsResource) {\n resources.set(mapKey(node.dialect, node.resourceUri), node);\n setLocation(node.dialect, node.resourceUri, node);\n }\n setLocation(node.dialect, resolveUri(`#${encodeURI(resourcePointer)}`, node.resourceUri), node);\n\n if (schemaObject === undefined) {\n return node;\n }\n\n if (typeof schemaObject.$anchor === \"string\") {\n anchors.set(mapKey(node.dialect, `${node.resourceUri}#${schemaObject.$anchor}`), node);\n }\n if (typeof schemaObject.$dynamicAnchor === \"string\") {\n const anchorUri = `${node.resourceUri}#${schemaObject.$dynamicAnchor}`;\n anchors.set(mapKey(node.dialect, anchorUri), node);\n dynamicAnchors.set(mapKey(node.dialect, anchorUri), node);\n }\n if (dialect === \"draft7\" && typeof effectiveId === \"string\" && fragmentOf(baseUri) !== \"\") {\n anchors.set(mapKey(dialect, baseUri), node);\n }\n for (const keyword of [\"$ref\", \"$dynamicRef\", \"$recursiveRef\"] as const) {\n const reference = schemaObject[keyword];\n if (reference !== undefined) {\n if (typeof reference !== \"string\") {\n throw new Error(`${keyword} must be a string.`);\n }\n pendingReferences.push({ node, reference });\n }\n }\n if (typeof schemaObject.pattern === \"string\") {\n new RegExp(schemaObject.pattern, \"u\");\n }\n if (isObject(schemaObject.patternProperties)) {\n for (const pattern of Object.keys(schemaObject.patternProperties)) {\n new RegExp(pattern, \"u\");\n }\n }\n\n const nextValidationVocabulary =\n resourceRoot === undefined ? validationVocabularyFor(schemaObject) : validationVocabulary;\n for (const [keyword, value] of Object.entries(schemaObject)) {\n if (schemaMapKeywords.has(keyword) && isObject(value)) {\n for (const [key, childSchema] of Object.entries(value)) {\n if (isSchema(childSchema)) {\n node.children.set(\n `${keyword}/${key}`,\n scan(\n childSchema,\n dialect,\n baseUri,\n node.resourceRoot,\n `${resourcePointer}/${escapePointer(keyword)}/${escapePointer(key)}`,\n nextValidationVocabulary,\n documentId\n )\n );\n }\n }\n } else if (schemaArrayKeywords.has(keyword) && Array.isArray(value)) {\n value.forEach((childSchema, index) => {\n if (isSchema(childSchema)) {\n node.children.set(\n `${keyword}/${index}`,\n scan(\n childSchema,\n dialect,\n baseUri,\n node.resourceRoot,\n `${resourcePointer}/${escapePointer(keyword)}/${index}`,\n nextValidationVocabulary,\n documentId\n )\n );\n }\n });\n } else if (schemaKeywords.has(keyword)) {\n if (keyword === \"items\" && Array.isArray(value)) {\n value.forEach((childSchema, index) => {\n if (isSchema(childSchema)) {\n node.children.set(\n `items/${index}`,\n scan(\n childSchema,\n dialect,\n baseUri,\n node.resourceRoot,\n `${resourcePointer}/items/${index}`,\n nextValidationVocabulary,\n documentId\n )\n );\n }\n });\n } else if (isSchema(value)) {\n node.children.set(\n keyword,\n scan(\n value,\n dialect,\n baseUri,\n node.resourceRoot,\n `${resourcePointer}/${escapePointer(keyword)}`,\n nextValidationVocabulary,\n documentId\n )\n );\n }\n }\n }\n return node;\n }\n\n const root = scan(schema, \"draft2020-12\", rootBase, undefined, \"\", true, \"root\");\n resources.set(mapKey(root.dialect, rootBase), root);\n setLocation(root.dialect, rootBase, root);\n setLocation(root.dialect, `${rootBase}#`, root);\n\n for (const [uri, registeredSchema] of Object.entries(registry)) {\n if (!isSchema(registeredSchema)) {\n throw new Error(`Registered JSON Schema ${uri} must be a boolean or object.`);\n }\n for (const inheritedDialect of [\"draft2020-12\", \"draft7\"] as const) {\n const remote = scan(\n registeredSchema,\n inheritedDialect,\n uri,\n undefined,\n \"\",\n true,\n `${inheritedDialect}:${uri}`\n );\n resources.set(mapKey(remote.dialect, withoutFragment(uri)), remote);\n setLocation(remote.dialect, withoutFragment(uri), remote);\n setLocation(remote.dialect, `${withoutFragment(uri)}#`, remote);\n }\n }\n\n function findByDialect<T>(map: Map<string, T>, dialect: Dialect, uri: string): T | undefined {\n const alternate = dialect === \"draft7\" ? \"draft2020-12\" : \"draft7\";\n return map.get(mapKey(dialect, uri)) ?? map.get(mapKey(alternate, uri));\n }\n\n function resolve(node: SchemaNode, reference: string): SchemaNode {\n const absolute = resolveUri(reference, node.baseUri);\n const direct =\n findByDialect(locations, node.dialect, absolute) ??\n findByDialect(resources, node.dialect, absolute) ??\n findByDialect(anchors, node.dialect, absolute);\n if (direct !== undefined) {\n return direct;\n }\n const resource = findByDialect(resources, node.dialect, withoutFragment(absolute));\n const fragment = fragmentOf(absolute);\n if (resource !== undefined && fragment === \"\") {\n return resource;\n }\n if (fragment.startsWith(\"/\")) {\n const pointerTarget = findByDialect(\n locations,\n node.dialect,\n `${withoutFragment(absolute)}#${fragment}`\n );\n if (pointerTarget !== undefined) {\n return pointerTarget;\n }\n if (resource !== undefined && isObject(resource.schema)) {\n let target: unknown = resource.schema;\n for (const segment of fragment.slice(1).split(\"/\")) {\n if (!isObject(target) && !Array.isArray(target)) {\n target = undefined;\n break;\n }\n const key = decodeURIComponent(segment).replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n target = Array.isArray(target) ? target[Number(key)] : target[key];\n }\n if (isObject(target)) {\n const targetNode = nodesBySchema\n .get(target)\n ?.find((candidate) => candidate.dialect === node.dialect);\n if (targetNode !== undefined) {\n return targetNode;\n }\n }\n }\n }\n throw new Error(`Unresolvable $ref: ${reference}`);\n }\n\n const reachableDocuments = new Set([root.documentId]);\n let discoveredDocument = true;\n while (discoveredDocument) {\n discoveredDocument = false;\n for (const pending of pendingReferences) {\n if (!reachableDocuments.has(pending.node.documentId)) {\n continue;\n }\n const target = resolve(pending.node, pending.reference);\n if (!reachableDocuments.has(target.documentId)) {\n reachableDocuments.add(target.documentId);\n discoveredDocument = true;\n }\n }\n }\n\n return {\n formats,\n root,\n locations,\n resources,\n anchors,\n dynamicAnchors,\n resolve,\n dynamicAnchor(scope, name) {\n return dynamicAnchors.get(mapKey(scope.dialect, `${scope.resourceUri}#${name}`));\n }\n };\n}\n", "import type { CompiledGraph } from \"./compiler.js\";\nimport type {\n EvaluationContext,\n EvaluationResult,\n JsonSchema,\n SchemaNode,\n SchemaObject\n} from \"./types.js\";\nimport {\n deepEqual,\n invalidResult,\n isMultipleOf,\n isObject,\n issue,\n mergeResults,\n typeMatches,\n unicodeLength,\n validResult\n} from \"./utils.js\";\n\nexport function evaluateSchema(graph: CompiledGraph, value: unknown): EvaluationResult {\n return evaluateNode(graph, graph.root, value, {\n instancePath: [],\n dynamicScope: [],\n activePairs: new Map()\n });\n}\n\nfunction evaluateNode(\n graph: CompiledGraph,\n node: SchemaNode,\n value: unknown,\n context: EvaluationContext\n): EvaluationResult {\n if (node.schema === true) {\n return validResult();\n }\n if (node.schema === false) {\n return invalidResult(issue(context.instancePath, \"valid schema\", value, \"must NOT be valid\"));\n }\n\n const activeValues = context.activePairs.get(node);\n if (activeValues?.has(value) === true) {\n return validResult();\n }\n const nextActivePairs = new Map(context.activePairs);\n const nextActiveValues = new Set(activeValues ?? []);\n nextActiveValues.add(value);\n nextActivePairs.set(node, nextActiveValues);\n\n const lastScope = context.dynamicScope.at(-1);\n const dynamicScope =\n lastScope?.resourceUri === node.resourceRoot.resourceUri\n ? context.dynamicScope\n : [...context.dynamicScope, node.resourceRoot];\n const nextContext = { ...context, dynamicScope, activePairs: nextActivePairs };\n const schema = node.schema;\n\n const referenceResult = evaluateReferences(graph, node, schema, value, nextContext);\n if (node.dialect === \"draft7\" && typeof schema.$ref === \"string\") {\n return referenceResult ?? validResult();\n }\n\n const results: EvaluationResult[] = [];\n if (referenceResult !== undefined) {\n results.push(referenceResult);\n }\n results.push(...evaluateApplicators(graph, node, schema, value, nextContext));\n if (node.validationVocabulary) {\n results.push(...evaluateValidationKeywords(node, schema, value, nextContext.instancePath));\n }\n\n if (typeof value === \"string\" && typeof schema.format === \"string\") {\n const validator = graph.formats.get(schema.format);\n if (validator !== undefined && validator(value) !== true) {\n results.push(invalidResult(issue(nextContext.instancePath, `format ${schema.format}`, value, `must match format ${schema.format}`)));\n }\n }\n\n const merged = mergeResults(results);\n if (isObject(value)) {\n evaluateUnevaluatedProperties(graph, node, schema, value, nextContext, merged);\n }\n if (Array.isArray(value)) {\n evaluateUnevaluatedItems(graph, node, schema, value, nextContext, merged);\n }\n return merged;\n}\n\nfunction evaluateReferences(\n graph: CompiledGraph,\n node: SchemaNode,\n schema: SchemaObject,\n value: unknown,\n context: EvaluationContext\n): EvaluationResult | undefined {\n const results: EvaluationResult[] = [];\n if (typeof schema.$ref === \"string\") {\n results.push(evaluateNode(graph, graph.resolve(node, schema.$ref), value, context));\n }\n if (typeof schema.$dynamicRef === \"string\") {\n const staticTarget = graph.resolve(node, schema.$dynamicRef);\n const fragment = new URL(schema.$dynamicRef, node.baseUri).hash.slice(1);\n let target = staticTarget;\n if (\n fragment !== \"\" &&\n !fragment.startsWith(\"/\") &&\n isObject(staticTarget.schema) &&\n staticTarget.schema.$dynamicAnchor === fragment\n ) {\n for (const scope of context.dynamicScope) {\n const candidate = graph.dynamicAnchor(scope, fragment);\n if (candidate !== undefined) {\n target = candidate;\n break;\n }\n }\n }\n results.push(evaluateNode(graph, target, value, context));\n }\n if (typeof schema.$recursiveRef === \"string\") {\n let target = graph.resolve(node, schema.$recursiveRef);\n if (schema.$recursiveRef === \"#\") {\n for (const scope of context.dynamicScope) {\n if (isObject(scope.schema) && scope.schema.$recursiveAnchor === true) {\n target = scope;\n break;\n }\n }\n }\n results.push(evaluateNode(graph, target, value, context));\n }\n return results.length === 0 ? undefined : mergeResults(results);\n}\n\nfunction evaluateApplicators(\n graph: CompiledGraph,\n node: SchemaNode,\n schema: SchemaObject,\n value: unknown,\n context: EvaluationContext\n): EvaluationResult[] {\n const results: EvaluationResult[] = [];\n for (const keyword of [\"allOf\", \"anyOf\", \"oneOf\"] as const) {\n const schemas = schema[keyword];\n if (!Array.isArray(schemas)) {\n continue;\n }\n const branchResults = schemas.map((_, index) =>\n evaluateChild(graph, node, `${keyword}/${index}`, value, context)\n );\n if (keyword === \"allOf\") {\n results.push(mergeResults(branchResults));\n } else {\n const successful = branchResults.filter((result) => result.valid);\n const valid = keyword === \"anyOf\" ? successful.length > 0 : successful.length === 1;\n if (valid) {\n results.push(mergeResults(successful));\n } else {\n results.push(\n invalidResult(\n issue(\n context.instancePath,\n keyword,\n value,\n keyword === \"anyOf\"\n ? \"must match a schema in anyOf\"\n : \"must match exactly one schema in oneOf\"\n )\n )\n );\n }\n }\n }\n\n if (schema.not !== undefined) {\n const result = evaluateChild(graph, node, \"not\", value, context);\n if (result.valid) {\n results.push(invalidResult(issue(context.instancePath, \"not\", value, \"must NOT be valid\")));\n }\n }\n\n if (schema.if !== undefined) {\n const condition = evaluateChild(graph, node, \"if\", value, context);\n const selected = condition.valid ? \"then\" : \"else\";\n if (condition.valid) {\n results.push(condition);\n }\n if (schema[selected] !== undefined) {\n results.push(evaluateChild(graph, node, selected, value, context));\n }\n }\n\n if (isObject(value)) {\n results.push(...evaluateObjectApplicators(graph, node, schema, value, context));\n }\n if (Array.isArray(value)) {\n results.push(...evaluateArrayApplicators(graph, node, schema, value, context));\n }\n return results;\n}\n\nfunction evaluateObjectApplicators(\n graph: CompiledGraph,\n node: SchemaNode,\n schema: SchemaObject,\n value: SchemaObject,\n context: EvaluationContext\n): EvaluationResult[] {\n const results: EvaluationResult[] = [];\n const evaluated = new Set<string>();\n const properties = isObject(schema.properties) ? schema.properties : {};\n for (const key of Object.keys(properties)) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const result = evaluateChild(\n graph,\n node,\n `properties/${key}`,\n value[key],\n childContext(context, key)\n );\n evaluated.add(key);\n results.push(markProperty(atChildLocation(result), key));\n }\n }\n\n const patternProperties = isObject(schema.patternProperties) ? schema.patternProperties : {};\n for (const [pattern] of Object.entries(patternProperties)) {\n const expression = new RegExp(pattern, \"u\");\n for (const [key, propertyValue] of Object.entries(value)) {\n if (expression.test(key)) {\n const result = evaluateChild(\n graph,\n node,\n `patternProperties/${pattern}`,\n propertyValue,\n childContext(context, key)\n );\n evaluated.add(key);\n results.push(markProperty(atChildLocation(result), key));\n }\n }\n }\n\n if (schema.additionalProperties !== undefined) {\n for (const [key, propertyValue] of Object.entries(value)) {\n if (!evaluated.has(key)) {\n const result = evaluateChild(\n graph,\n node,\n \"additionalProperties\",\n propertyValue,\n childContext(context, key)\n );\n results.push(markProperty(atChildLocation(result), key));\n }\n }\n }\n\n if (schema.propertyNames !== undefined) {\n for (const key of Object.keys(value)) {\n results.push(\n atChildLocation(\n evaluateChild(graph, node, \"propertyNames\", key, childContext(context, key))\n )\n );\n }\n }\n\n const dependentSchemas = isObject(schema.dependentSchemas) ? schema.dependentSchemas : {};\n for (const key of Object.keys(dependentSchemas)) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n results.push(evaluateChild(graph, node, `dependentSchemas/${key}`, value, context));\n }\n }\n\n if (node.dialect === \"draft7\" && isObject(schema.dependencies)) {\n for (const [key, dependency] of Object.entries(schema.dependencies)) {\n if (Object.prototype.hasOwnProperty.call(value, key) && !Array.isArray(dependency)) {\n results.push(\n evaluateInline(graph, node, dependency, value, context, `dependencies/${key}`)\n );\n }\n }\n }\n return results;\n}\n\nfunction evaluateArrayApplicators(\n graph: CompiledGraph,\n node: SchemaNode,\n schema: SchemaObject,\n value: unknown[],\n context: EvaluationContext\n): EvaluationResult[] {\n const results: EvaluationResult[] = [];\n if (node.dialect === \"draft2020-12\") {\n const prefixItems = Array.isArray(schema.prefixItems) ? schema.prefixItems : [];\n prefixItems.forEach((_, index) => {\n if (index < value.length) {\n const result = evaluateChild(\n graph,\n node,\n `prefixItems/${index}`,\n value[index],\n childContext(context, String(index))\n );\n results.push(markItem(atChildLocation(result), index));\n }\n });\n if (schema.items !== undefined && !Array.isArray(schema.items)) {\n for (let index = prefixItems.length; index < value.length; index += 1) {\n const result = evaluateChild(\n graph,\n node,\n \"items\",\n value[index],\n childContext(context, String(index))\n );\n results.push(markItem(atChildLocation(result), index));\n }\n }\n } else if (Array.isArray(schema.items)) {\n schema.items.forEach((_, index) => {\n if (index < value.length) {\n const result = evaluateChild(\n graph,\n node,\n `items/${index}`,\n value[index],\n childContext(context, String(index))\n );\n results.push(markItem(atChildLocation(result), index));\n }\n });\n if (schema.additionalItems !== undefined) {\n for (let index = schema.items.length; index < value.length; index += 1) {\n const result = evaluateChild(\n graph,\n node,\n \"additionalItems\",\n value[index],\n childContext(context, String(index))\n );\n results.push(markItem(atChildLocation(result), index));\n }\n }\n } else if (schema.items !== undefined) {\n for (let index = 0; index < value.length; index += 1) {\n const result = evaluateChild(\n graph,\n node,\n \"items\",\n value[index],\n childContext(context, String(index))\n );\n results.push(markItem(atChildLocation(result), index));\n }\n }\n\n if (schema.contains !== undefined) {\n const containsResults = value.map((item, index) =>\n evaluateChild(graph, node, \"contains\", item, childContext(context, String(index)))\n );\n const matching = containsResults\n .map((result, index) => ({ result, index }))\n .filter(({ result }) => result.valid);\n const minimum =\n node.dialect === \"draft2020-12\" && typeof schema.minContains === \"number\"\n ? schema.minContains\n : 1;\n const maximum =\n node.dialect === \"draft2020-12\" && typeof schema.maxContains === \"number\"\n ? schema.maxContains\n : Number.POSITIVE_INFINITY;\n if (matching.length < minimum || matching.length > maximum) {\n results.push(\n invalidResult(\n issue(context.instancePath, \"contains\", value, \"must contain required matching items\")\n )\n );\n } else if (node.dialect === \"draft2020-12\") {\n const result = validResult();\n for (const match of matching) {\n result.evaluatedItems.add(match.index);\n }\n results.push(result);\n }\n }\n return results;\n}\n\nfunction evaluateValidationKeywords(\n node: SchemaNode,\n schema: SchemaObject,\n value: unknown,\n path: readonly string[]\n): EvaluationResult[] {\n const results: EvaluationResult[] = [];\n const types =\n typeof schema.type === \"string\" ? [schema.type] : Array.isArray(schema.type) ? schema.type : [];\n if (\n types.length > 0 &&\n !types.some((type) => typeof type === \"string\" && typeMatches(type, value))\n ) {\n results.push(invalidResult(issue(path, types.join(\",\"), value, `must be ${types.join(\",\")}`)));\n return results;\n }\n if (schema.const !== undefined && !deepEqual(schema.const, value)) {\n results.push(invalidResult(issue(path, \"const\", value, \"must be equal to constant\")));\n }\n if (Array.isArray(schema.enum) && !schema.enum.some((entry) => deepEqual(entry, value))) {\n results.push(\n invalidResult(issue(path, \"enum\", value, \"must be equal to one of the allowed values\"))\n );\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n evaluateNumberKeywords(schema, value, path, results);\n }\n if (typeof value === \"string\") {\n evaluateStringKeywords(schema, value, path, results);\n }\n if (Array.isArray(value)) {\n evaluateArrayKeywords(schema, value, path, results);\n }\n if (isObject(value)) {\n evaluateObjectKeywords(node, schema, value, path, results);\n }\n return results;\n}\n\nfunction evaluateNumberKeywords(\n schema: SchemaObject,\n value: number,\n path: readonly string[],\n results: EvaluationResult[]\n): void {\n if (typeof schema.multipleOf === \"number\" && !isMultipleOf(value, schema.multipleOf)) {\n results.push(\n invalidResult(\n issue(\n path,\n `multiple of ${schema.multipleOf}`,\n value,\n `must be multiple of ${schema.multipleOf}`\n )\n )\n );\n }\n if (typeof schema.maximum === \"number\" && value > schema.maximum) {\n results.push(\n invalidResult(issue(path, `<= ${schema.maximum}`, value, `must be <= ${schema.maximum}`))\n );\n }\n if (typeof schema.minimum === \"number\" && value < schema.minimum) {\n results.push(\n invalidResult(issue(path, `>= ${schema.minimum}`, value, `must be >= ${schema.minimum}`))\n );\n }\n if (typeof schema.exclusiveMaximum === \"number\" && value >= schema.exclusiveMaximum) {\n results.push(\n invalidResult(\n issue(path, `< ${schema.exclusiveMaximum}`, value, `must be < ${schema.exclusiveMaximum}`)\n )\n );\n }\n if (typeof schema.exclusiveMinimum === \"number\" && value <= schema.exclusiveMinimum) {\n results.push(\n invalidResult(\n issue(path, `> ${schema.exclusiveMinimum}`, value, `must be > ${schema.exclusiveMinimum}`)\n )\n );\n }\n}\n\nfunction evaluateStringKeywords(\n schema: SchemaObject,\n value: string,\n path: readonly string[],\n results: EvaluationResult[]\n): void {\n const length = unicodeLength(value);\n if (typeof schema.maxLength === \"number\" && length > schema.maxLength) {\n results.push(\n invalidResult(\n issue(\n path,\n `length <= ${schema.maxLength}`,\n value,\n `must NOT have more than ${schema.maxLength} characters`\n )\n )\n );\n }\n if (typeof schema.minLength === \"number\" && length < schema.minLength) {\n results.push(\n invalidResult(\n issue(\n path,\n `length >= ${schema.minLength}`,\n value,\n `must NOT have fewer than ${schema.minLength} characters`\n )\n )\n );\n }\n if (typeof schema.pattern === \"string\" && !new RegExp(schema.pattern, \"u\").test(value)) {\n results.push(\n invalidResult(\n issue(path, `pattern ${schema.pattern}`, value, `must match pattern ${schema.pattern}`)\n )\n );\n }\n}\n\nfunction evaluateArrayKeywords(\n schema: SchemaObject,\n value: unknown[],\n path: readonly string[],\n results: EvaluationResult[]\n): void {\n if (typeof schema.maxItems === \"number\" && value.length > schema.maxItems) {\n results.push(\n invalidResult(\n issue(\n path,\n `items <= ${schema.maxItems}`,\n value,\n `must NOT have more than ${schema.maxItems} items`\n )\n )\n );\n }\n if (typeof schema.minItems === \"number\" && value.length < schema.minItems) {\n results.push(\n invalidResult(\n issue(\n path,\n `items >= ${schema.minItems}`,\n value,\n `must NOT have fewer than ${schema.minItems} items`\n )\n )\n );\n }\n if (schema.uniqueItems === true) {\n for (let left = 0; left < value.length; left += 1) {\n for (let right = left + 1; right < value.length; right += 1) {\n if (deepEqual(value[left], value[right])) {\n results.push(\n invalidResult(issue(path, \"unique items\", value, \"must NOT have duplicate items\"))\n );\n return;\n }\n }\n }\n }\n}\n\nfunction evaluateObjectKeywords(\n node: SchemaNode,\n schema: SchemaObject,\n value: SchemaObject,\n path: readonly string[],\n results: EvaluationResult[]\n): void {\n const keys = Object.keys(value);\n if (typeof schema.maxProperties === \"number\" && keys.length > schema.maxProperties) {\n results.push(\n invalidResult(\n issue(\n path,\n `properties <= ${schema.maxProperties}`,\n value,\n `must NOT have more than ${schema.maxProperties} properties`\n )\n )\n );\n }\n if (typeof schema.minProperties === \"number\" && keys.length < schema.minProperties) {\n results.push(\n invalidResult(\n issue(\n path,\n `properties >= ${schema.minProperties}`,\n value,\n `must NOT have fewer than ${schema.minProperties} properties`\n )\n )\n );\n }\n if (Array.isArray(schema.required)) {\n for (const key of schema.required) {\n if (typeof key === \"string\" && !Object.prototype.hasOwnProperty.call(value, key)) {\n results.push(\n invalidResult(\n issue([...path, key], \"required\", undefined, `must have required property '${key}'`)\n )\n );\n }\n }\n }\n const dependentRequired = isObject(schema.dependentRequired) ? schema.dependentRequired : {};\n for (const [key, dependencies] of Object.entries(dependentRequired)) {\n if (Object.prototype.hasOwnProperty.call(value, key) && Array.isArray(dependencies)) {\n addMissingDependencies(value, dependencies, path, results);\n }\n }\n if (node.dialect === \"draft7\" && isObject(schema.dependencies)) {\n for (const [key, dependencies] of Object.entries(schema.dependencies)) {\n if (Object.prototype.hasOwnProperty.call(value, key) && Array.isArray(dependencies)) {\n addMissingDependencies(value, dependencies, path, results);\n }\n }\n }\n}\n\nfunction addMissingDependencies(\n value: SchemaObject,\n dependencies: unknown[],\n path: readonly string[],\n results: EvaluationResult[]\n): void {\n for (const dependency of dependencies) {\n if (\n typeof dependency === \"string\" &&\n !Object.prototype.hasOwnProperty.call(value, dependency)\n ) {\n results.push(\n invalidResult(\n issue(\n [...path, dependency],\n \"dependency\",\n undefined,\n `must have property '${dependency}'`\n )\n )\n );\n }\n }\n}\n\nfunction evaluateUnevaluatedProperties(\n graph: CompiledGraph,\n node: SchemaNode,\n schema: SchemaObject,\n value: SchemaObject,\n context: EvaluationContext,\n result: EvaluationResult\n): void {\n if (node.dialect !== \"draft2020-12\" || schema.unevaluatedProperties === undefined) {\n return;\n }\n for (const [key, propertyValue] of Object.entries(value)) {\n if (!result.evaluatedProperties.has(key)) {\n const propertyResult = evaluateChild(\n graph,\n node,\n \"unevaluatedProperties\",\n propertyValue,\n childContext(context, key)\n );\n propertyResult.evaluatedProperties.add(key);\n mergeInto(result, propertyResult);\n }\n }\n}\n\nfunction evaluateUnevaluatedItems(\n graph: CompiledGraph,\n node: SchemaNode,\n schema: SchemaObject,\n value: unknown[],\n context: EvaluationContext,\n result: EvaluationResult\n): void {\n if (node.dialect !== \"draft2020-12\" || schema.unevaluatedItems === undefined) {\n return;\n }\n for (let index = 0; index < value.length; index += 1) {\n if (!result.evaluatedItems.has(index)) {\n const itemResult = evaluateChild(\n graph,\n node,\n \"unevaluatedItems\",\n value[index],\n childContext(context, String(index))\n );\n itemResult.evaluatedItems.add(index);\n mergeInto(result, itemResult);\n }\n }\n}\n\nfunction evaluateChild(\n graph: CompiledGraph,\n node: SchemaNode,\n key: string,\n value: unknown,\n context: EvaluationContext\n): EvaluationResult {\n const child = node.children.get(key);\n if (child === undefined) {\n return validResult();\n }\n return evaluateNode(graph, child, value, context);\n}\n\nfunction evaluateInline(\n graph: CompiledGraph,\n node: SchemaNode,\n schema: unknown,\n value: unknown,\n context: EvaluationContext,\n key: string\n): EvaluationResult {\n const child = node.children.get(key);\n if (child !== undefined) {\n return evaluateNode(graph, child, value, context);\n }\n if (typeof schema !== \"boolean\" && !isObject(schema)) {\n return validResult();\n }\n const inlineNode: SchemaNode = {\n schema: schema as JsonSchema,\n documentId: node.documentId,\n dialect: node.dialect,\n baseUri: node.baseUri,\n resourceUri: node.resourceUri,\n resourceRoot: node.resourceRoot,\n pointer: node.pointer,\n validationVocabulary: node.validationVocabulary,\n children: new Map()\n };\n return evaluateNode(graph, inlineNode, value, context);\n}\n\nfunction childContext(context: EvaluationContext, segment: string): EvaluationContext {\n return { ...context, instancePath: [...context.instancePath, segment] };\n}\n\nfunction mergeInto(target: EvaluationResult, source: EvaluationResult): void {\n target.valid &&= source.valid;\n target.issues.push(...source.issues);\n for (const key of source.evaluatedProperties) {\n target.evaluatedProperties.add(key);\n }\n for (const index of source.evaluatedItems) {\n target.evaluatedItems.add(index);\n }\n}\n\nfunction atChildLocation(result: EvaluationResult): EvaluationResult {\n return {\n valid: result.valid,\n issues: result.issues,\n evaluatedProperties: new Set(),\n evaluatedItems: new Set()\n };\n}\n\nfunction markProperty(result: EvaluationResult, key: string): EvaluationResult {\n result.evaluatedProperties.add(key);\n return result;\n}\n\nfunction markItem(result: EvaluationResult, index: number): EvaluationResult {\n result.evaluatedItems.add(index);\n return result;\n}\n", "import type { ValidationIssue } from \"../validate.js\";\nimport { compileGraph } from \"./compiler.js\";\nimport { evaluateSchema } from \"./evaluate.js\";\nimport type { CompileJsonSchemaOptions, CompiledJsonSchema } from \"./types.js\";\n\nexport type { CompileJsonSchemaOptions, CompiledJsonSchema } from \"./types.js\";\n\nexport function compileJsonSchema(\n schema: unknown,\n options: CompileJsonSchemaOptions = {}\n): CompiledJsonSchema {\n const graph = compileGraph(schema, options);\n return {\n validate(value: unknown) {\n const result = evaluateSchema(graph, value);\n return result.valid ? { ok: true, value } : { ok: false, issues: result.issues };\n }\n };\n}\n\nexport function formatIssues(issues: readonly ValidationIssue[]): string {\n return issues\n .map((current) => {\n const path = current.path.length === 0 ? \"data\" : `data/${current.path.join(\"/\")}`;\n return `${path} ${current.message}`;\n })\n .join(\", \");\n}\n", "import { isJsonValue } from \"toolcraft-schema\";\n\nfunction isLetter(code: number): boolean {\n return (code >= 0x41 && code <= 0x5a) || (code >= 0x61 && code <= 0x7a);\n}\nfunction isAlphanumeric(code: number): boolean {\n return isLetter(code) || (code >= 0x30 && code <= 0x39);\n}\n\nexport function isValidMetadataKey(key: string): boolean {\n const slash = key.indexOf(\"/\");\n let name = key;\n if (slash !== -1) {\n if (key.indexOf(\"/\", slash + 1) !== -1) return false;\n for (const label of key.slice(0, slash).split(\".\")) {\n if (label.length === 0 || !isLetter(label.charCodeAt(0)) || !isAlphanumeric(label.charCodeAt(label.length - 1))) return false;\n for (let index = 1; index < label.length - 1; index++) {\n if (!isAlphanumeric(label.charCodeAt(index)) && label[index] !== \"-\") return false;\n }\n }\n name = key.slice(slash + 1);\n }\n if (name.length === 0) return true;\n if (!isAlphanumeric(name.charCodeAt(0)) || !isAlphanumeric(name.charCodeAt(name.length - 1))) return false;\n for (let index = 1; index < name.length - 1; index++) {\n if (!isAlphanumeric(name.charCodeAt(index)) && name[index] !== \"-\" && name[index] !== \"_\" && name[index] !== \".\") return false;\n }\n return true;\n}\n\nexport function isValidMetadata(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n && isJsonValue(value) && Object.keys(value).every(isValidMetadataKey);\n}\n", "import type { ToolInputSchema, ToolOutputSchema } from \"./schema.js\";\n\n// JSON-RPC 2.0 types\nexport interface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id: string | number | null;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JSONRPCError;\n}\n\nexport interface JSONRPCError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// JSON-RPC error codes\nexport const JSON_RPC_ERROR_CODES = Object.freeze({\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n RESOURCE_NOT_FOUND: -32002,\n UNSUPPORTED_PROTOCOL_VERSION: -32022\n} as const);\n\nexport class ToolError extends Error {\n constructor(\n public readonly code: number,\n message: string,\n public readonly data?: unknown\n ) {\n if (!Number.isFinite(code)) {\n throw new Error(\"ToolError code must be a finite number\");\n }\n\n super(message);\n this.name = \"ToolError\";\n }\n}\n\n// MCP protocol types\nexport interface ToolsCapability {\n listChanged?: boolean;\n}\n\nexport interface PromptsCapability {\n listChanged?: boolean;\n}\n\nexport interface ResourcesCapability {\n subscribe?: boolean;\n listChanged?: boolean;\n}\n\nexport interface Implementation {\n name: string;\n title?: string;\n version: string;\n description?: string;\n websiteUrl?: string;\n icons?: Icon[];\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: {\n extensions?: Record<string, Record<string, unknown>>;\n tools?: ToolsCapability;\n prompts?: PromptsCapability;\n resources?: ResourcesCapability;\n };\n serverInfo: Implementation;\n}\n\nexport interface DiscoverResult {\n resultType: \"complete\";\n supportedVersions: string[];\n capabilities: InitializeResult[\"capabilities\"];\n _meta: {\n \"io.modelcontextprotocol/serverInfo\": InitializeResult[\"serverInfo\"];\n };\n ttlMs: number;\n cacheScope: \"public\" | \"private\";\n}\n\nexport interface Tool {\n name: string;\n title?: string;\n description?: string;\n inputSchema: JSONSchema;\n outputSchema?: OutputSchema;\n annotations?: ToolAnnotations;\n execution?: ToolExecution;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n structuredContent?: unknown;\n isError?: boolean;\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface ToolExecution {\n taskSupport?: \"optional\" | \"required\" | \"forbidden\";\n}\n\nexport interface Icon {\n src: string;\n mimeType?: string;\n sizes?: string[];\n theme?: \"light\" | \"dark\";\n}\n\nexport interface ContentAnnotations {\n audience?: Array<\"user\" | \"assistant\">;\n priority?: number;\n lastModified?: string;\n}\n\nexport interface ResourceLink extends Resource {\n type: \"resource_link\";\n}\n\nexport interface PromptArgument {\n name: string;\n title?: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface Prompt {\n name: string;\n title?: string;\n description?: string;\n arguments?: PromptArgument[];\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n}\n\nexport interface PromptMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem;\n}\n\nexport interface GetPromptResult {\n description?: string;\n messages: PromptMessage[];\n}\n\nexport type PromptHandler = (\n args: Record<string, string>,\n context: HandlerRequestContext\n) => Promise<GetPromptResult | InputRequiredResult> | GetPromptResult | InputRequiredResult;\n\nexport interface PromptDefinition extends Prompt {\n handler: PromptHandler;\n}\n\nexport interface Resource {\n uri: string;\n name: string;\n title?: string;\n description?: string;\n mimeType?: string;\n size?: number;\n annotations?: ContentAnnotations;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n}\n\nexport interface ResourceTemplate {\n uriTemplate: string;\n name: string;\n title?: string;\n description?: string;\n mimeType?: string;\n annotations?: ContentAnnotations;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n}\n\nexport type ResourceContents =\n | { uri: string; mimeType?: string; text: string; _meta?: Record<string, unknown> }\n | { uri: string; mimeType?: string; blob: string; _meta?: Record<string, unknown> };\n\nexport interface ReadResourceResult {\n contents: ResourceContents[];\n}\n\nexport type ResourceHandler = (\n uri: string,\n context: HandlerRequestContext\n) => Promise<ReadResourceResult | InputRequiredResult> | ReadResourceResult | InputRequiredResult;\n\nexport interface ResourceDefinition extends Resource {\n handler: ResourceHandler;\n}\n\nexport interface ResourceTemplateDefinition extends ResourceTemplate {\n handler: ResourceHandler;\n}\n\nexport interface HandleResult {\n result?: unknown;\n error?: JSONRPCError;\n}\n\nexport type PromptContentItem =\n | { type: \"text\"; text: string; annotations?: ContentAnnotations; _meta?: Record<string, unknown> }\n | {\n type: \"image\";\n data: string;\n mimeType: string;\n annotations?: ContentAnnotations;\n _meta?: Record<string, unknown>;\n }\n | {\n type: \"audio\";\n data: string;\n mimeType: string;\n annotations?: ContentAnnotations;\n _meta?: Record<string, unknown>;\n }\n | {\n type: \"resource\";\n annotations?: ContentAnnotations;\n _meta?: Record<string, unknown>;\n resource:\n | { uri: string; mimeType?: string; text: string; _meta?: Record<string, unknown> }\n | { uri: string; mimeType?: string; blob: string; _meta?: Record<string, unknown> };\n };\n\n// ContentItem is a union of all possible tool result content block types.\nexport type ContentItem = PromptContentItem | ResourceLink;\n\nexport interface JSONSchema {\n type: \"object\";\n properties?: Record<string, JSONSchemaProperty>;\n required?: string[];\n [keyword: string]: unknown;\n}\n\nexport interface OutputSchema {\n $schema?: string;\n [keyword: string]: unknown;\n}\n\nexport interface JSONSchemaProperty extends Record<string, unknown> {\n type?: string | string[];\n description?: string;\n [keyword: string]: unknown;\n}\n\n// Server types\nexport interface ServerOptions {\n name: string;\n version: string;\n toolCallTimeoutMs?: number;\n /** Shared active tool-handler capacity across sessions; defaults to four. */\n maxConcurrentToolCalls?: number;\n /** Maximum tool calls waiting for capacity; defaults to 64. Zero disables waiting. */\n maxQueuedToolCalls?: number;\n /** Per-stdio-connection UTF-8 bytes queued or submitted but unsettled; defaults to 1 MiB. */\n maxStdioOutputBytes?: number;\n /** Per-stdio-connection messages awaiting handler/output settlement; defaults to 128. */\n maxPendingStdioMessages?: number;\n /** Shared in-flight requests retained until their work settles; defaults to 128. */\n maxActiveRequests?: number;\n maxStdioLineBytes?: number;\n validateToolArguments?: boolean;\n supportNotifications?: boolean;\n supportResourceSubscriptions?: boolean;\n}\n\nimport type { ToolReturn } from \"./content/index.js\";\n\nexport interface InputRequiredResult {\n resultType: \"input_required\";\n inputRequests?: Record<\n string,\n {\n method: \"elicitation/create\" | \"sampling/createMessage\" | \"roots/list\";\n params?: Record<string, unknown>;\n }\n >;\n requestState?: string;\n _meta?: Record<string, unknown>;\n}\n\nexport interface HandlerRequestContext {\n readonly signal: AbortSignal;\n /** Opaque state provided by the transport, separate from untrusted request metadata. */\n readonly localContext?: unknown;\n readonly requestState?: string;\n readonly inputResponses?: Record<string, unknown>;\n readonly clientCapabilities: Record<string, unknown>;\n}\n\nexport type ToolHandler<T = Record<string, unknown>, TOut = ToolReturn> = (\n args: T,\n context: HandlerRequestContext\n) =>\n | Promise<TOut | CallToolResult | InputRequiredResult>\n | TOut\n | CallToolResult\n | InputRequiredResult;\n\nexport interface ToolDefinition<T = Record<string, unknown>, TOut = ToolReturn> {\n name: string;\n title?: string;\n description?: string;\n inputSchema: ToolInputSchema<T>;\n outputSchema?: ToolOutputSchema<TOut>;\n annotations?: ToolAnnotations;\n execution?: ToolExecution;\n icons?: Icon[];\n _meta?: Record<string, unknown>;\n handler: ToolHandler<T, TOut>;\n}\n\n// Transport types\nexport interface Transport {\n readable: NodeJS.ReadableStream;\n writable: NodeJS.WritableStream;\n}\n\n// SDK-compatible transport interface\nexport interface SDKTransport {\n onmessage?: (message: JSONRPCMessage) => void;\n onclose?: () => void;\n onerror?: (error: Error) => void;\n start: () => Promise<void>;\n close: () => Promise<void>;\n send: (message: JSONRPCMessage) => Promise<void>;\n}\n\nexport type JSONRPCMessage = JSONRPCRequest | JSONRPCResponse | JSONRPCNotification;\n\nexport interface JSONRPCNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: Record<string, unknown>;\n}\n", "export function isBase64(value: string): boolean {\n if (value.length % 4 !== 0) return false;\n return Buffer.from(value, \"base64\").toString(\"base64\") === value;\n}\n", "const invalidUriCharacters = new Set([\"\\\"\", \"<\", \">\", \"\\\\\", \"^\", \"`\", \"{\", \"|\", \"}\"]);\n\nexport function isValidUri(uri: string): boolean {\n for (let index = 0; index < uri.length; index++) {\n const code = uri.charCodeAt(index);\n if (code <= 0x20 || code >= 0x7f || invalidUriCharacters.has(uri[index]!)) return false;\n if (uri[index] === \"%\") {\n if (index + 2 >= uri.length) return false;\n for (let offset = 1; offset <= 2; offset++) {\n const digit = uri.charCodeAt(index + offset);\n if (!((digit >= 0x30 && digit <= 0x39) || (digit >= 0x41 && digit <= 0x46) || (digit >= 0x61 && digit <= 0x66))) return false;\n }\n index += 2;\n }\n }\n try {\n const parsed = new URL(uri);\n const openingBracket = uri.indexOf(\"[\");\n const closingBracket = uri.indexOf(\"]\");\n if (openingBracket !== -1 || closingBracket !== -1) {\n const schemeEnd = uri.indexOf(\":\");\n if (!uri.startsWith(\"//\", schemeEnd + 1) || !parsed.hostname.startsWith(\"[\")) return false;\n const authorityStart = schemeEnd + 3;\n let authorityEnd = authorityStart;\n while (authorityEnd < uri.length && !\"/?#\".includes(uri[authorityEnd]!)) authorityEnd++;\n const authority = uri.slice(authorityStart, authorityEnd);\n if (openingBracket !== authorityStart + authority.lastIndexOf(\"@\") + 1 ||\n closingBracket >= authorityEnd || uri.indexOf(\"[\", openingBracket + 1) !== -1 ||\n uri.indexOf(\"]\", closingBracket + 1) !== -1) return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n", "/*!\nThe MCP project is undergoing a licensing transition from the MIT License to the Apache License, Version 2.0 (\"Apache-2.0\"). All new code and specification contributions to the project are licensed under Apache-2.0. Documentation contributions (excluding specifications) are licensed under CC-BY-4.0.\n\nContributions for which relicensing consent has been obtained are licensed under Apache-2.0. Contributions made by authors who originally licensed their work under the MIT License and who have not yet granted explicit permission to relicense remain licensed under the MIT License.\n\nNo rights beyond those granted by the applicable original license are conveyed for such contributions.\n\n---\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to the Licensor for inclusion in the Work by the copyright\n owner or by an individual or Legal Entity authorized to submit on behalf\n of the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n---\n\nMIT License\n\nCopyright (c) 2024-2025 Model Context Protocol a Series of LF Projects, LLC.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---\n\nCreative Commons Attribution 4.0 International (CC-BY-4.0)\n\nDocumentation in this project (excluding specifications) is licensed under\nCC-BY-4.0. See https://creativecommons.org/licenses/by/4.0/legalcode for\nthe full license text.\n\n*/\n// Derived from the official MCP 2026-07-28 schema; upstream licensing notice above.\n// Source: https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/schema/2026-07-28/schema.json\n// Source SHA-256: ef70b61f99b6d2e5e3b46863822eab08dff6a45bedc7a08914e0e5b133f40203\n// Transitive input request/response, capability and server result definitions; descriptions omitted.\n// JSONValue and ElicitResult number/null types follow the normative TypeScript definitions,\n// correcting narrower types in the upstream generated JSON artifact.\nexport const inputRequestSchema: Record<string, unknown> = {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$ref\": \"#/$defs/InputRequest\",\n \"$defs\": {\n \"Annotations\": {\n \"properties\": {\n \"audience\": {\n \"items\": {\n \"$ref\": \"#/$defs/Role\"\n },\n \"type\": \"array\"\n },\n \"lastModified\": {\n \"type\": \"string\"\n },\n \"priority\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"type\": \"object\"\n },\n \"AudioContent\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"annotations\": {\n \"$ref\": \"#/$defs/Annotations\"\n },\n \"data\": {\n \"format\": \"byte\",\n \"type\": \"string\"\n },\n \"mimeType\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"audio\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"data\",\n \"mimeType\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"BlobResourceContents\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"blob\": {\n \"format\": \"byte\",\n \"type\": \"string\"\n },\n \"mimeType\": {\n \"type\": \"string\"\n },\n \"uri\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"blob\",\n \"uri\"\n ],\n \"type\": \"object\"\n },\n \"BooleanSchema\": {\n \"properties\": {\n \"default\": {\n \"type\": \"boolean\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"boolean\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"CallToolResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"content\": {\n \"items\": {\n \"$ref\": \"#/$defs/ContentBlock\"\n },\n \"type\": \"array\"\n },\n \"isError\": {\n \"type\": \"boolean\"\n },\n \"resultType\": {\n \"type\": \"string\"\n },\n \"structuredContent\": {}\n },\n \"required\": [\n \"content\",\n \"resultType\"\n ],\n \"type\": \"object\"\n },\n \"ClientCapabilities\": {\n \"properties\": {\n \"elicitation\": {\n \"properties\": {\n \"form\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"url\": {\n \"$ref\": \"#/$defs/JSONObject\"\n }\n },\n \"type\": \"object\"\n },\n \"experimental\": {\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"type\": \"object\"\n },\n \"extensions\": {\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"type\": \"object\"\n },\n \"roots\": {\n \"properties\": {},\n \"type\": \"object\"\n },\n \"sampling\": {\n \"properties\": {\n \"context\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"tools\": {\n \"$ref\": \"#/$defs/JSONObject\"\n }\n },\n \"type\": \"object\"\n }\n },\n \"type\": \"object\"\n },\n \"CompleteResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"completion\": {\n \"properties\": {\n \"hasMore\": {\n \"type\": \"boolean\"\n },\n \"total\": {\n \"type\": \"integer\"\n },\n \"values\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"maxItems\": 100,\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"values\"\n ],\n \"type\": \"object\"\n },\n \"resultType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"completion\",\n \"resultType\"\n ],\n \"type\": \"object\"\n },\n \"ContentBlock\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ImageContent\"\n },\n {\n \"$ref\": \"#/$defs/AudioContent\"\n },\n {\n \"$ref\": \"#/$defs/ResourceLink\"\n },\n {\n \"$ref\": \"#/$defs/EmbeddedResource\"\n }\n ]\n },\n \"CreateMessageRequest\": {\n \"properties\": {\n \"method\": {\n \"const\": \"sampling/createMessage\",\n \"type\": \"string\"\n },\n \"params\": {\n \"$ref\": \"#/$defs/CreateMessageRequestParams\"\n }\n },\n \"required\": [\n \"method\",\n \"params\"\n ],\n \"type\": \"object\"\n },\n \"CreateMessageRequestParams\": {\n \"properties\": {\n \"includeContext\": {\n \"enum\": [\n \"allServers\",\n \"none\",\n \"thisServer\"\n ],\n \"type\": \"string\"\n },\n \"maxTokens\": {\n \"type\": \"integer\"\n },\n \"messages\": {\n \"items\": {\n \"$ref\": \"#/$defs/SamplingMessage\"\n },\n \"type\": \"array\"\n },\n \"metadata\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"modelPreferences\": {\n \"$ref\": \"#/$defs/ModelPreferences\"\n },\n \"stopSequences\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"systemPrompt\": {\n \"type\": \"string\"\n },\n \"temperature\": {\n \"type\": \"number\"\n },\n \"toolChoice\": {\n \"$ref\": \"#/$defs/ToolChoice\"\n },\n \"tools\": {\n \"items\": {\n \"$ref\": \"#/$defs/Tool\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"maxTokens\",\n \"messages\"\n ],\n \"type\": \"object\"\n },\n \"CreateMessageResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ImageContent\"\n },\n {\n \"$ref\": \"#/$defs/AudioContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolUseContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"items\": {\n \"$ref\": \"#/$defs/SamplingMessageContentBlock\"\n },\n \"type\": \"array\"\n }\n ]\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"role\": {\n \"$ref\": \"#/$defs/Role\"\n },\n \"stopReason\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"content\",\n \"model\",\n \"role\"\n ],\n \"type\": \"object\"\n },\n \"DiscoverResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"cacheScope\": {\n \"enum\": [\n \"private\",\n \"public\"\n ],\n \"type\": \"string\"\n },\n \"capabilities\": {\n \"$ref\": \"#/$defs/ServerCapabilities\"\n },\n \"instructions\": {\n \"type\": \"string\"\n },\n \"resultType\": {\n \"type\": \"string\"\n },\n \"supportedVersions\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"ttlMs\": {\n \"minimum\": 0,\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"cacheScope\",\n \"capabilities\",\n \"resultType\",\n \"supportedVersions\",\n \"ttlMs\"\n ],\n \"type\": \"object\"\n },\n \"ElicitRequest\": {\n \"properties\": {\n \"method\": {\n \"const\": \"elicitation/create\",\n \"type\": \"string\"\n },\n \"params\": {\n \"$ref\": \"#/$defs/ElicitRequestParams\"\n }\n },\n \"required\": [\n \"method\",\n \"params\"\n ],\n \"type\": \"object\"\n },\n \"ElicitRequestFormParams\": {\n \"properties\": {\n \"message\": {\n \"type\": \"string\"\n },\n \"mode\": {\n \"const\": \"form\",\n \"type\": \"string\"\n },\n \"requestedSchema\": {\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"properties\": {\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/PrimitiveSchemaDefinition\"\n },\n \"type\": \"object\"\n },\n \"required\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"type\": {\n \"const\": \"object\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"properties\",\n \"type\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"message\",\n \"requestedSchema\"\n ],\n \"type\": \"object\"\n },\n \"ElicitRequestParams\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/ElicitRequestFormParams\"\n },\n {\n \"$ref\": \"#/$defs/ElicitRequestURLParams\"\n }\n ]\n },\n \"ElicitRequestURLParams\": {\n \"properties\": {\n \"message\": {\n \"type\": \"string\"\n },\n \"mode\": {\n \"const\": \"url\",\n \"type\": \"string\"\n },\n \"url\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message\",\n \"mode\",\n \"url\"\n ],\n \"type\": \"object\"\n },\n \"ElicitResult\": {\n \"properties\": {\n \"action\": {\n \"enum\": [\n \"accept\",\n \"cancel\",\n \"decline\"\n ],\n \"type\": \"string\"\n },\n \"content\": {\n \"additionalProperties\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": [\n \"string\",\n \"number\",\n \"boolean\"\n ]\n }\n ]\n },\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"type\": \"object\"\n },\n \"EmbeddedResource\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"annotations\": {\n \"$ref\": \"#/$defs/Annotations\"\n },\n \"resource\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextResourceContents\"\n },\n {\n \"$ref\": \"#/$defs/BlobResourceContents\"\n }\n ]\n },\n \"type\": {\n \"const\": \"resource\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"resource\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"GetPromptResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"messages\": {\n \"items\": {\n \"$ref\": \"#/$defs/PromptMessage\"\n },\n \"type\": \"array\"\n },\n \"resultType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"messages\",\n \"resultType\"\n ],\n \"type\": \"object\"\n },\n \"Icon\": {\n \"properties\": {\n \"mimeType\": {\n \"type\": \"string\"\n },\n \"sizes\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"src\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n },\n \"theme\": {\n \"enum\": [\n \"dark\",\n \"light\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"src\"\n ],\n \"type\": \"object\"\n },\n \"ImageContent\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"annotations\": {\n \"$ref\": \"#/$defs/Annotations\"\n },\n \"data\": {\n \"format\": \"byte\",\n \"type\": \"string\"\n },\n \"mimeType\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"image\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"data\",\n \"mimeType\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"Implementation\": {\n \"properties\": {\n \"description\": {\n \"type\": \"string\"\n },\n \"icons\": {\n \"items\": {\n \"$ref\": \"#/$defs/Icon\"\n },\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"websiteUrl\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"version\"\n ],\n \"type\": \"object\"\n },\n \"InputRequest\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/CreateMessageRequest\"\n },\n {\n \"$ref\": \"#/$defs/ListRootsRequest\"\n },\n {\n \"$ref\": \"#/$defs/ElicitRequest\"\n }\n ]\n },\n \"InputResponse\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/CreateMessageResult\"\n },\n {\n \"$ref\": \"#/$defs/ListRootsResult\"\n },\n {\n \"$ref\": \"#/$defs/ElicitResult\"\n }\n ]\n },\n \"InputResponses\": {\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/InputResponse\"\n },\n \"type\": \"object\"\n },\n \"JSONObject\": {\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/JSONValue\"\n },\n \"type\": \"object\"\n },\n \"JSONValue\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n {\n \"items\": {\n \"$ref\": \"#/$defs/JSONValue\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\"\n ]\n }\n ]\n },\n \"LegacyTitledEnumSchema\": {\n \"properties\": {\n \"default\": {\n \"type\": \"string\"\n },\n \"enum\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"enumNames\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"string\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"enum\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"ListPromptsResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"cacheScope\": {\n \"enum\": [\n \"private\",\n \"public\"\n ],\n \"type\": \"string\"\n },\n \"nextCursor\": {\n \"type\": \"string\"\n },\n \"prompts\": {\n \"items\": {\n \"$ref\": \"#/$defs/Prompt\"\n },\n \"type\": \"array\"\n },\n \"resultType\": {\n \"type\": \"string\"\n },\n \"ttlMs\": {\n \"minimum\": 0,\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"cacheScope\",\n \"prompts\",\n \"resultType\",\n \"ttlMs\"\n ],\n \"type\": \"object\"\n },\n \"ListResourcesResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"cacheScope\": {\n \"enum\": [\n \"private\",\n \"public\"\n ],\n \"type\": \"string\"\n },\n \"nextCursor\": {\n \"type\": \"string\"\n },\n \"resources\": {\n \"items\": {\n \"$ref\": \"#/$defs/Resource\"\n },\n \"type\": \"array\"\n },\n \"resultType\": {\n \"type\": \"string\"\n },\n \"ttlMs\": {\n \"minimum\": 0,\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"cacheScope\",\n \"resources\",\n \"resultType\",\n \"ttlMs\"\n ],\n \"type\": \"object\"\n },\n \"ListResourceTemplatesResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"cacheScope\": {\n \"enum\": [\n \"private\",\n \"public\"\n ],\n \"type\": \"string\"\n },\n \"nextCursor\": {\n \"type\": \"string\"\n },\n \"resourceTemplates\": {\n \"items\": {\n \"$ref\": \"#/$defs/ResourceTemplate\"\n },\n \"type\": \"array\"\n },\n \"resultType\": {\n \"type\": \"string\"\n },\n \"ttlMs\": {\n \"minimum\": 0,\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"cacheScope\",\n \"resourceTemplates\",\n \"resultType\",\n \"ttlMs\"\n ],\n \"type\": \"object\"\n },\n \"ListRootsRequest\": {\n \"properties\": {\n \"method\": {\n \"const\": \"roots/list\",\n \"type\": \"string\"\n },\n \"params\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n }\n },\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"method\"\n ],\n \"type\": \"object\"\n },\n \"ListRootsResult\": {\n \"properties\": {\n \"roots\": {\n \"items\": {\n \"$ref\": \"#/$defs/Root\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"roots\"\n ],\n \"type\": \"object\"\n },\n \"ListToolsResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"cacheScope\": {\n \"enum\": [\n \"private\",\n \"public\"\n ],\n \"type\": \"string\"\n },\n \"nextCursor\": {\n \"type\": \"string\"\n },\n \"resultType\": {\n \"type\": \"string\"\n },\n \"tools\": {\n \"items\": {\n \"$ref\": \"#/$defs/Tool\"\n },\n \"type\": \"array\"\n },\n \"ttlMs\": {\n \"minimum\": 0,\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"cacheScope\",\n \"resultType\",\n \"tools\",\n \"ttlMs\"\n ],\n \"type\": \"object\"\n },\n \"MetaObject\": {\n \"type\": \"object\"\n },\n \"ModelHint\": {\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"ModelPreferences\": {\n \"properties\": {\n \"costPriority\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"hints\": {\n \"items\": {\n \"$ref\": \"#/$defs/ModelHint\"\n },\n \"type\": \"array\"\n },\n \"intelligencePriority\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"speedPriority\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"type\": \"object\"\n },\n \"NumberSchema\": {\n \"properties\": {\n \"default\": {\n \"type\": \"number\"\n },\n \"maximum\": {\n \"type\": \"number\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"integer\",\n \"number\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"PrimitiveSchemaDefinition\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/StringSchema\"\n },\n {\n \"$ref\": \"#/$defs/NumberSchema\"\n },\n {\n \"$ref\": \"#/$defs/BooleanSchema\"\n },\n {\n \"$ref\": \"#/$defs/UntitledSingleSelectEnumSchema\"\n },\n {\n \"$ref\": \"#/$defs/TitledSingleSelectEnumSchema\"\n },\n {\n \"$ref\": \"#/$defs/UntitledMultiSelectEnumSchema\"\n },\n {\n \"$ref\": \"#/$defs/TitledMultiSelectEnumSchema\"\n },\n {\n \"$ref\": \"#/$defs/LegacyTitledEnumSchema\"\n }\n ]\n },\n \"Prompt\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"arguments\": {\n \"items\": {\n \"$ref\": \"#/$defs/PromptArgument\"\n },\n \"type\": \"array\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"icons\": {\n \"items\": {\n \"$ref\": \"#/$defs/Icon\"\n },\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"PromptArgument\": {\n \"properties\": {\n \"description\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"PromptMessage\": {\n \"properties\": {\n \"content\": {\n \"$ref\": \"#/$defs/ContentBlock\"\n },\n \"role\": {\n \"$ref\": \"#/$defs/Role\"\n }\n },\n \"required\": [\n \"content\",\n \"role\"\n ],\n \"type\": \"object\"\n },\n \"ReadResourceResult\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"cacheScope\": {\n \"enum\": [\n \"private\",\n \"public\"\n ],\n \"type\": \"string\"\n },\n \"contents\": {\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextResourceContents\"\n },\n {\n \"$ref\": \"#/$defs/BlobResourceContents\"\n }\n ]\n },\n \"type\": \"array\"\n },\n \"resultType\": {\n \"type\": \"string\"\n },\n \"ttlMs\": {\n \"minimum\": 0,\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"cacheScope\",\n \"contents\",\n \"resultType\",\n \"ttlMs\"\n ],\n \"type\": \"object\"\n },\n \"Resource\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"annotations\": {\n \"$ref\": \"#/$defs/Annotations\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"icons\": {\n \"items\": {\n \"$ref\": \"#/$defs/Icon\"\n },\n \"type\": \"array\"\n },\n \"mimeType\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"size\": {\n \"type\": \"integer\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"uri\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"uri\"\n ],\n \"type\": \"object\"\n },\n \"ResourceLink\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"annotations\": {\n \"$ref\": \"#/$defs/Annotations\"\n },\n \"icons\": {\n \"items\": {\n \"$ref\": \"#/$defs/Icon\"\n },\n \"type\": \"array\"\n },\n \"mimeType\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"size\": {\n \"type\": \"integer\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"resource_link\",\n \"type\": \"string\"\n },\n \"uri\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"type\",\n \"uri\"\n ],\n \"type\": \"object\"\n },\n \"ResourceTemplate\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"annotations\": {\n \"$ref\": \"#/$defs/Annotations\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"icons\": {\n \"items\": {\n \"$ref\": \"#/$defs/Icon\"\n },\n \"type\": \"array\"\n },\n \"mimeType\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"uriTemplate\": {\n \"format\": \"uri-template\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"uriTemplate\"\n ],\n \"type\": \"object\"\n },\n \"Result\": {\n \"additionalProperties\": {},\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/ResultMetaObject\"\n },\n \"resultType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"resultType\"\n ],\n \"type\": \"object\"\n },\n \"ResultMetaObject\": {\n \"properties\": {\n \"io.modelcontextprotocol/serverInfo\": {\n \"$ref\": \"#/$defs/Implementation\"\n }\n },\n \"type\": \"object\"\n },\n \"Role\": {\n \"enum\": [\n \"assistant\",\n \"user\"\n ],\n \"type\": \"string\"\n },\n \"Root\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"uri\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"uri\"\n ],\n \"type\": \"object\"\n },\n \"SamplingMessage\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ImageContent\"\n },\n {\n \"$ref\": \"#/$defs/AudioContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolUseContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"items\": {\n \"$ref\": \"#/$defs/SamplingMessageContentBlock\"\n },\n \"type\": \"array\"\n }\n ]\n },\n \"role\": {\n \"$ref\": \"#/$defs/Role\"\n }\n },\n \"required\": [\n \"content\",\n \"role\"\n ],\n \"type\": \"object\"\n },\n \"SamplingMessageContentBlock\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ImageContent\"\n },\n {\n \"$ref\": \"#/$defs/AudioContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolUseContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n }\n ]\n },\n \"ServerCapabilities\": {\n \"properties\": {\n \"completions\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"experimental\": {\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"type\": \"object\"\n },\n \"extensions\": {\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"type\": \"object\"\n },\n \"logging\": {\n \"$ref\": \"#/$defs/JSONObject\"\n },\n \"prompts\": {\n \"properties\": {\n \"listChanged\": {\n \"type\": \"boolean\"\n }\n },\n \"type\": \"object\"\n },\n \"resources\": {\n \"properties\": {\n \"listChanged\": {\n \"type\": \"boolean\"\n },\n \"subscribe\": {\n \"type\": \"boolean\"\n }\n },\n \"type\": \"object\"\n },\n \"tools\": {\n \"properties\": {\n \"listChanged\": {\n \"type\": \"boolean\"\n }\n },\n \"type\": \"object\"\n }\n },\n \"type\": \"object\"\n },\n \"StringSchema\": {\n \"properties\": {\n \"default\": {\n \"type\": \"string\"\n },\n \"format\": {\n \"enum\": [\n \"date\",\n \"date-time\",\n \"email\",\n \"uri\"\n ],\n \"type\": \"string\"\n },\n \"maxLength\": {\n \"type\": \"integer\"\n },\n \"minLength\": {\n \"type\": \"integer\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"string\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"annotations\": {\n \"$ref\": \"#/$defs/Annotations\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"text\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"text\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"TextResourceContents\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"mimeType\": {\n \"type\": \"string\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"uri\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"text\",\n \"uri\"\n ],\n \"type\": \"object\"\n },\n \"TitledMultiSelectEnumSchema\": {\n \"properties\": {\n \"default\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"items\": {\n \"properties\": {\n \"anyOf\": {\n \"items\": {\n \"properties\": {\n \"const\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"const\",\n \"title\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"anyOf\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": {\n \"type\": \"integer\"\n },\n \"minItems\": {\n \"type\": \"integer\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"array\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"items\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"TitledSingleSelectEnumSchema\": {\n \"properties\": {\n \"default\": {\n \"type\": \"string\"\n },\n \"oneOf\": {\n \"items\": {\n \"properties\": {\n \"const\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"const\",\n \"title\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"string\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"oneOf\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"Tool\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"annotations\": {\n \"$ref\": \"#/$defs/ToolAnnotations\"\n },\n \"icons\": {\n \"items\": {\n \"$ref\": \"#/$defs/Icon\"\n },\n \"type\": \"array\"\n },\n \"inputSchema\": {\n \"additionalProperties\": {},\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"object\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"outputSchema\": {\n \"additionalProperties\": {},\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"inputSchema\",\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"ToolAnnotations\": {\n \"properties\": {\n \"destructiveHint\": {\n \"type\": \"boolean\"\n },\n \"idempotentHint\": {\n \"type\": \"boolean\"\n },\n \"openWorldHint\": {\n \"type\": \"boolean\"\n },\n \"readOnlyHint\": {\n \"type\": \"boolean\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"ToolChoice\": {\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"auto\",\n \"none\",\n \"required\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"content\": {\n \"items\": {\n \"$ref\": \"#/$defs/ContentBlock\"\n },\n \"type\": \"array\"\n },\n \"isError\": {\n \"type\": \"boolean\"\n },\n \"structuredContent\": {},\n \"toolUseId\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"tool_result\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"content\",\n \"toolUseId\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"ToolUseContent\": {\n \"properties\": {\n \"_meta\": {\n \"$ref\": \"#/$defs/MetaObject\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"input\": {\n \"additionalProperties\": {},\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"tool_use\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"input\",\n \"name\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"UntitledMultiSelectEnumSchema\": {\n \"properties\": {\n \"default\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"items\": {\n \"properties\": {\n \"enum\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"type\": {\n \"const\": \"string\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"enum\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"maxItems\": {\n \"type\": \"integer\"\n },\n \"minItems\": {\n \"type\": \"integer\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"array\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"items\",\n \"type\"\n ],\n \"type\": \"object\"\n },\n \"UntitledSingleSelectEnumSchema\": {\n \"properties\": {\n \"default\": {\n \"type\": \"string\"\n },\n \"enum\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"const\": \"string\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"enum\",\n \"type\"\n ],\n \"type\": \"object\"\n }\n }\n};\n", "import { isBase64 } from \"./base64.js\";\nimport { isValidMetadataKey } from \"./metadata.js\";\nimport { isValidUri } from \"./uri.js\";\nimport { compileJsonSchema, type CompiledJsonSchema } from \"toolcraft-schema\";\nimport { inputRequestSchema } from \"./input-request-schema.js\";\nimport { isJsonValue } from \"toolcraft-schema\";\n\nconst validators = new Map<string, CompiledJsonSchema>();\nconst protocolSchema = structuredClone(inputRequestSchema);\nconst protocolDefinitions = protocolSchema.$defs as Record<string, Record<string, unknown>>;\nfor (const definition of [\"MetaObject\", \"ResultMetaObject\"] as const) {\n Object.assign(protocolDefinitions[definition], { propertyNames: { format: \"mcp-metadata-key\" } });\n}\nfor (const definition of [\"ClientCapabilities\", \"ServerCapabilities\"] as const) {\n const properties = protocolDefinitions[definition]!.properties as Record<string, Record<string, unknown>>;\n Object.assign(properties.extensions!, { propertyNames: { format: \"mcp-extension-key\" } });\n}\n\n\ntype ProtocolDefinition = \"InputRequest\" | \"InputResponses\" | \"ClientCapabilities\" | \"ElicitResult\" | \"CreateMessageResult\" | \"ListRootsResult\"\n | \"DiscoverResult\" | \"ListToolsResult\" | \"CallToolResult\" | \"ListPromptsResult\" | \"GetPromptResult\"\n | \"ListResourcesResult\" | \"ListResourceTemplatesResult\" | \"ReadResourceResult\" | \"CompleteResult\" | \"Result\";\n\nconst resultDefinitions: Record<string, ProtocolDefinition> = {\n \"server/discover\": \"DiscoverResult\",\n \"tools/list\": \"ListToolsResult\",\n \"tools/call\": \"CallToolResult\",\n \"prompts/list\": \"ListPromptsResult\",\n \"prompts/get\": \"GetPromptResult\",\n \"resources/list\": \"ListResourcesResult\",\n \"resources/templates/list\": \"ListResourceTemplatesResult\",\n \"resources/read\": \"ReadResourceResult\",\n \"completion/complete\": \"CompleteResult\",\n \"ping\": \"Result\",\n \"logging/setLevel\": \"Result\"\n};\n\nexport function validateServerResult(method: string, value: unknown): boolean {\n const definition = Object.hasOwn(resultDefinitions, method) ? resultDefinitions[method] : undefined;\n return definition === undefined || validateProtocolValue(definition, value);\n}\n\nexport function validateProtocolValue(\n definition: ProtocolDefinition,\n value: unknown\n): boolean {\n if (!isJsonValue(value)) return false;\n if (definition === \"ListRootsResult\" && typeof value === \"object\" && value !== null &&\n Array.isArray((value as { roots?: unknown }).roots) &&\n !(value as { roots: Array<{ uri?: unknown }> }).roots.every((root) =>\n typeof root?.uri === \"string\" && root.uri.startsWith(\"file://\") && isValidUri(root.uri))) return false;\n\n let validator = validators.get(definition);\n if (validator === undefined) {\n validator = compileJsonSchema({ ...protocolSchema, $ref: `#/$defs/${definition}` }, {\n formats: {\n \"mcp-metadata-key\": isValidMetadataKey,\n \"mcp-extension-key\": (key) => key.includes(\"/\") && isValidMetadataKey(key),\n uri: isValidUri, byte: isBase64\n }\n });\n validators.set(definition, validator);\n }\n return validator.validate(value).ok;\n}\n", "type SamplingContent =\n | { type: \"tool_use\"; id: string }\n | { type: \"tool_result\"; toolUseId: string }\n | { type: \"text\" | \"image\" | \"audio\" };\n\nexport interface SamplingMessage {\n role: \"user\" | \"assistant\";\n content: SamplingContent | SamplingContent[];\n}\n\n// Field schemas must be validated before checking cross-message invariants.\nexport function inspectSamplingMessages(\n messages: readonly SamplingMessage[]\n): { valid: boolean; usesTools: boolean } {\n let pending: Set<string> | undefined;\n let usesTools = false;\n const seenIds = new Set<string>();\n for (const message of messages) {\n const content = Array.isArray(message.content) ? message.content : [message.content];\n if (pending !== undefined) {\n if (message.role !== \"user\") return { valid: false, usesTools };\n for (const block of content) {\n if (block.type !== \"tool_result\" || !pending.delete(block.toolUseId))\n return { valid: false, usesTools };\n }\n if (pending.size > 0) return { valid: false, usesTools };\n pending = undefined;\n continue;\n }\n for (const block of content) {\n if (block.type === \"tool_result\") return { valid: false, usesTools };\n if (block.type !== \"tool_use\") continue;\n if (message.role !== \"assistant\" || seenIds.has(block.id))\n return { valid: false, usesTools };\n seenIds.add(block.id);\n pending ??= new Set<string>();\n pending.add(block.id);\n usesTools = true;\n }\n }\n return { valid: pending === undefined, usesTools };\n}\n", "import { isValidMetadata } from \"./metadata.js\";\nimport { JSON_RPC_ERROR_CODES, type HandleResult, type JSONRPCError } from \"./types.js\";\nimport { isJsonValue } from \"toolcraft-schema\";\nimport { validateProtocolValue } from \"./protocol-validation.js\";\nimport { inspectSamplingMessages, type SamplingMessage } from \"./sampling-messages.js\";\n\nexport const MODERN_PROTOCOL_VERSION = \"2026-07-28\";\n\nconst removedMethods = new Set([\n \"initialize\",\n \"notifications/initialized\",\n \"ping\",\n \"logging/setLevel\",\n \"resources/subscribe\",\n \"resources/unsubscribe\",\n \"notifications/roots/list_changed\"\n]);\nconst cacheableMethods = new Set([\n \"server/discover\",\n \"tools/list\",\n \"prompts/list\",\n \"resources/list\",\n \"resources/templates/list\",\n \"resources/read\"\n]);\nconst inputRequiredMethods = new Set([\"tools/call\", \"prompts/get\", \"resources/read\"]);\nconst inputRequestCapabilities: Record<string, string> = {\n \"roots/list\": \"roots\",\n \"sampling/createMessage\": \"sampling\",\n \"elicitation/create\": \"elicitation\"\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function selectRequestProtocol(\n method: string,\n params: Record<string, unknown> | undefined,\n legacyVersions: ReadonlySet<string>\n): { modern: boolean; error?: JSONRPCError } {\n const invalid = {\n modern: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: \"Request metadata must include protocolVersion and clientCapabilities\"\n }\n };\n const property = Object.getOwnPropertyDescriptor(params ?? {}, \"_meta\");\n if (property === undefined || property.enumerable !== true)\n return method === \"server/discover\" ? invalid : { modern: false };\n if (!(\"value\" in property)) return invalid;\n const metadata = property.value as unknown;\n if (!isRecord(metadata)) return invalid;\n if (!isValidMetadata(metadata)) return { modern: false, error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS, message: \"Invalid MCP metadata keys\"\n } };\n const versionKey = \"io.modelcontextprotocol/protocolVersion\";\n const capabilitiesKey = \"io.modelcontextprotocol/clientCapabilities\";\n if (!(versionKey in metadata) && !(capabilitiesKey in metadata) && method !== \"server/discover\") {\n return { modern: false };\n }\n const version = metadata[versionKey];\n if (\n !Object.prototype.hasOwnProperty.call(metadata, versionKey) ||\n typeof version !== \"string\" ||\n !Object.prototype.hasOwnProperty.call(metadata, capabilitiesKey) ||\n !isRecord(metadata[capabilitiesKey])\n )\n return invalid;\n if (version !== MODERN_PROTOCOL_VERSION && !legacyVersions.has(version)) {\n return {\n modern: false,\n error: {\n code: JSON_RPC_ERROR_CODES.UNSUPPORTED_PROTOCOL_VERSION,\n message: \"Unsupported protocol version\",\n data: { requested: version, supported: [...legacyVersions].reverse() }\n }\n };\n }\n const modern = version === MODERN_PROTOCOL_VERSION;\n if (modern && !validateProtocolValue(\"ClientCapabilities\", metadata[capabilitiesKey])) {\n return { modern, error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS, message: \"Invalid MCP clientCapabilities\"\n } };\n }\n if (\n modern &&\n ((params?.requestState !== undefined && typeof params.requestState !== \"string\") ||\n (params?.inputResponses !== undefined && !validateProtocolValue(\"InputResponses\", params.inputResponses)))\n ) {\n return {\n modern,\n error: { code: JSON_RPC_ERROR_CODES.INVALID_PARAMS, message: \"Invalid MCP retry parameters\" }\n };\n }\n if (modern && removedMethods.has(method)) {\n return {\n modern,\n error: { code: JSON_RPC_ERROR_CODES.METHOD_NOT_FOUND, message: \"Method not found\" }\n };\n }\n return { modern };\n}\n\nexport function validateInputRequiredResult(\n method: string,\n value: Record<string, unknown>,\n clientCapabilities: Record<string, unknown>\n): HandleResult | undefined {\n const requests = value.inputRequests;\n const requiredCapabilities: Record<string, Record<string, unknown>> = {};\n const invalidRequests =\n requests !== undefined &&\n (!isRecord(requests) || !isJsonValue(requests) ||\n Object.values(requests).some((request) => {\n if (!isRecord(request) || typeof request.method !== \"string\") return true;\n if (!validateProtocolValue(\"InputRequest\", request)) return true;\n const sampling = request.method === \"sampling/createMessage\"\n ? inspectSamplingMessages((request.params as { messages: SamplingMessage[] }).messages)\n : undefined;\n if (sampling?.valid === false) return true;\n if (request.method === \"elicitation/create\" &&\n (request.params as Record<string, unknown>).mode === \"url\") {\n try { new URL((request.params as Record<string, unknown>).url as string); }\n catch { return true; }\n }\n const capability = Object.prototype.hasOwnProperty.call(\n inputRequestCapabilities,\n request.method\n )\n ? inputRequestCapabilities[request.method]\n : undefined;\n if (capability === undefined || (request.params !== undefined && !isRecord(request.params)))\n return true;\n const supported = Object.prototype.hasOwnProperty.call(clientCapabilities, capability)\n ? clientCapabilities[capability] : undefined;\n if (!isRecord(supported)) requiredCapabilities[capability] = {};\n else if (capability === \"elicitation\") {\n const mode = (request.params as Record<string, unknown>).mode ?? \"form\";\n const implicitForm = mode === \"form\" && Object.keys(supported).length === 0;\n if (!implicitForm && (typeof mode !== \"string\" ||\n !Object.prototype.hasOwnProperty.call(supported, mode) || !isRecord(supported[mode]))) {\n const required = requiredCapabilities.elicitation ??= {};\n required[String(mode)] = {};\n }\n } else if (capability === \"sampling\") {\n const params = request.params as Record<string, unknown>;\n if ((params.tools !== undefined || params.toolChoice !== undefined || sampling?.usesTools === true) &&\n (!Object.prototype.hasOwnProperty.call(supported, \"tools\") || !isRecord(supported.tools))) {\n const required = requiredCapabilities.sampling ??= {};\n required.tools = {};\n }\n }\n return false;\n }));\n if (\n !inputRequiredMethods.has(method) ||\n (requests === undefined && value.requestState === undefined) ||\n (value.requestState !== undefined && typeof value.requestState !== \"string\") ||\n invalidRequests\n ) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n message: \"Invalid MCP input_required result\"\n }\n };\n }\n if (Object.keys(requiredCapabilities).length > 0) {\n return { error: {\n code: -32021,\n message: \"Missing required client capability\",\n data: { requiredCapabilities }\n } };\n }\n}\n\nexport function validateCacheMetadata(method: string, value: Record<string, unknown>): string | undefined {\n if (!cacheableMethods.has(method)) return undefined;\n if (!Number.isSafeInteger(value.ttlMs) || (value.ttlMs as number) < 0) {\n return \"MCP cache ttlMs must be a nonnegative safe integer\";\n }\n if (value.cacheScope !== \"public\" && value.cacheScope !== \"private\") {\n return \"MCP cacheScope must be public or private\";\n }\n return undefined;\n}\n\nexport function decorateModernResult(\n method: string,\n handled: HandleResult,\n serverInfo: { name: string; version: string },\n clientCapabilities: Record<string, unknown> = {}\n): HandleResult {\n if (handled.error !== undefined) {\n return handled.error.code === JSON_RPC_ERROR_CODES.RESOURCE_NOT_FOUND\n ? { error: { ...handled.error, code: JSON_RPC_ERROR_CODES.INVALID_PARAMS } }\n : handled;\n }\n if (handled.result === undefined && method.startsWith(\"notifications/\")) return handled;\n const value = handled.result;\n if (!isRecord(value))\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n message: \"MCP result must be an object\"\n }\n };\n if (\n value.resultType !== undefined &&\n value.resultType !== \"complete\" &&\n value.resultType !== \"input_required\"\n ) {\n return {\n error: { code: JSON_RPC_ERROR_CODES.INTERNAL_ERROR, message: \"Unrecognized MCP resultType\" }\n };\n }\n if (value.resultType === \"input_required\") {\n const invalid = validateInputRequiredResult(method, value, clientCapabilities);\n if (invalid !== undefined) return invalid;\n }\n const result = {\n ...value,\n resultType: value.resultType ?? \"complete\",\n _meta: {\n ...(isRecord(value._meta) ? value._meta : {}),\n \"io.modelcontextprotocol/serverInfo\": { ...serverInfo }\n }\n };\n if (cacheableMethods.has(method) && result.resultType === \"complete\") {\n const cacheableResult = { ...result, ttlMs: value.ttlMs === undefined ? 0 : value.ttlMs, cacheScope: value.cacheScope === undefined ? \"private\" : value.cacheScope };\n const cacheError = validateCacheMetadata(method, cacheableResult);\n if (cacheError !== undefined) {\n return { error: { code: JSON_RPC_ERROR_CODES.INTERNAL_ERROR, message: cacheError } };\n }\n return { result: cacheableResult };\n }\n return { result };\n}\n\nexport { validateProtocolValue, validateServerResult } from \"./protocol-validation.js\";\n\nexport { isJsonValue } from \"toolcraft-schema\";\nexport { isBase64 } from \"./base64.js\";\nexport { isValidUri } from \"./uri.js\";\n\nexport { isValidMetadata } from \"./metadata.js\";\n", "import { isValidUri } from \"tiny-stdio-mcp-server/protocol\";\nimport type { JsonRpcMessageLayer, RequestId } from \"./internal.js\";\n\nexport interface NotificationFilter {\n toolsListChanged?: boolean;\n promptsListChanged?: boolean;\n resourcesListChanged?: boolean;\n resourceSubscriptions?: string[];\n}\n\nexport interface SubscriptionOptions {\n signal?: AbortSignal;\n}\n\nexport interface McpSubscription {\n readonly id: RequestId;\n readonly notifications: NotificationFilter;\n readonly closed: Promise<void>;\n cancel(): void;\n}\n\ninterface Entry {\n requested: NotificationFilter;\n accepted?: NotificationFilter;\n acknowledge(filter: NotificationFilter): void;\n reject(error: Error): void;\n cancel(): void;\n}\n\nconst listFields = {\n \"notifications/tools/list_changed\": \"toolsListChanged\",\n \"notifications/prompts/list_changed\": \"promptsListChanged\",\n \"notifications/resources/list_changed\": \"resourcesListChanged\"\n} as const;\n\nfunction filterValue(value: unknown): NotificationFilter {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"Notification filter must be an object\");\n }\n const input = value as Record<string, unknown>;\n const filter: NotificationFilter = {};\n for (const key of Object.values(listFields)) {\n if (input[key] !== undefined && typeof input[key] !== \"boolean\") {\n throw new Error(`${key} must be a boolean`);\n }\n if (input[key] === true) filter[key] = true;\n }\n const uris = input.resourceSubscriptions;\n if (uris !== undefined) {\n if (\n !Array.isArray(uris) ||\n uris.length > 1024 ||\n !uris.every((uri) => {\n if (typeof uri !== \"string\" || uri.length > 8192) return false;\n return isValidUri(uri);\n })\n )\n throw new Error(\n \"Resource subscriptions require at most 1024 absolute URIs of at most 8192 characters\"\n );\n filter.resourceSubscriptions = [...new Set<string>(uris)];\n }\n return filter;\n}\n\nexport class SubscriptionManager {\n private readonly entries = new Map<RequestId, Entry>();\n\n constructor(private readonly layer: JsonRpcMessageLayer) {\n layer.onNotification(\"notifications/subscriptions/acknowledged\", (params) => {\n if (typeof params !== \"object\" || params === null) return;\n const input = params as Record<string, unknown>;\n const metadata = input._meta as Record<string, unknown> | undefined;\n const id = metadata?.[\"io.modelcontextprotocol/subscriptionId\"];\n if (typeof id !== \"string\" && typeof id !== \"number\") return;\n const entry = this.entries.get(id);\n if (entry === undefined || entry.accepted !== undefined) return;\n try {\n const accepted = filterValue(input.notifications);\n if (\n Object.values(listFields).some(\n (key) => accepted[key] === true && entry.requested[key] !== true\n ) ||\n accepted.resourceSubscriptions?.some(\n (uri) => !entry.requested.resourceSubscriptions?.includes(uri)\n )\n ) {\n throw new Error(\"Subscription acknowledgement exceeds the requested filter\");\n }\n entry.accepted = accepted;\n entry.acknowledge(accepted);\n } catch (error) {\n entry.reject(error instanceof Error ? error : new Error(String(error)));\n entry.cancel();\n }\n });\n }\n\n accepts(method: string, params: unknown): boolean {\n if (typeof params !== \"object\" || params === null) return false;\n const input = params as Record<string, unknown>;\n const metadata = input._meta as Record<string, unknown> | undefined;\n const id = metadata?.[\"io.modelcontextprotocol/subscriptionId\"];\n if (typeof id !== \"string\" && typeof id !== \"number\") return false;\n const accepted = this.entries.get(id)?.accepted;\n if (accepted === undefined) return false;\n const key = listFields[method as keyof typeof listFields];\n if (key !== undefined) return accepted[key] === true;\n return (\n method === \"notifications/resources/updated\" &&\n typeof input.uri === \"string\" &&\n accepted.resourceSubscriptions?.includes(input.uri) === true\n );\n }\n\n async listen(\n value: NotificationFilter,\n options: SubscriptionOptions = {}\n ): Promise<McpSubscription> {\n if (options.signal?.aborted) throw options.signal.reason;\n if (this.entries.size >= 64) throw new Error(\"Too many MCP subscriptions\");\n const requested = filterValue(value);\n let id!: RequestId;\n let canceled = false;\n let acknowledge!: (filter: NotificationFilter) => void;\n let reject!: (error: Error) => void;\n const acknowledged = new Promise<NotificationFilter>((resolve, fail) => {\n acknowledge = resolve;\n reject = fail;\n });\n const cancel = (): void => {\n if (canceled) return;\n canceled = true;\n clearTimeout(timer);\n this.entries.delete(id);\n const error = new Error(\"MCP subscription canceled\");\n reject(error);\n if (this.layer.cancelRequest(id, error)) {\n try {\n this.layer.sendNotification(\"notifications/cancelled\", { requestId: id });\n } catch {\n /* disposed */\n }\n }\n };\n const entry: Entry = {\n requested,\n acknowledge: (filter) => {\n clearTimeout(timer);\n acknowledge(filter);\n },\n reject,\n cancel\n };\n const completion = this.layer.sendRequest(\n \"subscriptions/listen\",\n { notifications: requested },\n {\n timeoutMs: null,\n onRequestId: (requestId) => {\n id = requestId;\n this.entries.set(id, entry);\n }\n }\n );\n const timer = setTimeout(() => {\n reject(new Error(\"MCP subscription acknowledgement timed out\"));\n cancel();\n }, this.layer.requestTimeoutMs);\n const abort = (): void => {\n reject(options.signal!.reason);\n cancel();\n };\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n const closed = completion\n .then((result) => {\n const metadata = (result as { _meta?: Record<string, unknown> })._meta;\n if (metadata?.[\"io.modelcontextprotocol/subscriptionId\"] !== id) {\n throw new Error(\"Invalid subscription completion ID\");\n }\n if (entry.accepted === undefined)\n throw new Error(\"Subscription completed before acknowledgement\");\n })\n .catch((error: unknown) => {\n reject(error instanceof Error ? error : new Error(String(error)));\n if (!canceled) throw error;\n })\n .finally(() => {\n options.signal?.removeEventListener(\"abort\", abort);\n clearTimeout(timer);\n this.entries.delete(id);\n });\n void closed.catch(() => undefined);\n try {\n const accepted = await acknowledged;\n return { id, notifications: structuredClone(accepted), closed, cancel };\n } catch (error) {\n cancel();\n throw error;\n }\n }\n\n close(): void {\n for (const entry of this.entries.values()) entry.cancel();\n this.entries.clear();\n }\n}\n", "import type { CreateSecretStoreInput } from \"auth-store\";\n\n/** Own scalar policies while retaining selected live host dependencies. */\nexport function snapshotOAuthPersistenceOptions(options: CreateSecretStoreInput): CreateSecretStoreInput {\n const file = options.fileStore, keychain = options.keychainStore, lock = keychain?.lock;\n return { ...options, backend: options.backend, env: options.env, platform: options.platform, backendEnvVar: options.backendEnvVar,\n ...(file === undefined ? {} : { fileStore: { ...file, fs: file.fs, filePath: file.filePath, salt: file.salt,\n defaultDirectory: file.defaultDirectory, defaultFileName: file.defaultFileName, throwOnInvalidDocument: file.throwOnInvalidDocument,\n getHomeDirectory: file.getHomeDirectory?.bind(file), getMachineIdentity: file.getMachineIdentity?.bind(file), getRandomBytes: file.getRandomBytes?.bind(file) } }),\n ...(keychain === undefined ? {} : { keychainStore: { ...keychain, service: keychain.service, account: keychain.account,\n runCommand: keychain.runCommand?.bind(keychain), ...(lock === undefined ? {} : { lock: { ...lock, fs: lock.fs, directory: lock.directory } }) } }) };\n}\n", "/** Compare OAuth scope sets without accepting controls or changing token case. */\nexport function normalizeOAuthScope(scope: unknown): string | undefined {\n if (scope === undefined) return undefined;\n if (typeof scope !== \"string\" || [...scope].some(char => char.charCodeAt(0) < 32 || char.charCodeAt(0) > 126 || char === '\"' || char === \"\\\\\"))\n throw new Error(\"Invalid OAuth scope syntax\");\n const normalized = [...new Set(scope.split(\" \").filter(Boolean))].sort().join(\" \");\n return normalized || undefined;\n}\n", "/** Settle the caller on cancellation without abandoning observation of host completion. */\nexport async function waitForOAuthOperation<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (signal === undefined) return operation;\n let abort!: () => void;\n try {\n return await new Promise<T>((resolve, reject) => {\n abort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n operation.then(resolve, reject);\n if (signal.aborted) abort();\n });\n } finally { signal.removeEventListener(\"abort\", abort); }\n}\n", "/** Copy credential JSON without invoking accessors or custom serialization. */\nexport function copyBoundedOAuthJson(value: unknown, message: string): unknown {\n const invalid = () => new Error(message);\n const ancestors = new Set<object>();\n const root: Record<string, unknown> = {};\n type Task = { input: unknown; target: object; key: string } | { leave: object };\n const tasks: Task[] = [{ input: value, target: root, key: \"value\" }];\n try {\n while (tasks.length) {\n const task = tasks.pop()!;\n if (\"leave\" in task) { ancestors.delete(task.leave); continue; }\n const { input, target, key } = task;\n let output: unknown = input;\n if (input !== null && typeof input !== \"boolean\" && typeof input !== \"string\" &&\n !(typeof input === \"number\" && Number.isFinite(input))) {\n if (typeof input !== \"object\" || input === null || ancestors.has(input)) throw invalid();\n const descriptors = Object.getOwnPropertyDescriptors(input);\n const array = Array.isArray(input);\n if (!array && Object.getPrototypeOf(input) !== Object.prototype && Object.getPrototypeOf(input) !== null) throw invalid();\n output = array ? [] : {};\n ancestors.add(input);\n tasks.push({ leave: input });\n const keys = array\n ? Array.from({ length: input.length }, (_, index) => String(index))\n : Object.keys(descriptors).filter(name => descriptors[name].enumerable);\n for (let index = keys.length - 1; index >= 0; index--) {\n const name = keys[index], descriptor = descriptors[name];\n if (descriptor === undefined || !Object.hasOwn(descriptor, \"value\")) throw invalid();\n tasks.push({ input: descriptor.value, target: output as object, key: name });\n }\n }\n Object.defineProperty(target, key, { value: output, enumerable: true, configurable: true, writable: true });\n }\n return root.value;\n } catch { throw invalid(); }\n}\n", "import http from \"node:http\";\nimport { parseAuthorizationState } from \"./authorization-state.js\";\nconst authorizationErrorBrand = Symbol.for(\"poe-platform.mcp-oauth.OAuthAuthorizationError\");\nconst oauthCallbackParameters = [\"code\", \"state\", \"iss\", \"error\", \"error_description\", \"error_uri\"];\n\nexport interface OAuthLandingPage {\n title: string;\n body: string;\n}\n\nexport interface LoopbackAuthorizationOptions {\n openBrowser?: (url: string) => Promise<void>;\n readLine?: () => Promise<string>;\n createServer?: () => http.Server;\n landingPage?: OAuthLandingPage;\n callbackPath?: string;\n /** Exact registered HTTP loopback redirect, including its fixed port and query. */\n redirectUri?: string;\n signal?: AbortSignal;\n /** Bounds listener setup and authorization; defaults to two minutes. */\n timeoutMs?: number;\n}\n\nexport interface LoopbackAuthorizationSession {\n redirectUri: string;\n waitForCode(authorizationUrl: string): Promise<string>;\n close(): void;\n}\n\n/** Capture declared configuration regardless of property enumerability. */\nexport function snapshotLoopbackAuthorizationOptions(options: LoopbackAuthorizationOptions): LoopbackAuthorizationOptions {\n return { ...options, openBrowser: options.openBrowser?.bind(options), readLine: options.readLine?.bind(options), createServer: options.createServer?.bind(options),\n callbackPath: options.callbackPath, redirectUri: options.redirectUri, signal: options.signal, timeoutMs: options.timeoutMs,\n landingPage: options.landingPage === undefined ? undefined : { ...options.landingPage, title: options.landingPage.title, body: options.landingPage.body } };\n}\n\n/** Authorization callback denial, retaining the provider diagnostic for host observers. */\nexport class OAuthAuthorizationError extends Error {\n /** Recognize errors from separately bundled copies of this package. */\n static is(value: unknown): value is OAuthAuthorizationError {\n return value instanceof Error && Object.getOwnPropertyDescriptor(value, authorizationErrorBrand)?.value === true;\n }\n constructor(readonly error: string, readonly errorDescription: string) {\n super(`OAuth authorization failed: ${error} \u2014 ${errorDescription}`);\n this.name = \"OAuthAuthorizationError\";\n Object.defineProperty(this, authorizationErrorBrand, { value: true });\n }\n}\n\nexport async function createLoopbackAuthorizationSession(\n options: LoopbackAuthorizationOptions = {}\n): Promise<LoopbackAuthorizationSession> {\n options = snapshotLoopbackAuthorizationOptions(options);\n options.signal?.throwIfAborted();\n const timeoutMs = options.timeoutMs ?? 120_000;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 2_147_483_647)\n throw new Error(\"OAuth authorization timeoutMs must be a positive supported timer interval\");\n const target = loopbackTarget(options);\n const server = options.createServer ? options.createServer() : http.createServer();\n const controller = new AbortController();\n let closed = false;\n let used = false;\n const callerAbort = (): void => controller.abort(options.signal?.reason);\n const teardown = (): void => {\n if (closed) return;\n closed = true;\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", callerAbort);\n server.closeAllConnections?.();\n server.close();\n };\n const timer = setTimeout(() => controller.abort(new Error(\"OAuth authorization timed out\")), timeoutMs);\n timer.unref?.();\n controller.signal.addEventListener(\"abort\", teardown, { once: true });\n options.signal?.addEventListener(\"abort\", callerAbort, { once: true });\n if (options.signal?.aborted) callerAbort();\n let port: number;\n try { port = await startServer(server, target.port, target.host, controller.signal); }\n catch (error) { controller.abort(error); throw error; }\n const redirectUri = options.redirectUri ?? `http://127.0.0.1:${port}${target.callbackPath}`;\n\n return {\n redirectUri,\n async waitForCode(authorizationUrl: string): Promise<string> {\n controller.signal.throwIfAborted();\n if (used) throw new Error(\"OAuth authorization session has already been used\");\n used = true;\n try {\n return await waitForAuthorizationCode(server, authorizationUrl, options, target.callbackPath, controller.signal);\n } finally { clearTimeout(timer); }\n },\n close(): void {\n controller.abort(new Error(\"OAuth authorization session closed\"));\n }\n };\n}\n\nexport function loopbackTarget(options: LoopbackAuthorizationOptions): { port: number; host: string; callbackPath: string } {\n if (options.redirectUri !== undefined) {\n let url: URL;\n try { url = new URL(options.redirectUri); }\n catch (cause) { throw new Error(\"Invalid OAuth loopback redirect URI\", { cause }); }\n if (url.protocol !== \"http:\" || ![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname)\n || url.username || url.password || url.href.includes(\"#\") || url.port === \"0\"\n || oauthCallbackParameters.some(name => url.searchParams.has(name))\n || [...options.redirectUri].some(char => char.codePointAt(0)! <= 32)\n || (options.callbackPath !== undefined && options.callbackPath !== url.pathname))\n throw new Error(\"Invalid OAuth loopback redirect URI\");\n return { port: url.port ? Number(url.port) : 80, host: url.hostname === \"[::1]\" ? \"::1\" : url.hostname, callbackPath: url.pathname };\n }\n const callbackPath = options.callbackPath ?? \"/callback\";\n const parsed = new URL(callbackPath, \"http://127.0.0.1\");\n if (!callbackPath.startsWith(\"/\") || parsed.origin !== \"http://127.0.0.1\" || parsed.pathname !== callbackPath || parsed.search || parsed.hash)\n throw new Error(\"Invalid OAuth loopback callback path\");\n return { port: 0, host: \"127.0.0.1\", callbackPath };\n}\n\nasync function startServer(server: http.Server, port: number, host: string, signal: AbortSignal): Promise<number> {\n signal.throwIfAborted();\n return new Promise<number>((resolve, reject) => {\n const cleanup = (): void => { server.off(\"error\", handleError); signal.removeEventListener(\"abort\", aborted); };\n const handleError = (error: Error): void => { cleanup(); reject(error); };\n const aborted = (): void => { cleanup(); reject(signal.reason); };\n server.once(\"error\", handleError);\n signal.addEventListener(\"abort\", aborted, { once: true });\n try {\n server.listen(port, host, () => {\n cleanup();\n if (signal.aborted) { server.close(); reject(signal.reason); return; }\n const address = server.address();\n if (address === null || typeof address === \"string\") { reject(new Error(\"OAuth listener has no TCP address\")); return; }\n resolve(address.port);\n });\n } catch (error) { cleanup(); reject(error); }\n });\n}\n\nfunction waitForAuthorizationCode(\n server: http.Server,\n authorizationUrl: string,\n options: LoopbackAuthorizationOptions,\n callbackPath: string,\n signal: AbortSignal\n): Promise<string> {\n signal.throwIfAborted();\n const expectedAuthorization = readExpectedAuthorizationCallback(authorizationUrl);\n\n return new Promise<string>((resolve, reject) => {\n let settled = false;\n const settle = (fn: () => void): void => {\n if (settled) return;\n settled = true;\n server.off(\"request\", request);\n signal.removeEventListener(\"abort\", aborted);\n fn();\n };\n const aborted = (): void => settle(() => reject(signal.reason));\n const request = (req: http.IncomingMessage, res: http.ServerResponse): void => {\n let url: URL;\n try { url = new URL(req.url ?? \"/\", \"http://127.0.0.1\"); }\n catch { res.writeHead(400); res.end(\"Invalid callback URL\"); return; }\n if (url.pathname !== callbackPath) {\n res.writeHead(404); res.end(\"Not found\"); return;\n }\n try {\n const callbackParameters = readAuthorizationCallbackParameters(url);\n validateAuthorizationCallbackBinding(callbackParameters, expectedAuthorization);\n if (callbackParameters.error !== null)\n throw new OAuthAuthorizationError(callbackParameters.error, callbackParameters.errorDescription ?? callbackParameters.error);\n const code = validateAuthorizationCallbackParameters(callbackParameters, expectedAuthorization);\n res.writeHead(200, { \"Content-Type\": \"text/html\" }); res.end(buildSuccessPage(options.landingPage));\n settle(() => resolve(code));\n } catch (error) {\n res.writeHead(400, { \"Content-Type\": \"text/plain; charset=utf-8\", \"X-Content-Type-Options\": \"nosniff\" });\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error));\n }\n };\n server.on(\"request\", request);\n signal.addEventListener(\"abort\", aborted, { once: true });\n if (options.readLine !== undefined) {\n void Promise.resolve().then(() => settled ? undefined : options.readLine!()).then(input => {\n if (settled) return;\n const callbackParameters = extractCallbackParametersFromInput(input!);\n if (callbackParameters === null) throw new Error(\"OAuth callback missing authorization code\");\n validateAuthorizationCallbackBinding(callbackParameters, expectedAuthorization);\n if (callbackParameters.error !== null)\n throw new OAuthAuthorizationError(callbackParameters.error, callbackParameters.errorDescription ?? callbackParameters.error);\n const code = validateAuthorizationCallbackParameters(callbackParameters, expectedAuthorization);\n settle(() => resolve(code));\n }).catch(error => settle(() => reject(error)));\n }\n if (options.openBrowser !== undefined) {\n void Promise.resolve().then(() => settled ? undefined : options.openBrowser!(authorizationUrl))\n .catch(error => settle(() => reject(error)));\n }\n });\n}\n\nexport function extractCodeFromInput(input: string): string | null {\n try { return extractCallbackParametersFromInput(input)?.code ?? null; }\n catch { return null; }\n}\n\nfunction extractCallbackParametersFromInput(input: string): AuthorizationCallbackParameters | null {\n const trimmed = input.replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\").trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n let url: URL;\n try {\n url = new URL(trimmed);\n } catch {\n return {\n code: trimmed,\n error: null,\n errorDescription: null,\n state: null,\n iss: null\n };\n }\n return readAuthorizationCallbackParameters(url);\n}\n\nfunction readAuthorizationCallbackParameters(url: URL): AuthorizationCallbackParameters {\n for (const parameter of oauthCallbackParameters) {\n if (url.searchParams.getAll(parameter).length > 1)\n throw new Error(`OAuth callback parameter '${parameter}' must occur only once`);\n }\n return { code: url.searchParams.get(\"code\"), error: url.searchParams.get(\"error\"),\n errorDescription: url.searchParams.get(\"error_description\"), state: url.searchParams.get(\"state\"), iss: url.searchParams.get(\"iss\") };\n}\n\ninterface AuthorizationCallbackParameters {\n code: string | null;\n error: string | null;\n errorDescription: string | null;\n state: string | null;\n iss: string | null;\n}\n\nfunction readExpectedAuthorizationCallback(authorizationUrl: string): {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n} {\n const url = new URL(authorizationUrl);\n const state = url.searchParams.get(\"state\");\n const parsedState = parseAuthorizationState(state);\n\n return {\n state,\n issuer: parsedState?.issuer ?? null,\n requireIssuer: parsedState?.requireIssuer ?? false\n };\n}\n\nfunction validateAuthorizationCallbackParameters(\n callback: AuthorizationCallbackParameters,\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): string {\n validateAuthorizationCallbackBinding(callback, expected);\n\n if (callback.code === null || callback.code.length === 0) {\n throw new Error(\"OAuth callback missing authorization code\");\n }\n\n return callback.code;\n}\n\nfunction validateAuthorizationCallbackBinding(\n callback: AuthorizationCallbackParameters,\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): void {\n if (expected.state !== null) {\n if (callback.state === null || callback.state.length === 0) {\n throw new Error(\"OAuth callback missing state\");\n }\n\n if (callback.state !== expected.state) {\n throw new Error(\"OAuth callback state mismatch\");\n }\n }\n\n if (expected.requireIssuer) {\n if (callback.iss === null || callback.iss.length === 0) {\n throw new Error(\"OAuth callback missing issuer\");\n }\n }\n\n if (\n callback.iss !== null &&\n callback.iss.length > 0 &&\n expected.issuer !== null &&\n callback.iss !== expected.issuer\n ) {\n throw new Error(\"OAuth callback issuer mismatch\");\n }\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\");\n}\n\nexport function buildSuccessPage(landingPage?: OAuthLandingPage): string {\n const title = landingPage?.title ?? \"Connected\";\n const body = landingPage?.body ?? \"You can close this tab and return to your terminal.\";\n\n return [\n \"<!DOCTYPE html>\",\n `<html><head><meta charset=utf-8><title>${escapeHtml(title)}</title></head>`,\n '<body style=\"font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0\">',\n '<div style=\"text-align:center\">',\n `<h1>${escapeHtml(title)}</h1>`,\n `<p style=\"color:#666\">${escapeHtml(body)}</p>`,\n \"</div></body></html>\"\n ].join(\"\");\n}\n", "import crypto from \"node:crypto\";\n\ninterface AuthorizationStatePayload {\n v: 1;\n n: string;\n i: string;\n r: boolean;\n}\n\nexport function createAuthorizationState(input: {\n issuer: string;\n requireIssuer: boolean;\n}): string {\n const payload: AuthorizationStatePayload = {\n v: 1,\n n: crypto.randomBytes(16).toString(\"base64url\"),\n i: input.issuer,\n r: input.requireIssuer,\n };\n\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\");\n}\n\nexport function parseAuthorizationState(\n value: string | null\n): { issuer: string; requireIssuer: boolean } | null {\n if (value === null || value.length === 0) {\n return null;\n }\n\n try {\n const decoded = Buffer.from(value, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded) as unknown;\n if (!isObjectRecord(parsed)) {\n return null;\n }\n\n const version = getOwnEntry(parsed, \"v\");\n const nonce = getOwnEntry(parsed, \"n\");\n const issuer = getOwnEntry(parsed, \"i\");\n const requireIssuer = getOwnEntry(parsed, \"r\");\n if (\n version !== 1\n || typeof nonce !== \"string\"\n || nonce.length === 0\n || typeof issuer !== \"string\"\n || issuer.length === 0\n || typeof requireIssuer !== \"boolean\"\n ) {\n return null;\n }\n\n return {\n issuer,\n requireIssuer,\n };\n } catch {\n return null;\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n", "import type { OAuthTokenEndpointAuthMethod } from \"./types.js\";\n\nexport function normalizeOAuthTokenEndpointAuthMethod(value: unknown): OAuthTokenEndpointAuthMethod | undefined {\n if (value === undefined || value === null) return undefined;\n if (value !== \"none\" && value !== \"client_secret_post\" && value !== \"client_secret_basic\")\n throw new Error(\"Unsupported OAuth token endpoint authentication method\");\n return value;\n}\n", "import { copyBoundedOAuthJson } from \"./bounded-json.js\";\nimport type { OAuthClientRegistration, StoredOAuthClient } from \"./types.js\";\nimport { loopbackTarget } from \"./loopback-authorization.js\";\nimport { normalizeOAuthScope } from \"./scope.js\";\nimport { normalizeOAuthTokenEndpointAuthMethod } from \"./token-auth-method.js\";\n\n/** Validate and copy a bounded JSON DCR response without quoting credential input. */\nexport function parseOAuthClientRegistration(value: unknown): OAuthClientRegistration {\n const invalid = () => new Error(\"Invalid OAuth client registration metadata\");\n const result = copyBoundedOAuthJson(value, \"Invalid OAuth client registration metadata\");\n if (typeof result !== \"object\" || result === null || Array.isArray(result)) throw invalid();\n const record = result as Record<string, unknown>;\n if (!Object.hasOwn(record, \"client_id\") || typeof record.client_id !== \"string\" || record.client_id.trim() === \"\")\n throw new Error(\"OAuth client registration response missing client_id\");\n for (const key of [\"client_id\", \"client_secret\", \"token_endpoint_auth_method\", \"application_type\", \"client_name\", \"client_uri\", \"logo_uri\", \"scope\",\n \"tos_uri\", \"policy_uri\", \"jwks_uri\", \"software_id\", \"software_version\", \"software_statement\", \"registration_access_token\", \"registration_client_uri\", \"issuer\"]) {\n if (Object.hasOwn(record, key) && record[key] !== null && typeof record[key] !== \"string\") throw invalid();\n }\n if (typeof record.client_secret === \"string\" && record.client_secret.trim() === \"\") throw invalid();\n for (const key of [\"redirect_uris\", \"grant_types\", \"response_types\", \"contacts\"]) {\n const entry = record[key];\n if (Object.hasOwn(record, key) && entry !== null && (!Array.isArray(entry) || entry.some(item => typeof item !== \"string\"))) throw invalid();\n }\n for (const key of [\"client_id_issued_at\", \"client_secret_expires_at\"]) {\n const entry = record[key];\n if (Object.hasOwn(record, key) && entry !== null && (typeof entry !== \"number\" || !Number.isSafeInteger(entry) || entry < 0)) throw invalid();\n }\n try { normalizeOAuthScope(Object.hasOwn(record, \"scope\") && record.scope !== null ? record.scope : undefined); } catch { throw invalid(); }\n return record as OAuthClientRegistration;\n}\n\nexport function normalizeStoredOAuthClient(value: unknown): StoredOAuthClient | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n const clientId = Object.hasOwn(record, \"clientId\") ? record.clientId : undefined;\n const clientSecret = Object.hasOwn(record, \"clientSecret\") ? record.clientSecret : undefined;\n if (typeof clientId !== \"string\" || clientId.trim() === \"\" ||\n (clientSecret !== undefined && (typeof clientSecret !== \"string\" || clientSecret.trim() === \"\"))) return null;\n const client: StoredOAuthClient = { clientId: clientId.trim(), ...(clientSecret === undefined ? {} : { clientSecret: (clientSecret as string).trim() }) };\n const requestedRedirectUri = Object.hasOwn(record, \"requestedRedirectUri\") ? record.requestedRedirectUri : undefined;\n if (requestedRedirectUri !== undefined) {\n try {\n if (typeof requestedRedirectUri !== \"string\") throw new Error(\"Invalid redirect identity\");\n loopbackTarget({ redirectUri: requestedRedirectUri });\n } catch { throw new Error(\"Invalid stored OAuth registration redirect identity\"); }\n client.requestedRedirectUri = requestedRedirectUri as string;\n }\n const method = normalizeOAuthTokenEndpointAuthMethod(Object.hasOwn(record, \"tokenEndpointAuthMethod\") ? record.tokenEndpointAuthMethod : undefined);\n if (Object.hasOwn(record, \"registration\") && record.registration !== undefined) {\n const registration = parseOAuthClientRegistration(record.registration);\n const registeredSecret = Object.hasOwn(registration, \"client_secret\") ? registration.client_secret?.trim() : undefined;\n if (registration.client_id.trim() !== client.clientId || registeredSecret !== client.clientSecret)\n throw new Error(\"OAuth client registration does not match the client identity\");\n client.registration = registration;\n const registrationMethod = normalizeOAuthTokenEndpointAuthMethod(Object.hasOwn(registration, \"token_endpoint_auth_method\") ? registration.token_endpoint_auth_method : undefined);\n if (method !== undefined && registrationMethod !== undefined && method !== registrationMethod)\n throw new Error(\"OAuth token endpoint authentication conflicts with the client registration\");\n if (registrationMethod !== undefined) client.tokenEndpointAuthMethod = registrationMethod;\n }\n if (method !== undefined) client.tokenEndpointAuthMethod = method;\n const ownership = Object.hasOwn(record, \"registrationOwnership\") ? record.registrationOwnership : undefined;\n if (ownership !== undefined) {\n if (ownership !== \"caller\" || client.registration === undefined)\n throw new Error(\"Invalid stored OAuth registration ownership\");\n client.registrationOwnership = \"caller\";\n }\n return client;\n}\n\n/** Fresh DCR may describe a normalized loopback port; saved identity stays exact. */\nexport function registrationMatchesRedirect(client: StoredOAuthClient, requestedUri: string, fresh = false): boolean {\n if (client.requestedRedirectUri !== undefined) return client.requestedRedirectUri === requestedUri;\n const redirects = client.registration?.redirect_uris;\n if (redirects === undefined || redirects === null || redirects.length === 0) return true;\n return redirects.some(returnedUri => {\n if (returnedUri === requestedUri) return true;\n if (!fresh) return false;\n let returned: URL, requested: URL;\n try { returned = new URL(returnedUri); requested = new URL(requestedUri); } catch { return false; }\n if (requested.protocol !== \"http:\" || returned.protocol !== \"http:\" ||\n ![\"127.0.0.1\", \"[::1]\", \"localhost\"].includes(requested.hostname)) return false;\n const sameHost = returned.hostname === requested.hostname;\n const normalizedIpv4 = requested.hostname === \"127.0.0.1\" && returned.hostname === \"localhost\" && returned.port === \"\";\n if (!sameHost && !normalizedIpv4) return false;\n returned.hostname = requested.hostname;\n returned.port = requested.port;\n return returned.href === requested.href;\n });\n}\n", "import { snapshotOAuthPersistenceOptions } from \"./persistence-options.js\";\nimport { normalizeStoredOAuthClient } from \"./client-registration.js\";\nimport crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { createSecretStore, resolveSecretStoreBackend, type CreateSecretStoreInput, type SecretStore } from \"auth-store\";\nimport type { OAuthSessionStore, StoredOAuthSession, StoredOAuthClient } from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_FILE_SALT = \"poe-code:mcp-oauth:v1\";\nconst DEFAULT_FILE_DIRECTORY = \".poe-code/mcp-oauth\";\nconst DEFAULT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth\";\nconst DEFAULT_CLIENT_FILE_SALT = \"poe-code:mcp-oauth:clients:v1\";\nconst DEFAULT_CLIENT_FILE_DIRECTORY = \".poe-code/mcp-oauth/clients\";\nconst DEFAULT_CLIENT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth-clients\";\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\n\nexport interface OAuthClientStore {\n load(issuer: string): Promise<StoredOAuthClient | null>;\n save(issuer: string, client: StoredOAuthClient): Promise<void>;\n clear(issuer: string): Promise<void>;\n}\n\nexport function createAuthStoreSessionStore(\n options: CreateSecretStoreInput = {},\n namespace?: string\n): OAuthSessionStore {\n assertPersistenceNamespace(namespace);\n options = snapshotPersistenceOptions(options);\n return {\n async withLock(resource, operation, lockOptions) {\n const store = createResourceSecretStore(resource, options, namespace);\n if (store.withLock === undefined) throw new Error(\"OAuth secret-store backend does not support transaction locks\");\n return store.withLock(operation, lockOptions);\n },\n async load(resource: string): Promise<StoredOAuthSession | null> {\n const store = createResourceSecretStore(resource, options, namespace);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n let parsed: unknown;\n try { parsed = JSON.parse(value); }\n catch { throw new Error(\"Stored OAuth session must be valid JSON; reset the store explicitly to recover\"); }\n if (isStoredOAuthSession(parsed)) {\n return parsed;\n }\n\n throw new Error(\"Stored OAuth session must match the expected shape\");\n },\n async save(resource: string, session: StoredOAuthSession): Promise<void> {\n const store = createResourceSecretStore(resource, options, namespace);\n await store.set(JSON.stringify(session));\n },\n async clear(resource: string): Promise<void> {\n const store = createResourceSecretStore(resource, options, namespace);\n await store.delete();\n }\n };\n}\n\nexport function createAuthStoreClientStore(options: CreateSecretStoreInput, namespace?: string): OAuthClientStore {\n assertPersistenceNamespace(namespace);\n options = snapshotPersistenceOptions(options);\n return {\n async load(issuer: string): Promise<StoredOAuthClient | null> {\n const store = createIssuerSecretStore(issuer, options, namespace);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n let parsed: unknown;\n try { parsed = JSON.parse(value); }\n catch { throw new Error(\"Stored OAuth client must be valid JSON; reset the store explicitly to recover\"); }\n // Preserve all registration metadata; provider normalization validates its\n // identity and schema before it can authorize a request.\n if (isObjectRecord(parsed) && typeof getOwnEntry(parsed, \"clientId\") === \"string\")\n return parsed as unknown as StoredOAuthClient;\n\n throw new Error(\"Stored OAuth client must be a JSON object with clientId\");\n },\n async save(issuer: string, client: StoredOAuthClient): Promise<void> {\n const store = createIssuerSecretStore(issuer, options, namespace);\n await store.set(JSON.stringify(client));\n },\n async clear(issuer: string): Promise<void> {\n const store = createIssuerSecretStore(issuer, options, namespace);\n await store.delete();\n }\n };\n}\n\nfunction snapshotPersistenceOptions(options: CreateSecretStoreInput): CreateSecretStoreInput {\n const snapshot = snapshotOAuthPersistenceOptions(options);\n snapshot.backend = resolveSecretStoreBackend(snapshot);\n return snapshot;\n}\n\nexport function createNamedSecretStore(\n key: string,\n options: CreateSecretStoreInput,\n defaults: { salt: string; directory: string; service: string; accountPrefix: string },\n namespace?: string\n): SecretStore {\n options = snapshotOAuthPersistenceOptions(options);\n const hash = crypto.createHash(\"sha256\").update(namespace === undefined ? key : JSON.stringify([namespace, key])).digest(\"hex\");\n const configuredFilePath = options.fileStore?.filePath;\n const parsedFilePath = configuredFilePath === undefined ? null : path.parse(configuredFilePath);\n\n const fileStore = {\n ...options.fileStore,\n throwOnInvalidDocument: true,\n filePath:\n parsedFilePath === null\n ? undefined\n : path.join(\n parsedFilePath.dir,\n `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`\n ),\n salt: options.fileStore?.salt ?? defaults.salt,\n defaultDirectory: options.fileStore?.defaultDirectory || defaults.directory,\n defaultFileName:\n parsedFilePath === null\n ? `${hash}.enc`\n : `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`\n };\n const keychainStore = {\n ...options.keychainStore,\n service: options.keychainStore?.service ?? defaults.service,\n account: `${options.keychainStore?.account ?? defaults.accountPrefix}:${hash}`\n };\n\n return createSecretStore({ ...options, fileStore, keychainStore }).store;\n}\n\nfunction createResourceSecretStore(resource: string, options: CreateSecretStoreInput, namespace?: string): SecretStore {\n return createNamedSecretStore(canonicalizeResourceIndicator(resource), options, {\n salt: DEFAULT_FILE_SALT,\n directory: DEFAULT_FILE_DIRECTORY,\n service: DEFAULT_KEYCHAIN_SERVICE,\n accountPrefix: \"provider\"\n }, namespace);\n}\n\nfunction createIssuerSecretStore(issuer: string, options: CreateSecretStoreInput, namespace?: string): SecretStore {\n return createNamedSecretStore(issuer, options, {\n salt: DEFAULT_CLIENT_FILE_SALT,\n directory: DEFAULT_CLIENT_FILE_DIRECTORY,\n service: DEFAULT_CLIENT_KEYCHAIN_SERVICE,\n accountPrefix: \"issuer\"\n }, namespace);\n}\n\nexport function assertPersistenceNamespace(namespace: string | undefined): void {\n if (namespace !== undefined && (typeof namespace !== \"string\" || namespace.trim() === \"\" || Buffer.byteLength(namespace, \"utf8\") > 1024))\n throw new Error(\"OAuth persistence namespace must be a nonempty string within 1024 bytes\");\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction getOwnString(record: Record<string, unknown>, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function isStoredOAuthSession(value: unknown): value is StoredOAuthSession {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n return (\n isNonBlankOwnString(value, \"resource\") &&\n isNonBlankOwnString(value, \"authorizationServer\") &&\n normalizeStoredOAuthClient(getOwnEntry(value, \"client\")) !== null &&\n isStoredOAuthDiscovery(getOwnEntry(value, \"discovery\")) &&\n (getOwnEntry(value, \"requestedScope\") === undefined || isNonBlankOwnString(value, \"requestedScope\")) &&\n (getOwnEntry(value, \"refreshState\") === undefined ||\n (getOwnEntry(value, \"refreshState\") === \"pending\" && getOwnEntry(value, \"tokens\") === undefined)) &&\n isStoredOAuthTokensOrMissing(getOwnEntry(value, \"tokens\"))\n );\n}\n\nfunction isStoredOAuthDiscovery(value: unknown): value is StoredOAuthSession[\"discovery\"] {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n return (\n isNonBlankOwnString(value, \"resourceMetadataUrl\") &&\n isObjectRecord(getOwnEntry(value, \"resourceMetadata\")) &&\n isObjectRecord(getOwnEntry(value, \"authorizationServerMetadata\"))\n );\n}\n\nfunction isStoredOAuthTokensOrMissing(value: unknown): value is StoredOAuthSession[\"tokens\"] {\n if (value === undefined) {\n return true;\n }\n\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (!isNonBlankOwnString(value, \"accessToken\") || getOwnString(value, \"tokenType\") !== \"Bearer\") {\n return false;\n }\n\n const expiresAt = getOwnEntry(value, \"expiresAt\");\n if (\n expiresAt !== null &&\n (typeof expiresAt !== \"number\" ||\n !Number.isSafeInteger(expiresAt) ||\n expiresAt > MAX_JS_DATE_MS ||\n !Number.isFinite(new Date(expiresAt).getTime()))\n ) {\n return false;\n }\n\n const refreshToken = getOwnEntry(value, \"refreshToken\");\n if (\n refreshToken !== undefined &&\n (typeof refreshToken !== \"string\" || refreshToken.trim().length === 0)\n ) {\n return false;\n }\n\n const scope = getOwnEntry(value, \"scope\");\n return scope === undefined || (typeof scope === \"string\" && scope.trim().length > 0);\n}\n\nfunction isNonBlankOwnString(record: Record<string, unknown>, key: string): boolean {\n const value = getOwnString(record, key);\n return value !== undefined && value.trim().length > 0;\n}\n", "import { createCipheriv, createDecipheriv, randomBytes, randomUUID, scrypt } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir, hostname, userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport type { SecretStore } from \"./types.js\";\nimport { withSecretStoreFileLock, type SecretStoreLockOptions, type SecretStoreLockFileSystem } from \"./transaction-lock.js\";\n\nconst derivedKeyCache = new Map<string, Promise<Buffer>>();\n\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\nconst ENCRYPTION_VERSION = 1;\nconst ENCRYPTION_KEY_BYTES = 32;\nconst ENCRYPTION_IV_BYTES = 12;\nconst ENCRYPTION_AUTH_TAG_BYTES = 16;\nconst ENCRYPTION_FILE_MODE = 0o600;\n\ninterface EncryptedDocument {\n version: number;\n iv: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface MachineIdentity {\n hostname: string;\n username: string;\n}\n\nexport interface EncryptedFileStoreFileSystem {\n readdir?(path: string): Promise<string[]>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void | string | undefined>;\n rename(oldPath: string, newPath: string): Promise<void>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n unlink(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n}\n\nexport interface EncryptedFileStoreInput {\n fs?: EncryptedFileStoreFileSystem;\n filePath?: string;\n salt: string;\n defaultDirectory?: string;\n defaultFileName?: string;\n getMachineIdentity?: () => MachineIdentity | Promise<MachineIdentity>;\n getHomeDirectory?: () => string;\n getRandomBytes?: (size: number) => Buffer;\n /** Fail closed instead of treating malformed or unauthenticated documents as absent. */\n throwOnInvalidDocument?: boolean;\n}\n\nexport class EncryptedFileStore implements SecretStore {\n private readonly fs: EncryptedFileStoreFileSystem;\n private readonly filePath: string;\n private readonly symbolicLinkCheckStartPath: string | null;\n private readonly salt: string;\n private readonly getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>;\n private readonly getRandomBytes: (size: number) => Buffer;\n private keyPromise: Promise<Buffer> | null = null;\n private readonly throwOnInvalidDocument: boolean;\n\n constructor(input: EncryptedFileStoreInput) {\n this.fs = input.fs ?? fs;\n this.salt = input.salt;\n if (input.filePath === undefined) {\n const homeDirectory = (input.getHomeDirectory ?? homedir)();\n const defaultDirectory = input.defaultDirectory ?? \".auth-store\";\n const defaultFileName = input.defaultFileName ?? \"credentials.enc\";\n assertSafeDefaultDirectory(defaultDirectory);\n assertSafeDefaultFileName(defaultFileName);\n this.filePath = path.join(\n homeDirectory,\n defaultDirectory,\n defaultFileName\n );\n this.symbolicLinkCheckStartPath = resolveDefaultDirectoryCheckStart(\n homeDirectory,\n defaultDirectory\n );\n } else {\n this.filePath = input.filePath;\n this.symbolicLinkCheckStartPath = null;\n }\n this.getMachineIdentity = input.getMachineIdentity ?? defaultMachineIdentity;\n this.getRandomBytes = input.getRandomBytes ?? randomBytes;\n this.throwOnInvalidDocument = input.throwOnInvalidDocument ?? false;\n }\n\n async get(): Promise<string | null> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n let rawDocument: string;\n try {\n rawDocument = await this.fs.readFile(this.filePath, \"utf8\");\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n\n const document = parseEncryptedDocument(rawDocument);\n if (!document) {\n if (this.throwOnInvalidDocument) throw new Error(\"Invalid encrypted credential document; reset the store explicitly to recover\");\n return null;\n }\n\n const key = await this.getEncryptionKey();\n\n try {\n const iv = Buffer.from(document.iv, \"base64\");\n const authTag = Buffer.from(document.authTag, \"base64\");\n const ciphertext = Buffer.from(document.ciphertext, \"base64\");\n\n if (\n iv.byteLength !== ENCRYPTION_IV_BYTES ||\n authTag.byteLength !== ENCRYPTION_AUTH_TAG_BYTES\n ) {\n if (this.throwOnInvalidDocument) throw new Error(\"Invalid encrypted credential document; reset the store explicitly to recover\");\n return null;\n }\n\n const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return plaintext.toString(\"utf8\");\n } catch {\n if (this.throwOnInvalidDocument) throw new Error(\"Invalid encrypted credential document; reset the store explicitly to recover\");\n return null;\n }\n }\n\n async withLock<T>(operation: () => Promise<T>, options: SecretStoreLockOptions = {}): Promise<T> {\n options = { ...options, signal: options.signal, timeoutMs: options.timeoutMs };\n await this.assertCredentialPathHasNoSymbolicLinks(`${this.filePath}.lock`);\n if (this.fs.readdir === undefined) throw new Error(\"Secret-store transaction locks require filesystem readdir support\");\n return withSecretStoreFileLock(this.fs as SecretStoreLockFileSystem, `${this.filePath}.lock`, operation, options);\n }\n\n async set(value: string): Promise<void> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n const key = await this.getEncryptionKey();\n const iv = this.getRandomBytes(ENCRYPTION_IV_BYTES);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(value, \"utf8\"),\n cipher.final()\n ]);\n const authTag = cipher.getAuthTag();\n\n const document: EncryptedDocument = {\n version: ENCRYPTION_VERSION,\n iv: iv.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\")\n };\n\n await this.fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n const temporaryPath = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;\n let temporaryCreated = false;\n\n try {\n await this.assertCredentialPathHasNoSymbolicLinks(temporaryPath);\n await this.fs.writeFile(temporaryPath, JSON.stringify(document), {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: ENCRYPTION_FILE_MODE\n });\n temporaryCreated = true;\n await this.fs.chmod(temporaryPath, ENCRYPTION_FILE_MODE);\n await this.fs.rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated || !isAlreadyExistsError(error)) {\n await removeIfPresent(this.fs, temporaryPath).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async delete(): Promise<void> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n try {\n await this.fs.unlink(this.filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n private async assertCredentialPathHasNoSymbolicLinks(targetPath: string): Promise<void> {\n const resolvedPath = path.resolve(targetPath);\n const protectedPaths = getProtectedCredentialPaths(\n resolvedPath,\n this.symbolicLinkCheckStartPath\n );\n\n for (const currentPath of protectedPaths) {\n try {\n const stats = await this.fs.lstat(currentPath);\n if (stats.isSymbolicLink()) {\n throw new Error(`Refusing to use encrypted credential path through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n throw error;\n }\n }\n }\n\n private getEncryptionKey(): Promise<Buffer> {\n if (!this.keyPromise) {\n const retryableKeyPromise = deriveEncryptionKey(this.getMachineIdentity, this.salt).catch((error) => {\n if (this.keyPromise === retryableKeyPromise) {\n this.keyPromise = null;\n }\n throw error;\n });\n this.keyPromise = retryableKeyPromise;\n }\n return this.keyPromise;\n }\n}\n\nfunction resolveDefaultDirectoryCheckStart(\n homeDirectory: string,\n defaultDirectory: string\n): string {\n const [firstSegment] = defaultDirectory.split(/[\\\\/]+/).filter(Boolean);\n return path.resolve(homeDirectory, firstSegment ?? \".\");\n}\n\nfunction getProtectedCredentialPaths(\n resolvedPath: string,\n symbolicLinkCheckStartPath: string | null\n): string[] {\n if (symbolicLinkCheckStartPath === null) {\n return getExplicitProtectedCredentialPaths(resolvedPath);\n }\n\n const resolvedStartPath = path.resolve(symbolicLinkCheckStartPath);\n if (!isPathInsideOrEqual(resolvedPath, resolvedStartPath)) {\n return [path.dirname(resolvedPath), resolvedPath];\n }\n\n const protectedPaths = [resolvedStartPath];\n let currentPath = resolvedStartPath;\n for (const segment of path.relative(resolvedStartPath, resolvedPath).split(path.sep).filter(Boolean)) {\n currentPath = path.join(currentPath, segment);\n protectedPaths.push(currentPath);\n }\n return protectedPaths;\n}\n\nfunction assertSafeDefaultDirectory(defaultDirectory: string): void {\n if (path.isAbsolute(defaultDirectory) || path.win32.isAbsolute(defaultDirectory)) {\n throw new Error(\"defaultDirectory must be a relative path inside the home directory\");\n }\n\n for (const segment of splitPathSegments(defaultDirectory)) {\n if (segment === \"..\") {\n throw new Error(\"defaultDirectory must be a relative path inside the home directory\");\n }\n }\n}\n\nfunction assertSafeDefaultFileName(defaultFileName: string): void {\n if (\n defaultFileName.trim().length === 0 ||\n defaultFileName === \".\" ||\n defaultFileName === \"..\" ||\n splitPathSegments(defaultFileName).length !== 1\n ) {\n throw new Error(\"defaultFileName must be a file name without path separators\");\n }\n}\n\nfunction splitPathSegments(value: string): string[] {\n return value\n .split(\"/\")\n .flatMap((segment) => segment.split(\"\\\\\"))\n .filter((segment) => segment.length > 0);\n}\n\nfunction getExplicitProtectedCredentialPaths(resolvedPath: string): string[] {\n const parsed = path.parse(resolvedPath);\n const segments = resolvedPath\n .slice(parsed.root.length)\n .split(path.sep)\n .filter((segment) => segment.length > 0);\n if (segments.length <= 1) {\n return [resolvedPath];\n }\n\n const protectedPaths: string[] = [];\n let currentPath = parsed.root;\n for (const [index, segment] of segments.entries()) {\n currentPath = path.join(currentPath, segment);\n if (index === 0) {\n continue;\n }\n protectedPaths.push(currentPath);\n }\n return protectedPaths;\n}\n\nfunction isPathInsideOrEqual(childPath: string, parentPath: string): boolean {\n const relativePath = path.relative(parentPath, childPath);\n return relativePath === \"\" || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nasync function removeIfPresent(fileSystem: EncryptedFileStoreFileSystem, filePath: string): Promise<void> {\n try {\n await fileSystem.unlink(filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n}\n\nfunction defaultMachineIdentity(): MachineIdentity {\n return {\n hostname: hostname(),\n username: userInfo().username\n };\n}\n\nasync function deriveEncryptionKey(\n getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>,\n salt: string\n): Promise<Buffer> {\n const machineIdentity = await getMachineIdentity();\n const secret = `${machineIdentity.hostname}:${machineIdentity.username}`;\n const cacheKey = JSON.stringify([machineIdentity.hostname, machineIdentity.username, salt]);\n\n const cached = derivedKeyCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const keyPromise = new Promise<Buffer>((resolve, reject) => {\n scrypt(secret, salt, ENCRYPTION_KEY_BYTES, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(Buffer.from(derivedKey));\n });\n });\n\n derivedKeyCache.set(cacheKey, keyPromise);\n return keyPromise.catch((error) => {\n if (derivedKeyCache.get(cacheKey) === keyPromise) {\n derivedKeyCache.delete(cacheKey);\n }\n throw error;\n });\n}\n\nfunction parseEncryptedDocument(raw: string): EncryptedDocument | null {\n try {\n const parsed = JSON.parse(raw);\n if (!isRecord(parsed)) {\n return null;\n }\n const version = getOwnEntry(parsed, \"version\");\n const iv = getOwnEntry(parsed, \"iv\");\n const authTag = getOwnEntry(parsed, \"authTag\");\n const ciphertext = getOwnEntry(parsed, \"ciphertext\");\n if (version !== ENCRYPTION_VERSION) {\n return null;\n }\n if (\n typeof iv !== \"string\" ||\n typeof authTag !== \"string\" ||\n typeof ciphertext !== \"string\"\n ) {\n return null;\n }\n return {\n version,\n iv,\n authTag,\n ciphertext\n };\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction isNotFoundError(error: unknown): error is NodeJS.ErrnoException {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nfunction isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\nexport interface SecretStoreLockOptions { signal?: AbortSignal; timeoutMs?: number }\nexport interface SecretStoreLockFileSystem {\n mkdir(path: string, options?: { recursive?: boolean; mode?: number }): Promise<unknown>;\n readdir(path: string): Promise<string[]>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(path: string, value: string, options: { encoding: BufferEncoding; flag: string; mode: number }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n unlink(path: string): Promise<void>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n}\n\n/** Filesystem bakery lock: unique claims allow dead-owner cleanup without deleting a replacement owner's lock. */\nexport async function withSecretStoreFileLock<T>(\n fs: SecretStoreLockFileSystem,\n lockDirectory: string,\n operation: () => Promise<T>,\n options: SecretStoreLockOptions = {}\n): Promise<T> {\n options = { ...options, signal: options.signal, timeoutMs: options.timeoutMs };\n const timeoutMs = options.timeoutMs ?? 30_000;\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0 || timeoutMs > 2_147_483_647)\n throw new Error(\"Invalid secret-store transaction lock timeout\");\n options.signal?.throwIfAborted();\n const deadline = performance.now() + timeoutMs;\n const directory = path.resolve(lockDirectory);\n await assertLockDirectoryPath(fs, directory);\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n await assertLockDirectoryPath(fs, directory);\n const name = `${process.pid}-${randomUUID()}.claim`;\n const claimPath = path.join(directory, name);\n const temporaryPath = `${claimPath}.tmp`;\n let claimed = true;\n let temporaryCreated = false;\n let outcome: { result: T } | { error: unknown };\n try {\n try { await fs.writeFile(claimPath, JSON.stringify({ ticket: null }), { encoding: \"utf8\", flag: \"wx\", mode: 0o600 }); }\n catch (error) { if (hasOwnErrorCode(error, \"EEXIST\")) claimed = false; throw error; }\n const existing = await readClaims(fs, directory, name);\n const ticket = existing.reduce((max, claim) => Math.max(max, claim.ticket ?? 0), 0) + 1;\n if (!Number.isSafeInteger(ticket)) throw new Error(\"Secret-store transaction lock ticket overflow\");\n temporaryCreated = true;\n try { await fs.writeFile(temporaryPath, JSON.stringify({ ticket }), { encoding: \"utf8\", flag: \"wx\", mode: 0o600 }); }\n catch (error) { if (hasOwnErrorCode(error, \"EEXIST\")) temporaryCreated = false; throw error; }\n await fs.rename(temporaryPath, claimPath);\n temporaryCreated = false;\n for (;;) {\n options.signal?.throwIfAborted();\n const peers = await readClaims(fs, directory, name);\n if (!peers.some(peer => peer.ticket === null || peer.ticket < ticket || (peer.ticket === ticket && peer.name < name))) break;\n const remaining = deadline - performance.now();\n if (remaining <= 0) throw new Error(\"Timed out waiting for secret-store transaction lock\");\n await new Promise<void>((resolve, reject) => {\n const abort = () => { clearTimeout(timer); options.signal?.removeEventListener(\"abort\", abort); reject(options.signal?.reason); };\n const timer = setTimeout(() => { options.signal?.removeEventListener(\"abort\", abort); resolve(); }, Math.min(10, remaining));\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n });\n }\n options.signal?.throwIfAborted();\n outcome = { result: await operation() };\n } catch (error) { outcome = { error }; }\n const cleanup: unknown[] = [];\n for (const target of [...(temporaryCreated ? [temporaryPath] : []), ...(claimed ? [claimPath] : [])]) {\n try { await fs.unlink(target); }\n catch (error) { if (!hasOwnErrorCode(error, \"ENOENT\")) cleanup.push(error); }\n }\n if (cleanup.length) throw new AggregateError([...( \"error\" in outcome ? [outcome.error] : []), ...cleanup], \"Secret-store transaction lock cleanup failed\");\n if (\"error\" in outcome) throw outcome.error;\n return outcome.result;\n}\n\nasync function assertNoSymbolicLink(fs: SecretStoreLockFileSystem, target: string): Promise<void> {\n try { if ((await fs.lstat(target)).isSymbolicLink()) throw new Error(\"Refusing secret-store transaction lock through symbolic link\"); }\n catch (error) { if (!hasOwnErrorCode(error, \"ENOENT\")) throw error; }\n}\n\nasync function assertLockDirectoryPath(fs: SecretStoreLockFileSystem, directory: string): Promise<void> {\n const root = path.parse(directory).root;\n const segments = directory.slice(root.length).split(path.sep).filter(Boolean);\n let current = root;\n for (const [index, segment] of segments.entries()) {\n current = path.join(current, segment);\n // Match encrypted credential paths: allow OS root aliases such as macOS /var.\n if (index > 0 || segments.length === 1) await assertNoSymbolicLink(fs, current);\n }\n}\n\nasync function readClaims(fs: SecretStoreLockFileSystem, directory: string, ownName: string): Promise<{ name: string; ticket: number | null }[]> {\n const claims: { name: string; ticket: number | null }[] = [];\n for (const name of await fs.readdir(directory)) {\n if (name === ownName || !name.endsWith(\".claim\")) continue;\n const pidText = name.slice(0, name.indexOf(\"-\"));\n const pid = Number(pidText);\n if (!Number.isSafeInteger(pid) || pid < 1 || String(pid) !== pidText) throw new Error(\"Malformed secret-store transaction lock owner\");\n const target = path.join(directory, name);\n await assertNoSymbolicLink(fs, target);\n let alive = true;\n try { process.kill(pid, 0); }\n catch (error) { alive = !hasOwnErrorCode(error, \"ESRCH\"); }\n if (!alive) {\n try { await fs.unlink(target); } catch (error) { if (!hasOwnErrorCode(error, \"ENOENT\")) throw error; }\n continue;\n }\n let ticket: number | null = null;\n let raw: string;\n try { raw = await fs.readFile(target, \"utf8\"); }\n catch (error) { if (hasOwnErrorCode(error, \"ENOENT\")) continue; throw error; }\n try {\n const value: unknown = JSON.parse(raw);\n if (value !== null && typeof value === \"object\" && \"ticket\" in value &&\n typeof value.ticket === \"number\" && Number.isSafeInteger(value.ticket) && value.ticket > 0) ticket = value.ticket;\n } catch { /* Incomplete live claims remain in the choosing phase; never steal them by age. */ }\n claims.push({ name, ticket });\n }\n return claims;\n}\n", "import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { promises as nodeFs } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport type { SecretStore } from \"./types.js\";\nimport { withSecretStoreFileLock, type SecretStoreLockFileSystem, type SecretStoreLockOptions } from \"./transaction-lock.js\";\n\nconst SECURITY_CLI = \"security\";\nconst KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE = 44;\n\nexport interface KeychainCommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface KeychainCommandOptions {\n stdin?: string;\n}\n\nexport type KeychainCommandRunner = (\n command: string,\n args: string[],\n options?: KeychainCommandOptions\n) => Promise<KeychainCommandResult>;\n\nexport interface KeychainStoreInput {\n runCommand?: KeychainCommandRunner;\n service: string;\n account: string;\n lock?: { fs?: SecretStoreLockFileSystem; directory?: string };\n}\n\nexport class KeychainStore implements SecretStore {\n private readonly runCommand: KeychainCommandRunner;\n private readonly service: string;\n private readonly account: string;\n private readonly lockFs: SecretStoreLockFileSystem;\n private readonly lockDirectory: string;\n\n constructor(input: KeychainStoreInput) {\n this.runCommand = input.runCommand ?? runSecurityCommand;\n this.service = input.service.trim();\n this.account = input.account.trim();\n this.lockFs = input.lock?.fs ?? nodeFs;\n this.lockDirectory = input.lock?.directory ?? path.join(homedir(), \".auth-store\", \"keychain-locks\");\n if (this.service.length === 0) {\n throw new Error(\"Keychain service must not be empty\");\n }\n if (this.account.length === 0) {\n throw new Error(\"Keychain account must not be empty\");\n }\n }\n\n async get(): Promise<string | null> {\n const result = await this.executeSecurityCommand(\n [\"find-generic-password\", \"-s\", this.service, \"-a\", this.account, \"-w\"],\n \"read secret from macOS Keychain\"\n );\n\n if (getCommandExitCode(result) === 0) {\n return stripTrailingLineBreak(getCommandOutput(result, \"stdout\"));\n }\n\n if (isKeychainEntryNotFound(result)) {\n return null;\n }\n\n throw createSecurityCliFailure(\"read secret from macOS Keychain\", result);\n }\n\n async withLock<T>(operation: () => Promise<T>, options: SecretStoreLockOptions = {}): Promise<T> {\n const identity = createHash(\"sha256\").update(JSON.stringify([this.service, this.account])).digest(\"hex\");\n return withSecretStoreFileLock(this.lockFs, path.join(this.lockDirectory, identity), operation, options);\n }\n\n async set(value: string): Promise<void> {\n if (value.includes(\"\\n\") || value.includes(\"\\r\")) {\n throw new Error(\"Keychain secrets cannot contain line breaks\");\n }\n\n const result = await this.executeSecurityCommand(\n [\n \"add-generic-password\",\n \"-s\",\n this.service,\n \"-a\",\n this.account,\n \"-U\",\n \"-w\",\n value\n ],\n \"store secret in macOS Keychain\"\n );\n\n if (getCommandExitCode(result) !== 0) {\n throw createSecurityCliFailure(\"store secret in macOS Keychain\", result);\n }\n }\n\n async delete(): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\"delete-generic-password\", \"-s\", this.service, \"-a\", this.account],\n \"delete secret from macOS Keychain\"\n );\n\n if (getCommandExitCode(result) === 0 || isKeychainEntryNotFound(result)) {\n return;\n }\n\n throw createSecurityCliFailure(\"delete secret from macOS Keychain\", result);\n }\n\n private async executeSecurityCommand(\n args: string[],\n operation: string,\n options?: KeychainCommandOptions\n ): Promise<KeychainCommandResult> {\n try {\n if (options === undefined) {\n return await this.runCommand(SECURITY_CLI, args);\n }\n return await this.runCommand(SECURITY_CLI, args, options);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to ${operation}: ${message}`);\n }\n }\n}\n\nfunction runSecurityCommand(\n command: string,\n args: string[],\n options?: KeychainCommandOptions\n): Promise<KeychainCommandResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [options?.stdin === undefined ? \"ignore\" : \"pipe\", \"pipe\", \"pipe\"]\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let stdinErrorMessage: string | undefined;\n const appendStderr = (message: string): void => {\n stderr = stderr.length === 0\n ? message\n : `${stderr}${stderr.endsWith(\"\\n\") ? \"\" : \"\\n\"}${message}`;\n };\n const appendStdinError = (): void => {\n if (stdinErrorMessage === undefined) {\n return;\n }\n\n appendStderr(stdinErrorMessage);\n stdinErrorMessage = undefined;\n };\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n if (options?.stdin !== undefined) {\n child.stdin?.once(\"error\", (error) => {\n stdinErrorMessage = error instanceof Error ? error.message : String(error);\n });\n child.stdin?.end(options.stdin);\n }\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const message =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n appendStdinError();\n appendStderr(message);\n resolve({\n stdout,\n stderr,\n exitCode: 127\n });\n });\n\n child.on(\"close\", (code) => {\n appendStdinError();\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1\n });\n });\n });\n}\n\nfunction stripTrailingLineBreak(value: string): string {\n if (value.endsWith(\"\\r\\n\")) {\n return value.slice(0, -2);\n }\n\n if (value.endsWith(\"\\n\") || value.endsWith(\"\\r\")) {\n return value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction isKeychainEntryNotFound(result: KeychainCommandResult): boolean {\n return getCommandExitCode(result) === KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE;\n}\n\nfunction createSecurityCliFailure(\n operation: string,\n result: KeychainCommandResult\n): Error {\n const exitCode = getCommandExitCode(result);\n const details =\n getCommandOutput(result, \"stderr\").trim()\n || getCommandOutput(result, \"stdout\").trim();\n if (details) {\n return new Error(\n `Failed to ${operation}: security exited with code ${exitCode}: ${details}`\n );\n }\n\n return new Error(`Failed to ${operation}: security exited with code ${exitCode}`);\n}\n\nfunction getCommandExitCode(result: KeychainCommandResult): number {\n const value = getOwnEntry(result, \"exitCode\");\n return typeof value === \"number\" && Number.isInteger(value) ? value : 1;\n}\n\nfunction getCommandOutput(\n result: KeychainCommandResult,\n key: \"stdout\" | \"stderr\"\n): string {\n const value = getOwnEntry(result, key);\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n", "import type {\n CreateSecretStoreInput,\n CreateSecretStoreResult,\n StoreBackend\n} from \"./types.js\";\nimport { EncryptedFileStore } from \"./encrypted-file-store.js\";\nimport { KeychainStore } from \"./keychain-store.js\";\n\nconst DEFAULT_BACKEND_ENV_VAR = \"AUTH_BACKEND\";\nconst MACOS_PLATFORM = \"darwin\";\n\nconst storeFactories: Record<\n StoreBackend,\n (input: CreateSecretStoreInput) => CreateSecretStoreResult[\"store\"]\n> = {\n file: (input) => {\n if (!input.fileStore) {\n throw new Error(\"fileStore configuration is required for file backend\");\n }\n return new EncryptedFileStore(input.fileStore);\n },\n keychain: (input) => {\n if (!input.keychainStore) {\n throw new Error(\"keychainStore configuration is required for keychain backend\");\n }\n return new KeychainStore(input.keychainStore);\n }\n};\n\nexport function createSecretStore(\n input: CreateSecretStoreInput\n): CreateSecretStoreResult {\n const backend = resolveSecretStoreBackend(input);\n const platform = input.platform ?? process.platform;\n\n if (backend === \"keychain\" && platform !== MACOS_PLATFORM) {\n throw new Error(\n `Keychain backend is only supported on macOS. Current platform: ${platform}`\n );\n }\n\n const store = storeFactories[backend](input);\n\n return { backend, store };\n}\n\n/** Select and validate a backend without constructing a store or accessing credentials. */\nexport function resolveSecretStoreBackend(input: CreateSecretStoreInput): StoreBackend {\n const envVar = input.backendEnvVar ?? DEFAULT_BACKEND_ENV_VAR;\n const configuredBackend =\n input.backend ?? getOwnEnvValue(input.env, envVar) ?? getOwnEnvValue(process.env, envVar);\n const backend = configuredBackend?.trim();\n\n if (backend === \"keychain\") {\n return \"keychain\";\n }\n\n if (backend === undefined || backend === \"file\") {\n return \"file\";\n }\n\n throw new Error(`Unsupported auth store backend: ${backend}`);\n}\n\nfunction getOwnEnvValue(\n env: NodeJS.ProcessEnv | undefined,\n key: string\n): string | undefined {\n return env !== undefined && Object.prototype.hasOwnProperty.call(env, key)\n ? env[key]\n : undefined;\n}\n", "export function canonicalizeResourceIndicator(value: string | URL): string {\n let url: URL;\n try {\n url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n } catch {\n throw new Error(\"Resource indicator must be an absolute URL\");\n }\n url.hash = \"\";\n return url.toString();\n}\n", "import { copyBoundedOAuthJson } from \"./bounded-json.js\";\nimport type { CreateSecretStoreInput } from \"auth-store\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nimport { assertPersistenceNamespace, createNamedSecretStore, isStoredOAuthSession, type OAuthClientStore } from \"./auth-store-session-store.js\";\nimport { normalizeStoredOAuthClient } from \"./client-registration.js\";\nimport type { OAuthSessionStore, StoredOAuthClient, StoredOAuthSession } from \"./types.js\";\n\ninterface ResourceCredentials {\n version: 1;\n resource: string;\n generation: number;\n session: StoredOAuthSession | null;\n clients: Record<string, StoredOAuthClient>;\n}\n\nexport interface ResourceBoundOAuthStores {\n readonly sessionStore: OAuthSessionStore;\n readonly clientStore: OAuthClientStore;\n readonly initialGrantAllowed: boolean;\n /** Retire grants/clients even when their document cannot be decrypted or parsed. */\n /** Explicitly replace the bound grant and original client in one transaction. */\n importSession(session: StoredOAuthSession, options?: { signal?: AbortSignal; timeoutMs?: number }): Promise<void>;\n reset(resource: string, options?: { signal?: AbortSignal; timeoutMs?: number }): Promise<void>;\n}\n\n/** One locked document owns a logical server's URL history, grant and clients. */\nexport function createResourceBoundOAuthStores(options: CreateSecretStoreInput, namespace: string | undefined, identity: string): ResourceBoundOAuthStores {\n assertPersistenceNamespace(identity);\n assertPersistenceNamespace(namespace);\n const store = createNamedSecretStore(identity, options, { salt: \"poe-code:mcp-oauth:resources:v1\",\n directory: \".poe-code/mcp-oauth/resources\", service: \"poe-code-mcp-oauth-resources\", accountPrefix: \"resource\" }, namespace);\n const result = { initialGrantAllowed: true, sessionStore: {} as OAuthSessionStore, clientStore: {} as OAuthClientStore,\n async reset(resource: string, options: { signal?: AbortSignal; timeoutMs?: number } = {}): Promise<void> {\n options.signal?.throwIfAborted();\n let url: URL;\n try { url = new URL(resource); } catch { throw new Error(\"OAuth reset resource must be an absolute HTTP URL\"); }\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.href.includes(\"#\"))\n throw new Error(\"OAuth reset resource must be an HTTP URL without credentials or fragment\");\n await replace({ version: 1, resource: canonicalizeResourceIndicator(url), generation: 1, session: null, clients: {} }, options);\n },\n async importSession(value: StoredOAuthSession, options: { signal?: AbortSignal; timeoutMs?: number } = {}): Promise<void> {\n options.signal?.throwIfAborted();\n const session = copyBoundedOAuthJson(value, \"Invalid OAuth import session\") as StoredOAuthSession;\n try {\n if (!isStoredOAuthSession(session) || session.tokens === undefined || session.refreshState !== undefined)\n throw new Error(\"Invalid session\");\n if (typeof session.discovery.resourceMetadata.resource !== \"string\") throw new Error(\"Invalid resource metadata\");\n const resource = new URL(session.resource), issuer = new URL(session.authorizationServer),\n advertisedResource = new URL(session.discovery.resourceMetadata.resource);\n if ([resource, issuer, advertisedResource].some(url => ![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.href.includes(\"#\")) ||\n issuer.href.includes(\"?\") || session.discovery.authorizationServerMetadata.issuer !== session.authorizationServer ||\n canonicalizeResourceIndicator(advertisedResource) !== canonicalizeResourceIndicator(resource))\n throw new Error(\"Invalid binding\");\n session.client = normalizeStoredOAuthClient(session.client)!;\n if (session.client.registration !== undefined) session.client.registrationOwnership = \"caller\";\n if (session.client.registration?.issuer !== undefined && session.client.registration.issuer !== null &&\n session.client.registration.issuer !== session.authorizationServer) throw new Error(\"Invalid registration issuer\");\n new Headers({ Authorization: `Bearer ${session.tokens.accessToken}` });\n session.resource = canonicalizeResourceIndicator(resource);\n } catch { throw new Error(\"Invalid OAuth import session or resource binding\"); }\n await replace({ version: 1, resource: session.resource, generation: 1, session,\n clients: { [session.authorizationServer]: session.client } }, options);\n }\n };\n async function replace(record: ResourceCredentials, options: { signal?: AbortSignal; timeoutMs?: number }): Promise<void> {\n options = { ...options, signal: options.signal, timeoutMs: options.timeoutMs };\n options.signal?.throwIfAborted();\n const timeoutMs = options.timeoutMs ?? 30_000;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 2_147_483_647)\n throw new Error(\"OAuth replacement timeoutMs must be a positive supported timer interval\");\n if (store.withLock === undefined) throw new Error(\"OAuth resource identity backend must support transaction locks\");\n // Strict reconciliation reads are bypassed only for explicit replacement,\n // while the raw stable backend lock still serializes every identity writer.\n await store.withLock(async () => {\n options.signal?.throwIfAborted();\n await store.set(JSON.stringify(record));\n result.initialGrantAllowed = false;\n }, { signal: options.signal, timeoutMs });\n }\n async function read(): Promise<ResourceCredentials | null> {\n const raw = await store.get();\n if (raw === null) return null;\n let value: unknown;\n try { value = JSON.parse(raw); } catch { throw new Error(\"Stored OAuth resource identity must be valid JSON; reset explicitly to recover\"); }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) throw new Error(\"Invalid stored OAuth resource identity\");\n const record = value as ResourceCredentials;\n if (![\"version\", \"resource\", \"generation\", \"session\", \"clients\"].every(key => Object.hasOwn(record, key)) || record.version !== 1 || typeof record.resource !== \"string\" || record.resource !== canonicalizeResourceIndicator(record.resource) ||\n !Number.isSafeInteger(record.generation) || record.generation < 0 ||\n (record.session !== null && (!isStoredOAuthSession(record.session) || record.session.resource !== record.resource)) ||\n typeof record.clients !== \"object\" || record.clients === null || Array.isArray(record.clients))\n throw new Error(\"Invalid stored OAuth resource identity; reset explicitly to recover\");\n let resourceUrl: URL;\n try { resourceUrl = new URL(record.resource); } catch { throw new Error(\"Invalid stored OAuth resource identity URL\"); }\n if (![\"http:\", \"https:\"].includes(resourceUrl.protocol) || resourceUrl.username || resourceUrl.password || resourceUrl.href.includes(\"#\"))\n throw new Error(\"Invalid stored OAuth resource identity URL\");\n for (const [issuer, client] of Object.entries(record.clients)) {\n const normalized = normalizeStoredOAuthClient(client);\n let url: URL;\n try { url = new URL(issuer); } catch { throw new Error(\"Invalid stored OAuth resource client issuer\"); }\n if (normalized === null || ![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.href.includes(\"?\") || url.href.includes(\"#\"))\n throw new Error(\"Invalid stored OAuth resource client\");\n Object.defineProperty(record.clients, issuer, { value: normalized, enumerable: true, configurable: true, writable: true });\n }\n return record;\n }\n async function reconcile(resource: string): Promise<ResourceCredentials> {\n resource = canonicalizeResourceIndicator(resource);\n const existing = await read();\n if (existing?.resource === resource) { result.initialGrantAllowed = existing.generation === 0; return existing; }\n const record: ResourceCredentials = { version: 1, resource, generation: existing === null ? 0 : existing.generation + 1, session: null, clients: {} };\n if (!Number.isSafeInteger(record.generation)) throw new Error(\"OAuth resource identity generation limit exceeded\");\n await store.set(JSON.stringify(record));\n result.initialGrantAllowed = record.generation === 0;\n return record;\n }\n result.sessionStore = {\n async withLock(resource, operation, options) {\n options = { ...options, signal: options?.signal, timeoutMs: options?.timeoutMs };\n if (store.withLock === undefined) throw new Error(\"OAuth resource identity backend must support transaction locks\");\n return store.withLock(async () => {\n options.signal?.throwIfAborted();\n await reconcile(resource);\n options.signal?.throwIfAborted();\n return operation();\n }, options);\n },\n async load(resource) {\n // Unauthorized provenance may peek before acquiring the transaction lock.\n // Only the lock owner may adopt a URL or retire the previous credentials.\n const record = await read();\n return record?.resource === canonicalizeResourceIndicator(resource) ? record.session : null;\n },\n async save(resource, session) {\n const record = await reconcile(resource);\n if (canonicalizeResourceIndicator(session.resource) !== record.resource) throw new Error(\"OAuth session does not match its resource identity\");\n record.session = session;\n await store.set(JSON.stringify(record));\n },\n async clear(resource) {\n const record = await reconcile(resource);\n record.session = null;\n // Preserve a tombstone so environment grants cannot revive a cleared family.\n record.generation = Math.max(1, record.generation);\n result.initialGrantAllowed = false;\n await store.set(JSON.stringify(record));\n }\n };\n result.clientStore = {\n async load(issuer) { const record = await read(); return record !== null && Object.hasOwn(record.clients, issuer) ? record.clients[issuer] : null; },\n async save(issuer, client) {\n const record = await read();\n if (record === null) throw new Error(\"OAuth resource identity must be bound before registering a client\");\n Object.defineProperty(record.clients, issuer, { value: client, enumerable: true, configurable: true, writable: true });\n await store.set(JSON.stringify(record));\n },\n async clear(issuer) {\n const record = await read();\n if (record === null || !Object.hasOwn(record.clients, issuer)) return;\n delete record.clients[issuer];\n await store.set(JSON.stringify(record));\n }\n };\n return result;\n}\n", "import { snapshotOAuthPersistenceOptions } from \"./persistence-options.js\";\nimport { createResourceBoundOAuthStores } from \"./resource-bound-store.js\";\nimport { normalizeStoredOAuthClient, parseOAuthClientRegistration, registrationMatchesRedirect } from \"./client-registration.js\";\nimport { normalizeOAuthScope } from \"./scope.js\";\nimport { normalizeOAuthTokenEndpointAuthMethod } from \"./token-auth-method.js\";\nimport { isIP } from \"node:net\";\nimport { fetchMcpResponse } from \"../http-fetch.js\";\nimport { URL } from \"node:url\";\nimport type {\n DefaultOAuthClientProviderOptions,\n OAuthAuthorizationServerMetadata,\n OAuthClientMetadata,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n StoredOAuthSession,\n StoredOAuthTokens\n} from \"./types.js\";\nimport {\n createAuthStoreClientStore,\n createAuthStoreSessionStore,\n assertPersistenceNamespace\n} from \"./auth-store-session-store.js\";\nimport { createLoopbackAuthorizationSession, loopbackTarget, snapshotLoopbackAuthorizationOptions } from \"./loopback-authorization.js\";\nimport { createAuthorizationState } from \"./authorization-state.js\";\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\";\nimport {\n exchangeAuthorizationCode,\n OAuthError,\n refreshAccessToken,\n isRetryableOAuthError,\n readOAuthJsonObjectResponse\n} from \"./token-endpoint.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nimport { withOAuthSessionTransaction } from \"./session-transaction.js\";\nimport { waitForOAuthOperation } from \"./cancellable-operation.js\";\n\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\nexport function createOAuthClientProvider(\n options: OAuthClientProviderOptions\n): OAuthClientProvider {\n if (isProviderOptions(options)) {\n return options.provider;\n }\n\n return createDefaultOAuthClientProvider(options);\n}\n\nexport function createDefaultOAuthClientProvider(\n options: DefaultOAuthClientProviderOptions\n): OAuthClientProvider {\n const clock = options.now?.bind(options) ?? Date.now;\n const browser = snapshotLoopbackAuthorizationOptions(options.browser);\n const clientMode = options.client.mode;\n const interactiveEnabled = options.allowInteractive !== false;\n const sessionLockTimeoutMs = options.sessionLockTimeoutMs;\n loopbackTarget(browser);\n assertPersistenceNamespace(options.persistenceNamespace);\n const clientMetadata = getClientMetadata(options.client);\n const requestedScope = clientMetadata?.scope;\n const configuredClient = normalizeConfiguredClient(options.client);\n const requestedTokenMethod = normalizeOAuthTokenEndpointAuthMethod(options.client.tokenEndpointAuthMethod);\n const configuredTokenMethod = requestedTokenMethod ?? configuredClient?.tokenEndpointAuthMethod;\n const resourceIdentity = options.resourceIdentity, persistenceNamespace = options.persistenceNamespace, selectedSessionStore = options.sessionStore;\n const suppliedGrant = options.initialGrant;\n const capturedGrant = suppliedGrant === undefined ? undefined : { resource: suppliedGrant.resource, tokens: snapshotInitialGrantTokens(suppliedGrant.tokens) };\n const authStore = options.authStore === undefined ? undefined : snapshotOAuthPersistenceOptions(options.authStore);\n if (resourceIdentity !== undefined && selectedSessionStore !== undefined)\n throw new Error(\"OAuth resourceIdentity requires native-owned persistence; custom stores own their resource trust policy\");\n const now = () => {\n const timestamp = clock();\n if (!Number.isSafeInteger(timestamp) || Math.abs(timestamp) > MAX_JS_DATE_MS)\n throw new Error(\"OAuth clock must return valid epoch milliseconds\");\n return timestamp;\n };\n const registeredClients = new Map<string, StoredOAuthSession[\"client\"] | null>();\n const resourceStores = resourceIdentity === undefined ? undefined :\n createResourceBoundOAuthStores(authStore ?? {}, persistenceNamespace, resourceIdentity);\n const sessionStore = resourceStores?.sessionStore ?? selectedSessionStore ?? createAuthStoreSessionStore(authStore, persistenceNamespace);\n const clientStore = resourceStores?.clientStore ??\n (authStore === undefined ? null : createAuthStoreClientStore(authStore, persistenceNamespace));\n if (capturedGrant !== undefined) {\n let resource: URL;\n try { resource = new URL(capturedGrant.resource); }\n catch { throw new Error(\"OAuth initial grant resource must be an absolute HTTP URL\"); }\n if ((resource.protocol !== \"http:\" && resource.protocol !== \"https:\") || resource.username || resource.password || resource.href.includes(\"#\"))\n throw new Error(\"OAuth initial grant resource must be an HTTP URL without credentials or fragments\");\n }\n const initialGrant = capturedGrant === undefined ? undefined : {\n resource: canonicalizeResourceIndicator(capturedGrant.resource),\n tokens: normalizeImportedTokens(capturedGrant.tokens, now),\n client: configuredClient\n };\n if (initialGrant !== undefined && (initialGrant.tokens === undefined || initialGrant.client === null))\n throw new Error(\"OAuth initial grant requires valid tokens and the original client ID\");\n if (initialGrant?.tokens !== undefined) {\n if (requestedScope !== undefined && initialGrant.tokens.scope !== requestedScope)\n throw new Error(\"OAuth initial grant does not match the requested OAuth scope\");\n try { new Headers({ Authorization: `Bearer ${initialGrant.tokens.accessToken}` }); }\n catch { throw new Error(\"OAuth initial grant access token is not a valid HTTP header value\"); }\n }\n let initialGrantConsumed = false;\n\n return {\n async authenticate(input): Promise<StoredOAuthTokens | void> {\n input = { ...input, ...(input.discover === undefined ? {} : { discover: input.discover.bind(input) }) };\n input.signal?.throwIfAborted();\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const resource = canonicalizeResourceIndicator(input.requestUrl);\n let session = await ensureAuthorizedSession(resource, undefined, input.fetch, true, false, input.signal);\n if (session?.tokens !== undefined && !isExpired(session.tokens, now)) return { ...session.tokens };\n if (session === null && !initialGrantConsumed && initialGrant?.resource === resource &&\n initialGrant.tokens !== undefined && !isExpired(initialGrant.tokens, now)) return { ...initialGrant.tokens };\n if (input.discover === undefined) return;\n const discovery = structuredClone(await waitForOAuthOperation(input.discover(), input.signal));\n input.signal?.throwIfAborted();\n assertRequestMatchesResource(resource, canonicalizeResourceIndicator(discovery.resource));\n session = await ensureAuthorizedSession(resource, discovery, input.fetch, true, false, input.signal);\n if (session?.tokens === undefined || isExpired(session.tokens, now)) throw new Error(\"OAuth authentication did not establish a usable grant\");\n return { ...session.tokens };\n },\n\n async authorizeRequest(input): Promise<StoredOAuthTokens | void> {\n input = { ...input };\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const session = await ensureAuthorizedSession(requestUrl, undefined, input.fetch, false, false, input.signal);\n const accessToken = session?.tokens?.accessToken;\n if (session === null && !initialGrantConsumed && initialGrant?.resource === requestUrl &&\n initialGrant.tokens !== undefined && !isExpired(initialGrant.tokens, now)) {\n input.headers.set(\"Authorization\", `Bearer ${initialGrant.tokens.accessToken}`);\n return { ...initialGrant.tokens };\n }\n if (\n session === null ||\n accessToken === undefined ||\n session.tokens === undefined ||\n isExpired(session.tokens, now)\n ) {\n return;\n }\n\n assertRequestMatchesResource(requestUrl, session.resource);\n\n input.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n return { ...session.tokens };\n },\n\n async handleUnauthorized(input) {\n input = { ...input };\n try {\n input.signal?.throwIfAborted();\n const presented = input.presentedTokens == null ? input.presentedTokens : normalizeStoredTokens(input.presentedTokens);\n if (input.presentedTokens != null && presented === undefined)\n throw new Error(\"OAuth rejected-request provenance does not match its authorization header\");\n const challengeError = input.challenge?.params.error;\n input = { ...input, discovery: structuredClone(input.discovery),\n ...(input.requestHeaders === undefined ? {} : { requestHeaders: new Headers(input.requestHeaders) }),\n ...(presented === undefined ? {} : { presentedTokens: presented }) };\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const resource = canonicalizeResourceIndicator(input.discovery.resource);\n assertRequestMatchesResource(requestUrl, resource);\n const cached = await waitForOAuthOperation(loadSession(resource), input.signal);\n const currentTokens = cached?.tokens ?? (!initialGrantConsumed && initialGrant?.resource === resource ? initialGrant.tokens : undefined);\n let rejectedCurrentGrant = hasCachedAccessToken(cached) || (!initialGrantConsumed && initialGrant?.resource === resource);\n let presentedTokens = input.presentedTokens;\n if (input.presentedTokens !== undefined) {\n rejectedCurrentGrant = false;\n if (input.presentedTokens !== null) {\n const presented = input.presentedTokens;\n const header = input.requestHeaders?.get(\"Authorization\") ?? \"\";\n const separator = header.indexOf(\" \");\n if (header.slice(0, separator).toLowerCase() !== \"bearer\" || header.slice(separator + 1).trim() !== presented.accessToken)\n throw new Error(\"OAuth rejected-request provenance does not match its authorization header\");\n presentedTokens = presented;\n rejectedCurrentGrant = currentTokens !== undefined && sameTokenGrant(currentTokens, presented);\n }\n }\n const forceRefresh = rejectedCurrentGrant && (challengeError === \"invalid_token\" || (input.presentedTokens !== undefined && challengeError === undefined));\n const session = await ensureAuthorizedSession(\n resource,\n {\n ...input.discovery,\n resource\n },\n input.fetch,\n true,\n forceRefresh,\n input.signal,\n presentedTokens\n );\n\n if (session?.tokens?.accessToken === undefined) {\n return { action: \"fail\" } as const;\n }\n\n return { action: \"retry\" } as const;\n } catch (error) {\n input.signal?.throwIfAborted();\n return {\n action: \"fail\",\n error: error instanceof Error ? error : new Error(String(error))\n } as const;\n }\n }\n };\n\n async function ensureAuthorizedSession(\n resource: string,\n discovery: OAuthDiscoveryResult | undefined,\n fetch: OAuthMetadataFetch,\n allowInteractive: boolean,\n forceRefresh = false,\n signal?: AbortSignal,\n rejectedTokens?: StoredOAuthTokens | null\n ): Promise<StoredOAuthSession | null> {\n signal?.throwIfAborted();\n if (discovery !== undefined) {\n if (getOwnString(discovery.authorizationServerMetadata, \"issuer\") !== discovery.authorizationServer)\n throw new Error(\"OAuth discovery authorization-server issuer mismatch\");\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n }\n const canonicalResource = canonicalizeResourceIndicator(resource);\n return withOAuthSessionTransaction(sessionStore, canonicalResource, async () => {\n let session = await loadSession(canonicalResource);\n if (resourceStores !== undefined) {\n registeredClients.clear();\n if (!resourceStores.initialGrantAllowed) initialGrantConsumed = true;\n }\n if (session !== null) assertRegistrationIssuer(session.client, session.authorizationServer);\n if (configuredClient !== null && discovery !== undefined) assertRegistrationIssuer(configuredClient, discovery.authorizationServer);\n if (session !== null && initialGrant?.resource === canonicalResource) initialGrantConsumed = true;\n signal?.throwIfAborted();\n if (session !== null && (\n canonicalizeResourceIndicator(session.resource) !== canonicalResource\n || getOwnString(session.discovery.authorizationServerMetadata, \"issuer\") !== session.authorizationServer\n || (discovery !== undefined && discovery.authorizationServer !== session.authorizationServer)\n )) {\n await clearSession(canonicalResource);\n session = null;\n }\n if (session === null && discovery !== undefined && !initialGrantConsumed && initialGrant?.resource === canonicalResource &&\n initialGrant.tokens !== undefined && initialGrant.client !== null) {\n session = { resource: canonicalResource, authorizationServer: discovery.authorizationServer,\n client: initialGrant.client, tokens: initialGrant.tokens,\n ...(requestedScope === undefined ? {} : { requestedScope }), discovery: toStoredDiscovery(discovery) };\n await saveSession(canonicalResource, session);\n initialGrantConsumed = true;\n signal?.throwIfAborted();\n }\n if (forceRefresh && rejectedTokens !== undefined && (rejectedTokens === null || session?.tokens === undefined || !sameTokenGrant(session.tokens, rejectedTokens)))\n forceRefresh = false;\n const sessionDiscovery = resolveDiscovery(discovery, session);\n if ((clientMode === \"static\" || configuredClient !== null || initialGrant !== undefined) && session !== null && (session.tokens !== undefined || session.refreshState === \"pending\")) {\n const configured = configuredClient;\n if (configured === null || configured.clientId !== session.client.clientId || configured.clientSecret !== session.client.clientSecret)\n throw new Error(\"Stored session belongs to a different OAuth client; use separate persistence or explicitly reset it\");\n }\n if (requestedScope !== undefined && session?.tokens !== undefined && normalizeOAuthScope(session.tokens.scope ?? session.requestedScope) !== requestedScope)\n throw new Error(\"Stored session does not match the requested OAuth scope; authorize again or select separate persistence\");\n if (configuredTokenMethod !== undefined && session !== null && (session.tokens !== undefined || session.refreshState === \"pending\") &&\n (session.client.tokenEndpointAuthMethod ?? (session.client.clientSecret === undefined ? \"none\" : \"client_secret_post\")) !== configuredTokenMethod)\n throw new Error(\"Stored session does not match the requested OAuth token endpoint authentication; select separate persistence or reset it\");\n\n if (session?.refreshState === \"pending\") {\n if (!allowInteractive || !interactiveEnabled || sessionDiscovery === undefined)\n throw new Error(\"OAuth refresh outcome is unknown; authorize again before using this resource\");\n return authorizeSession(canonicalResource, clearSessionTokens(session), sessionDiscovery, fetch, signal);\n }\n\n if (session?.tokens !== undefined && !forceRefresh && !isExpired(session.tokens, now)) {\n return session;\n }\n\n if (\n session?.tokens?.refreshToken !== undefined &&\n sessionDiscovery !== undefined &&\n (forceRefresh || isExpired(session.tokens, now))\n ) {\n if (hasExpiredClientSecret(session.client, now)) {\n if (!allowInteractive || !interactiveEnabled || clientMode === \"static\" || configuredClient?.registration !== undefined)\n throw new Error(\"OAuth client secret has expired; authorize again or update the imported registration\");\n return authorizeSession(canonicalResource, clearSessionTokens(session), sessionDiscovery, fetch, signal);\n }\n session = await refreshSession(canonicalResource, session, sessionDiscovery, fetch, signal);\n if (session?.tokens !== undefined && !isExpired(session.tokens, now)) {\n return session;\n }\n }\n\n if (forceRefresh && session?.tokens !== undefined) {\n session = clearSessionTokens(session);\n await saveSession(canonicalResource, session);\n }\n\n if (!allowInteractive || sessionDiscovery === undefined) {\n return session;\n }\n\n if (!interactiveEnabled) throw new Error(\"OAuth interactive authorization is disabled\");\n return authorizeSession(canonicalResource, session, sessionDiscovery, fetch, signal);\n }, { signal, timeoutMs: sessionLockTimeoutMs });\n }\n\n async function refreshSession(\n resource: string,\n session: StoredOAuthSession,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch,\n signal?: AbortSignal\n ): Promise<StoredOAuthSession | null> {\n signal?.throwIfAborted();\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n\n if (session.tokens?.refreshToken === undefined) {\n return session;\n }\n assertTokenEndpointAuthentication(session.client, discovery.authorizationServerMetadata);\n\n const pendingSession: StoredOAuthSession = { ...clearSessionTokens(session), refreshState: \"pending\" };\n await saveSession(resource, pendingSession);\n signal?.throwIfAborted();\n\n let refreshAttempted = false;\n let refreshedTokens: StoredOAuthTokens;\n\n while (true) {\n try {\n refreshedTokens = await refreshAccessToken({\n tokenEndpoint: requireOwnString(\n discovery.authorizationServerMetadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n ),\n clientId: session.client.clientId,\n clientSecret: session.client.clientSecret,\n tokenEndpointAuthMethod: session.client.tokenEndpointAuthMethod,\n refreshToken: session.tokens.refreshToken,\n resource,\n fetch, signal,\n now\n });\n break;\n } catch (error) {\n signal?.throwIfAborted();\n // Network errors, lost/malformed bodies and gateway failures cannot\n // establish whether a rotating refresh token was already consumed.\n if (!(error instanceof OAuthError) || !error.outcomeKnown) throw error;\n if (error.error === \"invalid_grant\") {\n const clearedSession = clearSessionTokens(session);\n await saveSession(resource, clearedSession);\n return clearedSession;\n }\n\n if (\n shouldReRegisterStoredDynamicClient(\n error,\n await loadRegisteredClient(discovery.authorizationServer),\n false\n )\n ) {\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n return null;\n }\n\n if (!refreshAttempted && isRetryableOAuthError(error)) {\n refreshAttempted = true;\n continue;\n }\n\n await saveSession(resource, session);\n throw error;\n }\n }\n\n const updatedSession: StoredOAuthSession = {\n ...session,\n tokens: {\n ...refreshedTokens,\n refreshToken: refreshedTokens.refreshToken ?? session.tokens.refreshToken,\n scope: refreshedTokens.scope ?? session.tokens.scope\n },\n discovery: toStoredDiscovery(discovery)\n };\n if (requestedScope !== undefined && normalizeOAuthScope(updatedSession.tokens?.scope ?? session.requestedScope) !== requestedScope)\n throw new Error(\"OAuth refresh response does not match the requested OAuth scope; authorize again\");\n await saveSession(resource, updatedSession);\n return updatedSession;\n }\n\n async function authorizeSession(\n resource: string,\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch,\n signal?: AbortSignal\n ): Promise<StoredOAuthSession> {\n signal?.throwIfAborted();\n assertS256PkceSupport(discovery.authorizationServerMetadata);\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n let currentSession = existingSession;\n let transientRetryAttempted = false;\n let reRegistrationAttempted = false;\n\n while (true) {\n const loopback = await createLoopbackAuthorizationSession({\n ...browser,\n signal: browser.signal === undefined ? signal : signal === undefined ? browser.signal : AbortSignal.any([signal, browser.signal])\n });\n let resolvedClient: ResolvedOAuthClient | null = null;\n\n try {\n resolvedClient = await resolveClient(\n currentSession,\n discovery,\n loopback.redirectUri,\n fetch,\n signal\n );\n assertTokenEndpointAuthentication(resolvedClient.client, discovery.authorizationServerMetadata);\n const sessionWithoutTokens: StoredOAuthSession = {\n resource,\n authorizationServer: discovery.authorizationServer,\n client: resolvedClient.client,\n ...(requestedScope === undefined ? {} : { requestedScope }),\n discovery: toStoredDiscovery(discovery)\n };\n await saveSession(resource, sessionWithoutTokens);\n\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const authorizationUrl = buildAuthorizationUrl({\n metadata: discovery.authorizationServerMetadata,\n resource,\n clientId: resolvedClient.client.clientId,\n redirectUri: loopback.redirectUri,\n codeChallenge: challenge,\n clientMetadata\n });\n const code = await loopback.waitForCode(authorizationUrl);\n const tokens = await exchangeAuthorizationCode({\n tokenEndpoint: requireOwnString(\n discovery.authorizationServerMetadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n ),\n clientId: resolvedClient.client.clientId,\n clientSecret: resolvedClient.client.clientSecret,\n tokenEndpointAuthMethod: resolvedClient.client.tokenEndpointAuthMethod,\n code,\n codeVerifier: verifier,\n redirectUri: loopback.redirectUri,\n resource,\n fetch, signal,\n now\n });\n if (requestedScope !== undefined && tokens.scope !== undefined && normalizeOAuthScope(tokens.scope) !== requestedScope)\n throw new Error(\"OAuth authorization response does not match the requested OAuth scope\");\n\n const session: StoredOAuthSession = {\n ...sessionWithoutTokens,\n tokens\n };\n\n await saveSession(resource, session);\n return session;\n } catch (error) {\n signal?.throwIfAborted();\n if (shouldReRegisterStoredDynamicClient(error, resolvedClient, reRegistrationAttempted)) {\n reRegistrationAttempted = true;\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n if (!transientRetryAttempted && isRetryableOAuthError(error)) {\n transientRetryAttempted = true;\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n throw error;\n } finally {\n loopback.close();\n }\n }\n }\n\n async function resolveClient(\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n redirectUri: string,\n fetch: OAuthMetadataFetch,\n parentSignal?: AbortSignal\n ): Promise<ResolvedOAuthClient> {\n parentSignal?.throwIfAborted();\n\n if (clientMode === \"static\" || configuredClient !== null) {\n if (configuredClient === null) {\n throw new Error(\"OAuth client_id must not be blank\");\n }\n assertRegistrationIssuer(configuredClient, discovery.authorizationServer);\n if (hasExpiredClientSecret(configuredClient, now))\n throw new Error(\"OAuth client secret has expired; update the imported registration\");\n\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: configuredClient\n };\n }\n\n const registrationEndpoint = getOwnString(\n discovery.authorizationServerMetadata,\n \"registration_endpoint\"\n );\n let storedClient = await loadRegisteredClient(discovery.authorizationServer);\n const importedClient = existingSession?.client.registrationOwnership === \"caller\" ? existingSession.client :\n storedClient?.registrationOwnership === \"caller\" ? storedClient : undefined;\n if (importedClient !== undefined) {\n assertRegistrationIssuer(importedClient, discovery.authorizationServer);\n if (hasExpiredClientSecret(importedClient, now)) throw new Error(\"OAuth client secret has expired; update the imported registration\");\n if (!registrationMatchesRedirect(importedClient, redirectUri))\n throw new Error(\"OAuth imported registration does not match the configured redirect URI; update its callback configuration\");\n return { kind: \"static\", fromStoredRegistration: false, client: importedClient };\n }\n if (storedClient !== null) {\n assertRegistrationIssuer(storedClient, discovery.authorizationServer);\n if (hasExpiredClientSecret(storedClient, now) || !registrationMatchesRedirect(storedClient, redirectUri)) {\n await clearRegisteredClient(discovery.authorizationServer);\n storedClient = null;\n }\n }\n if (storedClient !== null) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: storedClient\n };\n }\n\n if (registrationEndpoint === undefined) {\n if (existingSession !== null && existingSession.client.clientId.length > 0 && !hasExpiredClientSecret(existingSession.client, now) && registrationMatchesRedirect(existingSession.client, redirectUri)) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client\n };\n }\n\n throw new Error(\"Authorization server metadata is missing registration_endpoint\");\n }\n\n if (existingSession !== null && existingSession.client.clientId.length > 0 && !hasExpiredClientSecret(existingSession.client, now) && registrationMatchesRedirect(existingSession.client, redirectUri)) {\n await saveRegisteredClient(discovery.authorizationServer, existingSession.client);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client\n };\n }\n\n const supported = getSupportedTokenAuthMethods(discovery.authorizationServerMetadata);\n const registrationMethod = requestedTokenMethod ?? (supported === undefined ? \"none\" :\n [\"none\", \"client_secret_basic\", \"client_secret_post\"].find(method => supported.includes(method)));\n if (registrationMethod === undefined || (supported !== undefined && !supported.includes(registrationMethod)))\n throw new Error(\"Authorization server does not support the requested OAuth token endpoint authentication\");\n const registrationBody = buildClientRegistrationBody(\n clientMetadata,\n redirectUri,\n registrationMethod\n );\n const deadline = AbortSignal.timeout(30_000);\n const signal = parentSignal === undefined ? deadline : AbortSignal.any([parentSignal, deadline]);\n const response = await fetchMcpResponse(fetch, registrationEndpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(registrationBody),\n signal\n });\n const payload = await readOAuthJsonObjectResponse(response, signal);\n const registration = parseOAuthClientRegistration(payload);\n const registeredSecret = getOwnString(registration, \"client_secret\");\n const responseMethod = normalizeOAuthTokenEndpointAuthMethod(getOwnEntry(registration, \"token_endpoint_auth_method\")) ??\n requestedTokenMethod ?? (supported === undefined ? undefined : normalizeOAuthTokenEndpointAuthMethod(registrationMethod));\n const registeredClient = {\n clientId: registration.client_id.trim(),\n ...(registeredSecret === undefined ? {} : { clientSecret: registeredSecret.trim() }),\n ...(responseMethod === undefined ? {} : { tokenEndpointAuthMethod: responseMethod }),\n registration\n };\n assertRegistrationIssuer(registeredClient, discovery.authorizationServer);\n if (hasExpiredClientSecret(registeredClient, now))\n throw new Error(\"OAuth client secret has expired in the registration response\");\n if (!registrationMatchesRedirect(registeredClient, redirectUri, true))\n throw new Error(\"OAuth registration response does not match the requested redirect URI\");\n const clientWithRedirect = { ...registeredClient, requestedRedirectUri: redirectUri };\n await saveRegisteredClient(discovery.authorizationServer, clientWithRedirect);\n\n return {\n kind: \"dynamic\",\n fromStoredRegistration: false,\n client: clientWithRedirect\n };\n }\n\n async function loadSession(resource: string): Promise<StoredOAuthSession | null> {\n return normalizeLoadedSession(await sessionStore.load(resource));\n }\n\n async function saveSession(resource: string, session: StoredOAuthSession): Promise<void> {\n await sessionStore.save(resource, structuredClone(session));\n }\n\n async function clearSession(resource: string): Promise<void> {\n await sessionStore.clear(resource);\n }\n\n async function loadRegisteredClient(\n issuer: string\n ): Promise<StoredOAuthSession[\"client\"] | null> {\n if (registeredClients.has(issuer)) {\n return registeredClients.get(issuer) ?? null;\n }\n\n if (clientStore === null) {\n return null;\n }\n\n const client = await clientStore.load(issuer);\n const normalizedClient = client === null ? null : normalizeStoredOAuthClient(client);\n if (client !== null && normalizedClient === null) {\n await clientStore.clear(issuer);\n return null;\n }\n\n registeredClients.set(issuer, normalizedClient);\n return normalizedClient;\n }\n\n async function saveRegisteredClient(\n issuer: string,\n client: StoredOAuthSession[\"client\"]\n ): Promise<void> {\n registeredClients.set(issuer, client);\n if (clientStore !== null) {\n await clientStore.save(issuer, client);\n }\n }\n\n async function clearRegisteredClient(issuer: string): Promise<void> {\n registeredClients.delete(issuer);\n if (clientStore !== null) {\n await clientStore.clear(issuer);\n }\n }\n}\n\nfunction isProviderOptions(\n options: OAuthClientProviderOptions\n): options is { provider: OAuthClientProvider } {\n return Object.prototype.hasOwnProperty.call(options, \"provider\");\n}\n\nfunction isExpired(tokens: StoredOAuthTokens, now: () => number): boolean {\n return tokens.expiresAt !== null && tokens.expiresAt <= now();\n}\n\nfunction resolveDiscovery(\n discovery: OAuthDiscoveryResult | undefined,\n session: StoredOAuthSession | null\n): OAuthDiscoveryResult | undefined {\n if (discovery !== undefined) {\n return {\n ...discovery,\n resource: canonicalizeResourceIndicator(discovery.resource)\n };\n }\n\n if (session === null) {\n return undefined;\n }\n\n const metadata = session.discovery.authorizationServerMetadata;\n const issuer = getOwnString(metadata, \"issuer\");\n const authorizationEndpoint = getOwnString(metadata, \"authorization_endpoint\");\n const tokenEndpoint = getOwnString(metadata, \"token_endpoint\");\n const codeChallengeMethodsSupported = getOwnStringArray(\n metadata,\n \"code_challenge_methods_supported\"\n );\n if (\n issuer === undefined ||\n authorizationEndpoint === undefined ||\n tokenEndpoint === undefined ||\n codeChallengeMethodsSupported === undefined ||\n !codeChallengeMethodsSupported.includes(\"S256\")\n ) {\n return undefined;\n }\n\n return {\n resource: canonicalizeResourceIndicator(session.resource),\n resourceMetadataUrl: session.discovery.resourceMetadataUrl,\n resourceMetadata: session.discovery\n .resourceMetadata as OAuthDiscoveryResult[\"resourceMetadata\"],\n authorizationServer: session.authorizationServer,\n authorizationServerMetadataUrl: \"\",\n authorizationServerMetadata: metadata as OAuthAuthorizationServerMetadata\n };\n}\n\nfunction sameTokenGrant(left: StoredOAuthTokens, right: StoredOAuthTokens): boolean {\n return left.accessToken === right.accessToken && left.refreshToken === right.refreshToken &&\n left.tokenType === right.tokenType && left.expiresAt === right.expiresAt && left.scope === right.scope;\n}\n\nfunction clearSessionTokens(session: StoredOAuthSession): StoredOAuthSession {\n const nextSession = { ...session };\n delete nextSession.tokens;\n delete nextSession.refreshState;\n return nextSession;\n}\n\nfunction hasCachedAccessToken(\n session: StoredOAuthSession | null\n): session is StoredOAuthSession & { tokens: StoredOAuthTokens } {\n return session?.tokens?.accessToken !== undefined;\n}\n\nfunction normalizeLoadedSession(session: StoredOAuthSession | null): StoredOAuthSession | null {\n if (session === null) {\n return null;\n }\n const discovery = structuredClone(session.discovery);\n const refreshState = getOwnEntry(session, \"refreshState\");\n if (refreshState !== undefined && (refreshState !== \"pending\" || getOwnEntry(session, \"tokens\") !== undefined))\n throw new Error(\"Stored OAuth refresh state is invalid\");\n\n const client = normalizeStoredOAuthClient(getOwnEntry(session, \"client\"));\n if (client === null) {\n return { ...session, discovery, client: { clientId: \"\" }, tokens: undefined };\n }\n\n const tokens = normalizeStoredTokens(getOwnEntry(session, \"tokens\"));\n if (tokens !== undefined) {\n try { new Headers({ Authorization: `Bearer ${tokens.accessToken}` }); }\n catch { throw new Error(\"Stored OAuth access token is not a valid HTTP header value\"); }\n }\n return { ...session, discovery, client, tokens };\n}\n\n\nfunction snapshotInitialGrantTokens(value: unknown): unknown {\n if (!isObjectRecord(value)) return value;\n const expiresAt = getOwnEntry(value, \"expiresAt\"), expiresIn = getOwnEntry(value, \"expiresIn\"), issuedAt = getOwnEntry(value, \"issuedAt\");\n return { ...value, expiresAt, expiresIn, issuedAt };\n}\n\nfunction normalizeImportedTokens(value: unknown, now: () => number): StoredOAuthTokens | undefined {\n if (!isObjectRecord(value)) return undefined;\n const absolute = getOwnEntry(value, \"expiresAt\");\n const lifetime = getOwnEntry(value, \"expiresIn\");\n const issuedAt = getOwnEntry(value, \"issuedAt\");\n const snapshot = { ...value };\n if (lifetime !== undefined && (typeof lifetime !== \"number\" || !Number.isSafeInteger(lifetime) || lifetime < 0))\n throw new Error(\"OAuth initial grant has invalid relative expiry\");\n if (issuedAt !== undefined && (typeof issuedAt !== \"number\" || !Number.isSafeInteger(issuedAt) ||\n Math.abs(issuedAt) > MAX_JS_DATE_MS))\n throw new Error(\"OAuth initial grant has invalid issuance time\");\n const expiresAt = absolute !== undefined && absolute !== null ? absolute :\n lifetime === undefined ? null : (issuedAt === undefined ? now() : issuedAt as number) + (lifetime as number) * 1000;\n return normalizeStoredTokens({ ...snapshot, expiresAt });\n}\n\nfunction normalizeStoredTokens(value: unknown): StoredOAuthTokens | undefined {\n if (value === undefined || !isObjectRecord(value)) {\n return undefined;\n }\n\n const accessToken = getOwnString(value, \"accessToken\");\n const tokenType = getOwnString(value, \"tokenType\");\n const expiresAt = getOwnEntry(value, \"expiresAt\");\n const refreshToken = getOwnEntry(value, \"refreshToken\");\n const scope = getOwnEntry(value, \"scope\");\n const normalizedAccessToken = accessToken?.trim();\n const normalizedRefreshToken = typeof refreshToken === \"string\" ? refreshToken.trim() : undefined;\n const normalizedScope = normalizeOAuthScope(scope);\n\n if (\n accessToken === undefined ||\n normalizedAccessToken === undefined ||\n normalizedAccessToken.length === 0 ||\n tokenType !== \"Bearer\" ||\n !(\n expiresAt === null ||\n (typeof expiresAt === \"number\" &&\n Number.isSafeInteger(expiresAt) &&\n expiresAt <= MAX_JS_DATE_MS &&\n Number.isFinite(new Date(expiresAt).getTime()))\n ) ||\n (refreshToken !== undefined &&\n (typeof refreshToken !== \"string\" ||\n normalizedRefreshToken === undefined ||\n normalizedRefreshToken.length === 0))\n ) {\n return undefined;\n }\n\n return {\n accessToken: normalizedAccessToken,\n tokenType,\n expiresAt,\n ...(normalizedRefreshToken === undefined ? {} : { refreshToken: normalizedRefreshToken }),\n ...(normalizedScope === undefined || normalizedScope.length === 0\n ? {}\n : { scope: normalizedScope })\n };\n}\n\nfunction getClientMetadata(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): OAuthClientMetadata | undefined {\n if (client.metadata === undefined) {\n return undefined;\n }\n\n return {\n clientName: normalizeOptionalOAuthString(client.metadata.clientName),\n scope: normalizeOAuthScope(client.metadata.scope),\n softwareId: normalizeOptionalOAuthString(client.metadata.softwareId),\n softwareVersion: normalizeOptionalOAuthString(client.metadata.softwareVersion)\n };\n}\n\nfunction normalizeConfiguredClient(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): StoredOAuthSession[\"client\"] | null {\n const registration = client.registration === undefined ? undefined : parseOAuthClientRegistration(client.registration);\n const clientId = normalizeOptionalOAuthString(client.clientId) ?? registration?.client_id.trim();\n if (clientId === undefined) return null;\n const clientSecret = normalizeOptionalOAuthString(client.clientSecret) ?? (registration === undefined ? undefined : getOwnString(registration, \"client_secret\")?.trim());\n return normalizeStoredOAuthClient({ clientId, clientSecret, registration,\n ...(registration === undefined ? {} : { registrationOwnership: \"caller\" }),\n tokenEndpointAuthMethod: client.tokenEndpointAuthMethod });\n}\n\nfunction normalizeOptionalOAuthString(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnString(record: object, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction requireOwnString(record: object, key: string, label: string): string {\n const value = getOwnString(record, key);\n if (value === undefined) {\n throw new Error(`${label} is missing ${key}`);\n }\n\n return value;\n}\n\nfunction getOwnStringArray(record: object, key: string): string[] | undefined {\n const value = getOwnEntry(record, key);\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\")\n ? value\n : undefined;\n}\n\nfunction buildAuthorizationUrl(input: {\n metadata: OAuthAuthorizationServerMetadata;\n resource: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n clientMetadata: OAuthClientMetadata | undefined;\n}): string {\n const authorizationEndpoint = requireOwnString(\n input.metadata,\n \"authorization_endpoint\",\n \"Authorization server metadata\"\n );\n const issuer = requireOwnString(input.metadata, \"issuer\", \"Authorization server metadata\");\n const url = new URL(authorizationEndpoint);\n const resource = canonicalizeResourceIndicator(input.resource);\n const state = createAuthorizationState({\n issuer,\n requireIssuer:\n getOwnEntry(input.metadata, \"authorization_response_iss_parameter_supported\") === true\n });\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", input.clientId);\n url.searchParams.set(\"redirect_uri\", input.redirectUri);\n url.searchParams.set(\"code_challenge\", input.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"resource\", resource);\n url.searchParams.set(\"state\", state);\n\n if (input.clientMetadata?.scope !== undefined && input.clientMetadata.scope.length > 0) {\n url.searchParams.set(\"scope\", input.clientMetadata.scope);\n }\n\n return url.toString();\n}\n\nfunction assertS256PkceSupport(metadata: OAuthAuthorizationServerMetadata): void {\n if (!getOwnStringArray(metadata, \"code_challenge_methods_supported\")?.includes(\"S256\")) {\n throw new Error(\n \"Authorization server metadata must advertise code_challenge_methods_supported including S256\"\n );\n }\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n return (\n normalizedHostname === \"localhost\" ||\n normalizedHostname === \"::1\" ||\n normalizedHostname === \"[::1]\" ||\n (isIP(normalizedHostname) === 4 && normalizedHostname.startsWith(\"127.\"))\n );\n}\n\nfunction assertSecureUrl(value: string, label: string): URL {\n const url = new URL(value);\n if (url.username !== \"\" || url.password !== \"\" || url.href.includes(\"#\")) {\n throw new Error(`${label} must not include credentials or fragment`);\n }\n if (url.protocol === \"https:\") {\n return url;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return url;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction assertSecureOAuthFlowEndpoints(metadata: OAuthAuthorizationServerMetadata): void {\n const issuer = assertSecureUrl(requireOwnString(metadata, \"issuer\", \"Authorization server metadata\"), \"Authorization server issuer\");\n if (issuer.href.includes(\"?\")) throw new Error(\"Authorization server issuer must not include query or fragment\");\n const authorizationEndpoint = requireOwnString(\n metadata,\n \"authorization_endpoint\",\n \"Authorization server metadata\"\n );\n const tokenEndpoint = requireOwnString(\n metadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n );\n const registrationEndpoint = getOwnString(metadata, \"registration_endpoint\");\n\n assertNoAccessTokenInUrl(authorizationEndpoint, \"Authorization endpoint\");\n assertNoAccessTokenInUrl(tokenEndpoint, \"Token endpoint\");\n assertSecureUrl(authorizationEndpoint, \"Authorization endpoint\");\n assertSecureUrl(tokenEndpoint, \"Token endpoint\");\n\n if (registrationEndpoint !== undefined) {\n assertNoAccessTokenInUrl(registrationEndpoint, \"Registration endpoint\");\n assertSecureUrl(registrationEndpoint, \"Registration endpoint\");\n }\n}\n\nfunction assertNoAccessTokenInUrl(value: string | URL, label: string): void {\n const url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n if (url.searchParams.has(\"access_token\")) {\n throw new Error(`${label} must not include access_token in the URI`);\n }\n}\n\nfunction assertRequestMatchesResource(requestUrl: string, resource: string): void {\n if (requestUrl !== resource) {\n throw new Error(\n `OAuth request URL ${requestUrl} does not match discovered resource ${resource}`\n );\n }\n}\n\nfunction assertRegistrationIssuer(client: StoredOAuthSession[\"client\"], issuer: string): void {\n const registrationIssuer = client.registration === undefined ? undefined : getOwnString(client.registration, \"issuer\");\n if (registrationIssuer !== undefined && registrationIssuer !== issuer)\n throw new Error(\"OAuth client registration issuer does not match the authorization server\");\n}\n\nfunction hasExpiredClientSecret(client: StoredOAuthSession[\"client\"], now: () => number): boolean {\n if (client.clientSecret === undefined || client.tokenEndpointAuthMethod === \"none\" || client.registration === undefined) return false;\n const expiry = getOwnEntry(client.registration, \"client_secret_expires_at\");\n return typeof expiry === \"number\" && expiry !== 0 && expiry <= now() / 1000;\n}\n\nfunction getSupportedTokenAuthMethods(metadata: OAuthAuthorizationServerMetadata): string[] | undefined {\n const value = getOwnEntry(metadata, \"token_endpoint_auth_methods_supported\");\n if (value === undefined) return undefined;\n if (!Array.isArray(value) || value.length > 128 || value.some(method => typeof method !== \"string\"))\n throw new Error(\"Invalid OAuth token endpoint authentication metadata\");\n return value as string[];\n}\n\nfunction assertTokenEndpointAuthentication(client: StoredOAuthSession[\"client\"], metadata: OAuthAuthorizationServerMetadata): void {\n const method = client.tokenEndpointAuthMethod ?? (client.clientSecret === undefined ? \"none\" : \"client_secret_post\");\n if (method !== \"none\" && client.clientSecret === undefined)\n throw new Error(\"OAuth token endpoint authentication requires a client secret\");\n const supported = getSupportedTokenAuthMethods(metadata);\n if (supported !== undefined && !supported.includes(method))\n throw new Error(\"Authorization server does not support the requested OAuth token endpoint authentication\");\n}\n\nfunction buildClientRegistrationBody(\n metadata: OAuthClientMetadata | undefined,\n redirectUri: string,\n tokenEndpointAuthMethod: string\n): Record<string, unknown> {\n const body: Record<string, unknown> = {\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: tokenEndpointAuthMethod\n };\n const clientName = metadata === undefined ? undefined : getOwnString(metadata, \"clientName\");\n const scope = metadata === undefined ? undefined : getOwnString(metadata, \"scope\");\n const softwareId = metadata === undefined ? undefined : getOwnString(metadata, \"softwareId\");\n const softwareVersion =\n metadata === undefined ? undefined : getOwnString(metadata, \"softwareVersion\");\n\n if (clientName !== undefined && clientName.length > 0) {\n body.client_name = clientName;\n }\n\n if (scope !== undefined && scope.length > 0) {\n body.scope = scope;\n }\n\n if (softwareId !== undefined && softwareId.length > 0) {\n body.software_id = softwareId;\n }\n\n if (softwareVersion !== undefined && softwareVersion.length > 0) {\n body.software_version = softwareVersion;\n }\n\n return body;\n}\n\nfunction toStoredDiscovery(discovery: OAuthDiscoveryResult): StoredOAuthSession[\"discovery\"] {\n return {\n resourceMetadataUrl: discovery.resourceMetadataUrl,\n resourceMetadata: discovery.resourceMetadata,\n authorizationServerMetadata: discovery.authorizationServerMetadata\n };\n}\n\ninterface ResolvedOAuthClient {\n kind: \"dynamic\" | \"static\";\n fromStoredRegistration: boolean;\n client: StoredOAuthSession[\"client\"];\n}\n\nfunction shouldReRegisterStoredDynamicClient(\n error: unknown,\n client: ResolvedOAuthClient | StoredOAuthSession[\"client\"] | null,\n alreadyAttempted: boolean\n): boolean {\n if (!(error instanceof OAuthError) || error.error !== \"invalid_client\" || alreadyAttempted) {\n return false;\n }\n\n if (client === null) {\n return false;\n }\n\n if (\"kind\" in client) {\n return client.kind === \"dynamic\" && client.fromStoredRegistration;\n }\n\n return client.registrationOwnership !== \"caller\";\n}\n", "export async function fetchMcpResponse(\n fetchImplementation: (input: string | URL, init?: RequestInit) => Promise<Response>,\n input: string | URL,\n init: RequestInit = {}\n): Promise<Response> {\n const signal = init.signal;\n signal?.throwIfAborted();\n return new Promise<Response>((resolve, reject) => {\n let settled = false;\n const finish = (error?: unknown, response?: Response): void => {\n if (settled) return;\n settled = true;\n signal?.removeEventListener(\"abort\", abort);\n if (response === undefined) reject(error);\n else resolve(response);\n };\n const abort = () => finish(signal?.reason);\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) { abort(); return; }\n let pending: Promise<Response>;\n try { pending = fetchImplementation(input, { ...init, redirect: \"error\" }); }\n catch (error) { finish(error); return; }\n void pending.then(response => {\n if (settled || signal?.aborted) {\n void response.body?.cancel().catch(() => undefined);\n if (!settled) abort();\n return;\n }\n if (response.redirected || response.type === \"opaqueredirect\") {\n void response.body?.cancel().catch(() => undefined);\n finish(new Error(\"MCP HTTP redirects are not allowed\"));\n } else finish(undefined, response);\n }, error => finish(error));\n });\n}\n", "import crypto from \"node:crypto\";\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n", "export async function readBoundedResponseText(\n response: Response,\n maxBytes: number,\n readers?: Set<ReadableStreamDefaultReader<Uint8Array>>,\n signal?: AbortSignal\n): Promise<string> {\n if (maxBytes !== Infinity && (!Number.isSafeInteger(maxBytes) || maxBytes < 1))\n throw new Error(\"HTTP response byte limit must be a positive safe integer\");\n if (signal?.aborted) {\n void response.body?.cancel().catch(() => undefined);\n throw signal.reason;\n }\n const length = response.headers.get(\"Content-Length\");\n if (\n length !== null &&\n length.length > 0 &&\n [...length].every((character) => character >= \"0\" && character <= \"9\") &&\n Number(length) > maxBytes\n ) {\n void response.body?.cancel().catch(() => undefined);\n throw new Error(`HTTP response exceeds ${maxBytes} bytes`);\n }\n if (response.body === null) return \"\";\n const reader = response.body.getReader();\n readers?.add(reader);\n const abort = (): void => {\n void reader.cancel().catch(() => undefined);\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) abort();\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let bytes = 0;\n let text = \"\";\n try {\n while (true) {\n const chunk = await reader.read();\n signal?.throwIfAborted();\n if (chunk.done) return text + decoder.decode();\n bytes += chunk.value.byteLength;\n if (bytes > maxBytes) throw new Error(`HTTP response exceeds ${maxBytes} bytes`);\n text += decoder.decode(chunk.value, { stream: true });\n }\n } catch (error) {\n void reader.cancel().catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n readers?.delete(reader);\n reader.releaseLock();\n }\n}\n", "import { normalizeOAuthTokenEndpointAuthMethod } from \"./token-auth-method.js\";\nimport type { OAuthMetadataFetch, StoredOAuthTokens, OAuthTokenEndpointAuthMethod } from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nimport { readBoundedResponseText } from \"../http-response.js\";\nimport { fetchMcpResponse } from \"../http-fetch.js\";\nimport { normalizeOAuthScope } from \"./scope.js\";\n\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\nconst oauthErrorBrand = Symbol.for(\"poe-platform.mcp-oauth.OAuthError\");\n\ninterface OAuthErrorShape {\n error: string;\n error_description?: string;\n error_uri?: string;\n}\n\nexport class OAuthError extends Error {\n /** Recognize errors from separately bundled copies of this package. */\n static is(value: unknown): value is OAuthError {\n return value instanceof Error && Object.getOwnPropertyDescriptor(value, oauthErrorBrand)?.value === true;\n }\n readonly error: string;\n readonly errorDescription: string | undefined;\n readonly errorUri: string | undefined;\n readonly error_description: string | undefined;\n readonly error_uri: string | undefined;\n readonly status: number;\n readonly retryable: boolean;\n readonly terminal: boolean;\n /** True only when a complete OAuth error response establishes rejection. */\n readonly outcomeKnown: boolean;\n\n constructor(shape: OAuthErrorShape, status: number, outcomeKnown = true) {\n const description = Object.hasOwn(shape, \"error_description\") ? shape.error_description : undefined;\n const uri = Object.hasOwn(shape, \"error_uri\") ? shape.error_uri : undefined;\n super(description ?? (outcomeKnown ? shape.error : `OAuth HTTP response did not contain a valid error (HTTP ${status})`));\n this.name = \"OAuthError\";\n Object.defineProperty(this, oauthErrorBrand, { value: true });\n this.error = shape.error;\n this.errorDescription = description;\n this.errorUri = uri;\n this.error_description = description;\n this.error_uri = uri;\n this.status = status;\n this.retryable = isRetryableOAuthError(this);\n this.terminal = !this.retryable;\n this.outcomeKnown = outcomeKnown;\n }\n}\n\nexport function isRetryableOAuthError(error: unknown): error is OAuthError {\n return (\n error instanceof OAuthError &&\n (error.status >= 500 ||\n error.error === \"server_error\" ||\n error.error === \"temporarily_unavailable\")\n );\n}\n\nexport async function exchangeAuthorizationCode(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n tokenEndpointAuthMethod?: OAuthTokenEndpointAuthMethod;\n code: string;\n codeVerifier: string;\n redirectUri: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n signal?: AbortSignal;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n tokenEndpointAuthMethod: input.tokenEndpointAuthMethod,\n params: {\n grant_type: \"authorization_code\",\n code: input.code,\n code_verifier: input.codeVerifier,\n redirect_uri: input.redirectUri,\n resource\n },\n fetch: input.fetch,\n signal: input.signal,\n now: input.now\n });\n}\n\nexport async function refreshAccessToken(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n tokenEndpointAuthMethod?: OAuthTokenEndpointAuthMethod;\n refreshToken: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n signal?: AbortSignal;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n tokenEndpointAuthMethod: input.tokenEndpointAuthMethod,\n params: {\n grant_type: \"refresh_token\",\n refresh_token: input.refreshToken,\n resource\n },\n fetch: input.fetch,\n signal: input.signal,\n now: input.now\n });\n}\n\nasync function requestTokens(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n tokenEndpointAuthMethod?: OAuthTokenEndpointAuthMethod;\n params: Record<string, string>;\n fetch: OAuthMetadataFetch;\n signal?: AbortSignal;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const method = normalizeOAuthTokenEndpointAuthMethod(input.tokenEndpointAuthMethod) ??\n (input.clientSecret === undefined ? \"none\" : \"client_secret_post\");\n if (method !== \"none\" && (input.clientSecret === undefined || input.clientSecret.trim() === \"\"))\n throw new Error(\"OAuth token endpoint authentication requires a client secret\");\n const body = new URLSearchParams(input.params);\n const headers = new Headers({ Accept: \"application/json\", \"Content-Type\": \"application/x-www-form-urlencoded\" });\n if (method === \"client_secret_basic\") {\n const encoded = new URLSearchParams({ credential: input.clientId }).toString().slice(\"credential=\".length);\n const encodedSecret = new URLSearchParams({ credential: input.clientSecret! }).toString().slice(\"credential=\".length);\n headers.set(\"Authorization\", `Basic ${Buffer.from(`${encoded}:${encodedSecret}`).toString(\"base64\")}`);\n } else {\n body.set(\"client_id\", input.clientId);\n if (method === \"client_secret_post\") body.set(\"client_secret\", input.clientSecret!);\n }\n\n input.signal?.throwIfAborted();\n const deadline = AbortSignal.timeout(30_000);\n const signal = input.signal === undefined ? deadline : AbortSignal.any([input.signal, deadline]);\n const response = await fetchMcpResponse(input.fetch, input.tokenEndpoint, {\n method: \"POST\",\n headers,\n body: body.toString(),\n signal\n });\n const payload = await readOAuthJsonObjectResponse(response, signal);\n const accessToken = getOwnEntry(payload, \"access_token\");\n\n if (typeof accessToken !== \"string\" || accessToken.trim().length === 0) {\n throw new Error(\"OAuth token response missing access_token\");\n }\n const normalizedAccessToken = accessToken.trim();\n try { new Headers({ Authorization: `Bearer ${normalizedAccessToken}` }); }\n catch { throw new Error(\"OAuth token response access_token is not a valid HTTP header value\"); }\n\n const tokenType = normalizeBearerTokenType(getOwnEntry(payload, \"token_type\"));\n if (tokenType === null) {\n throw new Error(\"OAuth token response missing token_type=Bearer\");\n }\n\n const expiresIn = getOwnEntry(payload, \"expires_in\");\n let expiresAt: number | null = null;\n if (expiresIn !== undefined) {\n if (\n typeof expiresIn !== \"number\" ||\n !Number.isFinite(expiresIn) ||\n !Number.isInteger(expiresIn) ||\n expiresIn < 0\n ) {\n throw new Error(\"OAuth token response has invalid expires_in\");\n }\n\n const issuedAt = input.now();\n if (!Number.isSafeInteger(issuedAt) || Math.abs(issuedAt) > MAX_JS_DATE_MS)\n throw new Error(\"OAuth token response has invalid expires_in\");\n expiresAt = issuedAt + expiresIn * 1000;\n if (\n !Number.isSafeInteger(expiresAt) ||\n expiresAt > MAX_JS_DATE_MS ||\n !Number.isFinite(new Date(expiresAt).getTime())\n ) {\n throw new Error(\"OAuth token response has invalid expires_in\");\n }\n }\n\n const refreshToken = getOwnEntry(payload, \"refresh_token\");\n if (refreshToken !== undefined && (typeof refreshToken !== \"string\" || refreshToken.trim().length === 0))\n throw new Error(\"OAuth token response has invalid refresh_token\");\n const scope = getOwnEntry(payload, \"scope\");\n const normalizedRefreshToken =\n typeof refreshToken === \"string\" && refreshToken.trim().length > 0\n ? refreshToken.trim()\n : undefined;\n const normalizedScope = normalizeOAuthScope(scope);\n if (scope !== undefined && normalizedScope === undefined)\n throw new Error(\"Invalid OAuth scope syntax in token response\");\n return {\n accessToken: normalizedAccessToken,\n refreshToken: normalizedRefreshToken === undefined ? undefined : normalizedRefreshToken,\n tokenType,\n expiresAt,\n scope: normalizedScope === undefined ? undefined : normalizedScope\n };\n}\n\nexport async function readOAuthJsonObjectResponse(\n response: Response,\n signal?: AbortSignal\n): Promise<Record<string, unknown>> {\n const fallbackError = createFallbackOAuthError(response.status);\n let payload: unknown;\n\n try {\n payload = JSON.parse(await readBoundedResponseText(response, 1024 * 1024, undefined, signal));\n } catch (error) {\n if (signal?.aborted) throw signal.reason;\n if (error instanceof Error && error.message.startsWith(\"HTTP response exceeds \")) throw error;\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n const record = payload as Record<string, unknown>;\n if (!response.ok) {\n const error = getOwnEntry(record, \"error\");\n if (typeof error !== \"string\" || error.trim() === \"\") throw fallbackError;\n throw new OAuthError(readOAuthError(record), response.status);\n }\n\n return record;\n}\n\nfunction readOAuthError(\n payload: Record<string, unknown>,\n fallbackError = \"server_error\"\n): OAuthErrorShape {\n const error = getOwnEntry(payload, \"error\");\n const errorDescription = getOwnEntry(payload, \"error_description\");\n const errorUri = getOwnEntry(payload, \"error_uri\");\n return {\n error: typeof error === \"string\" ? error : fallbackError,\n error_description: typeof errorDescription === \"string\" ? errorDescription : undefined,\n error_uri: typeof errorUri === \"string\" ? errorUri : undefined\n };\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction createFallbackOAuthError(status: number): OAuthError {\n const error = status === 503 ? \"temporarily_unavailable\" : status >= 500 ? \"server_error\" : \"invalid_response\";\n return new OAuthError({ error }, status, false);\n}\n\nfunction normalizeBearerTokenType(value: unknown): \"Bearer\" | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n return value.toLowerCase() === \"bearer\" ? \"Bearer\" : null;\n}\n", "import type { OAuthSessionStore } from \"./types.js\";\nimport { waitForOAuthOperation } from \"./cancellable-operation.js\";\n\nconst queues = new WeakMap<OAuthSessionStore, Map<string, Promise<void>>>();\n\n/** Serialize the complete read/redeem/write operation, with independent cancellation for waiters. */\nexport async function withOAuthSessionTransaction<T>(\n store: OAuthSessionStore,\n resource: string,\n operation: () => Promise<T>,\n options: { signal?: AbortSignal; timeoutMs?: number } = {}\n): Promise<T> {\n const timeoutMs = options.timeoutMs ?? 30_000;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 2_147_483_647)\n throw new Error(\"sessionLockTimeoutMs must be an integer from 1 to 2147483647 milliseconds\");\n options.signal?.throwIfAborted();\n const started = performance.now();\n const pending = queues.get(store) ?? new Map<string, Promise<void>>();\n queues.set(store, pending);\n const previous = pending.get(resource) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>(resolve => { release = resolve; });\n const tail = previous.then(() => current);\n pending.set(resource, tail);\n let running: Promise<T> | undefined;\n try {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let rejectWait!: (reason?: unknown) => void;\n const waiting = new Promise<void>((resolve, reject) => { rejectWait = reject; previous.then(resolve, reject); });\n const abort = () => rejectWait(options.signal?.reason);\n try {\n timer = setTimeout(() => rejectWait(new Error(\"Timed out waiting for OAuth session transaction lock\")), timeoutMs);\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n await waiting;\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", abort);\n }\n options.signal?.throwIfAborted();\n running = (async () => store.withLock === undefined ? operation() : store.withLock(resource, operation, {\n signal: options.signal, timeoutMs: Math.max(0, timeoutMs - (performance.now() - started))\n }))();\n return await waitForOAuthOperation(running, options.signal);\n } finally {\n // Cancellation settles the caller, but unfinished host work still owns the lease.\n if (running === undefined) release();\n else void running.then(release, release);\n void tail.then(() => { if (pending.get(resource) === tail) pending.delete(resource); });\n }\n}\n", "import { readBoundedResponseText } from \"../http-response.js\";\nimport { fetchMcpResponse } from \"../http-fetch.js\";\nimport {\n decodeProtectedHeader,\n errors,\n importJWK,\n jwtVerify,\n type JSONWebKeySet,\n type JWK,\n type JWTPayload\n} from \"jose\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_ALLOWED_ALGORITHMS = [\n \"ES256\",\n \"ES384\",\n \"ES512\",\n \"RS256\",\n \"RS384\",\n \"RS512\",\n \"PS256\",\n \"PS384\",\n \"PS512\",\n \"EdDSA\"\n] as const;\n\ntype FetchLike = typeof fetch;\ntype TokenVerificationErrorCode =\n | \"invalid_token\"\n | \"insufficient_scope\"\n | \"temporarily_unavailable\";\n\nexport interface JwksTokenVerifierOptions {\n jwksUrl: string | URL;\n clockSkewSeconds?: number;\n allowedAlgorithms?: readonly string[];\n jwksCacheTtlMs?: number;\n jwksFetchTimeoutMs?: number;\n jwksRefreshCooldownMs?: number;\n allowInsecureJwks?: boolean;\n requireAccessTokenType?: boolean;\n fetch?: FetchLike;\n}\n\nexport interface JwksVerifiedAccessToken {\n token: string;\n issuer: string;\n audience: string[];\n scopes: string[];\n expiresAt: number;\n claims: Record<string, unknown>;\n subject?: string;\n clientId?: string;\n}\n\nexport interface JwksTokenVerifier {\n verify(input: {\n token: string;\n resource: string;\n authorizationServers: readonly string[];\n requiredScopes: readonly string[];\n }): Promise<JwksVerifiedAccessToken>;\n}\n\ntype TokenVerificationErrorShape = Error & {\n error: TokenVerificationErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n};\n\nfunction isTokenVerificationErrorShape(error: unknown): error is TokenVerificationErrorShape {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const challengeError = error as { error?: unknown };\n return (\n challengeError.error === \"invalid_token\" ||\n challengeError.error === \"insufficient_scope\" ||\n challengeError.error === \"temporarily_unavailable\"\n );\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getOwnString(record: object, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction toUrl(value: string | URL, label: string): URL {\n try {\n return new URL(String(value));\n } catch {\n throw new Error(`${label} must be an absolute URL`);\n }\n}\n\nfunction normalizeAudience(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n return isStringArray(value) ? [...value] : [];\n}\n\nfunction normalizeVerifiedAudience(value: unknown, expectedResource: string): string[] {\n const audiences = normalizeAudience(value);\n for (const audience of audiences) {\n try {\n const normalizedAudience = canonicalizeResourceIndicator(audience);\n if (normalizedAudience === expectedResource) {\n return [normalizedAudience];\n }\n } catch {\n continue;\n }\n }\n\n throw createInvalidTokenError(\"audience mismatch\");\n}\n\nfunction parseScopes(payload: JWTPayload): string[] {\n const scope = getOwnString(payload, \"scope\");\n const scopes = getOwnEntry(payload, \"scopes\");\n const raw = scope !== undefined ? scope : typeof scopes === \"string\" ? scopes : null;\n\n if (raw !== null) {\n return raw\n .split(\" \")\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0);\n }\n\n return isStringArray(scopes) ? [...scopes] : [];\n}\n\nfunction toVerifiedAccessToken(\n token: string,\n payload: JWTPayload,\n audience = normalizeAudience(getOwnEntry(payload, \"aud\"))\n): JwksVerifiedAccessToken {\n const issuer = getOwnString(payload, \"iss\");\n const expiresAt = getOwnEntry(payload, \"exp\");\n const subject = getOwnString(payload, \"sub\");\n const clientId = getOwnString(payload, \"client_id\");\n\n return {\n token,\n issuer: issuer ?? \"\",\n audience,\n scopes: parseScopes(payload),\n expiresAt: expiresAt as number,\n claims: { ...payload },\n ...(subject !== undefined\n ? {\n subject\n }\n : {}),\n ...(clientId !== undefined\n ? {\n clientId\n }\n : {})\n };\n}\n\nfunction createTokenVerificationError(input: {\n error: TokenVerificationErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n}): TokenVerificationErrorShape {\n return Object.assign(new Error(input.errorDescription ?? input.error), input);\n}\n\nfunction createTemporarilyUnavailableError(): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"temporarily_unavailable\",\n errorDescription: \"token verification temporarily unavailable\"\n });\n}\n\nfunction createInvalidTokenError(errorDescription: string): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"invalid_token\",\n errorDescription\n });\n}\n\nfunction normalizeVerificationError(error: unknown): TokenVerificationErrorShape {\n if (isTokenVerificationErrorShape(error)) {\n return error;\n }\n\n if (error instanceof errors.JWTExpired) {\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error instanceof errors.JWTClaimValidationFailed) {\n if (error.claim === \"aud\") {\n return createInvalidTokenError(\"audience mismatch\");\n }\n\n if (error.claim === \"iss\") {\n return createInvalidTokenError(\"issuer mismatch\");\n }\n\n if (error.claim === \"nbf\") {\n return createInvalidTokenError(\"token not active yet\");\n }\n\n if (error.claim === \"exp\") {\n if (error.reason === \"missing\") {\n return createInvalidTokenError(\"token missing expiry\");\n }\n\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error.claim === \"typ\") {\n return createInvalidTokenError(\"invalid access token type\");\n }\n }\n\n if (error instanceof errors.JOSEAlgNotAllowed || error instanceof errors.JOSENotSupported) {\n return createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n if (\n error instanceof errors.JWKSNoMatchingKey ||\n error instanceof errors.JWKSMultipleMatchingKeys ||\n error instanceof errors.JWSSignatureVerificationFailed\n ) {\n return createInvalidTokenError(\"token signature invalid\");\n }\n\n if (error instanceof errors.JWKSInvalid || error instanceof errors.JWKSTimeout) {\n return createTemporarilyUnavailableError();\n }\n\n return createInvalidTokenError(\"token verification failed\");\n}\n\nasync function loadJwks(\n jwksUrl: URL,\n fetchImplementation: FetchLike,\n timeoutMs: number\n): Promise<JSONWebKeySet> {\n try {\n const signal = AbortSignal.timeout(timeoutMs);\n const response = await fetchMcpResponse(fetchImplementation, jwksUrl, {\n headers: {\n Accept: \"application/json\"\n },\n signal\n });\n\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined);\n throw createTemporarilyUnavailableError();\n }\n\n const payload: unknown = JSON.parse(await readBoundedResponseText(response, 1024 * 1024, undefined, signal));\n const keys = isObjectRecord(payload) ? getOwnEntry(payload, \"keys\") : undefined;\n if (!isObjectRecord(payload) || !Array.isArray(keys) || !keys.every(isObjectRecord)) {\n throw createTemporarilyUnavailableError();\n }\n\n return { keys } as JSONWebKeySet;\n } catch (error) {\n if (isTokenVerificationErrorShape(error)) {\n throw error;\n }\n\n throw createTemporarilyUnavailableError();\n }\n}\n\nfunction resolveAlgorithm(token: string, allowedAlgorithms: readonly string[]): string {\n const header = decodeProtectedHeader(token);\n const alg = getOwnString(header, \"alg\");\n\n if (hasCriticalHeaderClaims(header)) {\n throw createInvalidTokenError(\"unsupported critical token claims\");\n }\n\n if (\n typeof alg !== \"string\" ||\n alg === \"none\" ||\n alg.startsWith(\"HS\") ||\n !allowedAlgorithms.includes(alg)\n ) {\n throw createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n return alg;\n}\n\nfunction hasCriticalHeaderClaims(header: ReturnType<typeof decodeProtectedHeader>): boolean {\n const criticalClaims = getOwnEntry(header, \"crit\");\n return Array.isArray(criticalClaims) && criticalClaims.length > 0;\n}\n\nfunction isVerificationCandidate(key: JWK, alg: string, kid: string | undefined): boolean {\n const keyId = getOwnString(key, \"kid\");\n const keyAlgorithm = getOwnString(key, \"alg\");\n const keyUse = getOwnString(key, \"use\");\n const keyOps = getOwnEntry(key, \"key_ops\");\n\n if (kid !== undefined && keyId !== kid) {\n return false;\n }\n\n if (keyAlgorithm !== undefined && keyAlgorithm !== alg) {\n return false;\n }\n\n if (keyUse !== undefined && keyUse !== \"sig\") {\n return false;\n }\n\n if (Array.isArray(keyOps) && !keyOps.includes(\"verify\")) {\n return false;\n }\n\n return true;\n}\n\nfunction shouldContinueWithNextKey(error: unknown): boolean {\n return error instanceof errors.JWSSignatureVerificationFailed;\n}\n\nasync function verifyJwtAgainstJwks(input: {\n token: string;\n jwks: JSONWebKeySet;\n alg: string;\n authorizationServers: readonly string[];\n clockSkewSeconds: number;\n requireAccessTokenType: boolean;\n}) {\n const protectedHeader = decodeProtectedHeader(input.token);\n const kid = getOwnString(protectedHeader, \"kid\");\n const candidateKeys = input.jwks.keys.filter((key) =>\n isVerificationCandidate(key, input.alg, kid)\n );\n\n if (candidateKeys.length === 0) {\n throw new NoMatchingKeyError();\n }\n\n let lastSignatureError: unknown;\n let hasMalformedKey = false;\n\n for (const candidate of candidateKeys) {\n let key;\n try {\n key = await importJWK(candidate, input.alg);\n } catch {\n hasMalformedKey = true;\n continue;\n }\n\n try {\n return await jwtVerify(input.token, key as never, {\n algorithms: [input.alg],\n issuer: [...input.authorizationServers],\n clockTolerance: input.clockSkewSeconds,\n requiredClaims: [\"exp\"],\n ...(input.requireAccessTokenType ? { typ: \"at+jwt\" } : {})\n });\n } catch (error) {\n if (shouldContinueWithNextKey(error)) {\n lastSignatureError = error;\n continue;\n }\n\n throw error;\n }\n }\n\n if (hasMalformedKey) {\n throw createTemporarilyUnavailableError();\n }\n\n throw lastSignatureError ?? createInvalidTokenError(\"token signature invalid\");\n}\n\nclass NoMatchingKeyError extends Error {}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n if (hostname === \"localhost\" || hostname.endsWith(\".localhost\")) {\n return true;\n }\n\n if (hostname === \"[::1]\" || hostname === \"::1\") {\n return true;\n }\n\n const parts = hostname.split(\".\");\n return (\n parts.length === 4 &&\n parts[0] === \"127\" &&\n parts.slice(1).every((part) => {\n const value = Number(part);\n return Number.isInteger(value) && value >= 0 && value <= 255;\n })\n );\n}\n\nexport function createJwksTokenVerifier(options: JwksTokenVerifierOptions): JwksTokenVerifier {\n const jwksUrl = toUrl(options.jwksUrl, \"jwksUrl\");\n if ((jwksUrl.protocol !== \"http:\" && jwksUrl.protocol !== \"https:\") || jwksUrl.username !== \"\" || jwksUrl.password !== \"\") {\n throw new Error(\"jwksUrl must be an HTTP or HTTPS URL without credentials\");\n }\n const clockSkewSeconds = options.clockSkewSeconds ?? 30;\n const allowedAlgorithms = options.allowedAlgorithms ?? DEFAULT_ALLOWED_ALGORITHMS;\n const jwksCacheTtlMs = options.jwksCacheTtlMs ?? 300_000;\n const jwksFetchTimeoutMs = options.jwksFetchTimeoutMs ?? 5_000;\n const jwksRefreshCooldownMs = options.jwksRefreshCooldownMs ?? 30_000;\n const requireAccessTokenType = options.requireAccessTokenType ?? false;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n if (!Number.isFinite(clockSkewSeconds) || clockSkewSeconds < 0) {\n throw new Error(\"clockSkewSeconds must be a finite non-negative number\");\n }\n for (const key of [\"jwksCacheTtlMs\", \"jwksRefreshCooldownMs\"] as const) {\n const value = key === \"jwksCacheTtlMs\" ? jwksCacheTtlMs : jwksRefreshCooldownMs;\n if (!Number.isSafeInteger(value) || value < 0) throw new Error(`${key} must be a non-negative safe integer`);\n }\n if (!Number.isInteger(jwksFetchTimeoutMs) || jwksFetchTimeoutMs <= 0 || jwksFetchTimeoutMs > 2_147_483_647) {\n throw new Error(\"jwksFetchTimeoutMs must be a positive integer no greater than 2147483647\");\n }\n let cachedJwks: { value: JSONWebKeySet; expiresAt: number } | undefined;\n let pendingJwks: Promise<JSONWebKeySet> | undefined;\n let pendingForcedRefresh: Promise<JSONWebKeySet> | undefined;\n let lastForcedRefreshAt = Number.NEGATIVE_INFINITY;\n\n if (\n jwksUrl.protocol !== \"https:\" &&\n !isLoopbackHostname(jwksUrl.hostname) &&\n options.allowInsecureJwks !== true\n ) {\n throw new Error(\"jwksUrl must use HTTPS for non-loopback hosts\");\n }\n\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"fetch is not available; pass options.fetch explicitly\");\n }\n\n async function getJwks(forceRefresh = false): Promise<JSONWebKeySet> {\n const now = Date.now();\n if (!forceRefresh && cachedJwks !== undefined && cachedJwks.expiresAt > now) {\n return cachedJwks.value;\n }\n\n if (pendingJwks !== undefined) {\n return pendingJwks;\n }\n\n pendingJwks = loadJwks(jwksUrl, fetchImplementation, jwksFetchTimeoutMs)\n .then((jwks) => {\n cachedJwks = {\n value: jwks,\n expiresAt: Date.now() + jwksCacheTtlMs\n };\n return jwks;\n })\n .finally(() => {\n pendingJwks = undefined;\n });\n\n return pendingJwks;\n }\n\n function refreshJwksAfterUnknownKey(): Promise<JSONWebKeySet> {\n if (pendingForcedRefresh !== undefined) {\n return pendingForcedRefresh;\n }\n\n const now = Date.now();\n if (now - lastForcedRefreshAt < jwksRefreshCooldownMs) {\n throw new NoMatchingKeyError();\n }\n\n lastForcedRefreshAt = now;\n pendingForcedRefresh = getJwks(true).finally(() => {\n pendingForcedRefresh = undefined;\n });\n return pendingForcedRefresh;\n }\n\n return {\n async verify(input): Promise<JwksVerifiedAccessToken> {\n try {\n const expectedResource = canonicalizeResourceIndicator(input.resource);\n const algorithm = resolveAlgorithm(input.token, allowedAlgorithms);\n let jwks = await getJwks();\n let verified;\n\n try {\n verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n requireAccessTokenType\n });\n } catch (error) {\n if (!(error instanceof NoMatchingKeyError)) {\n throw error;\n }\n\n jwks = await refreshJwksAfterUnknownKey();\n verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n requireAccessTokenType\n });\n }\n const audience = normalizeVerifiedAudience(\n getOwnEntry(verified.payload, \"aud\"),\n expectedResource\n );\n const accessToken = toVerifiedAccessToken(input.token, verified.payload, audience);\n\n if (\n input.requiredScopes.length > 0 &&\n !input.requiredScopes.every((scope) => accessToken.scopes.includes(scope))\n ) {\n throw createTokenVerificationError({\n error: \"insufficient_scope\",\n errorDescription: \"insufficient scope\",\n scope: [...input.requiredScopes]\n });\n }\n\n return accessToken;\n } catch (error) {\n if (error instanceof NoMatchingKeyError) {\n throw createInvalidTokenError(\"token signature invalid\");\n }\n\n throw normalizeVerificationError(error);\n }\n }\n };\n}\n", "export interface ParameterHeader {\n name: string;\n path: string[];\n type: \"string\" | \"integer\" | \"boolean\";\n}\n\nexport function encodeHeaderValue(value: string): string {\n const bytes = Buffer.from(value, \"utf8\");\n if (bytes.toString(\"utf8\") !== value)\n throw new Error(\"MCP header value must contain valid Unicode\");\n const sentinel = value.startsWith(\"=?base64?\") && value.endsWith(\"?=\");\n const unsafe =\n value.trim() !== value ||\n [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code !== 9 && (code < 32 || code > 126);\n });\n return sentinel || unsafe ? `=?base64?${bytes.toString(\"base64\")}?=` : value;\n}\n\nexport function decodeHeaderValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n if (value.startsWith(\"=?base64?\") && value.endsWith(\"?=\")) {\n const encoded = value.slice(9, -2);\n const bytes = Buffer.from(encoded, \"base64\");\n if (bytes.toString(\"base64\") !== encoded) return undefined;\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(bytes);\n } catch {\n return undefined;\n }\n }\n if (\n value.trim() !== value ||\n [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code !== 9 && (code < 32 || code > 126);\n })\n )\n return undefined;\n return value;\n}\n\nconst schemaMaps = new Set([\n \"properties\",\n \"patternProperties\",\n \"$defs\",\n \"definitions\",\n \"dependentSchemas\"\n]);\nconst schemaArrays = new Set([\"oneOf\", \"allOf\", \"anyOf\", \"prefixItems\"]);\nconst schemaChildren = new Set([\n \"items\",\n \"additionalProperties\",\n \"not\",\n \"contains\",\n \"if\",\n \"then\",\n \"else\",\n \"propertyNames\",\n \"unevaluatedProperties\",\n \"unevaluatedItems\",\n \"contentSchema\"\n]);\nconst tokenPunctuation = new Set([\n \"!\",\n \"#\",\n \"$\",\n \"%\",\n \"&\",\n \"'\",\n \"*\",\n \"+\",\n \"-\",\n \".\",\n \"^\",\n \"_\",\n \"`\",\n \"|\",\n \"~\"\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getParameterHeaders(schema: unknown): ParameterHeader[] {\n const headers: ParameterHeader[] = [];\n const names = new Set<string>();\n const ancestors = new Set<object>();\n let nodes = 0;\n const visit = (value: unknown, path: string[], reachable: boolean, depth: number): void => {\n if (++nodes > 10000 || depth > 64)\n throw new Error(\"MCP header schema traversal limit exceeded\");\n if (typeof value === \"boolean\") return;\n if (!isRecord(value) || ancestors.has(value)) throw new Error(\"Invalid MCP header schema\");\n ancestors.add(value);\n try {\n if (Object.prototype.hasOwnProperty.call(value, \"x-mcp-header\")) {\n const name = value[\"x-mcp-header\"];\n if (\n !reachable ||\n path.length === 0 ||\n typeof name !== \"string\" ||\n name.length === 0 ||\n [...name].some((character) => {\n const code = character.charCodeAt(0);\n return (\n !tokenPunctuation.has(character) &&\n !(\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122)\n )\n );\n })\n )\n throw new Error(\"Invalid x-mcp-header name or property path\");\n if (value.type !== \"string\" && value.type !== \"integer\" && value.type !== \"boolean\")\n throw new Error(\"x-mcp-header requires a string, integer, or boolean property\");\n const key = name.toLowerCase();\n if (names.has(key)) throw new Error(\"Duplicate x-mcp-header name\");\n names.add(key);\n headers.push({ name: `Mcp-Param-${name}`, path: [...path], type: value.type });\n }\n for (const [keyword, child] of Object.entries(value)) {\n if (schemaMaps.has(keyword)) {\n if (!isRecord(child)) throw new Error(\"Invalid schema map\");\n for (const [key, nested] of Object.entries(child))\n visit(\n nested,\n keyword === \"properties\" ? [...path, key] : path,\n reachable && keyword === \"properties\",\n depth + 1\n );\n } else if (schemaArrays.has(keyword)) {\n if (!Array.isArray(child)) throw new Error(\"Invalid schema array\");\n for (const nested of child) visit(nested, path, false, depth + 1);\n } else if (schemaChildren.has(keyword)) {\n if (Array.isArray(child))\n for (const nested of child) visit(nested, path, false, depth + 1);\n else visit(child, path, false, depth + 1);\n }\n }\n } finally {\n ancestors.delete(value);\n }\n };\n visit(schema, [], true, 0);\n return headers;\n}\n\nexport function createParameterHeaders(\n definitions: readonly ParameterHeader[],\n argumentsValue: unknown\n): Record<string, string> {\n const values: Record<string, string> = {};\n for (const definition of definitions) {\n let value = argumentsValue;\n for (const key of definition.path) {\n value =\n isRecord(value) && Object.prototype.hasOwnProperty.call(value, key)\n ? value[key]\n : undefined;\n }\n if (value === undefined) continue;\n if (\n definition.type === \"integer\"\n ? !Number.isSafeInteger(value)\n : typeof value !== definition.type\n )\n throw new Error(`Invalid value for ${definition.name}`);\n values[definition.name] = encodeHeaderValue(String(value));\n }\n return values;\n}\n\nexport function validateParameterHeaders(\n definitions: readonly ParameterHeader[],\n argumentsValue: unknown,\n headers: Record<string, string | string[] | undefined>\n): string | undefined {\n let expected: Record<string, string>;\n try {\n expected = createParameterHeaders(definitions, argumentsValue);\n } catch (error) {\n return error instanceof Error ? error.message : \"Invalid MCP parameter header value\";\n }\n for (const definition of definitions) {\n const value = expected[definition.name];\n const actual = headers[definition.name.toLowerCase()];\n if (value === undefined && actual === undefined) continue;\n if (\n value === undefined ||\n actual === undefined ||\n decodeHeaderValue(actual) !== decodeHeaderValue(value)\n )\n return `Header mismatch: ${definition.name} must match the tool argument`;\n }\n}\n", "import { isIP } from \"node:net\";\nimport { readBoundedResponseText } from \"./http-response.js\";\nimport type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n} from \"mcp-oauth\";\nimport { canonicalizeResourceIndicator, fetchMcpResponse } from \"mcp-oauth\";\n\nexport type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n};\n\nexport interface OAuthDiscoveryCache {\n get(\n resourceUrl: string\n ): OAuthDiscoveryResult | null | undefined | Promise<OAuthDiscoveryResult | null | undefined>;\n set(resourceUrl: string, value: OAuthDiscoveryResult): void | Promise<void>;\n delete?(resourceUrl: string): void | Promise<void>;\n}\n\nexport interface OAuthMetadataDiscoveryOptions {\n fetch?: OAuthMetadataFetch;\n cache?: OAuthDiscoveryCache;\n}\n\nexport interface OAuthMetadataLookupOptions {\n resourceMetadataUrl?: string | URL;\n signal?: AbortSignal;\n}\n\nconst metadataErrorBrand = Symbol.for(\"poe-platform.tiny-mcp-client.OAuthMetadataError\");\n\n/** Native metadata failure with complete SDK diagnostics and a safe phase. */\nexport class OAuthMetadataError extends Error {\n static is(value: unknown): value is OAuthMetadataError {\n return value instanceof Error && Object.getOwnPropertyDescriptor(value, metadataErrorBrand)?.value === true;\n }\n\n constructor(readonly phase: \"protected-resource\" | \"authorization-server\", message: string, readonly status?: number) {\n super(message);\n this.name = \"OAuthMetadataError\";\n Object.defineProperty(this, metadataErrorBrand, { value: true });\n }\n}\n\nfunction defaultOAuthMetadataFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname === \"[::1]\"\n || (isIP(normalizedHostname) === 4 && normalizedHostname.startsWith(\"127.\"));\n}\n\nfunction assertSecureUrl(url: URL, label: string): void {\n if (url.username !== \"\" || url.password !== \"\" || url.href.includes(\"#\")) {\n throw new Error(`${label} must not include credentials or fragment`);\n }\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction validateProtectedResourceMetadata(\n value: unknown,\n resourceUrl: string\n): OAuthProtectedResourceMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Protected resource metadata must be a JSON object\");\n }\n\n if (typeof value.resource !== \"string\" || value.resource.length === 0) {\n throw new Error(\"Protected resource metadata must include a resource string\");\n }\n if (value.resource.includes(\"#\")) {\n throw new OAuthMetadataError(\"protected-resource\", \"Protected resource metadata resource must not include fragment\");\n }\n\n const normalizedResource = canonicalizeResourceIndicator(value.resource);\n\n if (normalizedResource !== resourceUrl) {\n throw new OAuthMetadataError(\"protected-resource\",\n `Protected resource metadata resource mismatch: expected ${resourceUrl}, received ${value.resource}`\n );\n }\n\n if (!isStringArray(value.authorization_servers) || value.authorization_servers.length === 0) {\n throw new Error(\n \"Protected resource metadata must include a non-empty authorization_servers array\"\n );\n }\n\n return {\n ...value,\n resource: normalizedResource,\n } as OAuthProtectedResourceMetadata;\n}\n\nfunction validateAuthorizationServerMetadata(\n value: unknown,\n issuer: string\n): OAuthAuthorizationServerMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Authorization server metadata must be a JSON object\");\n }\n\n if (typeof value.issuer !== \"string\" || value.issuer.length === 0) {\n throw new Error(\"Authorization server metadata must include issuer\");\n }\n\n if (value.issuer !== issuer) {\n throw new OAuthMetadataError(\"authorization-server\",\n `Authorization server metadata issuer mismatch: expected ${issuer}, received ${value.issuer}`\n );\n }\n\n if (\n typeof value.authorization_endpoint !== \"string\" ||\n value.authorization_endpoint.length === 0\n ) {\n throw new Error(\"Authorization server metadata must include authorization_endpoint\");\n }\n\n if (typeof value.token_endpoint !== \"string\" || value.token_endpoint.length === 0) {\n throw new Error(\"Authorization server metadata must include token_endpoint\");\n }\n\n for (const field of [\"authorization_endpoint\", \"token_endpoint\", \"registration_endpoint\"]) {\n if (field === \"registration_endpoint\" && value[field] === undefined) {\n continue;\n }\n let endpoint: URL;\n try {\n if (typeof value[field] !== \"string\") {\n throw new Error();\n }\n endpoint = new URL(value[field]);\n } catch {\n throw new Error(`Authorization server metadata ${field} must be an absolute URL`);\n }\n assertSecureUrl(endpoint, `Authorization server metadata ${field}`);\n }\n\n if (\n !isStringArray(value.response_types_supported) ||\n !value.response_types_supported.includes(\"code\")\n ) {\n throw new Error(\n \"Authorization server metadata must include response_types_supported containing code\"\n );\n }\n\n if (\n !isStringArray(value.code_challenge_methods_supported) ||\n !value.code_challenge_methods_supported.includes(\"S256\")\n ) {\n throw new Error(\n \"Authorization server metadata must include code_challenge_methods_supported containing S256\"\n );\n }\n\n return value as OAuthAuthorizationServerMetadata;\n}\n\nasync function readJsonResponse(response: Response, phase: OAuthMetadataError[\"phase\"], signal: AbortSignal): Promise<unknown> {\n const label = phase === \"protected-resource\" ? \"Protected resource metadata\" : \"Authorization server metadata\";\n if (!response.ok) {\n void response.body?.cancel().catch(() => undefined);\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n throw new OAuthMetadataError(phase, `${label} request failed (${statusDescriptor})`, response.status);\n }\n\n const text = await readBoundedResponseText(response, 1024 * 1024, undefined, signal);\n try {\n return JSON.parse(text);\n } catch {\n throw new Error(`${label} response must be valid JSON`);\n }\n}\n\nasync function fetchMetadata(fetch: OAuthMetadataFetch, location: string, phase: OAuthMetadataError[\"phase\"], parentSignal?: AbortSignal): Promise<unknown> {\n parentSignal?.throwIfAborted();\n const deadline = AbortSignal.timeout(10_000);\n const signal = parentSignal === undefined ? deadline : AbortSignal.any([deadline, parentSignal]);\n const response = await fetchMcpResponse(fetch, location, {\n method: \"GET\", headers: { Accept: \"application/json\" }, signal\n });\n return readJsonResponse(response, phase, signal);\n}\n\nfunction resolveWellKnownMetadataUrl(inputUrl: string | URL, suffix: string): string {\n const url = new URL(typeof inputUrl === \"string\" ? inputUrl : inputUrl.toString());\n\n const resourcePath = url.pathname === \"/\" ? \"\" : url.pathname;\n url.pathname = `/.well-known/${suffix}${resourcePath}`;\n\n return url.toString();\n}\n\nexport function resolveProtectedResourceMetadataUrl(\n resourceUrl: string | URL,\n resourceMetadataUrl?: string | URL\n): string {\n const resource = new URL(typeof resourceUrl === \"string\" ? resourceUrl : resourceUrl.toString());\n assertSecureUrl(resource, \"Protected resource URL\");\n\n if (resourceMetadataUrl !== undefined) {\n const resolvedResourceMetadataUrl = new URL(\n typeof resourceMetadataUrl === \"string\" ? resourceMetadataUrl : resourceMetadataUrl.toString(),\n resource\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n }\n\n const resolvedResourceMetadataUrl = new URL(\n resolveWellKnownMetadataUrl(resource, \"oauth-protected-resource\")\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n}\n\nfunction validateAuthorizationServerIssuer(issuer: string | URL): string {\n const input = typeof issuer === \"string\" ? issuer : issuer.toString();\n const url = new URL(input);\n if (url.href.includes(\"?\") || url.href.includes(\"#\")) {\n throw new Error(\"Authorization server issuer must not include query or fragment\");\n }\n\n assertSecureUrl(url, \"Authorization server issuer\");\n\n return input;\n}\n\nexport function resolveAuthorizationServerMetadataUrl(issuer: string | URL): string {\n return resolveWellKnownMetadataUrl(\n validateAuthorizationServerIssuer(issuer),\n \"oauth-authorization-server\"\n );\n}\n\nfunction authorizationServerMetadataLocations(issuer: string): string[] {\n const locations = [\n resolveAuthorizationServerMetadataUrl(issuer),\n resolveWellKnownMetadataUrl(issuer, \"openid-configuration\")\n ];\n const issuerUrl = new URL(issuer);\n if (issuerUrl.pathname !== \"/\") {\n const path = issuerUrl.pathname.endsWith(\"/\")\n ? issuerUrl.pathname.slice(0, -1)\n : issuerUrl.pathname;\n issuerUrl.pathname = `${path}/.well-known/openid-configuration`;\n locations.push(issuerUrl.toString());\n }\n return locations;\n}\n\nfunction validateCachedDiscovery(value: unknown, resource: string): OAuthDiscoveryResult {\n if (!isObjectRecord(value) || value.resource !== resource) {\n throw new Error(\"Cached OAuth discovery resource mismatch\");\n }\n if (\n typeof value.resourceMetadataUrl !== \"string\" ||\n typeof value.authorizationServer !== \"string\" ||\n typeof value.authorizationServerMetadataUrl !== \"string\"\n ) {\n throw new Error(\"Cached OAuth discovery is missing identity fields\");\n }\n const resourceMetadata = validateProtectedResourceMetadata(value.resourceMetadata, resource);\n const resourceMetadataLocation = new URL(value.resourceMetadataUrl);\n assertSecureUrl(resourceMetadataLocation, \"Cached OAuth discovery metadata location\");\n const issuer = validateAuthorizationServerIssuer(value.authorizationServer);\n if (!resourceMetadata.authorization_servers.includes(issuer)) {\n throw new Error(\"Cached OAuth discovery issuer was not advertised by the resource\");\n }\n if (\n !authorizationServerMetadataLocations(issuer).includes(value.authorizationServerMetadataUrl)\n ) {\n throw new Error(\"Cached OAuth discovery metadata location does not match issuer\");\n }\n const authorizationServerMetadata = validateAuthorizationServerMetadata(\n value.authorizationServerMetadata,\n issuer\n );\n return structuredClone({\n resource,\n resourceMetadataUrl: value.resourceMetadataUrl,\n resourceMetadata,\n authorizationServer: issuer,\n authorizationServerMetadataUrl: value.authorizationServerMetadataUrl,\n authorizationServerMetadata\n });\n}\n\nasync function waitForCache<T>(operation: T | Promise<T>, signal?: AbortSignal): Promise<T> {\n if (signal === undefined) return operation;\n let abort!: () => void;\n try {\n return await new Promise<T>((resolve, reject) => {\n abort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n Promise.resolve(operation).then(resolve, reject);\n if (signal.aborted) abort();\n });\n } finally { signal.removeEventListener(\"abort\", abort); }\n}\n\nexport class OAuthMetadataDiscovery {\n private readonly fetchImpl: OAuthMetadataFetch;\n private readonly cache: OAuthDiscoveryCache | undefined;\n private readonly memoryCache = new Map<string, OAuthDiscoveryResult>();\n\n constructor({ fetch = defaultOAuthMetadataFetch, cache }: OAuthMetadataDiscoveryOptions = {}) {\n this.fetchImpl = fetch;\n this.cache = cache;\n }\n\n private async discoverProtectedResource(\n resource: string,\n resourceMetadataUrl?: string | URL,\n signal?: AbortSignal\n ): Promise<{ location: string; metadata: OAuthProtectedResourceMetadata }> {\n const locations = new Set([resolveProtectedResourceMetadataUrl(resource, resourceMetadataUrl)]);\n if (resourceMetadataUrl === undefined) {\n locations.add(new URL(\"/.well-known/oauth-protected-resource\", resource).toString());\n }\n\n let lastError: unknown;\n for (const location of locations) {\n try {\n const metadata = validateProtectedResourceMetadata(\n await fetchMetadata(this.fetchImpl, location, \"protected-resource\", signal),\n resource\n );\n return { location, metadata };\n } catch (error) {\n signal?.throwIfAborted();\n lastError = error;\n }\n }\n throw lastError;\n }\n\n async discover(\n resourceUrl: string | URL,\n { resourceMetadataUrl, signal }: OAuthMetadataLookupOptions = {}\n ): Promise<OAuthDiscoveryResult> {\n signal?.throwIfAborted();\n const cacheKey = canonicalizeResourceIndicator(resourceUrl);\n resolveProtectedResourceMetadataUrl(resourceUrl, resourceMetadataUrl);\n const memoryCachedResult = this.memoryCache.get(cacheKey);\n if (memoryCachedResult !== undefined && resourceMetadataUrl === undefined) {\n return structuredClone(memoryCachedResult);\n }\n\n const sharedCachedResult = resourceMetadataUrl === undefined ? await waitForCache(this.cache?.get(cacheKey), signal) : undefined;\n signal?.throwIfAborted();\n if (\n sharedCachedResult !== null &&\n sharedCachedResult !== undefined &&\n resourceMetadataUrl === undefined\n ) {\n try {\n const result = validateCachedDiscovery(sharedCachedResult, cacheKey);\n this.memoryCache.set(cacheKey, structuredClone(result));\n return result;\n } catch {\n await waitForCache(this.cache?.delete?.(cacheKey), signal);\n }\n }\n\n const { location: resourceMetadataLocation, metadata: resourceMetadata } =\n await this.discoverProtectedResource(cacheKey, resourceMetadataUrl, signal);\n\n const authorizationServerErrors: string[] = [];\n\n for (const authorizationServer of resourceMetadata.authorization_servers) {\n const normalizedAuthorizationServer = validateAuthorizationServerIssuer(authorizationServer);\n const metadataLocations = authorizationServerMetadataLocations(normalizedAuthorizationServer);\n\n for (const authorizationServerMetadataUrl of metadataLocations) {\n try {\n const authorizationServerMetadata = validateAuthorizationServerMetadata(\n await fetchMetadata(this.fetchImpl, authorizationServerMetadataUrl, \"authorization-server\", signal),\n normalizedAuthorizationServer\n );\n\n const result: OAuthDiscoveryResult = {\n resource: resourceMetadata.resource,\n resourceMetadataUrl: resourceMetadataLocation,\n resourceMetadata,\n authorizationServer: normalizedAuthorizationServer,\n authorizationServerMetadataUrl,\n authorizationServerMetadata\n };\n\n this.memoryCache.set(cacheKey, structuredClone(result));\n await waitForCache(this.cache?.set(cacheKey, structuredClone(result)), signal);\n return result;\n } catch (error) {\n signal?.throwIfAborted();\n authorizationServerErrors.push(\n `${authorizationServerMetadataUrl}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n }\n\n throw new OAuthMetadataError(\"authorization-server\",\n `Unable to load authorization server metadata for ${cacheKey}: ${authorizationServerErrors.join(\n \"; \"\n )}`\n );\n }\n}\n\nexport async function discoverOAuthMetadata(\n resourceUrl: string | URL,\n options: OAuthMetadataDiscoveryOptions & OAuthMetadataLookupOptions = {}\n): Promise<OAuthDiscoveryResult> {\n const discovery = new OAuthMetadataDiscovery(options);\n return discovery.discover(resourceUrl, options);\n}\n\nfunction skipOptionalWhitespace(value: string, start: number): number {\n let index = start;\n while (index < value.length && (value[index] === \" \" || value[index] === \"\\t\")) {\n index += 1;\n }\n return index;\n}\n\nfunction readToken(value: string, start: number): { token: string; nextIndex: number } | null {\n let index = start;\n while (index < value.length) {\n const character = value[index];\n if (\n character === \" \"\n || character === \"\\t\"\n || character === \",\"\n || character === \"=\"\n || character === \"\\\"\"\n ) {\n break;\n }\n index += 1;\n }\n\n if (index === start) {\n return null;\n }\n\n return {\n token: value.slice(start, index),\n nextIndex: index,\n };\n}\n\nfunction looksLikeAuthParam(value: string, start: number): boolean {\n const token = readToken(value, start);\n if (token === null) {\n return false;\n }\n\n return value[skipOptionalWhitespace(value, token.nextIndex)] === \"=\";\n}\n\nfunction isToken68Character(character: string): boolean {\n return (\n (character >= \"a\" && character <= \"z\")\n || (character >= \"A\" && character <= \"Z\")\n || (character >= \"0\" && character <= \"9\")\n || character === \"-\"\n || character === \".\"\n || character === \"_\"\n || character === \"~\"\n || character === \"+\"\n || character === \"/\"\n );\n}\n\nfunction readToken68(\n value: string,\n start: number\n): { token68: string; nextIndex: number } | null {\n let nextIndex = start;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n const token68 = value.slice(start, nextIndex);\n if (token68.length === 0) {\n return null;\n }\n\n let index = 0;\n while (index < token68.length && isToken68Character(token68[index]!)) {\n index += 1;\n }\n\n if (index === 0) {\n return null;\n }\n\n while (index < token68.length && token68[index] === \"=\") {\n index += 1;\n }\n\n if (index !== token68.length) {\n return null;\n }\n\n return { token68, nextIndex };\n}\n\nfunction readQuotedString(\n value: string,\n start: number\n): { parsedValue: string; nextIndex: number } | null {\n if (value[start] !== \"\\\"\") {\n return null;\n }\n\n let parsedValue = \"\";\n let index = start + 1;\n let escaping = false;\n\n while (index < value.length) {\n const character = value[index];\n if (escaping) {\n parsedValue += character;\n escaping = false;\n index += 1;\n continue;\n }\n\n if (character === \"\\\\\") {\n escaping = true;\n index += 1;\n continue;\n }\n\n if (character === \"\\\"\") {\n return {\n parsedValue,\n nextIndex: index + 1,\n };\n }\n\n parsedValue += character;\n index += 1;\n }\n\n return null;\n}\n\nfunction parseAuthParam(\n value: string,\n start: number\n): { name: string; value: string; nextIndex: number } | null {\n const token = readToken(value, start);\n if (token === null) {\n return null;\n }\n\n let index = skipOptionalWhitespace(value, token.nextIndex);\n if (value[index] !== \"=\") {\n return null;\n }\n\n index = skipOptionalWhitespace(value, index + 1);\n if (index >= value.length) {\n return null;\n }\n\n const quotedValue = readQuotedString(value, index);\n if (quotedValue !== null) {\n return {\n name: token.token,\n value: quotedValue.parsedValue,\n nextIndex: quotedValue.nextIndex,\n };\n }\n\n let nextIndex = index;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n return {\n name: token.token,\n value: value.slice(index, nextIndex),\n nextIndex,\n };\n}\n\nexport function parseBearerWwwAuthenticateHeader(\n headerValue: string | null\n): OAuthUnauthorizedChallenge | null {\n if (headerValue === null) {\n return null;\n }\n\n let index = 0;\n let firstBearerChallenge: OAuthUnauthorizedChallenge | null = null;\n\n while (index < headerValue.length) {\n index = skipOptionalWhitespace(headerValue, index);\n while (headerValue[index] === \",\") {\n index = skipOptionalWhitespace(headerValue, index + 1);\n }\n\n const scheme = readToken(headerValue, index);\n if (scheme === null) {\n break;\n }\n\n index = skipOptionalWhitespace(headerValue, scheme.nextIndex);\n const params: Record<string, string> = Object.create(null) as Record<string, string>;\n\n if (index < headerValue.length && headerValue[index] !== \",\") {\n const token68 = readToken68(headerValue, index);\n if (token68 !== null) {\n index = token68.nextIndex;\n } else if (looksLikeAuthParam(headerValue, index)) {\n while (index < headerValue.length) {\n const parsedParam = parseAuthParam(headerValue, index);\n if (parsedParam === null) {\n break;\n }\n\n const parameterName = parsedParam.name.toLowerCase();\n if (scheme.token.toLowerCase() === \"bearer\" && Object.hasOwn(params, parameterName)) {\n throw new Error(\"Bearer challenge must not repeat authentication parameters\");\n }\n params[parameterName] = parsedParam.value;\n index = skipOptionalWhitespace(headerValue, parsedParam.nextIndex);\n\n if (headerValue[index] !== \",\") {\n break;\n }\n\n const nextIndex = skipOptionalWhitespace(headerValue, index + 1);\n if (!looksLikeAuthParam(headerValue, nextIndex)) {\n index = nextIndex;\n break;\n }\n\n index = nextIndex;\n }\n }\n }\n\n if (scheme.token.toLowerCase() === \"bearer\") {\n const challenge: OAuthUnauthorizedChallenge = {\n scheme: \"Bearer\",\n params,\n raw: headerValue,\n };\n if (Object.keys(params).length > 0) {\n return challenge;\n }\n\n firstBearerChallenge ??= challenge;\n }\n\n if (headerValue[index] === \",\") {\n index += 1;\n }\n }\n\n return firstBearerChallenge;\n}\n", "import { spawn, type ChildProcessWithoutNullStreams, type SpawnOptions } from \"node:child_process\";\nimport path from \"node:path\";\nimport {\n HttpTransport,\n fetchMcpResponse,\n McpClient,\n StdioTransport,\n type McpTransport\n} from \"tiny-mcp-client\";\n\nimport type { McpConnection } from \"./mcp.js\";\n\nexport type McpServerConfig =\n | { command: string; args?: string[]; cwd?: string; env?: Record<string, string> }\n | { url: string; headers?: Record<string, string> };\n\nexport type McpModuleOptions = {\n servers: Record<string, McpServerConfig>;\n requestTimeoutMs?: number;\n closeTimeoutMs?: number;\n maxToolPages?: number;\n signal?: AbortSignal;\n fetch?: (input: string | URL, init?: RequestInit) => Promise<Response>;\n spawn?: (command: string, args: ReadonlyArray<string>, options: SpawnOptions) => ChildProcessWithoutNullStreams;\n};\n\nexport type ManagedMcpConnection = {\n ready: Promise<McpConnection>;\n close(): Promise<void>;\n};\n\nexport function parseMcpConfig(source: string, directory: string): McpModuleOptions {\n const parsed = JSON.parse(source) as unknown;\n const options = normalizeMcpOptions(parsed, [\n \"servers\",\n \"requestTimeoutMs\",\n \"closeTimeoutMs\",\n \"maxToolPages\"\n ]);\n for (const server of Object.values(options.servers)) {\n if (\"command\" in server) {\n server.cwd = path.resolve(directory, server.cwd ?? \".\");\n if (server.command.includes(\"/\") || server.command.includes(\"\\\\\")) {\n server.command = path.resolve(directory, server.command);\n }\n }\n }\n return options;\n}\n\nexport function normalizeMcpOptions(\n value: unknown,\n keys: string[] = [\n \"servers\",\n \"requestTimeoutMs\",\n \"closeTimeoutMs\",\n \"maxToolPages\",\n \"signal\",\n \"fetch\",\n \"spawn\"\n ]\n): McpModuleOptions {\n const options = readRecord(value, \"MCP options\", keys);\n const servers = readRecord(options.servers, \"MCP servers\");\n const normalized = Object.create(null) as Record<string, McpServerConfig>;\n for (const [name, input] of Object.entries(servers)) {\n if (name.length === 0 || name.trim() !== name)\n throw new TypeError(\"MCP server names must be non-empty without surrounding whitespace.\");\n const server = readRecord(input, `MCP server ${name}`);\n if (Object.hasOwn(server, \"command\")) {\n readRecord(server, `MCP server ${name}`, [\"command\", \"args\", \"cwd\", \"env\"]);\n const command = readText(server.command, \"MCP command\");\n let args: string[] | undefined;\n if (server.args !== undefined) {\n if (!Array.isArray(server.args)) throw new TypeError(\"MCP args must be an array of strings.\");\n args = [];\n for (let index = 0; index < server.args.length; index++) {\n const argument = Object.getOwnPropertyDescriptor(server.args, String(index));\n if (argument === undefined || !(\"value\" in argument) || typeof argument.value !== \"string\") {\n throw new TypeError(\"MCP args must be an array of strings without holes or accessors.\");\n }\n args.push(argument.value);\n }\n }\n normalized[name] = {\n command,\n ...(args === undefined ? {} : { args }),\n ...(server.cwd === undefined ? {} : { cwd: readText(server.cwd, \"MCP cwd\") }),\n env: readStrings(server.env ?? {}, \"MCP environment\")\n };\n } else {\n readRecord(server, `MCP server ${name}`, [\"url\", \"headers\"]);\n const url = new URL(readText(server.url, \"MCP URL\"));\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.hash)\n throw new TypeError(\"MCP URL must use HTTP or HTTPS without credentials or a fragment.\");\n const headers = readStrings(server.headers ?? {}, \"MCP headers\");\n new Headers(headers);\n normalized[name] = { url: url.href, headers };\n }\n }\n for (const name of [\"fetch\", \"spawn\"])\n if (options[name] !== undefined && typeof options[name] !== \"function\")\n throw new TypeError(`MCP ${name} must be a function.`);\n if (options.signal !== undefined && !(options.signal instanceof AbortSignal))\n throw new TypeError(\"MCP signal must be an AbortSignal.\");\n return {\n servers: normalized,\n requestTimeoutMs: readTimeout(options.requestTimeoutMs, 30_000),\n closeTimeoutMs: readTimeout(options.closeTimeoutMs, 1_000),\n maxToolPages: readTimeout(options.maxToolPages, 100),\n ...(options.signal === undefined ? {} : { signal: options.signal as AbortSignal }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch as McpModuleOptions[\"fetch\"] }),\n ...(options.spawn === undefined ? {} : { spawn: options.spawn as McpModuleOptions[\"spawn\"] })\n };\n}\n\nfunction readRecord(value: unknown, label: string, keys?: string[]): Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n ![Object.prototype, null].includes(Object.getPrototypeOf(value))\n )\n throw new TypeError(`${label} must be a plain object.`);\n const result = Object.create(null) as Record<string, unknown>;\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!(\"value\" in descriptor) || (keys !== undefined && !keys.includes(key)))\n throw new TypeError(`${label} contains unsupported field ${key}.`);\n result[key] = descriptor.value;\n }\n return result;\n}\n\nfunction readText(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0 || value.includes(\"\\0\"))\n throw new TypeError(`${label} must be a non-empty string without NUL characters.`);\n return value;\n}\n\nfunction readStrings(value: unknown, label: string): Record<string, string> {\n const entries = readRecord(value, label);\n for (const [name, entry] of Object.entries(entries))\n if (typeof entry !== \"string\" || name.includes(\"\\0\") || entry.includes(\"\\0\"))\n throw new TypeError(`${label} must contain strings without NUL characters.`);\n return entries as Record<string, string>;\n}\n\nfunction readTimeout(value: unknown, fallback: number): number {\n if (value === undefined) return fallback;\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value <= 0 ||\n value > 2_147_483_647\n )\n throw new TypeError(\"MCP timeouts must be positive 32-bit integers.\");\n return value;\n}\n\nexport function connectMcpTransport(\n server: McpServerConfig,\n options: McpModuleOptions,\n signal?: AbortSignal\n): ManagedMcpConnection {\n signal?.throwIfAborted();\n options.signal?.throwIfAborted();\n const client = new McpClient({\n clientInfo: { name: \"safejs\", version: \"1\" },\n requestTimeoutMs: options.requestTimeoutMs\n });\n let child: ChildProcessWithoutNullStreams | undefined;\n const activeRequests = new Set<AbortController>();\n const transport: McpTransport =\n \"command\" in server\n ? new StdioTransport({\n ...server,\n spawn(command, args, spawnOptions) {\n child =\n options.spawn === undefined\n ? (spawn(command, args, spawnOptions) as ChildProcessWithoutNullStreams)\n : options.spawn(command, args, spawnOptions);\n return child;\n }\n })\n : new HttpTransport({\n ...server,\n async fetch(input, init) {\n const controller = new AbortController();\n activeRequests.add(controller);\n const cancel = () => controller.abort(init?.signal?.reason);\n init?.signal?.addEventListener(\"abort\", cancel, { once: true });\n if (init?.signal?.aborted) cancel();\n const timeout = setTimeout(\n () => controller.abort(new Error(\"MCP HTTP request timed out.\")),\n init?.method === \"DELETE\" ? options.closeTimeoutMs : options.requestTimeoutMs\n );\n const finish = () => {\n clearTimeout(timeout);\n activeRequests.delete(controller);\n init?.signal?.removeEventListener(\"abort\", cancel);\n };\n try {\n const response = await fetchMcpResponse(options.fetch ?? fetch, input, {\n ...init,\n signal: controller.signal\n });\n if (response.body === null) {\n finish();\n return response;\n }\n const reader = response.body.getReader();\n let stopReading: (() => void) | undefined;\n let released = false;\n const release = () => {\n if (released) return;\n released = true;\n finish();\n if (stopReading !== undefined)\n controller.signal.removeEventListener(\"abort\", stopReading);\n reader.releaseLock();\n };\n const body = new ReadableStream<Uint8Array>({\n start(stream) {\n stopReading = () => {\n void reader.cancel(controller.signal.reason).catch(() => undefined);\n release();\n stream.error(controller.signal.reason);\n };\n controller.signal.addEventListener(\"abort\", stopReading, { once: true });\n if (controller.signal.aborted) stopReading();\n },\n async pull(stream) {\n try {\n const result = await reader.read();\n if (controller.signal.aborted) return;\n if (result.done) {\n release();\n stream.close();\n } else stream.enqueue(result.value);\n } catch (error) {\n release();\n stream.error(error);\n }\n },\n cancel(reason) {\n void reader.cancel(reason).catch(() => undefined);\n release();\n }\n });\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n } catch (error) {\n finish();\n throw error;\n }\n }\n });\n let closing: Promise<void> | undefined;\n const cancel = () => {\n void close().catch(() => undefined);\n };\n function close(): Promise<void> {\n closing ??= (async () => {\n signal?.removeEventListener(\"abort\", cancel);\n options.signal?.removeEventListener(\"abort\", cancel);\n for (const request of activeRequests) request.abort(new Error(\"MCP connection closed.\"));\n await client.close();\n transport.dispose();\n await new Promise<void>((resolve, reject) => {\n let forced: ReturnType<typeof setTimeout> | undefined;\n const timeout = setTimeout(() => {\n if (child !== undefined && child.exitCode === null && child.signalCode === null)\n child.kill(\"SIGKILL\");\n forced = setTimeout(\n () => reject(new Error(\"MCP transport did not close.\")),\n options.closeTimeoutMs\n );\n }, options.closeTimeoutMs);\n void transport.closed.then(\n () => {\n clearTimeout(timeout);\n clearTimeout(forced);\n resolve();\n },\n (error) => {\n clearTimeout(timeout);\n clearTimeout(forced);\n reject(error);\n }\n );\n });\n })();\n return closing;\n }\n signal?.addEventListener(\"abort\", cancel, { once: true });\n options.signal?.addEventListener(\"abort\", cancel, { once: true });\n const aborted = signal?.aborted || options.signal?.aborted;\n if (aborted) cancel();\n const connecting = aborted\n ? Promise.reject(signal?.aborted ? signal.reason : options.signal?.reason)\n : client.connect(transport);\n const ready = connecting.then(\n () => client,\n async (error) => {\n await close().catch(() => undefined);\n throw signal?.aborted\n ? signal.reason\n : options.signal?.aborted\n ? options.signal.reason\n : error;\n }\n );\n return { ready, close };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["spawn", "metadata", "item", "key", "key", "path", "key", "key", "path", "key", "key", "key", "key", "record", "key", "record", "key", "crypto", "path", "randomUUID", "path", "fs", "path", "key", "randomUUID", "isRecord", "getOwnEntry", "record", "homedir", "path", "path", "homedir", "getOwnEntry", "key", "record", "key", "isObjectRecord", "getOwnEntry", "key", "crypto", "path", "record", "options", "record", "key", "URL", "crypto", "MAX_JS_DATE_MS", "getOwnEntry", "record", "key", "MAX_JS_DATE_MS", "URL", "presented", "fetch", "getOwnString", "getOwnEntry", "isObjectRecord", "record", "key", "hostname", "isRecord", "path", "key", "isIP", "isObjectRecord", "normalizeHostname", "hostname", "isLoopbackHostname", "isIP", "assertSecureUrl", "fetch", "resolvedResourceMetadataUrl", "path", "isObjectRecord", "spawn", "signal", "isObjectRecord", "name", "key", "spawn", "path", "path", "key", "spawn", "cancel"]
|
|
7
|
-
}
|