@ai-sdk/mcp 2.0.0-canary.63 → 2.0.0-canary.65
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/CHANGELOG.md +12 -0
- package/dist/index.js +35 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/tool/mcp-http-transport.ts +6 -2
- package/src/tool/mcp-sse-transport.ts +5 -1
- package/src/tool/oauth.ts +30 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @ai-sdk/mcp
|
|
2
2
|
|
|
3
|
+
## 2.0.0-canary.65
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- b29e087: fix (mcp): handle SSE messages without explicit event fields
|
|
8
|
+
|
|
9
|
+
## 2.0.0-canary.64
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 024a6b4: fix(mcp): validate oauth metadata issuer during discovery
|
|
14
|
+
|
|
3
15
|
## 2.0.0-canary.63
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -692,15 +692,18 @@ async function discoverOAuthProtectedResourceMetadata(serverUrl, opts, fetchFn =
|
|
|
692
692
|
function buildDiscoveryUrls(authorizationServerUrl) {
|
|
693
693
|
const url = typeof authorizationServerUrl === "string" ? new URL(authorizationServerUrl) : authorizationServerUrl;
|
|
694
694
|
const hasPath = url.pathname !== "/";
|
|
695
|
+
const rootIssuer = url.origin;
|
|
695
696
|
const urlsToTry = [];
|
|
696
697
|
if (!hasPath) {
|
|
697
698
|
urlsToTry.push({
|
|
698
699
|
url: new URL("/.well-known/oauth-authorization-server", url.origin),
|
|
699
|
-
type: "oauth"
|
|
700
|
+
type: "oauth",
|
|
701
|
+
expectedIssuer: rootIssuer
|
|
700
702
|
});
|
|
701
703
|
urlsToTry.push({
|
|
702
704
|
url: new URL("/.well-known/openid-configuration", url.origin),
|
|
703
|
-
type: "oidc"
|
|
705
|
+
type: "oidc",
|
|
706
|
+
expectedIssuer: rootIssuer
|
|
704
707
|
});
|
|
705
708
|
return urlsToTry;
|
|
706
709
|
}
|
|
@@ -708,27 +711,39 @@ function buildDiscoveryUrls(authorizationServerUrl) {
|
|
|
708
711
|
if (pathname.endsWith("/")) {
|
|
709
712
|
pathname = pathname.slice(0, -1);
|
|
710
713
|
}
|
|
714
|
+
const pathIssuer = `${url.origin}${pathname}`;
|
|
711
715
|
urlsToTry.push({
|
|
712
716
|
url: new URL(
|
|
713
717
|
`/.well-known/oauth-authorization-server${pathname}`,
|
|
714
718
|
url.origin
|
|
715
719
|
),
|
|
716
|
-
type: "oauth"
|
|
720
|
+
type: "oauth",
|
|
721
|
+
expectedIssuer: pathIssuer
|
|
717
722
|
});
|
|
718
723
|
urlsToTry.push({
|
|
719
724
|
url: new URL("/.well-known/oauth-authorization-server", url.origin),
|
|
720
|
-
type: "oauth"
|
|
725
|
+
type: "oauth",
|
|
726
|
+
expectedIssuer: rootIssuer
|
|
721
727
|
});
|
|
722
728
|
urlsToTry.push({
|
|
723
729
|
url: new URL(`/.well-known/openid-configuration${pathname}`, url.origin),
|
|
724
|
-
type: "oidc"
|
|
730
|
+
type: "oidc",
|
|
731
|
+
expectedIssuer: pathIssuer
|
|
725
732
|
});
|
|
726
733
|
urlsToTry.push({
|
|
727
734
|
url: new URL(`${pathname}/.well-known/openid-configuration`, url.origin),
|
|
728
|
-
type: "oidc"
|
|
735
|
+
type: "oidc",
|
|
736
|
+
expectedIssuer: pathIssuer
|
|
729
737
|
});
|
|
730
738
|
return urlsToTry;
|
|
731
739
|
}
|
|
740
|
+
function assertMetadataIssuerMatches(metadata, expectedIssuer) {
|
|
741
|
+
if (metadata.issuer !== expectedIssuer) {
|
|
742
|
+
throw new MCPClientOAuthError({
|
|
743
|
+
message: `OAuth authorization server metadata issuer ${metadata.issuer} does not match expected issuer ${expectedIssuer}`
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
}
|
|
732
747
|
async function discoverAuthorizationServerMetadata(authorizationServerUrl, {
|
|
733
748
|
fetchFn = fetch,
|
|
734
749
|
protocolVersion = LATEST_PROTOCOL_VERSION
|
|
@@ -736,7 +751,7 @@ async function discoverAuthorizationServerMetadata(authorizationServerUrl, {
|
|
|
736
751
|
var _a3;
|
|
737
752
|
const headers = { "MCP-Protocol-Version": protocolVersion };
|
|
738
753
|
const urlsToTry = buildDiscoveryUrls(authorizationServerUrl);
|
|
739
|
-
for (const { url: endpointUrl, type } of urlsToTry) {
|
|
754
|
+
for (const { url: endpointUrl, type, expectedIssuer } of urlsToTry) {
|
|
740
755
|
const response = await fetchWithCorsRetry(endpointUrl, headers, fetchFn);
|
|
741
756
|
if (!response) {
|
|
742
757
|
continue;
|
|
@@ -750,11 +765,14 @@ async function discoverAuthorizationServerMetadata(authorizationServerUrl, {
|
|
|
750
765
|
);
|
|
751
766
|
}
|
|
752
767
|
if (type === "oauth") {
|
|
753
|
-
|
|
768
|
+
const metadata = OAuthMetadataSchema.parse(await response.json());
|
|
769
|
+
assertMetadataIssuerMatches(metadata, expectedIssuer);
|
|
770
|
+
return metadata;
|
|
754
771
|
} else {
|
|
755
772
|
const metadata = OpenIdProviderDiscoveryMetadataSchema.parse(
|
|
756
773
|
await response.json()
|
|
757
774
|
);
|
|
775
|
+
assertMetadataIssuerMatches(metadata, expectedIssuer);
|
|
758
776
|
if (!((_a3 = metadata.code_challenge_methods_supported) == null ? void 0 : _a3.includes("S256"))) {
|
|
759
777
|
throw new Error(
|
|
760
778
|
`Incompatible OIDC provider at ${endpointUrl}: does not support S256 code challenge method required by MCP specification`
|
|
@@ -1248,6 +1266,9 @@ async function authInternal(provider, {
|
|
|
1248
1266
|
}
|
|
1249
1267
|
|
|
1250
1268
|
// src/tool/mcp-sse-transport.ts
|
|
1269
|
+
function isMessageEvent(event) {
|
|
1270
|
+
return event === void 0 || event === "message";
|
|
1271
|
+
}
|
|
1251
1272
|
var SseMCPTransport = class {
|
|
1252
1273
|
constructor({
|
|
1253
1274
|
url,
|
|
@@ -1366,7 +1387,7 @@ var SseMCPTransport = class {
|
|
|
1366
1387
|
this.endpoint = endpoint;
|
|
1367
1388
|
this.connected = true;
|
|
1368
1389
|
resolve();
|
|
1369
|
-
} else if (event
|
|
1390
|
+
} else if (isMessageEvent(event)) {
|
|
1370
1391
|
try {
|
|
1371
1392
|
const message = await parseJSONRPCMessage(data);
|
|
1372
1393
|
(_c2 = this.onmessage) == null ? void 0 : _c2.call(this, message);
|
|
@@ -1473,6 +1494,9 @@ import {
|
|
|
1473
1494
|
withUserAgentSuffix as withUserAgentSuffix2,
|
|
1474
1495
|
getRuntimeEnvironmentUserAgent as getRuntimeEnvironmentUserAgent2
|
|
1475
1496
|
} from "@ai-sdk/provider-utils";
|
|
1497
|
+
function isMessageEvent2(event) {
|
|
1498
|
+
return event === void 0 || event === "message";
|
|
1499
|
+
}
|
|
1476
1500
|
var HttpMCPTransport = class {
|
|
1477
1501
|
constructor({
|
|
1478
1502
|
url,
|
|
@@ -1653,7 +1677,7 @@ var HttpMCPTransport = class {
|
|
|
1653
1677
|
const { done, value } = await reader.read();
|
|
1654
1678
|
if (done) return;
|
|
1655
1679
|
const { event, data } = value;
|
|
1656
|
-
if (event
|
|
1680
|
+
if (isMessageEvent2(event)) {
|
|
1657
1681
|
try {
|
|
1658
1682
|
const jsonRpcMessage = await parseJSONRPCMessage(data);
|
|
1659
1683
|
(_a4 = this.onmessage) == null ? void 0 : _a4.call(this, jsonRpcMessage);
|
|
@@ -1780,7 +1804,7 @@ var HttpMCPTransport = class {
|
|
|
1780
1804
|
if (id) {
|
|
1781
1805
|
this.lastInboundEventId = id;
|
|
1782
1806
|
}
|
|
1783
|
-
if (event
|
|
1807
|
+
if (isMessageEvent2(event)) {
|
|
1784
1808
|
try {
|
|
1785
1809
|
const jsonRpcMessage = await parseJSONRPCMessage(data);
|
|
1786
1810
|
(_a4 = this.onmessage) == null ? void 0 : _a4.call(this, jsonRpcMessage);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tool/mcp-client.ts","../src/error/mcp-client-error.ts","../src/tool/mcp-sse-transport.ts","../src/tool/json-rpc-message.ts","../src/tool/types.ts","../src/version.ts","../src/tool/oauth.ts","../src/tool/oauth-types.ts","../src/error/oauth-error.ts","../src/util/oauth-util.ts","../src/tool/mcp-http-transport.ts","../src/tool/mcp-transport.ts","../src/tool/mcp-apps.ts"],"sourcesContent":["import type { JSONObject, JSONSchema7, JSONValue } from '@ai-sdk/provider';\nimport {\n asSchema,\n dynamicTool,\n jsonSchema,\n safeParseJSON,\n safeValidateTypes,\n tool,\n type FlexibleSchema,\n type Tool,\n type ToolExecutionOptions,\n type ToolResultOutput,\n} from '@ai-sdk/provider-utils';\nimport type { z } from 'zod/v4';\nimport { MCPClientError } from '../error/mcp-client-error';\nimport type {\n JSONRPCError,\n JSONRPCNotification,\n JSONRPCRequest,\n JSONRPCResponse,\n} from './json-rpc-message';\nimport {\n createMcpTransport,\n isCustomMcpTransport,\n type MCPTransport,\n type MCPTransportConfig,\n} from './mcp-transport';\nimport { getMCPAppToolMeta, MCP_APP_MIME_TYPE } from './mcp-apps';\nimport {\n CallToolResultSchema,\n ElicitationRequestSchema,\n ElicitResultSchema,\n InitializeResultSchema,\n LATEST_PROTOCOL_VERSION,\n ListResourceTemplatesResultSchema,\n ListResourcesResultSchema,\n ListPromptsResultSchema,\n ListToolsResultSchema,\n ReadResourceResultSchema,\n GetPromptResultSchema,\n SUPPORTED_PROTOCOL_VERSIONS,\n type CallToolResult,\n type ClientCapabilities,\n type Configuration,\n type Configuration as ClientConfiguration,\n type ElicitationRequest,\n type ElicitResult,\n type ListResourceTemplatesResult,\n type ListResourcesResult,\n type ListPromptsResult,\n type ListToolsResult,\n type McpToolSet,\n type Notification,\n type PaginatedRequest,\n type ReadResourceResult,\n type GetPromptResult,\n type Request,\n type RequestOptions,\n type ServerCapabilities,\n type ToolSchemas,\n type ToolMeta,\n type McpProviderMetadata,\n} from './types';\nconst CLIENT_VERSION = '1.0.0';\n\nfunction mcpToModelOutput({\n output,\n}: {\n toolCallId: string;\n input: unknown;\n output: unknown;\n}): ToolResultOutput {\n const result = output as CallToolResult;\n\n if (!('content' in result) || !Array.isArray(result.content)) {\n return { type: 'json', value: result as JSONValue };\n }\n\n const convertedContent = result.content.map(\n (part: { type: string; [key: string]: unknown }) => {\n if (part.type === 'text' && 'text' in part) {\n return { type: 'text' as const, text: part.text as string };\n }\n if (part.type === 'image' && 'data' in part && 'mimeType' in part) {\n return {\n type: 'file' as const,\n mediaType: part.mimeType as string,\n data: { type: 'data' as const, data: part.data as string },\n };\n }\n return { type: 'text' as const, text: JSON.stringify(part) };\n },\n );\n\n return { type: 'content', value: convertedContent };\n}\n\nexport interface MCPClientConfig {\n /** Transport configuration for connecting to the MCP server */\n transport: MCPTransportConfig | MCPTransport;\n /** Optional callback for uncaught errors */\n onUncaughtError?: (error: unknown) => void;\n /** Optional client name, defaults to 'ai-sdk-mcp-client' */\n clientName?: string;\n /**\n * Optional client name, defaults to 'ai-sdk-mcp-client'\n *\n * @deprecated Use `clientName` instead.\n */\n name?: string;\n /** Optional client version, defaults to '1.0.0' */\n version?: string;\n /**\n * Optional client capabilities to advertise during initialization\n *\n * NOTE: It is up to the client application to handle the requests properly. This parameter just helps surface the request from the server\n */\n capabilities?: ClientCapabilities;\n}\n\nexport async function createMCPClient(\n config: MCPClientConfig,\n): Promise<MCPClient> {\n const client = new DefaultMCPClient(config);\n await client.init();\n return client;\n}\n\nexport interface MCPClient {\n /**\n * Information about the connected MCP server, as reported during initialization.\n * @see https://modelcontextprotocol.io/specification/2025-11-25/schema#implementation\n */\n readonly serverInfo: Configuration;\n\n /**\n * Optional instructions provided by the server during the initialize handshake.\n *\n * These describe how to use the server and its features, and can be used by clients\n * to improve LLM interactions (e.g. by including them in the system prompt).\n *\n * @see https://modelcontextprotocol.io/specification/2025-11-25/schema#initializeresult\n */\n readonly instructions?: string;\n\n tools<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>(options?: {\n schemas?: TOOL_SCHEMAS;\n }): Promise<McpToolSet<TOOL_SCHEMAS>>;\n\n /**\n * Lists available tools from the MCP server.\n */\n listTools(options?: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n }): Promise<ListToolsResult>;\n\n /**\n * Calls a tool on the MCP server.\n */\n callTool(args: {\n name: string;\n arguments?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<CallToolResult>;\n\n /**\n * Creates AI SDK tools from tool definitions.\n */\n toolsFromDefinitions<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>(\n definitions: ListToolsResult,\n options?: { schemas?: TOOL_SCHEMAS },\n ): McpToolSet<TOOL_SCHEMAS>;\n\n listResources(options?: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n }): Promise<ListResourcesResult>;\n\n readResource(args: {\n uri: string;\n options?: RequestOptions;\n }): Promise<ReadResourceResult>;\n\n listResourceTemplates(options?: {\n options?: RequestOptions;\n }): Promise<ListResourceTemplatesResult>;\n\n experimental_listPrompts(options?: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n }): Promise<ListPromptsResult>;\n\n experimental_getPrompt(args: {\n name: string;\n arguments?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<GetPromptResult>;\n\n onElicitationRequest(\n schema: typeof ElicitationRequestSchema,\n handler: (\n request: ElicitationRequest,\n ) => Promise<ElicitResult> | ElicitResult,\n ): void;\n\n close: () => Promise<void>;\n}\n\n/**\n * A lightweight MCP Client implementation\n *\n * The primary purpose of this client is tool conversion between MCP<>AI SDK\n * but can later be extended to support other MCP features\n *\n * Tool parameters are automatically inferred from the server's JSON schema\n * if not explicitly provided in the tools configuration\n *\n * This client is meant to be used to communicate with a single server. To communicate and fetch tools across multiple servers, it's recommended to create a new client instance per server.\n *\n * Not supported:\n * - Accepting notifications\n * - Session management (when passing a sessionId to an instance of the Streamable HTTP transport)\n * - Resumable SSE streams\n */\nclass DefaultMCPClient implements MCPClient {\n private transport: MCPTransport;\n private onUncaughtError?: (error: unknown) => void;\n private clientInfo: ClientConfiguration;\n private clientCapabilities: ClientCapabilities;\n private requestMessageId = 0;\n private responseHandlers: Map<\n number,\n (response: JSONRPCResponse | Error) => void\n > = new Map();\n private serverCapabilities: ServerCapabilities = {};\n private _serverInfo: Configuration = { name: '', version: '' };\n private _serverInstructions?: string;\n private isClosed = true;\n private elicitationRequestHandler?: (\n request: ElicitationRequest,\n ) => Promise<ElicitResult> | ElicitResult;\n\n constructor({\n transport: transportConfig,\n name,\n clientName = name ?? 'ai-sdk-mcp-client',\n version = CLIENT_VERSION,\n onUncaughtError,\n capabilities,\n }: MCPClientConfig) {\n this.onUncaughtError = onUncaughtError;\n this.clientCapabilities = capabilities ?? {};\n\n if (isCustomMcpTransport(transportConfig)) {\n this.transport = transportConfig;\n } else {\n this.transport = createMcpTransport(transportConfig);\n }\n\n this.transport.onclose = () => this.onClose();\n this.transport.onerror = (error: Error) => this.onError(error);\n this.transport.onmessage = message => {\n if ('method' in message) {\n if ('id' in message) {\n this.onRequestMessage(message);\n } else {\n this.onError(\n new MCPClientError({\n message: 'Unsupported message type',\n }),\n );\n }\n return;\n }\n\n this.onResponse(message);\n };\n\n this.clientInfo = {\n name: clientName,\n version,\n };\n }\n\n get serverInfo(): Configuration {\n return this._serverInfo;\n }\n\n get instructions(): string | undefined {\n return this._serverInstructions;\n }\n\n async init(): Promise<this> {\n try {\n await this.transport.start();\n this.isClosed = false;\n\n const result = await this.request({\n request: {\n method: 'initialize',\n params: {\n protocolVersion: LATEST_PROTOCOL_VERSION,\n capabilities: this.clientCapabilities,\n clientInfo: this.clientInfo,\n },\n },\n resultSchema: InitializeResultSchema,\n });\n\n if (result === undefined) {\n throw new MCPClientError({\n message: 'Server sent invalid initialize result',\n });\n }\n\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion)) {\n throw new MCPClientError({\n message: `Server's protocol version is not supported: ${result.protocolVersion}`,\n });\n }\n\n this.serverCapabilities = result.capabilities;\n this._serverInfo = result.serverInfo;\n if (this.transport.setProtocolVersion) {\n this.transport.setProtocolVersion(result.protocolVersion);\n } else {\n this.transport.protocolVersion = result.protocolVersion;\n }\n this._serverInstructions = result.instructions;\n\n // Complete initialization handshake:\n await this.notification({\n method: 'notifications/initialized',\n });\n\n return this;\n } catch (error) {\n await this.close();\n throw error;\n }\n }\n\n async close(): Promise<void> {\n if (this.isClosed) return;\n await this.transport?.close();\n this.onClose();\n }\n\n private assertCapability(method: string): void {\n switch (method) {\n case 'initialize':\n break;\n case 'tools/list':\n case 'tools/call':\n if (!this.serverCapabilities.tools) {\n throw new MCPClientError({\n message: `Server does not support tools`,\n });\n }\n break;\n case 'resources/list':\n case 'resources/read':\n case 'resources/templates/list':\n if (!this.serverCapabilities.resources) {\n throw new MCPClientError({\n message: `Server does not support resources`,\n });\n }\n break;\n case 'prompts/list':\n case 'prompts/get':\n if (!this.serverCapabilities.prompts) {\n throw new MCPClientError({\n message: `Server does not support prompts`,\n });\n }\n break;\n default:\n throw new MCPClientError({\n message: `Unsupported method: ${method}`,\n });\n }\n }\n\n private async request<T extends z.ZodType<object>>({\n request,\n resultSchema,\n options,\n }: {\n request: Request;\n resultSchema: T;\n options?: RequestOptions;\n }): Promise<z.infer<T>> {\n return new Promise((resolve, reject) => {\n if (this.isClosed) {\n return reject(\n new MCPClientError({\n message: 'Attempted to send a request from a closed client',\n }),\n );\n }\n\n this.assertCapability(request.method);\n\n const signal = options?.signal;\n signal?.throwIfAborted();\n\n const messageId = this.requestMessageId++;\n const jsonrpcRequest: JSONRPCRequest = {\n ...request,\n jsonrpc: '2.0',\n id: messageId,\n };\n\n const cleanup = () => {\n this.responseHandlers.delete(messageId);\n };\n\n this.responseHandlers.set(messageId, response => {\n if (signal?.aborted) {\n return reject(\n new MCPClientError({\n message: 'Request was aborted',\n cause: signal.reason,\n }),\n );\n }\n\n if (response instanceof Error) {\n return reject(response);\n }\n\n try {\n const result = resultSchema.parse(response.result);\n resolve(result);\n } catch (error) {\n const parseError = new MCPClientError({\n message: 'Failed to parse server response',\n cause: error,\n });\n reject(parseError);\n }\n });\n\n this.transport.send(jsonrpcRequest).catch(error => {\n cleanup();\n reject(error);\n });\n });\n }\n\n async listTools({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListToolsResult> {\n return this.request({\n request: { method: 'tools/list', params },\n resultSchema: ListToolsResultSchema,\n options,\n });\n }\n\n async callTool({\n name,\n arguments: args = {},\n options,\n }: {\n name: string;\n arguments?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<CallToolResult> {\n try {\n return this.request({\n request: { method: 'tools/call', params: { name, arguments: args } },\n resultSchema: CallToolResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async listResourcesInternal({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListResourcesResult> {\n try {\n return this.request({\n request: { method: 'resources/list', params },\n resultSchema: ListResourcesResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async readResourceInternal({\n uri,\n options,\n }: {\n uri: string;\n options?: RequestOptions;\n }): Promise<ReadResourceResult> {\n try {\n return this.request({\n request: { method: 'resources/read', params: { uri } },\n resultSchema: ReadResourceResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async listResourceTemplatesInternal({\n options,\n }: {\n options?: RequestOptions;\n } = {}): Promise<ListResourceTemplatesResult> {\n try {\n return this.request({\n request: { method: 'resources/templates/list' },\n resultSchema: ListResourceTemplatesResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async listPromptsInternal({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListPromptsResult> {\n try {\n return this.request({\n request: { method: 'prompts/list', params },\n resultSchema: ListPromptsResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async getPromptInternal({\n name,\n args,\n options,\n }: {\n name: string;\n args?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<GetPromptResult> {\n try {\n return this.request({\n request: { method: 'prompts/get', params: { name, arguments: args } },\n resultSchema: GetPromptResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async notification(notification: Notification): Promise<void> {\n const jsonrpcNotification: JSONRPCNotification = {\n ...notification,\n jsonrpc: '2.0',\n };\n await this.transport.send(jsonrpcNotification);\n }\n\n /**\n * Returns a set of AI SDK tools from the MCP server.\n * This fetches tool definitions and wraps them with execute functions.\n * @returns A record of tool names to their implementations\n */\n async tools<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>({\n schemas = 'automatic',\n }: {\n schemas?: TOOL_SCHEMAS;\n } = {}): Promise<McpToolSet<TOOL_SCHEMAS>> {\n const definitions = await this.listTools();\n return this.toolsFromDefinitions(definitions, {\n schemas,\n } as { schemas?: TOOL_SCHEMAS });\n }\n\n /**\n * Creates AI SDK tools from tool definitions without fetching from the server.\n */\n toolsFromDefinitions<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>(\n definitions: ListToolsResult,\n { schemas = 'automatic' }: { schemas?: TOOL_SCHEMAS } = {} as {\n schemas?: TOOL_SCHEMAS;\n },\n ): McpToolSet<TOOL_SCHEMAS> {\n const tools: Record<string, Tool & { _meta?: ToolMeta }> = {};\n\n for (const {\n name,\n title,\n description,\n inputSchema,\n annotations,\n _meta,\n } of definitions.tools) {\n const resolvedTitle = title ?? annotations?.title;\n if (\n schemas !== 'automatic' &&\n !Object.prototype.hasOwnProperty.call(schemas, name)\n ) {\n continue;\n }\n\n const self = this;\n const outputSchema =\n schemas !== 'automatic' ? schemas[name]?.outputSchema : undefined;\n const appMeta = getMCPAppToolMeta({ _meta });\n const metadata = {\n clientName: this.clientInfo.name,\n toolName: name,\n ...(resolvedTitle != null ? { title: resolvedTitle } : {}),\n ...(appMeta?.resourceUri != null\n ? {\n app: {\n ...appMeta,\n mimeType: MCP_APP_MIME_TYPE,\n } as JSONObject,\n }\n : {}),\n } satisfies McpProviderMetadata;\n\n const execute = async (\n args: any,\n options: ToolExecutionOptions<{}>,\n ): Promise<unknown> => {\n options?.abortSignal?.throwIfAborted();\n const result = await self.callTool({\n name,\n arguments: args,\n options: { signal: options?.abortSignal },\n });\n\n if (result.isError) {\n return result;\n }\n\n if (outputSchema != null) {\n return self.extractStructuredContent(result, outputSchema, name);\n }\n\n return result;\n };\n\n const toolWithExecute =\n schemas === 'automatic'\n ? dynamicTool({\n description,\n title: resolvedTitle,\n metadata,\n inputSchema: jsonSchema({\n ...inputSchema,\n properties: inputSchema.properties ?? {},\n additionalProperties: false,\n } as JSONSchema7),\n execute,\n toModelOutput: mcpToModelOutput,\n })\n : tool({\n description,\n title: resolvedTitle,\n metadata,\n inputSchema: schemas[name].inputSchema,\n ...(outputSchema != null ? { outputSchema } : {}),\n execute,\n toModelOutput: mcpToModelOutput,\n });\n\n tools[name] = { ...toolWithExecute, _meta };\n }\n\n return tools as McpToolSet<TOOL_SCHEMAS>;\n }\n\n /**\n * Extracts and validates structuredContent from a tool result.\n */\n private async extractStructuredContent(\n result: CallToolResult,\n outputSchema: FlexibleSchema<unknown>,\n toolName: string,\n ): Promise<unknown> {\n if ('structuredContent' in result && result.structuredContent != null) {\n const validationResult = await safeValidateTypes({\n value: result.structuredContent,\n schema: asSchema(outputSchema),\n });\n\n if (!validationResult.success) {\n throw new MCPClientError({\n message: `Tool \"${toolName}\" returned structuredContent that does not match the expected outputSchema`,\n cause: validationResult.error,\n });\n }\n\n return validationResult.value;\n }\n\n // Fallback\n if ('content' in result && Array.isArray(result.content)) {\n const textContent = result.content.find(c => c.type === 'text');\n if (textContent && 'text' in textContent) {\n const parseResult = await safeParseJSON({\n text: textContent.text,\n schema: outputSchema,\n });\n\n if (!parseResult.success) {\n throw new MCPClientError({\n message: `Tool \"${toolName}\" returned content that does not match the expected outputSchema`,\n cause: parseResult.error,\n });\n }\n\n return parseResult.value;\n }\n }\n\n throw new MCPClientError({\n message: `Tool \"${toolName}\" did not return structuredContent or parseable text content`,\n });\n }\n\n listResources({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListResourcesResult> {\n return this.listResourcesInternal({ params, options });\n }\n\n readResource({\n uri,\n options,\n }: {\n uri: string;\n options?: RequestOptions;\n }): Promise<ReadResourceResult> {\n return this.readResourceInternal({ uri, options });\n }\n\n listResourceTemplates({\n options,\n }: {\n options?: RequestOptions;\n } = {}): Promise<ListResourceTemplatesResult> {\n return this.listResourceTemplatesInternal({ options });\n }\n\n experimental_listPrompts({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListPromptsResult> {\n return this.listPromptsInternal({ params, options });\n }\n\n experimental_getPrompt({\n name,\n arguments: args,\n options,\n }: {\n name: string;\n arguments?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<GetPromptResult> {\n return this.getPromptInternal({ name, args, options });\n }\n\n onElicitationRequest(\n schema: typeof ElicitationRequestSchema,\n handler: (\n request: ElicitationRequest,\n ) => Promise<ElicitResult> | ElicitResult,\n ): void {\n if (schema !== ElicitationRequestSchema) {\n throw new MCPClientError({\n message:\n 'Unsupported request schema. Only ElicitationRequestSchema is supported.',\n });\n }\n\n this.elicitationRequestHandler = handler;\n }\n\n private async onRequestMessage(request: JSONRPCRequest): Promise<void> {\n try {\n if (request.method === 'ping') {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n result: {},\n });\n return;\n }\n\n if (request.method !== 'elicitation/create') {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32601,\n message: `Unsupported request method: ${request.method}`,\n },\n });\n return;\n }\n\n if (!this.elicitationRequestHandler) {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32601,\n message: 'No elicitation handler registered on client',\n },\n });\n return;\n }\n\n const parsedRequest = ElicitationRequestSchema.safeParse({\n method: request.method,\n params: request.params,\n });\n\n if (!parsedRequest.success) {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32602,\n message: `Invalid elicitation request: ${parsedRequest.error.message}`,\n data: parsedRequest.error.issues,\n },\n });\n return;\n }\n\n try {\n const result = await this.elicitationRequestHandler(parsedRequest.data);\n const validatedResult = ElicitResultSchema.parse(result);\n\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n result: validatedResult,\n });\n } catch (error) {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32603,\n message:\n error instanceof Error\n ? error.message\n : 'Failed to handle elicitation request',\n },\n });\n this.onError(error);\n }\n } catch (error) {\n this.onError(error);\n }\n }\n\n private onClose(): void {\n if (this.isClosed) return;\n\n this.isClosed = true;\n const error = new MCPClientError({\n message: 'Connection closed',\n });\n\n for (const handler of this.responseHandlers.values()) {\n handler(error);\n }\n\n this.responseHandlers.clear();\n }\n\n private onError(error: unknown): void {\n if (this.onUncaughtError) {\n this.onUncaughtError(error);\n }\n }\n\n private onResponse(response: JSONRPCResponse | JSONRPCError): void {\n const messageId = Number(response.id);\n const handler = this.responseHandlers.get(messageId);\n\n if (handler === undefined) {\n throw new MCPClientError({\n message: `Protocol error: Received a response for an unknown message ID: ${JSON.stringify(\n response,\n )}`,\n });\n }\n\n this.responseHandlers.delete(messageId);\n\n handler(\n 'result' in response\n ? response\n : new MCPClientError({\n message: response.error.message,\n code: response.error.code,\n data: response.error.data,\n cause: response.error,\n }),\n );\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_MCPClientError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * An error occurred with the MCP client.\n */\nexport class MCPClientError extends AISDKError {\n private readonly [symbol] = true;\n readonly data?: unknown;\n\n /**\n * JSON-RPC error code from the server response, per the JSON-RPC 2.0\n * spec (e.g. `-32601` method-not-found, `-32602` invalid-params, or\n * MCP-specific codes such as `-32002` resource-not-found). This is the\n * application-level error code populated from `error.code` in the\n * server's JSON-RPC error payload. Distinct from `statusCode`, which\n * is the HTTP transport status.\n */\n readonly code?: number;\n\n /**\n * HTTP status code from the failed response, when the error originated\n * from the streamable HTTP transport. Undefined for stdio transport\n * errors and for failures that do not have an associated response\n * status (e.g. network errors, abort). Distinct from `code`, which is\n * the JSON-RPC application error code.\n */\n readonly statusCode?: number;\n\n /**\n * URL of the MCP endpoint the failing request was sent to, when the\n * error originated from an HTTP transport failure.\n */\n readonly url?: string;\n\n /**\n * Body of the failing HTTP response, decoded as text, when available.\n * Undefined when the body could not be read or the error did not have\n * an associated response.\n */\n readonly responseBody?: string;\n\n constructor({\n name = 'MCPClientError',\n message,\n cause,\n data,\n code,\n statusCode,\n url,\n responseBody,\n }: {\n name?: string;\n message: string;\n cause?: unknown;\n data?: unknown;\n code?: number;\n statusCode?: number;\n url?: string;\n responseBody?: string;\n }) {\n super({ name, message, cause });\n this.data = data;\n this.code = code;\n this.statusCode = statusCode;\n this.url = url;\n this.responseBody = responseBody;\n }\n\n static isInstance(error: unknown): error is MCPClientError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import {\n EventSourceParserStream,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { MCPClientError } from '../error/mcp-client-error';\nimport { parseJSONRPCMessage, type JSONRPCMessage } from './json-rpc-message';\nimport type { MCPTransport } from './mcp-transport';\nimport { VERSION } from '../version';\nimport {\n extractResourceMetadataUrl,\n UnauthorizedError,\n auth,\n type OAuthClientProvider,\n} from './oauth';\nimport { LATEST_PROTOCOL_VERSION } from './types';\n\nexport class SseMCPTransport implements MCPTransport {\n private endpoint?: URL;\n private abortController?: AbortController;\n private url: URL;\n private connected = false;\n private sseConnection?: {\n close: () => void;\n };\n private headers?: Record<string, string>;\n private authProvider?: OAuthClientProvider;\n private resourceMetadataUrl?: URL;\n private redirectMode: RequestRedirect;\n private fetchFn: FetchFunction;\n\n onclose?: () => void;\n onerror?: (error: unknown) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n protocolVersion?: string;\n\n constructor({\n url,\n headers,\n authProvider,\n redirect = 'error',\n fetch: fetchFn,\n }: {\n url: string;\n headers?: Record<string, string>;\n authProvider?: OAuthClientProvider;\n redirect?: 'follow' | 'error';\n fetch?: FetchFunction;\n }) {\n this.url = new URL(url);\n this.headers = headers;\n this.authProvider = authProvider;\n this.redirectMode = redirect;\n this.fetchFn = fetchFn ?? globalThis.fetch;\n }\n\n setProtocolVersion(version: string): void {\n this.protocolVersion = version;\n }\n\n private async commonHeaders(\n base: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n ...this.headers,\n ...base,\n 'mcp-protocol-version': this.protocolVersion ?? LATEST_PROTOCOL_VERSION,\n };\n\n if (this.authProvider) {\n const tokens = await this.authProvider.tokens();\n if (tokens?.access_token) {\n headers['Authorization'] = `Bearer ${tokens.access_token}`;\n }\n }\n\n return withUserAgentSuffix(\n headers,\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n }\n\n async start(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.connected) {\n return resolve();\n }\n\n this.abortController = new AbortController();\n\n const establishConnection = async (triedAuth: boolean = false) => {\n try {\n const headers = await this.commonHeaders({\n Accept: 'text/event-stream',\n });\n const response = await this.fetchFn(this.url.href, {\n headers,\n signal: this.abortController?.signal,\n redirect: this.redirectMode,\n });\n\n if (response.status === 401 && this.authProvider && !triedAuth) {\n this.resourceMetadataUrl = extractResourceMetadataUrl(response);\n try {\n const result = await auth(this.authProvider, {\n serverUrl: this.url,\n resourceMetadataUrl: this.resourceMetadataUrl,\n fetchFn: this.fetchFn,\n });\n if (result !== 'AUTHORIZED') {\n const error = new UnauthorizedError();\n this.onerror?.(error);\n return reject(error);\n }\n } catch (error) {\n this.onerror?.(error);\n return reject(error);\n }\n return establishConnection(true);\n }\n\n if (!response.ok || !response.body) {\n let errorMessage = `MCP SSE Transport Error: ${response.status} ${response.statusText}`;\n\n if (response.status === 405) {\n errorMessage +=\n '. This server does not support SSE transport. Try using `http` transport instead';\n }\n\n const error = new MCPClientError({\n message: errorMessage,\n });\n this.onerror?.(error);\n return reject(error);\n }\n\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n const reader = stream.getReader();\n\n const processEvents = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n if (this.connected) {\n this.connected = false;\n throw new MCPClientError({\n message:\n 'MCP SSE Transport Error: Connection closed unexpectedly',\n });\n }\n return;\n }\n\n const { event, data } = value;\n\n if (event === 'endpoint') {\n if (this.endpoint) {\n continue;\n }\n\n const endpoint = new URL(data, this.url);\n\n if (endpoint.origin !== this.url.origin) {\n this.connected = false;\n this.endpoint = undefined;\n this.sseConnection?.close();\n this.abortController?.abort();\n throw new MCPClientError({\n message: `MCP SSE Transport Error: Endpoint origin does not match connection origin: ${endpoint.origin}`,\n });\n }\n\n this.endpoint = endpoint;\n this.connected = true;\n resolve();\n } else if (event === 'message') {\n try {\n const message = await parseJSONRPCMessage(data);\n this.onmessage?.(message);\n } catch (error) {\n const e = new MCPClientError({\n message:\n 'MCP SSE Transport Error: Failed to parse message',\n cause: error,\n });\n this.onerror?.(e);\n // We do not throw here so we continue processing events after reporting the error\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n\n this.onerror?.(error);\n reject(error);\n }\n };\n\n this.sseConnection = {\n close: () => reader.cancel(),\n };\n\n processEvents();\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n\n this.onerror?.(error);\n reject(error);\n }\n };\n\n void establishConnection();\n });\n }\n\n async close(): Promise<void> {\n this.connected = false;\n this.endpoint = undefined;\n this.sseConnection?.close();\n this.abortController?.abort();\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n if (!this.endpoint || !this.connected) {\n throw new MCPClientError({\n message: 'MCP SSE Transport Error: Not connected',\n });\n }\n\n const endpoint = this.endpoint as URL;\n\n const attempt = async (triedAuth: boolean = false): Promise<void> => {\n try {\n const headers = await this.commonHeaders({\n 'Content-Type': 'application/json',\n });\n const init = {\n method: 'POST',\n headers,\n body: JSON.stringify(message),\n signal: this.abortController?.signal,\n redirect: this.redirectMode,\n };\n\n const response = await this.fetchFn(endpoint.href, init);\n\n if (response.status === 401 && this.authProvider && !triedAuth) {\n this.resourceMetadataUrl = extractResourceMetadataUrl(response);\n try {\n const result = await auth(this.authProvider, {\n serverUrl: this.url,\n resourceMetadataUrl: this.resourceMetadataUrl,\n fetchFn: this.fetchFn,\n });\n if (result !== 'AUTHORIZED') {\n const error = new UnauthorizedError();\n this.onerror?.(error);\n return;\n }\n } catch (error) {\n this.onerror?.(error);\n return;\n }\n return attempt(true);\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => null);\n const error = new MCPClientError({\n message: `MCP SSE Transport Error: POSTing to endpoint (HTTP ${response.status}): ${text}`,\n });\n this.onerror?.(error);\n return;\n }\n } catch (error) {\n this.onerror?.(error);\n return;\n }\n };\n await attempt();\n }\n}\n\nexport async function deserializeMessage(\n line: string,\n): Promise<JSONRPCMessage> {\n return parseJSONRPCMessage(line);\n}\n","import { parseJSON } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { BaseParamsSchema, RequestSchema, ResultSchema } from './types';\n\nconst JSONRPC_VERSION = '2.0';\n\nconst JSONRPCRequestSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n })\n .merge(RequestSchema)\n .strict();\n\nexport type JSONRPCRequest = z.infer<typeof JSONRPCRequestSchema>;\n\nconst JSONRPCResponseSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n result: ResultSchema,\n })\n .strict();\n\nexport type JSONRPCResponse = z.infer<typeof JSONRPCResponseSchema>;\n\nconst JSONRPCErrorSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n error: z.object({\n code: z.number().int(),\n message: z.string(),\n data: z.optional(z.unknown()),\n }),\n })\n .strict();\n\nexport type JSONRPCError = z.infer<typeof JSONRPCErrorSchema>;\n\nconst JSONRPCNotificationSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n })\n .merge(\n z.object({\n method: z.string(),\n params: z.optional(BaseParamsSchema),\n }),\n )\n .strict();\n\nexport type JSONRPCNotification = z.infer<typeof JSONRPCNotificationSchema>;\n\nexport const JSONRPCMessageSchema = z.union([\n JSONRPCRequestSchema,\n JSONRPCNotificationSchema,\n JSONRPCResponseSchema,\n JSONRPCErrorSchema,\n]);\n\nexport type JSONRPCMessage = z.infer<typeof JSONRPCMessageSchema>;\n\nexport async function parseJSONRPCMessage(\n text: string,\n): Promise<JSONRPCMessage> {\n return JSONRPCMessageSchema.parse(await parseJSON({ text }));\n}\n","import { z } from 'zod/v4';\nimport type { JSONObject } from '@ai-sdk/provider';\nimport type { FlexibleSchema, Tool } from '@ai-sdk/provider-utils';\n\nexport const LATEST_PROTOCOL_VERSION = '2025-11-25';\nexport const SUPPORTED_PROTOCOL_VERSIONS = [\n LATEST_PROTOCOL_VERSION,\n '2025-06-18',\n '2025-03-26',\n '2024-11-05',\n];\n\nexport type McpProviderMetadata = {\n clientName?: string;\n title?: string;\n toolName?: string;\n app?: JSONObject;\n};\n\n/** MCP tool metadata - keys should follow MCP _meta key format specification */\nconst ToolMetaSchema = z.optional(z.record(z.string(), z.unknown()));\nexport type ToolMeta = z.infer<typeof ToolMetaSchema>;\n\nexport type ToolSchemas =\n | Record<\n string,\n {\n inputSchema: FlexibleSchema<JSONObject | unknown>;\n outputSchema?: FlexibleSchema<JSONObject | unknown>;\n }\n >\n | 'automatic'\n | undefined;\n\n/** Base MCP tool type with execute and _meta */\ntype McpToolBase<INPUT = unknown, OUTPUT = CallToolResult> = Tool<\n INPUT,\n OUTPUT\n> &\n Required<Pick<Tool<INPUT, OUTPUT>, 'execute'>> & {\n _meta?: ToolMeta;\n };\n\nexport type McpToolSet<TOOL_SCHEMAS extends ToolSchemas = 'automatic'> =\n TOOL_SCHEMAS extends Record<\n string,\n { inputSchema: FlexibleSchema<any>; outputSchema?: FlexibleSchema<any> }\n >\n ? {\n [K in keyof TOOL_SCHEMAS]: TOOL_SCHEMAS[K] extends {\n inputSchema: FlexibleSchema<infer INPUT>;\n outputSchema: FlexibleSchema<infer OUTPUT>;\n }\n ? McpToolBase<INPUT, OUTPUT>\n : TOOL_SCHEMAS[K] extends {\n inputSchema: FlexibleSchema<infer INPUT>;\n }\n ? McpToolBase<INPUT, CallToolResult>\n : never;\n }\n : Record<string, McpToolBase<unknown, CallToolResult>>;\n\nconst ClientOrServerImplementationSchema = z.looseObject({\n name: z.string(),\n version: z.string(),\n title: z.optional(z.string()),\n});\n\n// Maps to `Implementation` in the MCP specification\nexport type Configuration = z.infer<typeof ClientOrServerImplementationSchema>;\n\nexport const BaseParamsSchema = z.looseObject({\n _meta: z.optional(z.object({}).loose()),\n});\ntype BaseParams = z.infer<typeof BaseParamsSchema>;\nexport const ResultSchema = BaseParamsSchema;\n\nexport const RequestSchema = z.object({\n method: z.string(),\n params: z.optional(BaseParamsSchema),\n});\nexport type Request = z.infer<typeof RequestSchema>;\nexport type RequestOptions = {\n signal?: AbortSignal;\n timeout?: number;\n maxTotalTimeout?: number;\n};\n\nexport type Notification = z.infer<typeof RequestSchema>;\n\n/** @see https://modelcontextprotocol.io/specification/2025-06-18/client/elicitation */\nconst ElicitationCapabilitySchema = z\n .object({\n applyDefaults: z.optional(z.boolean()),\n })\n .loose();\n\nconst ServerCapabilitiesSchema = z.looseObject({\n experimental: z.optional(z.object({}).loose()),\n logging: z.optional(z.object({}).loose()),\n prompts: z.optional(\n z.looseObject({\n listChanged: z.optional(z.boolean()),\n }),\n ),\n resources: z.optional(\n z.looseObject({\n subscribe: z.optional(z.boolean()),\n listChanged: z.optional(z.boolean()),\n }),\n ),\n tools: z.optional(\n z.looseObject({\n listChanged: z.optional(z.boolean()),\n }),\n ),\n elicitation: z.optional(ElicitationCapabilitySchema),\n});\n\nexport type ServerCapabilities = z.infer<typeof ServerCapabilitiesSchema>;\nexport const ClientCapabilitiesSchema = z\n .object({\n elicitation: z.optional(ElicitationCapabilitySchema),\n })\n .loose();\n\nexport type ClientCapabilities = z.infer<typeof ClientCapabilitiesSchema>;\nexport type ElicitationCapability = z.infer<typeof ElicitationCapabilitySchema>;\n\nexport const InitializeResultSchema = ResultSchema.extend({\n protocolVersion: z.string(),\n capabilities: ServerCapabilitiesSchema,\n serverInfo: ClientOrServerImplementationSchema,\n instructions: z.optional(z.string()),\n});\nexport type InitializeResult = z.infer<typeof InitializeResultSchema>;\n\nexport type PaginatedRequest = Request & {\n params?: BaseParams & {\n cursor?: string;\n };\n};\n\nconst PaginatedResultSchema = ResultSchema.extend({\n nextCursor: z.optional(z.string()),\n});\n\nconst ToolSchema = z\n .object({\n name: z.string(),\n /**\n * @see https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool\n */\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n inputSchema: z\n .object({\n type: z.literal('object'),\n properties: z.optional(z.object({}).loose()),\n })\n .loose(),\n /**\n * @see https://modelcontextprotocol.io/specification/2025-06-18/server/tools#output-schema\n */\n outputSchema: z.optional(z.object({}).loose()),\n annotations: z.optional(\n z\n .object({\n title: z.optional(z.string()),\n })\n .loose(),\n ),\n _meta: ToolMetaSchema,\n })\n .loose();\nexport type MCPTool = z.infer<typeof ToolSchema>;\nexport const ListToolsResultSchema = PaginatedResultSchema.extend({\n tools: z.array(ToolSchema),\n});\nexport type ListToolsResult = z.infer<typeof ListToolsResultSchema>;\n\nconst TextContentSchema = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n })\n .loose();\nconst ImageContentSchema = z\n .object({\n type: z.literal('image'),\n data: z.base64(),\n mimeType: z.string(),\n })\n .loose();\nexport const ResourceSchema = z\n .object({\n uri: z.string(),\n name: z.string(),\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n mimeType: z.optional(z.string()),\n size: z.optional(z.number()),\n })\n .loose();\nexport type MCPResource = z.infer<typeof ResourceSchema>;\n\nexport const ListResourcesResultSchema = PaginatedResultSchema.extend({\n resources: z.array(ResourceSchema),\n});\nexport type ListResourcesResult = z.infer<typeof ListResourcesResultSchema>;\n\nconst ResourceContentsSchema = z\n .object({\n /**\n * The URI of this resource.\n */\n uri: z.string(),\n /**\n * Optional display name of the resource content.\n */\n name: z.optional(z.string()),\n /**\n * Optional human readable title.\n */\n title: z.optional(z.string()),\n /**\n * The MIME type of this resource, if known.\n */\n mimeType: z.optional(z.string()),\n })\n .loose();\nconst TextResourceContentsSchema = ResourceContentsSchema.extend({\n text: z.string(),\n});\nconst BlobResourceContentsSchema = ResourceContentsSchema.extend({\n blob: z.base64(),\n});\nconst EmbeddedResourceSchema = z\n .object({\n type: z.literal('resource'),\n resource: z.union([TextResourceContentsSchema, BlobResourceContentsSchema]),\n })\n .loose();\nconst ResourceLinkContentSchema = z\n .object({\n type: z.literal('resource_link'),\n uri: z.string(),\n name: z.string(),\n description: z.optional(z.string()),\n mimeType: z.optional(z.string()),\n })\n .loose();\n\nexport const CallToolResultSchema = ResultSchema.extend({\n content: z.array(\n z.union([\n TextContentSchema,\n ImageContentSchema,\n EmbeddedResourceSchema,\n ResourceLinkContentSchema,\n ]),\n ),\n /**\n * @see https://modelcontextprotocol.io/specification/2025-06-18/server/tools#structured-content\n */\n structuredContent: z.optional(z.unknown()),\n isError: z.boolean().default(false).optional(),\n}).or(\n ResultSchema.extend({\n toolResult: z.unknown(),\n }),\n);\nexport type CallToolResult = z.infer<typeof CallToolResultSchema>;\n\nconst ResourceTemplateSchema = z\n .object({\n uriTemplate: z.string(),\n name: z.string(),\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n mimeType: z.optional(z.string()),\n })\n .loose();\n\nexport const ListResourceTemplatesResultSchema = ResultSchema.extend({\n resourceTemplates: z.array(ResourceTemplateSchema),\n});\nexport type ListResourceTemplatesResult = z.infer<\n typeof ListResourceTemplatesResultSchema\n>;\n\nexport const ReadResourceResultSchema = ResultSchema.extend({\n contents: z.array(\n z.union([TextResourceContentsSchema, BlobResourceContentsSchema]),\n ),\n});\nexport type ReadResourceResult = z.infer<typeof ReadResourceResultSchema>;\n\n// Prompts\nconst PromptArgumentSchema = z\n .object({\n name: z.string(),\n description: z.optional(z.string()),\n required: z.optional(z.boolean()),\n })\n .loose();\n\nexport const PromptSchema = z\n .object({\n name: z.string(),\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n arguments: z.optional(z.array(PromptArgumentSchema)),\n })\n .loose();\nexport type MCPPrompt = z.infer<typeof PromptSchema>;\n\nexport const ListPromptsResultSchema = PaginatedResultSchema.extend({\n prompts: z.array(PromptSchema),\n});\nexport type ListPromptsResult = z.infer<typeof ListPromptsResultSchema>;\n\nconst PromptMessageSchema = z\n .object({\n role: z.union([z.literal('user'), z.literal('assistant')]),\n content: z.union([\n TextContentSchema,\n ImageContentSchema,\n EmbeddedResourceSchema,\n ResourceLinkContentSchema,\n ]),\n })\n .loose();\nexport type MCPPromptMessage = z.infer<typeof PromptMessageSchema>;\n\nexport const GetPromptResultSchema = ResultSchema.extend({\n description: z.optional(z.string()),\n messages: z.array(PromptMessageSchema),\n});\nexport type GetPromptResult = z.infer<typeof GetPromptResultSchema>;\n\nconst ElicitationRequestParamsSchema = BaseParamsSchema.extend({\n message: z.string(),\n requestedSchema: z.unknown(),\n});\n\nexport const ElicitationRequestSchema = RequestSchema.extend({\n method: z.literal('elicitation/create'),\n params: ElicitationRequestParamsSchema,\n});\n\nexport type ElicitationRequest = z.infer<typeof ElicitationRequestSchema>;\n\nexport const ElicitResultSchema = ResultSchema.extend({\n action: z.union([\n z.literal('accept'),\n z.literal('decline'),\n z.literal('cancel'),\n ]),\n content: z.optional(z.record(z.string(), z.unknown())),\n});\n\nexport type ElicitResult = z.infer<typeof ElicitResultSchema>;\n","declare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import pkceChallenge from 'pkce-challenge';\nimport {\n OAuthProtectedResourceMetadataSchema,\n OAuthMetadataSchema,\n OpenIdProviderDiscoveryMetadataSchema,\n OAuthTokensSchema,\n OAuthErrorResponseSchema,\n OAuthClientInformationFullSchema,\n type OAuthTokens,\n type OAuthProtectedResourceMetadata,\n type AuthorizationServerMetadata,\n type OAuthClientInformation,\n type OAuthClientMetadata,\n type OAuthClientInformationFull,\n} from './oauth-types';\nimport {\n MCPClientOAuthError,\n ServerError,\n OAUTH_ERRORS,\n InvalidClientError,\n InvalidGrantError,\n UnauthorizedClientError,\n} from '../error/oauth-error';\nimport {\n resourceUrlFromServerUrl,\n checkResourceAllowed,\n resourceUrlStripSlash,\n} from '../util/oauth-util';\nimport { LATEST_PROTOCOL_VERSION } from './types';\nimport { parseJSON, type FetchFunction } from '@ai-sdk/provider-utils';\nexport type AuthResult = 'AUTHORIZED' | 'REDIRECT';\n\nexport interface OAuthAuthorizationServerInformation {\n authorizationServerUrl: string;\n tokenEndpoint: string;\n}\n\nexport interface OAuthClientProvider {\n /**\n * Returns current access token if present; undefined otherwise.\n */\n tokens(): OAuthTokens | undefined | Promise<OAuthTokens | undefined>;\n saveTokens(tokens: OAuthTokens): void | Promise<void>;\n redirectToAuthorization(authorizationUrl: URL): void | Promise<void>;\n saveCodeVerifier(codeVerifier: string): void | Promise<void>;\n codeVerifier(): string | Promise<string>;\n\n /**\n * Adds custom client authentication to OAuth token requests.\n *\n * This optional method allows implementations to customize how client credentials\n * are included in token exchange and refresh requests. When provided, this method\n * is called instead of the default authentication logic, giving full control over\n * the authentication mechanism.\n *\n * Common use cases include:\n * - Supporting authentication methods beyond the standard OAuth 2.0 methods\n * - Adding custom headers for proprietary authentication schemes\n * - Implementing client assertion-based authentication (e.g., JWT bearer tokens)\n *\n * @param headers - The request headers (can be modified to add authentication)\n * @param params - The request body parameters (can be modified to add credentials)\n * @param url - The token endpoint URL being called\n * @param metadata - Optional OAuth metadata for the server, which may include supported authentication methods\n */\n addClientAuthentication?(\n headers: Headers,\n params: URLSearchParams,\n url: string | URL,\n metadata?: AuthorizationServerMetadata,\n ): void | Promise<void>;\n\n /**\n * If implemented, provides a way for the client to invalidate (e.g. delete) the specified\n * credentials, in the case where the server has indicated that they are no longer valid.\n * This avoids requiring the user to intervene manually.\n */\n invalidateCredentials?(\n scope: 'all' | 'client' | 'tokens' | 'verifier',\n ): void | Promise<void>;\n get redirectUrl(): string | URL;\n get clientMetadata(): OAuthClientMetadata;\n clientInformation():\n | OAuthClientInformation\n | undefined\n | Promise<OAuthClientInformation | undefined>;\n saveClientInformation?(\n clientInformation: OAuthClientInformation,\n ): void | Promise<void>;\n authorizationServerInformation?():\n | OAuthAuthorizationServerInformation\n | undefined\n | Promise<OAuthAuthorizationServerInformation | undefined>;\n saveAuthorizationServerInformation?(\n authorizationServerInformation: OAuthAuthorizationServerInformation,\n ): void | Promise<void>;\n /**\n * Validates an authorization server URL discovered from MCP protected resource\n * metadata before the client fetches its OAuth metadata.\n */\n validateAuthorizationServerURL?(\n serverUrl: string | URL,\n authorizationServerUrl: string | URL,\n ): void | Promise<void>;\n state?(): string | Promise<string>;\n saveState?(state: string): void | Promise<void>;\n storedState?(): string | undefined | Promise<string | undefined>;\n validateResourceURL?(\n serverUrl: string | URL,\n resource?: string,\n ): Promise<URL | undefined>;\n}\n\nexport class UnauthorizedError extends Error {\n constructor(message = 'Unauthorized') {\n super(message);\n this.name = 'UnauthorizedError';\n }\n}\n\nfunction normalizeUrl(url: string | URL): string {\n return new URL(url).href;\n}\n\nfunction createAuthorizationServerInformation(\n authorizationServerUrl: string | URL,\n metadata?: AuthorizationServerMetadata,\n): OAuthAuthorizationServerInformation {\n return {\n authorizationServerUrl: normalizeUrl(authorizationServerUrl),\n tokenEndpoint: normalizeUrl(\n metadata?.token_endpoint\n ? new URL(metadata.token_endpoint)\n : new URL('/token', authorizationServerUrl),\n ),\n };\n}\n\nfunction addAuthorizationServerInformationToTokens(\n tokens: OAuthTokens,\n authorizationServerInformation: OAuthAuthorizationServerInformation,\n): OAuthTokens {\n return {\n ...tokens,\n authorization_server: authorizationServerInformation.authorizationServerUrl,\n token_endpoint: authorizationServerInformation.tokenEndpoint,\n };\n}\n\nfunction addAuthorizationServerInformationToClientInformation<\n CLIENT_INFORMATION extends OAuthClientInformation,\n>(\n clientInformation: CLIENT_INFORMATION,\n authorizationServerInformation: OAuthAuthorizationServerInformation,\n): CLIENT_INFORMATION {\n return {\n ...clientInformation,\n authorization_server: authorizationServerInformation.authorizationServerUrl,\n token_endpoint: authorizationServerInformation.tokenEndpoint,\n };\n}\n\nfunction getAuthorizationServerInformationFromCredentials(credentials?: {\n authorization_server?: string;\n token_endpoint?: string;\n}): OAuthAuthorizationServerInformation | undefined {\n if (!credentials?.authorization_server || !credentials.token_endpoint) {\n return undefined;\n }\n\n return {\n authorizationServerUrl: normalizeUrl(credentials.authorization_server),\n tokenEndpoint: normalizeUrl(credentials.token_endpoint),\n };\n}\n\nasync function getStoredAuthorizationServerInformation({\n provider,\n clientInformation,\n tokens,\n}: {\n provider: OAuthClientProvider;\n clientInformation: OAuthClientInformation;\n tokens?: OAuthTokens;\n}): Promise<OAuthAuthorizationServerInformation | undefined> {\n const tokenAuthorizationServerInformation =\n getAuthorizationServerInformationFromCredentials(tokens);\n if (tokenAuthorizationServerInformation) {\n return tokenAuthorizationServerInformation;\n }\n\n const providerAuthorizationServerInformation =\n await provider.authorizationServerInformation?.();\n if (providerAuthorizationServerInformation) {\n return {\n authorizationServerUrl: normalizeUrl(\n providerAuthorizationServerInformation.authorizationServerUrl,\n ),\n tokenEndpoint: normalizeUrl(\n providerAuthorizationServerInformation.tokenEndpoint,\n ),\n };\n }\n\n return getAuthorizationServerInformationFromCredentials(clientInformation);\n}\n\nasync function saveAuthorizationServerInformation({\n provider,\n clientInformation,\n authorizationServerInformation,\n}: {\n provider: OAuthClientProvider;\n clientInformation: OAuthClientInformation;\n authorizationServerInformation: OAuthAuthorizationServerInformation;\n}): Promise<boolean> {\n if (provider.saveAuthorizationServerInformation) {\n await provider.saveAuthorizationServerInformation(\n authorizationServerInformation,\n );\n return true;\n }\n\n if (provider.saveClientInformation) {\n await provider.saveClientInformation(\n addAuthorizationServerInformationToClientInformation(\n clientInformation,\n authorizationServerInformation,\n ),\n );\n return true;\n }\n\n return false;\n}\n\nfunction assertResourceMetadataUrlSameOrigin(\n serverUrl: string | URL,\n resourceMetadataUrl?: URL,\n): void {\n if (!resourceMetadataUrl) {\n return;\n }\n\n const expectedOrigin = new URL(serverUrl).origin;\n if (resourceMetadataUrl.origin !== expectedOrigin) {\n throw new MCPClientOAuthError({\n message: `OAuth protected resource metadata URL ${resourceMetadataUrl.href} must have the same origin as the MCP server URL ${expectedOrigin}`,\n });\n }\n}\n\nfunction assertAuthorizationServerInformationMatches({\n storedAuthorizationServerInformation,\n currentAuthorizationServerInformation,\n}: {\n storedAuthorizationServerInformation: OAuthAuthorizationServerInformation;\n currentAuthorizationServerInformation: OAuthAuthorizationServerInformation;\n}): void {\n if (\n storedAuthorizationServerInformation.authorizationServerUrl !==\n currentAuthorizationServerInformation.authorizationServerUrl ||\n storedAuthorizationServerInformation.tokenEndpoint !==\n currentAuthorizationServerInformation.tokenEndpoint\n ) {\n throw new MCPClientOAuthError({\n message:\n 'OAuth authorization server metadata does not match the metadata that issued the stored credentials',\n });\n }\n}\n\n/**\n * Extracts the OAuth 2.0 Protected Resource Metadata URL from a WWW-Authenticate header (RFC9728).\n * Looks for a resource=\"...\" parameter.\n */\nexport function extractResourceMetadataUrl(\n response: Response,\n): URL | undefined {\n const header =\n response.headers.get('www-authenticate') ??\n response.headers.get('WWW-Authenticate');\n if (!header) {\n return undefined;\n }\n\n const [type, scheme] = header.split(' ');\n if (type.toLowerCase() !== 'bearer' || !scheme) {\n return undefined;\n }\n\n // regex taken from MCP spec\n const regex = /resource_metadata=\"([^\"]*)\"/;\n const match = header.match(regex);\n if (!match) {\n return undefined;\n }\n\n try {\n return new URL(match[1]);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Constructs the well-known path for auth-related metadata discovery\n */\nfunction buildWellKnownPath(\n wellKnownPrefix:\n | 'oauth-authorization-server'\n | 'oauth-protected-resource'\n | 'openid-configuration',\n pathname: string = '',\n options: { prependPathname?: boolean } = {},\n): string {\n if (pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1);\n }\n\n return options.prependPathname\n ? `${pathname}/.well-known/${wellKnownPrefix}`\n : `/.well-known/${wellKnownPrefix}${pathname}`;\n}\n\nasync function fetchWithCorsRetry(\n url: URL,\n headers?: Record<string, string>,\n fetchFn: FetchFunction = fetch,\n): Promise<Response | undefined> {\n try {\n return await fetchFn(url, { headers });\n } catch (error) {\n if (error instanceof TypeError) {\n if (headers) {\n return fetchWithCorsRetry(url, undefined, fetchFn);\n } else {\n return undefined;\n }\n }\n throw error;\n }\n}\n\n/**\n * Tries to discover OAuth metadata at a specific URL\n */\nasync function tryMetadataDiscovery(\n url: URL,\n protocolVersion: string,\n fetchFn: FetchFunction = fetch,\n): Promise<Response | undefined> {\n const headers = {\n 'MCP-Protocol-Version': protocolVersion,\n };\n return await fetchWithCorsRetry(url, headers, fetchFn);\n}\n\n/**\n * Determines if fallback to root discovery should be attempted\n */\nfunction shouldAttemptFallback(\n response: Response | undefined,\n pathname: string,\n): boolean {\n return (\n !response ||\n (response.status >= 400 && response.status < 500 && pathname !== '/')\n );\n}\n\n/**\n * Generic function for discovering OAuth metadata with fallback support\n */\nasync function discoverMetadataWithFallback(\n serverUrl: string | URL,\n wellKnownType: 'oauth-authorization-server' | 'oauth-protected-resource',\n fetchFn: FetchFunction,\n opts?: {\n protocolVersion?: string;\n metadataUrl?: string | URL;\n metadataServerUrl?: string | URL;\n },\n): Promise<Response | undefined> {\n const issuer = new URL(serverUrl);\n const protocolVersion = opts?.protocolVersion ?? LATEST_PROTOCOL_VERSION;\n\n let url: URL;\n if (opts?.metadataUrl) {\n url = new URL(opts.metadataUrl);\n } else {\n const wellKnownPath = buildWellKnownPath(wellKnownType, issuer.pathname);\n url = new URL(wellKnownPath, opts?.metadataServerUrl ?? issuer);\n url.search = issuer.search;\n }\n\n let response = await tryMetadataDiscovery(url, protocolVersion, fetchFn);\n\n if (!opts?.metadataUrl && shouldAttemptFallback(response, issuer.pathname)) {\n const rootUrl = new URL(`/.well-known/${wellKnownType}`, issuer);\n response = await tryMetadataDiscovery(rootUrl, protocolVersion, fetchFn);\n }\n\n return response;\n}\n\nexport async function discoverOAuthProtectedResourceMetadata(\n serverUrl: string | URL,\n opts?: { protocolVersion?: string; resourceMetadataUrl?: string | URL },\n fetchFn: FetchFunction = fetch,\n): Promise<OAuthProtectedResourceMetadata> {\n const response = await discoverMetadataWithFallback(\n serverUrl,\n 'oauth-protected-resource',\n fetchFn,\n {\n protocolVersion: opts?.protocolVersion,\n metadataUrl: opts?.resourceMetadataUrl,\n },\n );\n\n if (!response || response.status === 404) {\n throw new Error(\n `Resource server does not implement OAuth 2.0 Protected Resource Metadata.`,\n );\n }\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status} trying to load well-known OAuth protected resource metadata.`,\n );\n }\n return OAuthProtectedResourceMetadataSchema.parse(await response.json());\n}\n\n/**\n * Builds a list of discovery URLs to try for authorization server metadata.\n * URLs are returned in priority order:\n * 1. OAuth metadata at the given URL\n * 2. OAuth metadata at root (if URL has path)\n * 3. OIDC metadata endpoints\n */\nexport function buildDiscoveryUrls(\n authorizationServerUrl: string | URL,\n): { url: URL; type: 'oauth' | 'oidc' }[] {\n const url =\n typeof authorizationServerUrl === 'string'\n ? new URL(authorizationServerUrl)\n : authorizationServerUrl;\n const hasPath = url.pathname !== '/';\n const urlsToTry: { url: URL; type: 'oauth' | 'oidc' }[] = [];\n\n if (!hasPath) {\n urlsToTry.push({\n url: new URL('/.well-known/oauth-authorization-server', url.origin),\n type: 'oauth',\n });\n\n urlsToTry.push({\n url: new URL('/.well-known/openid-configuration', url.origin),\n type: 'oidc',\n });\n\n return urlsToTry;\n }\n\n let pathname = url.pathname;\n if (pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1);\n }\n\n urlsToTry.push({\n url: new URL(\n `/.well-known/oauth-authorization-server${pathname}`,\n url.origin,\n ),\n type: 'oauth',\n });\n\n urlsToTry.push({\n url: new URL('/.well-known/oauth-authorization-server', url.origin),\n type: 'oauth',\n });\n\n urlsToTry.push({\n url: new URL(`/.well-known/openid-configuration${pathname}`, url.origin),\n type: 'oidc',\n });\n\n urlsToTry.push({\n url: new URL(`${pathname}/.well-known/openid-configuration`, url.origin),\n type: 'oidc',\n });\n\n return urlsToTry;\n}\n\nexport async function discoverAuthorizationServerMetadata(\n authorizationServerUrl: string | URL,\n {\n fetchFn = fetch,\n protocolVersion = LATEST_PROTOCOL_VERSION,\n }: {\n fetchFn?: FetchFunction;\n protocolVersion?: string;\n } = {},\n): Promise<AuthorizationServerMetadata | undefined> {\n const headers = { 'MCP-Protocol-Version': protocolVersion };\n\n const urlsToTry = buildDiscoveryUrls(authorizationServerUrl);\n\n for (const { url: endpointUrl, type } of urlsToTry) {\n const response = await fetchWithCorsRetry(endpointUrl, headers, fetchFn);\n\n if (!response) {\n /**\n * CORS error occurred - don't throw as the endpoint may not allow CORS,\n * continue trying other possible endpoints\n */\n continue;\n }\n\n if (!response.ok) {\n // Continue looking for any 4xx response code.\n if (response.status >= 400 && response.status < 500) {\n continue;\n }\n throw new Error(\n `HTTP ${response.status} trying to load ${type === 'oauth' ? 'OAuth' : 'OpenID provider'} metadata from ${endpointUrl}`,\n );\n }\n\n if (type === 'oauth') {\n return OAuthMetadataSchema.parse(await response.json());\n } else {\n const metadata = OpenIdProviderDiscoveryMetadataSchema.parse(\n await response.json(),\n );\n\n // MCP spec requires OIDC providers to support S256 PKCE\n if (!metadata.code_challenge_methods_supported?.includes('S256')) {\n throw new Error(\n `Incompatible OIDC provider at ${endpointUrl}: does not support S256 code challenge method required by MCP specification`,\n );\n }\n\n return metadata;\n }\n }\n\n return undefined;\n}\n\nexport async function startAuthorization(\n authorizationServerUrl: string | URL,\n {\n metadata,\n clientInformation,\n redirectUrl,\n scope,\n state,\n resource,\n }: {\n metadata?: AuthorizationServerMetadata;\n clientInformation: OAuthClientInformation;\n redirectUrl: string | URL;\n scope?: string;\n state?: string;\n resource?: URL;\n },\n): Promise<{ authorizationUrl: URL; codeVerifier: string }> {\n const responseType = 'code';\n const codeChallengeMethod = 'S256';\n\n let authorizationUrl: URL;\n if (metadata) {\n authorizationUrl = new URL(metadata.authorization_endpoint);\n\n if (!metadata.response_types_supported.includes(responseType)) {\n throw new Error(\n `Incompatible auth server: does not support response type ${responseType}`,\n );\n }\n\n if (\n !metadata.code_challenge_methods_supported ||\n !metadata.code_challenge_methods_supported.includes(codeChallengeMethod)\n ) {\n throw new Error(\n `Incompatible auth server: does not support code challenge method ${codeChallengeMethod}`,\n );\n }\n } else {\n authorizationUrl = new URL('/authorize', authorizationServerUrl);\n }\n\n const challenge = await pkceChallenge();\n const codeVerifier = challenge.code_verifier;\n const codeChallenge = challenge.code_challenge;\n\n authorizationUrl.searchParams.set('response_type', responseType);\n authorizationUrl.searchParams.set('client_id', clientInformation.client_id);\n authorizationUrl.searchParams.set('code_challenge', codeChallenge);\n authorizationUrl.searchParams.set(\n 'code_challenge_method',\n codeChallengeMethod,\n );\n authorizationUrl.searchParams.set('redirect_uri', String(redirectUrl));\n\n if (state) {\n authorizationUrl.searchParams.set('state', state);\n }\n\n if (scope) {\n authorizationUrl.searchParams.set('scope', scope);\n }\n\n if (scope?.includes('offline_access')) {\n // if the request includes the OIDC-only \"offline_access\" scope,\n // we need to set the prompt to \"consent\" to ensure the user is prompted to grant offline access\n // https://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess\n authorizationUrl.searchParams.append('prompt', 'consent');\n }\n\n if (resource) {\n authorizationUrl.searchParams.set(\n 'resource',\n resourceUrlStripSlash(resource),\n );\n }\n\n return { authorizationUrl, codeVerifier };\n}\n\ntype ClientAuthMethod = 'client_secret_basic' | 'client_secret_post' | 'none';\n\n/**\n * Determines the best client authentication method to use based on server support and client configuration.\n *\n * Priority order (highest to lowest):\n * 1. client_secret_basic (if client secret is available)\n * 2. client_secret_post (if client secret is available)\n * 3. none (for public clients)\n *\n * @param clientInformation - OAuth client information containing credentials\n * @param supportedMethods - Authentication methods supported by the authorization server\n * @returns The selected authentication method\n */\nfunction selectClientAuthMethod(\n clientInformation: OAuthClientInformation,\n supportedMethods: string[],\n): ClientAuthMethod {\n const hasClientSecret = clientInformation.client_secret !== undefined;\n\n if (supportedMethods.length === 0) {\n return hasClientSecret ? 'client_secret_post' : 'none';\n }\n\n if (hasClientSecret && supportedMethods.includes('client_secret_basic')) {\n return 'client_secret_basic';\n }\n\n if (hasClientSecret && supportedMethods.includes('client_secret_post')) {\n return 'client_secret_post';\n }\n\n if (supportedMethods.includes('none')) {\n return 'none';\n }\n\n return hasClientSecret ? 'client_secret_post' : 'none';\n}\n\n/**\n * Applies client authentication to the request based on the specified method.\n *\n * Implements OAuth 2.1 client authentication methods:\n * - client_secret_basic: HTTP Basic authentication (RFC 6749 Section 2.3.1)\n * - client_secret_post: Credentials in request body (RFC 6749 Section 2.3.1)\n * - none: Public client authentication (RFC 6749 Section 2.1)\n *\n * @param method - The authentication method to use\n * @param clientInformation - OAuth client information containing credentials\n * @param headers - HTTP headers object to modify\n * @param params - URL search parameters to modify\n * @throws {Error} When required credentials are missing\n */\nfunction applyClientAuthentication(\n method: ClientAuthMethod,\n clientInformation: OAuthClientInformation,\n headers: Headers,\n params: URLSearchParams,\n): void {\n const { client_id, client_secret } = clientInformation;\n\n switch (method) {\n case 'client_secret_basic':\n applyBasicAuth(client_id, client_secret, headers);\n return;\n case 'client_secret_post':\n applyPostAuth(client_id, client_secret, params);\n return;\n case 'none':\n applyPublicAuth(client_id, params);\n return;\n default:\n throw new Error(`Unsupported client authentication method: ${method}`);\n }\n}\n\nfunction applyBasicAuth(\n clientId: string,\n clientSecret: string | undefined,\n headers: Headers,\n): void {\n if (!clientSecret) {\n throw new Error(\n 'client_secret_basic authentication requires a client_secret',\n );\n }\n\n const credentials = btoa(`${clientId}:${clientSecret}`);\n headers.set('Authorization', `Basic ${credentials}`);\n}\n\n/**\n * Applies POST body authentication (RFC 6749 Section 2.3.1)\n */\nfunction applyPostAuth(\n clientId: string,\n clientSecret: string | undefined,\n params: URLSearchParams,\n): void {\n params.set('client_id', clientId);\n if (clientSecret) {\n params.set('client_secret', clientSecret);\n }\n}\n\n/**\n * Applies public client authentication (RFC 6749 Section 2.1)\n */\nfunction applyPublicAuth(clientId: string, params: URLSearchParams): void {\n params.set('client_id', clientId);\n}\n\n/**\n * Parses an OAuth error response from a string or Response object.\n *\n * If the input is a standard OAuth2.0 error response, it will be parsed according to the spec\n * and an instance of the appropriate OAuthError subclass will be returned.\n * If parsing fails, it falls back to a generic ServerError that includes\n * the response status (if available) and original content.\n *\n * @param input - A Response object or string containing the error response\n * @returns A Promise that resolves to an OAuthError instance\n */\nexport async function parseErrorResponse(\n input: Response | string,\n): Promise<MCPClientOAuthError> {\n const statusCode = input instanceof Response ? input.status : undefined;\n const body = input instanceof Response ? await input.text() : input;\n\n try {\n const result = OAuthErrorResponseSchema.parse(\n await parseJSON({ text: body }),\n );\n const { error, error_description, error_uri } = result;\n const errorClass = OAUTH_ERRORS[error] || ServerError;\n return new errorClass({\n message: error_description || '',\n cause: error_uri,\n });\n } catch (error) {\n // Not a valid OAuth error response, but try to inform the user of the raw data anyway\n const errorMessage = `${statusCode ? `HTTP ${statusCode}: ` : ''}Invalid OAuth error response: ${error}. Raw body: ${body}`;\n return new ServerError({ message: errorMessage });\n }\n}\n\n/**\n * Exchanges an authorization code for an access token with the given server.\n *\n * Supports multiple client authentication methods as specified in OAuth 2.1:\n * - Automatically selects the best authentication method based on server support\n * - Falls back to appropriate defaults when server metadata is unavailable\n *\n * @param authorizationServerUrl - The authorization server's base URL\n * @param options - Configuration object containing client info, auth code, etc.\n * @returns Promise resolving to OAuth tokens\n * @throws {Error} When token exchange fails or authentication is invalid\n */\nexport async function exchangeAuthorization(\n authorizationServerUrl: string | URL,\n {\n metadata,\n clientInformation,\n authorizationCode,\n codeVerifier,\n redirectUri,\n resource,\n addClientAuthentication,\n fetchFn,\n }: {\n metadata?: AuthorizationServerMetadata;\n clientInformation: OAuthClientInformation;\n authorizationCode: string;\n codeVerifier: string;\n redirectUri: string | URL;\n resource?: URL;\n addClientAuthentication?: OAuthClientProvider['addClientAuthentication'];\n fetchFn?: FetchFunction;\n },\n): Promise<OAuthTokens> {\n const grantType = 'authorization_code';\n\n const tokenUrl = metadata?.token_endpoint\n ? new URL(metadata.token_endpoint)\n : new URL('/token', authorizationServerUrl);\n\n if (\n metadata?.grant_types_supported &&\n !metadata.grant_types_supported.includes(grantType)\n ) {\n throw new Error(\n `Incompatible auth server: does not support grant type ${grantType}`,\n );\n }\n\n const headers = new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n });\n const params = new URLSearchParams({\n grant_type: grantType,\n code: authorizationCode,\n code_verifier: codeVerifier,\n redirect_uri: String(redirectUri),\n });\n\n if (addClientAuthentication) {\n await addClientAuthentication(\n headers,\n params,\n authorizationServerUrl,\n metadata,\n );\n } else {\n const supportedMethods =\n metadata?.token_endpoint_auth_methods_supported ?? [];\n const authMethod = selectClientAuthMethod(\n clientInformation,\n supportedMethods,\n );\n\n applyClientAuthentication(authMethod, clientInformation, headers, params);\n }\n\n if (resource) {\n params.set('resource', resourceUrlStripSlash(resource));\n }\n\n const response = await (fetchFn ?? fetch)(tokenUrl, {\n method: 'POST',\n headers,\n body: params,\n });\n\n if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n return OAuthTokensSchema.parse(await response.json());\n}\n\n/**\n * Exchange a refresh token for an updated access token.\n *\n * Supports multiple client authentication methods as specified in OAuth 2.1:\n * - Automatically selects the best authentication method based on server support\n * - Preserves the original refresh token if a new one is not returned\n *\n * @param authorizationServerUrl - The authorization server's base URL\n * @param options - Configuration object containing client info, refresh token, etc.\n * @returns Promise resolving to OAuth tokens (preserves original refresh_token if not replaced)\n * @throws {Error} When token refresh fails or authentication is invalid\n */\nexport async function refreshAuthorization(\n authorizationServerUrl: string | URL,\n {\n metadata,\n clientInformation,\n refreshToken,\n resource,\n addClientAuthentication,\n fetchFn,\n }: {\n metadata?: AuthorizationServerMetadata;\n clientInformation: OAuthClientInformation;\n refreshToken: string;\n resource?: URL;\n addClientAuthentication?: OAuthClientProvider['addClientAuthentication'];\n fetchFn?: FetchFunction;\n },\n): Promise<OAuthTokens> {\n const grantType = 'refresh_token';\n\n let tokenUrl: URL;\n if (metadata) {\n tokenUrl = new URL(metadata.token_endpoint);\n\n if (\n metadata.grant_types_supported &&\n !metadata.grant_types_supported.includes(grantType)\n ) {\n throw new Error(\n `Incompatible auth server: does not support grant type ${grantType}`,\n );\n }\n } else {\n tokenUrl = new URL('/token', authorizationServerUrl);\n }\n\n const headers = new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n });\n const params = new URLSearchParams({\n grant_type: grantType,\n refresh_token: refreshToken,\n });\n\n if (addClientAuthentication) {\n await addClientAuthentication(\n headers,\n params,\n authorizationServerUrl,\n metadata,\n );\n } else {\n const supportedMethods =\n metadata?.token_endpoint_auth_methods_supported ?? [];\n const authMethod = selectClientAuthMethod(\n clientInformation,\n supportedMethods,\n );\n\n applyClientAuthentication(authMethod, clientInformation, headers, params);\n }\n\n if (resource) {\n params.set('resource', resourceUrlStripSlash(resource));\n }\n\n const response = await (fetchFn ?? fetch)(tokenUrl, {\n method: 'POST',\n headers,\n body: params,\n });\n if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n return OAuthTokensSchema.parse({\n refresh_token: refreshToken,\n ...(await response.json()),\n });\n}\n\n/**\n * Performs OAuth 2.0 Dynamic Client Registration according to RFC 7591.\n */\nexport async function registerClient(\n authorizationServerUrl: string | URL,\n {\n metadata,\n clientMetadata,\n fetchFn,\n }: {\n metadata?: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: FetchFunction;\n },\n): Promise<OAuthClientInformationFull> {\n let registrationUrl: URL;\n\n if (metadata) {\n if (!metadata.registration_endpoint) {\n throw new Error(\n 'Incompatible auth server: does not support dynamic client registration',\n );\n }\n\n registrationUrl = new URL(metadata.registration_endpoint);\n } else {\n registrationUrl = new URL('/register', authorizationServerUrl);\n }\n\n const response = await (fetchFn ?? fetch)(registrationUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(clientMetadata),\n });\n\n if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n return OAuthClientInformationFullSchema.parse(await response.json());\n}\n\nexport async function auth(\n provider: OAuthClientProvider,\n options: {\n serverUrl: string | URL;\n authorizationCode?: string;\n callbackState?: string;\n scope?: string;\n resourceMetadataUrl?: URL;\n fetchFn?: FetchFunction;\n },\n): Promise<AuthResult> {\n try {\n return await authInternal(provider, options);\n } catch (error) {\n if (\n error instanceof InvalidClientError ||\n error instanceof UnauthorizedClientError\n ) {\n await provider.invalidateCredentials?.('all');\n return await authInternal(provider, options);\n } else if (error instanceof InvalidGrantError) {\n await provider.invalidateCredentials?.('tokens');\n return await authInternal(provider, options);\n }\n\n throw error;\n }\n}\n\nexport async function selectResourceURL(\n serverUrl: string | URL,\n provider: OAuthClientProvider,\n resourceMetadata?: OAuthProtectedResourceMetadata,\n): Promise<URL | undefined> {\n const defaultResource = resourceUrlFromServerUrl(serverUrl);\n\n if (provider.validateResourceURL) {\n return await provider.validateResourceURL(\n defaultResource,\n resourceMetadata?.resource,\n );\n }\n\n if (!resourceMetadata) {\n return undefined;\n }\n\n if (\n !checkResourceAllowed({\n requestedResource: defaultResource,\n configuredResource: resourceMetadata.resource,\n })\n ) {\n throw new Error(\n `Protected resource ${resourceMetadata.resource} does not match expected ${defaultResource} (or origin)`,\n );\n }\n return new URL(resourceMetadata.resource);\n}\n\nasync function authInternal(\n provider: OAuthClientProvider,\n {\n serverUrl,\n authorizationCode,\n callbackState,\n scope,\n resourceMetadataUrl,\n fetchFn,\n }: {\n serverUrl: string | URL;\n authorizationCode?: string;\n callbackState?: string;\n scope?: string;\n resourceMetadataUrl?: URL;\n fetchFn?: FetchFunction;\n },\n): Promise<AuthResult> {\n let resourceMetadata: OAuthProtectedResourceMetadata | undefined;\n let authorizationServerUrl: string | URL | undefined;\n\n /** Reject Protected Resource Metadata URLs outside the configured MCP server origin. */\n assertResourceMetadataUrlSameOrigin(serverUrl, resourceMetadataUrl);\n\n /** Discover PRM and select its advertised authorization server. */\n try {\n resourceMetadata = await discoverOAuthProtectedResourceMetadata(\n serverUrl,\n { resourceMetadataUrl },\n fetchFn,\n );\n if (\n resourceMetadata.authorization_servers &&\n resourceMetadata.authorization_servers.length > 0\n ) {\n authorizationServerUrl = resourceMetadata.authorization_servers[0];\n }\n } catch {}\n\n /** Fall back to legacy MCP behavior where the MCP server is the Authorization Server */\n if (!authorizationServerUrl) {\n authorizationServerUrl = serverUrl;\n }\n\n /** Validate and select the resource value sent to the AS */\n const resource: URL | undefined = await selectResourceURL(\n serverUrl,\n provider,\n resourceMetadata,\n );\n\n /** Let applications constrain discovered AS URLs before metadata fetches. */\n await provider.validateAuthorizationServerURL?.(\n serverUrl,\n authorizationServerUrl,\n );\n\n /** Discover AS metadata and derive the credential pin for this flow */\n const metadata = await discoverAuthorizationServerMetadata(\n authorizationServerUrl,\n {\n fetchFn,\n },\n );\n const currentAuthorizationServerInformation =\n createAuthorizationServerInformation(authorizationServerUrl, metadata);\n\n /** Load or register client credentials with the AS pin attached. */\n let clientInformation = await Promise.resolve(provider.clientInformation());\n if (!clientInformation) {\n if (authorizationCode !== undefined) {\n throw new Error(\n 'Existing OAuth client information is required when exchanging an authorization code',\n );\n }\n\n if (!provider.saveClientInformation) {\n throw new Error(\n 'OAuth client information must be saveable for dynamic registration',\n );\n }\n\n const fullInformation = await registerClient(authorizationServerUrl, {\n metadata,\n clientMetadata: provider.clientMetadata,\n fetchFn,\n });\n\n clientInformation = addAuthorizationServerInformationToClientInformation(\n fullInformation,\n currentAuthorizationServerInformation,\n );\n await provider.saveClientInformation(clientInformation);\n }\n\n /** On callback, validate state and AS pin before code exchange */\n if (authorizationCode !== undefined) {\n if (provider.storedState) {\n const expectedState = await provider.storedState();\n if (expectedState !== undefined && expectedState !== callbackState) {\n throw new Error(\n 'OAuth state parameter mismatch - possible CSRF attack',\n );\n }\n }\n\n const storedAuthorizationServerInformation =\n await getStoredAuthorizationServerInformation({\n provider,\n clientInformation,\n });\n if (!storedAuthorizationServerInformation) {\n throw new MCPClientOAuthError({\n message:\n 'Stored OAuth authorization server metadata is required when exchanging an authorization code',\n });\n }\n assertAuthorizationServerInformationMatches({\n storedAuthorizationServerInformation,\n currentAuthorizationServerInformation,\n });\n\n const codeVerifier = await provider.codeVerifier();\n const tokens = await exchangeAuthorization(authorizationServerUrl, {\n metadata,\n clientInformation,\n authorizationCode,\n codeVerifier,\n redirectUri: provider.redirectUrl,\n resource,\n addClientAuthentication: provider.addClientAuthentication,\n fetchFn: fetchFn,\n });\n\n await provider.saveTokens(\n addAuthorizationServerInformationToTokens(\n tokens,\n currentAuthorizationServerInformation,\n ),\n );\n return 'AUTHORIZED';\n }\n\n const tokens = await provider.tokens();\n\n /** Refresh only when stored credentials match the current AS pin */\n if (tokens?.refresh_token) {\n const storedAuthorizationServerInformation =\n await getStoredAuthorizationServerInformation({\n provider,\n clientInformation,\n tokens,\n });\n\n if (storedAuthorizationServerInformation) {\n assertAuthorizationServerInformationMatches({\n storedAuthorizationServerInformation,\n currentAuthorizationServerInformation,\n });\n } else {\n await provider.invalidateCredentials?.('tokens');\n }\n\n try {\n if (storedAuthorizationServerInformation) {\n // Attempt to refresh the token\n const newTokens = await refreshAuthorization(authorizationServerUrl, {\n metadata,\n clientInformation,\n refreshToken: tokens.refresh_token,\n resource,\n addClientAuthentication: provider.addClientAuthentication,\n fetchFn,\n });\n\n await provider.saveTokens(\n addAuthorizationServerInformationToTokens(\n newTokens,\n currentAuthorizationServerInformation,\n ),\n );\n return 'AUTHORIZED';\n }\n } catch (error) {\n if (\n // If this is a ServerError, or an unknown type, log it out and try to continue. Otherwise, escalate so we can fix things and retry.\n !(error instanceof MCPClientOAuthError) ||\n error instanceof ServerError\n ) {\n // Could not refresh OAuth tokens\n } else {\n // Refresh failed for another reason, re-throw\n throw error;\n }\n }\n }\n\n /** Start authorization and persist the AS pin before redirecting */\n const state = provider.state ? await provider.state() : undefined;\n if (state && provider.saveState) {\n await provider.saveState(state);\n }\n\n // Start new authorization flow\n const { authorizationUrl, codeVerifier } = await startAuthorization(\n authorizationServerUrl,\n {\n metadata,\n clientInformation,\n state,\n redirectUrl: provider.redirectUrl,\n scope: scope || provider.clientMetadata.scope,\n resource,\n },\n );\n\n const savedAuthorizationServerInformation =\n await saveAuthorizationServerInformation({\n provider,\n clientInformation,\n authorizationServerInformation: currentAuthorizationServerInformation,\n });\n if (!savedAuthorizationServerInformation) {\n throw new MCPClientOAuthError({\n message:\n 'OAuth authorization server metadata must be saveable before starting authorization',\n });\n }\n\n await provider.saveCodeVerifier(codeVerifier);\n await provider.redirectToAuthorization(authorizationUrl);\n return 'REDIRECT';\n}\n","import { z } from 'zod/v4';\n/**\n * Reusable URL validation that disallows javascript: scheme\n */\nexport const SafeUrlSchema = z\n .string()\n .url()\n .superRefine((val, ctx) => {\n if (!URL.canParse(val)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'URL must be parseable',\n fatal: true,\n });\n\n return z.NEVER;\n }\n })\n .refine(\n url => {\n const parsedUrl = new URL(url);\n return (\n parsedUrl.protocol !== 'javascript:' &&\n parsedUrl.protocol !== 'data:' &&\n parsedUrl.protocol !== 'vbscript:'\n );\n },\n { message: 'URL cannot use javascript:, data:, or vbscript: scheme' },\n );\n\n/**\n * OAuth 2.1 token response\n */\nexport const OAuthTokensSchema = z\n .object({\n access_token: z.string(),\n id_token: z.string().optional(), // Optional for OAuth 2.1, but necessary in OpenID Connect\n token_type: z.string(),\n expires_in: z.number().optional(),\n scope: z.string().optional(),\n refresh_token: z.string().optional(),\n authorization_server: SafeUrlSchema.optional(),\n token_endpoint: SafeUrlSchema.optional(),\n })\n .strip();\n\nexport const OAuthProtectedResourceMetadataSchema = z\n .object({\n resource: z.string().url(),\n authorization_servers: z.array(SafeUrlSchema).optional(),\n jwks_uri: z.string().url().optional(),\n scopes_supported: z.array(z.string()).optional(),\n bearer_methods_supported: z.array(z.string()).optional(),\n resource_signing_alg_values_supported: z.array(z.string()).optional(),\n resource_name: z.string().optional(),\n resource_documentation: z.string().optional(),\n resource_policy_uri: z.string().url().optional(),\n resource_tos_uri: z.string().url().optional(),\n tls_client_certificate_bound_access_tokens: z.boolean().optional(),\n authorization_details_types_supported: z.array(z.string()).optional(),\n dpop_signing_alg_values_supported: z.array(z.string()).optional(),\n dpop_bound_access_tokens_required: z.boolean().optional(),\n })\n .passthrough();\n\nexport const OAuthMetadataSchema = z\n .object({\n issuer: z.string(),\n authorization_endpoint: SafeUrlSchema,\n token_endpoint: SafeUrlSchema,\n registration_endpoint: SafeUrlSchema.optional(),\n scopes_supported: z.array(z.string()).optional(),\n response_types_supported: z.array(z.string()),\n grant_types_supported: z.array(z.string()).optional(),\n code_challenge_methods_supported: z.array(z.string()),\n token_endpoint_auth_methods_supported: z.array(z.string()).optional(),\n token_endpoint_auth_signing_alg_values_supported: z\n .array(z.string())\n .optional(),\n })\n .passthrough();\n\n/**\n * OpenID Connect Discovery 1.0 Provider Metadata\n * see: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata\n */\nexport const OpenIdProviderMetadataSchema = z\n .object({\n issuer: z.string(),\n authorization_endpoint: SafeUrlSchema,\n token_endpoint: SafeUrlSchema,\n userinfo_endpoint: SafeUrlSchema.optional(),\n jwks_uri: SafeUrlSchema,\n registration_endpoint: SafeUrlSchema.optional(),\n scopes_supported: z.array(z.string()).optional(),\n response_types_supported: z.array(z.string()),\n grant_types_supported: z.array(z.string()).optional(),\n subject_types_supported: z.array(z.string()),\n id_token_signing_alg_values_supported: z.array(z.string()),\n claims_supported: z.array(z.string()).optional(),\n token_endpoint_auth_methods_supported: z.array(z.string()).optional(),\n })\n .passthrough();\n\n/**\n * OpenID Connect Discovery metadata that may include OAuth 2.0 fields\n * This schema represents the real-world scenario where OIDC providers\n * return a mix of OpenID Connect and OAuth 2.0 metadata fields\n */\nexport const OpenIdProviderDiscoveryMetadataSchema =\n OpenIdProviderMetadataSchema.merge(\n OAuthMetadataSchema.pick({\n code_challenge_methods_supported: true,\n }),\n );\n\nexport const OAuthClientInformationSchema = z\n .object({\n client_id: z.string(),\n client_secret: z.string().optional(),\n client_id_issued_at: z.number().optional(),\n client_secret_expires_at: z.number().optional(),\n authorization_server: SafeUrlSchema.optional(),\n token_endpoint: SafeUrlSchema.optional(),\n })\n .strip();\n\nexport const OAuthClientMetadataSchema = z\n .object({\n redirect_uris: z.array(SafeUrlSchema),\n token_endpoint_auth_method: z.string().optional(),\n grant_types: z.array(z.string()).optional(),\n response_types: z.array(z.string()).optional(),\n client_name: z.string().optional(),\n client_uri: SafeUrlSchema.optional(),\n logo_uri: SafeUrlSchema.optional(),\n scope: z.string().optional(),\n contacts: z.array(z.string()).optional(),\n tos_uri: SafeUrlSchema.optional(),\n policy_uri: z.string().optional(),\n jwks_uri: SafeUrlSchema.optional(),\n jwks: z.any().optional(),\n software_id: z.string().optional(),\n software_version: z.string().optional(),\n software_statement: z.string().optional(),\n })\n .strip();\n\nexport type OAuthMetadata = z.infer<typeof OAuthMetadataSchema>;\nexport type OpenIdProviderDiscoveryMetadata = z.infer<\n typeof OpenIdProviderDiscoveryMetadataSchema\n>;\nexport type OAuthTokens = z.infer<typeof OAuthTokensSchema>;\nexport type OAuthProtectedResourceMetadata = z.infer<\n typeof OAuthProtectedResourceMetadataSchema\n>;\nexport type OAuthClientInformation = z.infer<\n typeof OAuthClientInformationSchema\n>;\nexport type AuthorizationServerMetadata =\n | OAuthMetadata\n | OpenIdProviderDiscoveryMetadata;\n\nexport const OAuthErrorResponseSchema = z.object({\n error: z.string(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\nexport const OAuthClientInformationFullSchema = OAuthClientMetadataSchema.merge(\n OAuthClientInformationSchema,\n);\nexport type OAuthClientMetadata = z.infer<typeof OAuthClientMetadataSchema>;\nexport type OAuthClientInformationFull = z.infer<\n typeof OAuthClientInformationFullSchema\n>;\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_MCPClientOAuthError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * An error occurred with the MCP client within the OAuth flow.\n */\nexport class MCPClientOAuthError extends AISDKError {\n private readonly [symbol] = true;\n\n constructor({\n name = 'MCPClientOAuthError',\n message,\n cause,\n }: {\n name?: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n }\n\n static isInstance(error: unknown): error is MCPClientOAuthError {\n return AISDKError.hasMarker(error, marker);\n }\n}\nexport class ServerError extends MCPClientOAuthError {\n static errorCode = 'server_error';\n}\n\nexport class InvalidClientError extends MCPClientOAuthError {\n static errorCode = 'invalid_client';\n}\n\nexport class InvalidGrantError extends MCPClientOAuthError {\n static errorCode = 'invalid_grant';\n}\n\nexport class UnauthorizedClientError extends MCPClientOAuthError {\n static errorCode = 'unauthorized_client';\n}\n\nexport const OAUTH_ERRORS = {\n [ServerError.errorCode]: ServerError,\n [InvalidClientError.errorCode]: InvalidClientError,\n [InvalidGrantError.errorCode]: InvalidGrantError,\n [UnauthorizedClientError.errorCode]: UnauthorizedClientError,\n};\n","/**\n * Utilities for handling OAuth resource URIs.\n */\n\n/**\n * Converts a server URL to a resource URL by removing the fragment.\n * RFC 8707 section 2 states that resource URIs \"MUST NOT include a fragment component\".\n * Keeps everything else unchanged (scheme, domain, port, path, query).\n */\nexport function resourceUrlFromServerUrl(url: URL | string): URL {\n const resourceURL =\n typeof url === 'string' ? new URL(url) : new URL(url.href);\n resourceURL.hash = ''; // Remove fragment\n return resourceURL;\n}\n\n/**\n * Serializes a resource URL to a string, removing the trailing slash that\n * URL.href adds to pathless URLs. Per the MCP spec, implementations SHOULD\n * use the form without the trailing slash for better interoperability.\n */\nexport function resourceUrlStripSlash(resource: URL): string {\n const href = resource.href;\n if (resource.pathname === '/' && href.endsWith('/')) {\n return href.slice(0, -1);\n }\n return href;\n}\n\n/**\n * Checks if a requested resource URL matches a configured resource URL.\n * A requested resource matches if it has the same scheme, domain, port,\n * and its path starts with the configured resource's path.\n *\n * @param requestedResource The resource URL being requested\n * @param configuredResource The resource URL that has been configured\n * @returns true if the requested resource matches the configured resource, false otherwise\n */\nexport function checkResourceAllowed({\n requestedResource,\n configuredResource,\n}: {\n requestedResource: URL | string;\n configuredResource: URL | string;\n}): boolean {\n const requested =\n typeof requestedResource === 'string'\n ? new URL(requestedResource)\n : new URL(requestedResource.href);\n const configured =\n typeof configuredResource === 'string'\n ? new URL(configuredResource)\n : new URL(configuredResource.href);\n\n // Compare the origin (scheme, domain, and port)\n if (requested.origin !== configured.origin) {\n return false;\n }\n\n // Handle cases like requested=/foo and configured=/foo/\n if (requested.pathname.length < configured.pathname.length) {\n return false;\n }\n\n // Check if the requested path starts with the configured path\n // Ensure both paths end with / for proper comparison\n // This ensures that if we have paths like \"/api\" and \"/api/users\",\n // we properly detect that \"/api/users\" is a subpath of \"/api\"\n // By adding a trailing slash if missing, we avoid false positives\n // where paths like \"/api123\" would incorrectly match \"/api\"\n const requestedPath = requested.pathname.endsWith('/')\n ? requested.pathname\n : requested.pathname + '/';\n const configuredPath = configured.pathname.endsWith('/')\n ? configured.pathname\n : configured.pathname + '/';\n\n return requestedPath.startsWith(configuredPath);\n}\n","import {\n EventSourceParserStream,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { MCPClientError } from '../error/mcp-client-error';\nimport {\n JSONRPCMessageSchema,\n parseJSONRPCMessage,\n type JSONRPCMessage,\n} from './json-rpc-message';\nimport type { MCPTransport } from './mcp-transport';\nimport { VERSION } from '../version';\nimport {\n extractResourceMetadataUrl,\n UnauthorizedError,\n auth,\n type AuthResult,\n type OAuthClientProvider,\n} from './oauth';\nimport { LATEST_PROTOCOL_VERSION } from './types';\n\n/**\n * HTTP MCP transport implementing the Streamable HTTP style.\n *\n * Client transport for Streamable HTTP: this implements the MCP Streamable HTTP transport specification.\n * It will connect to a server using HTTP POST for sending messages and HTTP GET with Server-Sent Events\n * for receiving messages.\n */\nexport class HttpMCPTransport implements MCPTransport {\n private url: URL;\n private abortController?: AbortController;\n private headers?: Record<string, string>;\n private authProvider?: OAuthClientProvider;\n private resourceMetadataUrl?: URL;\n private sessionId?: string;\n private inboundSseConnection?: { close: () => void };\n private redirectMode: RequestRedirect;\n private fetchFn: FetchFunction;\n private authPromise?: Promise<AuthResult>;\n\n // Inbound SSE resumption and reconnection state\n private lastInboundEventId?: string;\n private inboundReconnectAttempts = 0;\n private readonly reconnectionOptions = {\n initialReconnectionDelay: 1000,\n maxReconnectionDelay: 30000,\n reconnectionDelayGrowFactor: 1.5,\n maxRetries: 2,\n } as const;\n\n onclose?: () => void;\n onerror?: (error: unknown) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n protocolVersion?: string;\n\n constructor({\n url,\n headers,\n authProvider,\n redirect = 'error',\n fetch: fetchFn,\n }: {\n url: string;\n headers?: Record<string, string>;\n authProvider?: OAuthClientProvider;\n redirect?: 'follow' | 'error';\n fetch?: FetchFunction;\n }) {\n this.url = new URL(url);\n this.headers = headers;\n this.authProvider = authProvider;\n this.redirectMode = redirect;\n this.fetchFn = fetchFn ?? globalThis.fetch;\n }\n\n setProtocolVersion(version: string): void {\n this.protocolVersion = version;\n }\n\n private async commonHeaders(\n base: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n ...this.headers,\n ...base,\n 'mcp-protocol-version': this.protocolVersion ?? LATEST_PROTOCOL_VERSION,\n };\n\n if (this.sessionId) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n if (this.authProvider) {\n const tokens = await this.authProvider.tokens();\n if (tokens?.access_token) {\n headers['Authorization'] = `Bearer ${tokens.access_token}`;\n }\n }\n\n return withUserAgentSuffix(\n headers,\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n }\n\n /**\n * Runs a single OAuth recovery flow for concurrent 401 responses.\n */\n private authorizeOnce(resourceMetadataUrl?: URL): Promise<AuthResult> {\n if (!this.authProvider) {\n return Promise.resolve('REDIRECT');\n }\n\n if (!this.authPromise) {\n this.authPromise = auth(this.authProvider, {\n serverUrl: this.url,\n resourceMetadataUrl,\n fetchFn: this.fetchFn,\n }).finally(() => {\n this.authPromise = undefined;\n });\n }\n\n return this.authPromise;\n }\n\n async start(): Promise<void> {\n if (this.abortController) {\n throw new MCPClientError({\n message:\n 'MCP HTTP Transport Error: Transport already started. Note: client.connect() calls start() automatically.',\n });\n }\n this.abortController = new AbortController();\n\n void this.openInboundSse();\n }\n\n async close(): Promise<void> {\n this.inboundSseConnection?.close();\n try {\n if (\n this.sessionId &&\n this.abortController &&\n !this.abortController.signal.aborted\n ) {\n const headers = await this.commonHeaders({});\n await this.fetchFn(this.url.href, {\n method: 'DELETE',\n headers,\n signal: this.abortController.signal,\n redirect: this.redirectMode,\n }).catch(() => undefined);\n }\n } catch {}\n\n this.abortController?.abort();\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n const attempt = async (triedAuth: boolean = false): Promise<void> => {\n try {\n const headers = await this.commonHeaders({\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n });\n\n const init = {\n method: 'POST',\n headers,\n body: JSON.stringify(message),\n signal: this.abortController?.signal,\n redirect: this.redirectMode,\n } satisfies RequestInit;\n\n const response = await this.fetchFn(this.url.href, init);\n\n const sessionId = response.headers.get('mcp-session-id');\n if (sessionId) {\n this.sessionId = sessionId;\n }\n\n if (response.status === 401 && this.authProvider && !triedAuth) {\n this.resourceMetadataUrl = extractResourceMetadataUrl(response);\n try {\n const result = await this.authorizeOnce(this.resourceMetadataUrl);\n if (result !== 'AUTHORIZED') {\n const error = new UnauthorizedError();\n throw error;\n }\n } catch (error) {\n this.onerror?.(error);\n throw error;\n }\n return attempt(true);\n }\n\n // If server accepted the message (e.g. initialized notification), optionally (re)start inbound SSE\n if (response.status === 202) {\n // If inbound SSE was not available earlier (e.g. 405 before init), try again now\n // Do not await to avoid blocking send()\n if (!this.inboundSseConnection) {\n void this.openInboundSse();\n }\n return;\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => null);\n let errorMessage = `MCP HTTP Transport Error: POSTing to endpoint (HTTP ${response.status}): ${text}`;\n\n // 404 since this is a GET request which the server does not support\n if (response.status === 404) {\n errorMessage +=\n '. This server does not support HTTP transport. Try using `sse` transport instead';\n }\n\n const error = new MCPClientError({\n message: errorMessage,\n statusCode: response.status,\n url: this.url.href,\n responseBody: text ?? undefined,\n });\n this.onerror?.(error);\n throw error;\n }\n\n // Notifications (messages without 'id') don't expect a JSON-RPC response\n // Some servers return 200 with acknowledgment JSON instead of 202\n const isNotification = !('id' in message);\n if (isNotification) {\n return;\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n const data = await response.json();\n const messages: JSONRPCMessage[] = Array.isArray(data)\n ? data.map((message: unknown) =>\n JSONRPCMessageSchema.parse(message),\n )\n : [JSONRPCMessageSchema.parse(data)];\n for (const jsonRpcMessage of messages) {\n this.onmessage?.(jsonRpcMessage);\n }\n return;\n }\n\n if (contentType.includes('text/event-stream')) {\n if (!response.body) {\n const error = new MCPClientError({\n message:\n 'MCP HTTP Transport Error: text/event-stream response without body',\n statusCode: response.status,\n url: this.url.href,\n });\n this.onerror?.(error);\n throw error;\n }\n\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n const reader = stream.getReader();\n\n const processEvents = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) return;\n const { event, data } = value;\n if (event === 'message') {\n try {\n const jsonRpcMessage = await parseJSONRPCMessage(data);\n this.onmessage?.(jsonRpcMessage);\n } catch (error) {\n const e = new MCPClientError({\n message:\n 'MCP HTTP Transport Error: Failed to parse message',\n cause: error,\n });\n this.onerror?.(e);\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n this.onerror?.(error);\n }\n };\n\n processEvents();\n return;\n }\n\n const error = new MCPClientError({\n message: `MCP HTTP Transport Error: Unexpected content type: ${contentType}`,\n statusCode: response.status,\n url: this.url.href,\n });\n this.onerror?.(error);\n throw error;\n } catch (error) {\n this.onerror?.(error);\n throw error;\n }\n };\n\n await attempt();\n }\n\n private getNextReconnectionDelay(attempt: number): number {\n const {\n initialReconnectionDelay,\n reconnectionDelayGrowFactor,\n maxReconnectionDelay,\n } = this.reconnectionOptions;\n return Math.min(\n initialReconnectionDelay * Math.pow(reconnectionDelayGrowFactor, attempt),\n maxReconnectionDelay,\n );\n }\n\n private scheduleInboundSseReconnection(): void {\n const { maxRetries } = this.reconnectionOptions;\n if (maxRetries > 0 && this.inboundReconnectAttempts >= maxRetries) {\n this.onerror?.(\n new MCPClientError({\n message: `MCP HTTP Transport Error: Maximum reconnection attempts (${maxRetries}) exceeded.`,\n }),\n );\n return;\n }\n\n const delay = this.getNextReconnectionDelay(this.inboundReconnectAttempts);\n this.inboundReconnectAttempts += 1;\n setTimeout(async () => {\n if (this.abortController?.signal.aborted) return;\n await this.openInboundSse(false, this.lastInboundEventId);\n }, delay);\n }\n\n // Open optional inbound SSE stream; best-effort and resumable\n private async openInboundSse(\n triedAuth: boolean = false,\n resumeToken?: string,\n ): Promise<void> {\n try {\n const headers = await this.commonHeaders({\n Accept: 'text/event-stream',\n });\n if (resumeToken) {\n headers['last-event-id'] = resumeToken;\n }\n\n const response = await this.fetchFn(this.url.href, {\n method: 'GET',\n headers,\n signal: this.abortController?.signal,\n redirect: this.redirectMode,\n });\n\n const sessionId = response.headers.get('mcp-session-id');\n if (sessionId) {\n this.sessionId = sessionId;\n }\n\n if (response.status === 401 && this.authProvider && !triedAuth) {\n this.resourceMetadataUrl = extractResourceMetadataUrl(response);\n try {\n const result = await this.authorizeOnce(this.resourceMetadataUrl);\n if (result !== 'AUTHORIZED') {\n const error = new UnauthorizedError();\n this.onerror?.(error);\n return;\n }\n } catch (error) {\n this.onerror?.(error);\n return;\n }\n return this.openInboundSse(true, resumeToken);\n }\n\n if (response.status === 405) {\n return;\n }\n\n if (!response.ok || !response.body) {\n const error = new MCPClientError({\n message: `MCP HTTP Transport Error: GET SSE failed: ${response.status} ${response.statusText}`,\n statusCode: response.status,\n url: this.url.href,\n });\n this.onerror?.(error);\n return;\n }\n\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n const reader = stream.getReader();\n\n const processEvents = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) return;\n const { event, data, id } = value as {\n event?: string;\n data: string;\n id?: string;\n };\n\n if (id) {\n this.lastInboundEventId = id;\n }\n\n if (event === 'message') {\n try {\n const jsonRpcMessage = await parseJSONRPCMessage(data);\n this.onmessage?.(jsonRpcMessage);\n } catch (error) {\n const e = new MCPClientError({\n message: 'MCP HTTP Transport Error: Failed to parse message',\n cause: error,\n });\n this.onerror?.(e);\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n this.onerror?.(error);\n if (!this.abortController?.signal.aborted) {\n this.scheduleInboundSseReconnection();\n }\n }\n };\n\n this.inboundSseConnection = {\n close: () => reader.cancel(),\n };\n this.inboundReconnectAttempts = 0;\n processEvents();\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n this.onerror?.(error);\n if (!this.abortController?.signal.aborted) {\n this.scheduleInboundSseReconnection();\n }\n }\n }\n}\n","import type { FetchFunction } from '@ai-sdk/provider-utils';\nimport { MCPClientError } from '../error/mcp-client-error';\nimport type { JSONRPCMessage } from './json-rpc-message';\nimport { SseMCPTransport } from './mcp-sse-transport';\nimport { HttpMCPTransport } from './mcp-http-transport';\nimport type { OAuthClientProvider } from './oauth';\n\n/**\n * Transport interface for MCP (Model Context Protocol) communication.\n * Maps to the `Transport` interface in the MCP spec.\n */\nexport interface MCPTransport {\n /**\n * Initialize and start the transport\n */\n start(): Promise<void>;\n\n /**\n * Send a JSON-RPC message through the transport\n * @param message The JSON-RPC message to send\n */\n send(message: JSONRPCMessage): Promise<void>;\n\n /**\n * Clean up and close the transport\n */\n close(): Promise<void>;\n\n /**\n * Event handler for transport closure\n */\n onclose?: () => void;\n\n /**\n * Event handler for transport errors\n */\n onerror?: (error: Error) => void;\n\n /**\n * Event handler for received messages\n */\n onmessage?: (message: JSONRPCMessage) => void;\n\n /**\n * The protocol version negotiated during initialization.\n */\n protocolVersion?: string;\n\n /**\n * Set the protocol version negotiated during initialization.\n */\n setProtocolVersion?(version: string): void;\n}\n\nexport type MCPTransportConfig = {\n type: 'sse' | 'http';\n\n /**\n * The URL of the MCP server.\n */\n url: string;\n\n /**\n * Additional HTTP headers to be sent with requests.\n */\n headers?: Record<string, string>;\n\n /**\n * An optional OAuth client provider to use for authentication for MCP servers.\n */\n authProvider?: OAuthClientProvider;\n\n /**\n * Controls how HTTP redirects are handled for transport requests.\n * - `'follow'`: Follow redirects automatically (standard fetch behavior).\n * - `'error'`: Reject any redirect response with an error.\n * @default 'error'\n */\n redirect?: 'follow' | 'error';\n\n /**\n * Optional custom fetch implementation to use for HTTP requests.\n * Useful for runtimes that need a request-local fetch.\n * @default globalThis.fetch\n */\n fetch?: FetchFunction;\n};\n\nexport function createMcpTransport(config: MCPTransportConfig): MCPTransport {\n switch (config.type) {\n case 'sse':\n return new SseMCPTransport(config);\n case 'http':\n return new HttpMCPTransport(config);\n default:\n throw new MCPClientError({\n message:\n 'Unsupported or invalid transport configuration. If you are using a custom transport, make sure it implements the MCPTransport interface.',\n });\n }\n}\n\nexport function isCustomMcpTransport(\n transport: MCPTransportConfig | MCPTransport,\n): transport is MCPTransport {\n return (\n 'start' in transport &&\n typeof transport.start === 'function' &&\n 'send' in transport &&\n typeof transport.send === 'function' &&\n 'close' in transport &&\n typeof transport.close === 'function'\n );\n}\n","import { isJSONObject, type JSONObject } from '@ai-sdk/provider';\nimport { convertBase64ToUint8Array } from '@ai-sdk/provider-utils';\nimport type { MCPClient } from './mcp-client';\nimport type {\n ClientCapabilities,\n ListToolsResult,\n ReadResourceResult,\n RequestOptions,\n ToolMeta,\n} from './types';\n\n/**\n * MCP capability extension name used by hosts that can render MCP Apps.\n */\nexport const MCP_APP_EXTENSION_NAME = 'io.modelcontextprotocol/ui' as const;\n\n/**\n * MIME type for HTML resources that are meant to be rendered as MCP Apps.\n */\nexport const MCP_APP_MIME_TYPE = 'text/html;profile=mcp-app' as const;\n\n/**\n * Deprecated flat metadata key for app resource URIs.\n * Hosts still check it for compatibility with older MCP Apps servers.\n */\nexport const MCP_APP_LEGACY_RESOURCE_URI_META_KEY = 'ui/resourceUri' as const;\n\n/**\n * Client capabilities to pass to `createMCPClient` when the host supports MCP Apps.\n */\nexport const mcpAppClientCapabilities = {\n extensions: {\n [MCP_APP_EXTENSION_NAME]: {\n mimeTypes: [MCP_APP_MIME_TYPE],\n },\n },\n} as const satisfies ClientCapabilities;\n\nexport type MCPAppToolVisibility = 'model' | 'app';\n\n/**\n * Normalized `_meta.ui` metadata from an MCP tool definition.\n */\nexport type MCPAppToolMeta = {\n resourceUri?: string;\n visibility?: MCPAppToolVisibility[];\n [key: string]: unknown;\n};\n\n/**\n * Content security policy metadata requested by an MCP App resource.\n */\nexport type MCPAppResourceCSP = {\n connectDomains?: string[];\n resourceDomains?: string[];\n frameDomains?: string[];\n [key: string]: unknown;\n};\n\n/**\n * Host rendering metadata from an MCP App resource.\n */\nexport type MCPAppResourceMeta = {\n prefersBorder?: boolean;\n csp?: MCPAppResourceCSP;\n permissions?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n/**\n * HTML and metadata needed by a host to render an MCP App.\n */\nexport type MCPAppResource = {\n uri: string;\n mimeType: typeof MCP_APP_MIME_TYPE;\n html: string;\n meta?: MCPAppResourceMeta;\n};\n\ntype MCPAppToolLike = {\n _meta?: ToolMeta;\n [key: string]: unknown;\n};\n\nfunction getToolUiMeta(meta?: ToolMeta): JSONObject | undefined {\n const uiMeta = meta?.ui;\n return isJSONObject(uiMeta) ? uiMeta : undefined;\n}\n\nfunction getResourceUiMeta(meta: unknown): MCPAppResourceMeta | undefined {\n const resourceMeta = isJSONObject(meta) ? meta : undefined;\n const rawUiMeta = resourceMeta?.ui;\n const uiMeta = isJSONObject(rawUiMeta) ? rawUiMeta : undefined;\n\n return uiMeta as MCPAppResourceMeta | undefined;\n}\n\nfunction parseVisibility(value: unknown): MCPAppToolVisibility[] | undefined {\n return Array.isArray(value)\n ? value.filter(\n (v): v is MCPAppToolVisibility => v === 'model' || v === 'app',\n )\n : undefined;\n}\n\n/**\n * Reads and validates MCP Apps metadata from a tool definition.\n */\nexport function getMCPAppToolMeta(\n tool: MCPAppToolLike,\n): MCPAppToolMeta | undefined {\n const uiMeta = getToolUiMeta(tool._meta);\n const resourceUri =\n uiMeta?.resourceUri ?? tool._meta?.[MCP_APP_LEGACY_RESOURCE_URI_META_KEY];\n const visibility = parseVisibility(uiMeta?.visibility);\n\n if (resourceUri !== undefined) {\n if (typeof resourceUri !== 'string' || !resourceUri.startsWith('ui://')) {\n throw new Error(\n `Invalid MCP App resource URI: ${JSON.stringify(resourceUri)}`,\n );\n }\n } else if (uiMeta == null) {\n return undefined;\n }\n\n return {\n ...uiMeta,\n ...(resourceUri != null ? { resourceUri } : {}),\n ...(visibility != null ? { visibility } : {}),\n };\n}\n\n/**\n * Returns the `ui://` app resource URI attached to a tool, if present.\n */\nexport function getMCPAppResourceUri(tool: MCPAppToolLike): string | undefined {\n return getMCPAppToolMeta(tool)?.resourceUri;\n}\n\n/**\n * Checks whether a tool has an MCP App resource attached.\n */\nexport function isMCPAppTool(tool: MCPAppToolLike): boolean {\n return getMCPAppResourceUri(tool) != null;\n}\n\n/**\n * Splits tool definitions into model-visible tools and app-visible tools.\n */\nexport function splitMCPAppTools(definitions: ListToolsResult): {\n modelVisible: ListToolsResult;\n appVisible: ListToolsResult;\n} {\n const modelVisibleTools = [];\n const appVisibleTools = [];\n\n for (const tool of definitions.tools) {\n const visibility = getMCPAppToolMeta(tool)?.visibility;\n\n // Tools without app visibility metadata remain model-visible.\n if (visibility == null || visibility.includes('model')) {\n modelVisibleTools.push(tool);\n }\n\n if (visibility?.includes('app') === true) {\n appVisibleTools.push(tool);\n }\n }\n\n return {\n modelVisible: {\n ...definitions,\n tools: modelVisibleTools,\n },\n appVisible: {\n ...definitions,\n tools: appVisibleTools,\n },\n };\n}\n\n/**\n * Returns the unique MCP App resource URIs referenced by tool definitions.\n */\nexport function getMCPAppResourceUris(definitions: ListToolsResult): string[] {\n return [\n ...new Set(\n definitions.tools\n .map(tool => getMCPAppResourceUri(tool))\n .filter((uri): uri is string => uri != null),\n ),\n ];\n}\n\n/**\n * Extracts app HTML and rendering metadata from a `resources/read` result.\n */\nexport function getMCPAppResourceFromReadResult({\n uri,\n resource,\n}: {\n uri: string;\n resource: ReadResourceResult;\n}): MCPAppResource {\n const content = resource.contents.find(content => content.uri === uri);\n\n if (content == null) {\n throw new Error(`MCP App resource not found in read result: ${uri}`);\n }\n\n if (content.mimeType !== MCP_APP_MIME_TYPE) {\n throw new Error(\n `Unsupported MCP App resource MIME type: ${content.mimeType}`,\n );\n }\n\n const html =\n 'text' in content && typeof content.text === 'string'\n ? content.text\n : 'blob' in content && typeof content.blob === 'string'\n ? new TextDecoder().decode(convertBase64ToUint8Array(content.blob))\n : undefined;\n\n if (html == null) {\n throw new Error(`Unsupported MCP App resource content format: ${uri}`);\n }\n\n const meta = getResourceUiMeta(content._meta);\n\n return { uri, mimeType: MCP_APP_MIME_TYPE, html, meta };\n}\n\n/**\n * Reads a `ui://` resource from an MCP server and normalizes it for rendering.\n */\nexport async function readMCPAppResource({\n client,\n uri,\n options,\n}: {\n client: Pick<MCPClient, 'readResource'>;\n uri: string;\n options?: RequestOptions;\n}): Promise<MCPAppResource> {\n if (!uri.startsWith('ui://')) {\n throw new Error(`Unsupported MCP App resource URI: ${uri}`);\n }\n\n return getMCPAppResourceFromReadResult({\n uri,\n resource: await client.readResource({ uri, options }),\n });\n}\n"],"mappings":"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","names":["name","z","z","z","AISDKError","name","marker","symbol","_a","_b","parseJSON","_a","_b","codeVerifier","tokens","_a","_b","_c","_d","_e","EventSourceParserStream","withUserAgentSuffix","getRuntimeEnvironmentUserAgent","_a","withUserAgentSuffix","getRuntimeEnvironmentUserAgent","_b","error","message","EventSourceParserStream","_c","_d","tool","_a","_b","_a","tool","content","name","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../src/tool/mcp-client.ts","../src/error/mcp-client-error.ts","../src/tool/mcp-sse-transport.ts","../src/tool/json-rpc-message.ts","../src/tool/types.ts","../src/version.ts","../src/tool/oauth.ts","../src/tool/oauth-types.ts","../src/error/oauth-error.ts","../src/util/oauth-util.ts","../src/tool/mcp-http-transport.ts","../src/tool/mcp-transport.ts","../src/tool/mcp-apps.ts"],"sourcesContent":["import type { JSONObject, JSONSchema7, JSONValue } from '@ai-sdk/provider';\nimport {\n asSchema,\n dynamicTool,\n jsonSchema,\n safeParseJSON,\n safeValidateTypes,\n tool,\n type FlexibleSchema,\n type Tool,\n type ToolExecutionOptions,\n type ToolResultOutput,\n} from '@ai-sdk/provider-utils';\nimport type { z } from 'zod/v4';\nimport { MCPClientError } from '../error/mcp-client-error';\nimport type {\n JSONRPCError,\n JSONRPCNotification,\n JSONRPCRequest,\n JSONRPCResponse,\n} from './json-rpc-message';\nimport {\n createMcpTransport,\n isCustomMcpTransport,\n type MCPTransport,\n type MCPTransportConfig,\n} from './mcp-transport';\nimport { getMCPAppToolMeta, MCP_APP_MIME_TYPE } from './mcp-apps';\nimport {\n CallToolResultSchema,\n ElicitationRequestSchema,\n ElicitResultSchema,\n InitializeResultSchema,\n LATEST_PROTOCOL_VERSION,\n ListResourceTemplatesResultSchema,\n ListResourcesResultSchema,\n ListPromptsResultSchema,\n ListToolsResultSchema,\n ReadResourceResultSchema,\n GetPromptResultSchema,\n SUPPORTED_PROTOCOL_VERSIONS,\n type CallToolResult,\n type ClientCapabilities,\n type Configuration,\n type Configuration as ClientConfiguration,\n type ElicitationRequest,\n type ElicitResult,\n type ListResourceTemplatesResult,\n type ListResourcesResult,\n type ListPromptsResult,\n type ListToolsResult,\n type McpToolSet,\n type Notification,\n type PaginatedRequest,\n type ReadResourceResult,\n type GetPromptResult,\n type Request,\n type RequestOptions,\n type ServerCapabilities,\n type ToolSchemas,\n type ToolMeta,\n type McpProviderMetadata,\n} from './types';\nconst CLIENT_VERSION = '1.0.0';\n\nfunction mcpToModelOutput({\n output,\n}: {\n toolCallId: string;\n input: unknown;\n output: unknown;\n}): ToolResultOutput {\n const result = output as CallToolResult;\n\n if (!('content' in result) || !Array.isArray(result.content)) {\n return { type: 'json', value: result as JSONValue };\n }\n\n const convertedContent = result.content.map(\n (part: { type: string; [key: string]: unknown }) => {\n if (part.type === 'text' && 'text' in part) {\n return { type: 'text' as const, text: part.text as string };\n }\n if (part.type === 'image' && 'data' in part && 'mimeType' in part) {\n return {\n type: 'file' as const,\n mediaType: part.mimeType as string,\n data: { type: 'data' as const, data: part.data as string },\n };\n }\n return { type: 'text' as const, text: JSON.stringify(part) };\n },\n );\n\n return { type: 'content', value: convertedContent };\n}\n\nexport interface MCPClientConfig {\n /** Transport configuration for connecting to the MCP server */\n transport: MCPTransportConfig | MCPTransport;\n /** Optional callback for uncaught errors */\n onUncaughtError?: (error: unknown) => void;\n /** Optional client name, defaults to 'ai-sdk-mcp-client' */\n clientName?: string;\n /**\n * Optional client name, defaults to 'ai-sdk-mcp-client'\n *\n * @deprecated Use `clientName` instead.\n */\n name?: string;\n /** Optional client version, defaults to '1.0.0' */\n version?: string;\n /**\n * Optional client capabilities to advertise during initialization\n *\n * NOTE: It is up to the client application to handle the requests properly. This parameter just helps surface the request from the server\n */\n capabilities?: ClientCapabilities;\n}\n\nexport async function createMCPClient(\n config: MCPClientConfig,\n): Promise<MCPClient> {\n const client = new DefaultMCPClient(config);\n await client.init();\n return client;\n}\n\nexport interface MCPClient {\n /**\n * Information about the connected MCP server, as reported during initialization.\n * @see https://modelcontextprotocol.io/specification/2025-11-25/schema#implementation\n */\n readonly serverInfo: Configuration;\n\n /**\n * Optional instructions provided by the server during the initialize handshake.\n *\n * These describe how to use the server and its features, and can be used by clients\n * to improve LLM interactions (e.g. by including them in the system prompt).\n *\n * @see https://modelcontextprotocol.io/specification/2025-11-25/schema#initializeresult\n */\n readonly instructions?: string;\n\n tools<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>(options?: {\n schemas?: TOOL_SCHEMAS;\n }): Promise<McpToolSet<TOOL_SCHEMAS>>;\n\n /**\n * Lists available tools from the MCP server.\n */\n listTools(options?: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n }): Promise<ListToolsResult>;\n\n /**\n * Calls a tool on the MCP server.\n */\n callTool(args: {\n name: string;\n arguments?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<CallToolResult>;\n\n /**\n * Creates AI SDK tools from tool definitions.\n */\n toolsFromDefinitions<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>(\n definitions: ListToolsResult,\n options?: { schemas?: TOOL_SCHEMAS },\n ): McpToolSet<TOOL_SCHEMAS>;\n\n listResources(options?: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n }): Promise<ListResourcesResult>;\n\n readResource(args: {\n uri: string;\n options?: RequestOptions;\n }): Promise<ReadResourceResult>;\n\n listResourceTemplates(options?: {\n options?: RequestOptions;\n }): Promise<ListResourceTemplatesResult>;\n\n experimental_listPrompts(options?: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n }): Promise<ListPromptsResult>;\n\n experimental_getPrompt(args: {\n name: string;\n arguments?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<GetPromptResult>;\n\n onElicitationRequest(\n schema: typeof ElicitationRequestSchema,\n handler: (\n request: ElicitationRequest,\n ) => Promise<ElicitResult> | ElicitResult,\n ): void;\n\n close: () => Promise<void>;\n}\n\n/**\n * A lightweight MCP Client implementation\n *\n * The primary purpose of this client is tool conversion between MCP<>AI SDK\n * but can later be extended to support other MCP features\n *\n * Tool parameters are automatically inferred from the server's JSON schema\n * if not explicitly provided in the tools configuration\n *\n * This client is meant to be used to communicate with a single server. To communicate and fetch tools across multiple servers, it's recommended to create a new client instance per server.\n *\n * Not supported:\n * - Accepting notifications\n * - Session management (when passing a sessionId to an instance of the Streamable HTTP transport)\n * - Resumable SSE streams\n */\nclass DefaultMCPClient implements MCPClient {\n private transport: MCPTransport;\n private onUncaughtError?: (error: unknown) => void;\n private clientInfo: ClientConfiguration;\n private clientCapabilities: ClientCapabilities;\n private requestMessageId = 0;\n private responseHandlers: Map<\n number,\n (response: JSONRPCResponse | Error) => void\n > = new Map();\n private serverCapabilities: ServerCapabilities = {};\n private _serverInfo: Configuration = { name: '', version: '' };\n private _serverInstructions?: string;\n private isClosed = true;\n private elicitationRequestHandler?: (\n request: ElicitationRequest,\n ) => Promise<ElicitResult> | ElicitResult;\n\n constructor({\n transport: transportConfig,\n name,\n clientName = name ?? 'ai-sdk-mcp-client',\n version = CLIENT_VERSION,\n onUncaughtError,\n capabilities,\n }: MCPClientConfig) {\n this.onUncaughtError = onUncaughtError;\n this.clientCapabilities = capabilities ?? {};\n\n if (isCustomMcpTransport(transportConfig)) {\n this.transport = transportConfig;\n } else {\n this.transport = createMcpTransport(transportConfig);\n }\n\n this.transport.onclose = () => this.onClose();\n this.transport.onerror = (error: Error) => this.onError(error);\n this.transport.onmessage = message => {\n if ('method' in message) {\n if ('id' in message) {\n this.onRequestMessage(message);\n } else {\n this.onError(\n new MCPClientError({\n message: 'Unsupported message type',\n }),\n );\n }\n return;\n }\n\n this.onResponse(message);\n };\n\n this.clientInfo = {\n name: clientName,\n version,\n };\n }\n\n get serverInfo(): Configuration {\n return this._serverInfo;\n }\n\n get instructions(): string | undefined {\n return this._serverInstructions;\n }\n\n async init(): Promise<this> {\n try {\n await this.transport.start();\n this.isClosed = false;\n\n const result = await this.request({\n request: {\n method: 'initialize',\n params: {\n protocolVersion: LATEST_PROTOCOL_VERSION,\n capabilities: this.clientCapabilities,\n clientInfo: this.clientInfo,\n },\n },\n resultSchema: InitializeResultSchema,\n });\n\n if (result === undefined) {\n throw new MCPClientError({\n message: 'Server sent invalid initialize result',\n });\n }\n\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion)) {\n throw new MCPClientError({\n message: `Server's protocol version is not supported: ${result.protocolVersion}`,\n });\n }\n\n this.serverCapabilities = result.capabilities;\n this._serverInfo = result.serverInfo;\n if (this.transport.setProtocolVersion) {\n this.transport.setProtocolVersion(result.protocolVersion);\n } else {\n this.transport.protocolVersion = result.protocolVersion;\n }\n this._serverInstructions = result.instructions;\n\n // Complete initialization handshake:\n await this.notification({\n method: 'notifications/initialized',\n });\n\n return this;\n } catch (error) {\n await this.close();\n throw error;\n }\n }\n\n async close(): Promise<void> {\n if (this.isClosed) return;\n await this.transport?.close();\n this.onClose();\n }\n\n private assertCapability(method: string): void {\n switch (method) {\n case 'initialize':\n break;\n case 'tools/list':\n case 'tools/call':\n if (!this.serverCapabilities.tools) {\n throw new MCPClientError({\n message: `Server does not support tools`,\n });\n }\n break;\n case 'resources/list':\n case 'resources/read':\n case 'resources/templates/list':\n if (!this.serverCapabilities.resources) {\n throw new MCPClientError({\n message: `Server does not support resources`,\n });\n }\n break;\n case 'prompts/list':\n case 'prompts/get':\n if (!this.serverCapabilities.prompts) {\n throw new MCPClientError({\n message: `Server does not support prompts`,\n });\n }\n break;\n default:\n throw new MCPClientError({\n message: `Unsupported method: ${method}`,\n });\n }\n }\n\n private async request<T extends z.ZodType<object>>({\n request,\n resultSchema,\n options,\n }: {\n request: Request;\n resultSchema: T;\n options?: RequestOptions;\n }): Promise<z.infer<T>> {\n return new Promise((resolve, reject) => {\n if (this.isClosed) {\n return reject(\n new MCPClientError({\n message: 'Attempted to send a request from a closed client',\n }),\n );\n }\n\n this.assertCapability(request.method);\n\n const signal = options?.signal;\n signal?.throwIfAborted();\n\n const messageId = this.requestMessageId++;\n const jsonrpcRequest: JSONRPCRequest = {\n ...request,\n jsonrpc: '2.0',\n id: messageId,\n };\n\n const cleanup = () => {\n this.responseHandlers.delete(messageId);\n };\n\n this.responseHandlers.set(messageId, response => {\n if (signal?.aborted) {\n return reject(\n new MCPClientError({\n message: 'Request was aborted',\n cause: signal.reason,\n }),\n );\n }\n\n if (response instanceof Error) {\n return reject(response);\n }\n\n try {\n const result = resultSchema.parse(response.result);\n resolve(result);\n } catch (error) {\n const parseError = new MCPClientError({\n message: 'Failed to parse server response',\n cause: error,\n });\n reject(parseError);\n }\n });\n\n this.transport.send(jsonrpcRequest).catch(error => {\n cleanup();\n reject(error);\n });\n });\n }\n\n async listTools({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListToolsResult> {\n return this.request({\n request: { method: 'tools/list', params },\n resultSchema: ListToolsResultSchema,\n options,\n });\n }\n\n async callTool({\n name,\n arguments: args = {},\n options,\n }: {\n name: string;\n arguments?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<CallToolResult> {\n try {\n return this.request({\n request: { method: 'tools/call', params: { name, arguments: args } },\n resultSchema: CallToolResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async listResourcesInternal({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListResourcesResult> {\n try {\n return this.request({\n request: { method: 'resources/list', params },\n resultSchema: ListResourcesResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async readResourceInternal({\n uri,\n options,\n }: {\n uri: string;\n options?: RequestOptions;\n }): Promise<ReadResourceResult> {\n try {\n return this.request({\n request: { method: 'resources/read', params: { uri } },\n resultSchema: ReadResourceResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async listResourceTemplatesInternal({\n options,\n }: {\n options?: RequestOptions;\n } = {}): Promise<ListResourceTemplatesResult> {\n try {\n return this.request({\n request: { method: 'resources/templates/list' },\n resultSchema: ListResourceTemplatesResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async listPromptsInternal({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListPromptsResult> {\n try {\n return this.request({\n request: { method: 'prompts/list', params },\n resultSchema: ListPromptsResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async getPromptInternal({\n name,\n args,\n options,\n }: {\n name: string;\n args?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<GetPromptResult> {\n try {\n return this.request({\n request: { method: 'prompts/get', params: { name, arguments: args } },\n resultSchema: GetPromptResultSchema,\n options,\n });\n } catch (error) {\n throw error;\n }\n }\n\n private async notification(notification: Notification): Promise<void> {\n const jsonrpcNotification: JSONRPCNotification = {\n ...notification,\n jsonrpc: '2.0',\n };\n await this.transport.send(jsonrpcNotification);\n }\n\n /**\n * Returns a set of AI SDK tools from the MCP server.\n * This fetches tool definitions and wraps them with execute functions.\n * @returns A record of tool names to their implementations\n */\n async tools<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>({\n schemas = 'automatic',\n }: {\n schemas?: TOOL_SCHEMAS;\n } = {}): Promise<McpToolSet<TOOL_SCHEMAS>> {\n const definitions = await this.listTools();\n return this.toolsFromDefinitions(definitions, {\n schemas,\n } as { schemas?: TOOL_SCHEMAS });\n }\n\n /**\n * Creates AI SDK tools from tool definitions without fetching from the server.\n */\n toolsFromDefinitions<TOOL_SCHEMAS extends ToolSchemas = 'automatic'>(\n definitions: ListToolsResult,\n { schemas = 'automatic' }: { schemas?: TOOL_SCHEMAS } = {} as {\n schemas?: TOOL_SCHEMAS;\n },\n ): McpToolSet<TOOL_SCHEMAS> {\n const tools: Record<string, Tool & { _meta?: ToolMeta }> = {};\n\n for (const {\n name,\n title,\n description,\n inputSchema,\n annotations,\n _meta,\n } of definitions.tools) {\n const resolvedTitle = title ?? annotations?.title;\n if (\n schemas !== 'automatic' &&\n !Object.prototype.hasOwnProperty.call(schemas, name)\n ) {\n continue;\n }\n\n const self = this;\n const outputSchema =\n schemas !== 'automatic' ? schemas[name]?.outputSchema : undefined;\n const appMeta = getMCPAppToolMeta({ _meta });\n const metadata = {\n clientName: this.clientInfo.name,\n toolName: name,\n ...(resolvedTitle != null ? { title: resolvedTitle } : {}),\n ...(appMeta?.resourceUri != null\n ? {\n app: {\n ...appMeta,\n mimeType: MCP_APP_MIME_TYPE,\n } as JSONObject,\n }\n : {}),\n } satisfies McpProviderMetadata;\n\n const execute = async (\n args: any,\n options: ToolExecutionOptions<{}>,\n ): Promise<unknown> => {\n options?.abortSignal?.throwIfAborted();\n const result = await self.callTool({\n name,\n arguments: args,\n options: { signal: options?.abortSignal },\n });\n\n if (result.isError) {\n return result;\n }\n\n if (outputSchema != null) {\n return self.extractStructuredContent(result, outputSchema, name);\n }\n\n return result;\n };\n\n const toolWithExecute =\n schemas === 'automatic'\n ? dynamicTool({\n description,\n title: resolvedTitle,\n metadata,\n inputSchema: jsonSchema({\n ...inputSchema,\n properties: inputSchema.properties ?? {},\n additionalProperties: false,\n } as JSONSchema7),\n execute,\n toModelOutput: mcpToModelOutput,\n })\n : tool({\n description,\n title: resolvedTitle,\n metadata,\n inputSchema: schemas[name].inputSchema,\n ...(outputSchema != null ? { outputSchema } : {}),\n execute,\n toModelOutput: mcpToModelOutput,\n });\n\n tools[name] = { ...toolWithExecute, _meta };\n }\n\n return tools as McpToolSet<TOOL_SCHEMAS>;\n }\n\n /**\n * Extracts and validates structuredContent from a tool result.\n */\n private async extractStructuredContent(\n result: CallToolResult,\n outputSchema: FlexibleSchema<unknown>,\n toolName: string,\n ): Promise<unknown> {\n if ('structuredContent' in result && result.structuredContent != null) {\n const validationResult = await safeValidateTypes({\n value: result.structuredContent,\n schema: asSchema(outputSchema),\n });\n\n if (!validationResult.success) {\n throw new MCPClientError({\n message: `Tool \"${toolName}\" returned structuredContent that does not match the expected outputSchema`,\n cause: validationResult.error,\n });\n }\n\n return validationResult.value;\n }\n\n // Fallback\n if ('content' in result && Array.isArray(result.content)) {\n const textContent = result.content.find(c => c.type === 'text');\n if (textContent && 'text' in textContent) {\n const parseResult = await safeParseJSON({\n text: textContent.text,\n schema: outputSchema,\n });\n\n if (!parseResult.success) {\n throw new MCPClientError({\n message: `Tool \"${toolName}\" returned content that does not match the expected outputSchema`,\n cause: parseResult.error,\n });\n }\n\n return parseResult.value;\n }\n }\n\n throw new MCPClientError({\n message: `Tool \"${toolName}\" did not return structuredContent or parseable text content`,\n });\n }\n\n listResources({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListResourcesResult> {\n return this.listResourcesInternal({ params, options });\n }\n\n readResource({\n uri,\n options,\n }: {\n uri: string;\n options?: RequestOptions;\n }): Promise<ReadResourceResult> {\n return this.readResourceInternal({ uri, options });\n }\n\n listResourceTemplates({\n options,\n }: {\n options?: RequestOptions;\n } = {}): Promise<ListResourceTemplatesResult> {\n return this.listResourceTemplatesInternal({ options });\n }\n\n experimental_listPrompts({\n params,\n options,\n }: {\n params?: PaginatedRequest['params'];\n options?: RequestOptions;\n } = {}): Promise<ListPromptsResult> {\n return this.listPromptsInternal({ params, options });\n }\n\n experimental_getPrompt({\n name,\n arguments: args,\n options,\n }: {\n name: string;\n arguments?: Record<string, unknown>;\n options?: RequestOptions;\n }): Promise<GetPromptResult> {\n return this.getPromptInternal({ name, args, options });\n }\n\n onElicitationRequest(\n schema: typeof ElicitationRequestSchema,\n handler: (\n request: ElicitationRequest,\n ) => Promise<ElicitResult> | ElicitResult,\n ): void {\n if (schema !== ElicitationRequestSchema) {\n throw new MCPClientError({\n message:\n 'Unsupported request schema. Only ElicitationRequestSchema is supported.',\n });\n }\n\n this.elicitationRequestHandler = handler;\n }\n\n private async onRequestMessage(request: JSONRPCRequest): Promise<void> {\n try {\n if (request.method === 'ping') {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n result: {},\n });\n return;\n }\n\n if (request.method !== 'elicitation/create') {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32601,\n message: `Unsupported request method: ${request.method}`,\n },\n });\n return;\n }\n\n if (!this.elicitationRequestHandler) {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32601,\n message: 'No elicitation handler registered on client',\n },\n });\n return;\n }\n\n const parsedRequest = ElicitationRequestSchema.safeParse({\n method: request.method,\n params: request.params,\n });\n\n if (!parsedRequest.success) {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32602,\n message: `Invalid elicitation request: ${parsedRequest.error.message}`,\n data: parsedRequest.error.issues,\n },\n });\n return;\n }\n\n try {\n const result = await this.elicitationRequestHandler(parsedRequest.data);\n const validatedResult = ElicitResultSchema.parse(result);\n\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n result: validatedResult,\n });\n } catch (error) {\n await this.transport.send({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32603,\n message:\n error instanceof Error\n ? error.message\n : 'Failed to handle elicitation request',\n },\n });\n this.onError(error);\n }\n } catch (error) {\n this.onError(error);\n }\n }\n\n private onClose(): void {\n if (this.isClosed) return;\n\n this.isClosed = true;\n const error = new MCPClientError({\n message: 'Connection closed',\n });\n\n for (const handler of this.responseHandlers.values()) {\n handler(error);\n }\n\n this.responseHandlers.clear();\n }\n\n private onError(error: unknown): void {\n if (this.onUncaughtError) {\n this.onUncaughtError(error);\n }\n }\n\n private onResponse(response: JSONRPCResponse | JSONRPCError): void {\n const messageId = Number(response.id);\n const handler = this.responseHandlers.get(messageId);\n\n if (handler === undefined) {\n throw new MCPClientError({\n message: `Protocol error: Received a response for an unknown message ID: ${JSON.stringify(\n response,\n )}`,\n });\n }\n\n this.responseHandlers.delete(messageId);\n\n handler(\n 'result' in response\n ? response\n : new MCPClientError({\n message: response.error.message,\n code: response.error.code,\n data: response.error.data,\n cause: response.error,\n }),\n );\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_MCPClientError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * An error occurred with the MCP client.\n */\nexport class MCPClientError extends AISDKError {\n private readonly [symbol] = true;\n readonly data?: unknown;\n\n /**\n * JSON-RPC error code from the server response, per the JSON-RPC 2.0\n * spec (e.g. `-32601` method-not-found, `-32602` invalid-params, or\n * MCP-specific codes such as `-32002` resource-not-found). This is the\n * application-level error code populated from `error.code` in the\n * server's JSON-RPC error payload. Distinct from `statusCode`, which\n * is the HTTP transport status.\n */\n readonly code?: number;\n\n /**\n * HTTP status code from the failed response, when the error originated\n * from the streamable HTTP transport. Undefined for stdio transport\n * errors and for failures that do not have an associated response\n * status (e.g. network errors, abort). Distinct from `code`, which is\n * the JSON-RPC application error code.\n */\n readonly statusCode?: number;\n\n /**\n * URL of the MCP endpoint the failing request was sent to, when the\n * error originated from an HTTP transport failure.\n */\n readonly url?: string;\n\n /**\n * Body of the failing HTTP response, decoded as text, when available.\n * Undefined when the body could not be read or the error did not have\n * an associated response.\n */\n readonly responseBody?: string;\n\n constructor({\n name = 'MCPClientError',\n message,\n cause,\n data,\n code,\n statusCode,\n url,\n responseBody,\n }: {\n name?: string;\n message: string;\n cause?: unknown;\n data?: unknown;\n code?: number;\n statusCode?: number;\n url?: string;\n responseBody?: string;\n }) {\n super({ name, message, cause });\n this.data = data;\n this.code = code;\n this.statusCode = statusCode;\n this.url = url;\n this.responseBody = responseBody;\n }\n\n static isInstance(error: unknown): error is MCPClientError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import {\n EventSourceParserStream,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { MCPClientError } from '../error/mcp-client-error';\nimport { parseJSONRPCMessage, type JSONRPCMessage } from './json-rpc-message';\nimport type { MCPTransport } from './mcp-transport';\nimport { VERSION } from '../version';\nimport {\n extractResourceMetadataUrl,\n UnauthorizedError,\n auth,\n type OAuthClientProvider,\n} from './oauth';\nimport { LATEST_PROTOCOL_VERSION } from './types';\n\nfunction isMessageEvent(event: string | undefined): boolean {\n return event === undefined || event === 'message';\n}\n\nexport class SseMCPTransport implements MCPTransport {\n private endpoint?: URL;\n private abortController?: AbortController;\n private url: URL;\n private connected = false;\n private sseConnection?: {\n close: () => void;\n };\n private headers?: Record<string, string>;\n private authProvider?: OAuthClientProvider;\n private resourceMetadataUrl?: URL;\n private redirectMode: RequestRedirect;\n private fetchFn: FetchFunction;\n\n onclose?: () => void;\n onerror?: (error: unknown) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n protocolVersion?: string;\n\n constructor({\n url,\n headers,\n authProvider,\n redirect = 'error',\n fetch: fetchFn,\n }: {\n url: string;\n headers?: Record<string, string>;\n authProvider?: OAuthClientProvider;\n redirect?: 'follow' | 'error';\n fetch?: FetchFunction;\n }) {\n this.url = new URL(url);\n this.headers = headers;\n this.authProvider = authProvider;\n this.redirectMode = redirect;\n this.fetchFn = fetchFn ?? globalThis.fetch;\n }\n\n setProtocolVersion(version: string): void {\n this.protocolVersion = version;\n }\n\n private async commonHeaders(\n base: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n ...this.headers,\n ...base,\n 'mcp-protocol-version': this.protocolVersion ?? LATEST_PROTOCOL_VERSION,\n };\n\n if (this.authProvider) {\n const tokens = await this.authProvider.tokens();\n if (tokens?.access_token) {\n headers['Authorization'] = `Bearer ${tokens.access_token}`;\n }\n }\n\n return withUserAgentSuffix(\n headers,\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n }\n\n async start(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.connected) {\n return resolve();\n }\n\n this.abortController = new AbortController();\n\n const establishConnection = async (triedAuth: boolean = false) => {\n try {\n const headers = await this.commonHeaders({\n Accept: 'text/event-stream',\n });\n const response = await this.fetchFn(this.url.href, {\n headers,\n signal: this.abortController?.signal,\n redirect: this.redirectMode,\n });\n\n if (response.status === 401 && this.authProvider && !triedAuth) {\n this.resourceMetadataUrl = extractResourceMetadataUrl(response);\n try {\n const result = await auth(this.authProvider, {\n serverUrl: this.url,\n resourceMetadataUrl: this.resourceMetadataUrl,\n fetchFn: this.fetchFn,\n });\n if (result !== 'AUTHORIZED') {\n const error = new UnauthorizedError();\n this.onerror?.(error);\n return reject(error);\n }\n } catch (error) {\n this.onerror?.(error);\n return reject(error);\n }\n return establishConnection(true);\n }\n\n if (!response.ok || !response.body) {\n let errorMessage = `MCP SSE Transport Error: ${response.status} ${response.statusText}`;\n\n if (response.status === 405) {\n errorMessage +=\n '. This server does not support SSE transport. Try using `http` transport instead';\n }\n\n const error = new MCPClientError({\n message: errorMessage,\n });\n this.onerror?.(error);\n return reject(error);\n }\n\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n const reader = stream.getReader();\n\n const processEvents = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n if (this.connected) {\n this.connected = false;\n throw new MCPClientError({\n message:\n 'MCP SSE Transport Error: Connection closed unexpectedly',\n });\n }\n return;\n }\n\n const { event, data } = value;\n\n if (event === 'endpoint') {\n if (this.endpoint) {\n continue;\n }\n\n const endpoint = new URL(data, this.url);\n\n if (endpoint.origin !== this.url.origin) {\n this.connected = false;\n this.endpoint = undefined;\n this.sseConnection?.close();\n this.abortController?.abort();\n throw new MCPClientError({\n message: `MCP SSE Transport Error: Endpoint origin does not match connection origin: ${endpoint.origin}`,\n });\n }\n\n this.endpoint = endpoint;\n this.connected = true;\n resolve();\n } else if (isMessageEvent(event)) {\n try {\n const message = await parseJSONRPCMessage(data);\n this.onmessage?.(message);\n } catch (error) {\n const e = new MCPClientError({\n message:\n 'MCP SSE Transport Error: Failed to parse message',\n cause: error,\n });\n this.onerror?.(e);\n // We do not throw here so we continue processing events after reporting the error\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n\n this.onerror?.(error);\n reject(error);\n }\n };\n\n this.sseConnection = {\n close: () => reader.cancel(),\n };\n\n processEvents();\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n\n this.onerror?.(error);\n reject(error);\n }\n };\n\n void establishConnection();\n });\n }\n\n async close(): Promise<void> {\n this.connected = false;\n this.endpoint = undefined;\n this.sseConnection?.close();\n this.abortController?.abort();\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n if (!this.endpoint || !this.connected) {\n throw new MCPClientError({\n message: 'MCP SSE Transport Error: Not connected',\n });\n }\n\n const endpoint = this.endpoint as URL;\n\n const attempt = async (triedAuth: boolean = false): Promise<void> => {\n try {\n const headers = await this.commonHeaders({\n 'Content-Type': 'application/json',\n });\n const init = {\n method: 'POST',\n headers,\n body: JSON.stringify(message),\n signal: this.abortController?.signal,\n redirect: this.redirectMode,\n };\n\n const response = await this.fetchFn(endpoint.href, init);\n\n if (response.status === 401 && this.authProvider && !triedAuth) {\n this.resourceMetadataUrl = extractResourceMetadataUrl(response);\n try {\n const result = await auth(this.authProvider, {\n serverUrl: this.url,\n resourceMetadataUrl: this.resourceMetadataUrl,\n fetchFn: this.fetchFn,\n });\n if (result !== 'AUTHORIZED') {\n const error = new UnauthorizedError();\n this.onerror?.(error);\n return;\n }\n } catch (error) {\n this.onerror?.(error);\n return;\n }\n return attempt(true);\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => null);\n const error = new MCPClientError({\n message: `MCP SSE Transport Error: POSTing to endpoint (HTTP ${response.status}): ${text}`,\n });\n this.onerror?.(error);\n return;\n }\n } catch (error) {\n this.onerror?.(error);\n return;\n }\n };\n await attempt();\n }\n}\n\nexport async function deserializeMessage(\n line: string,\n): Promise<JSONRPCMessage> {\n return parseJSONRPCMessage(line);\n}\n","import { parseJSON } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { BaseParamsSchema, RequestSchema, ResultSchema } from './types';\n\nconst JSONRPC_VERSION = '2.0';\n\nconst JSONRPCRequestSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n })\n .merge(RequestSchema)\n .strict();\n\nexport type JSONRPCRequest = z.infer<typeof JSONRPCRequestSchema>;\n\nconst JSONRPCResponseSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n result: ResultSchema,\n })\n .strict();\n\nexport type JSONRPCResponse = z.infer<typeof JSONRPCResponseSchema>;\n\nconst JSONRPCErrorSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n id: z.union([z.string(), z.number().int()]),\n error: z.object({\n code: z.number().int(),\n message: z.string(),\n data: z.optional(z.unknown()),\n }),\n })\n .strict();\n\nexport type JSONRPCError = z.infer<typeof JSONRPCErrorSchema>;\n\nconst JSONRPCNotificationSchema = z\n .object({\n jsonrpc: z.literal(JSONRPC_VERSION),\n })\n .merge(\n z.object({\n method: z.string(),\n params: z.optional(BaseParamsSchema),\n }),\n )\n .strict();\n\nexport type JSONRPCNotification = z.infer<typeof JSONRPCNotificationSchema>;\n\nexport const JSONRPCMessageSchema = z.union([\n JSONRPCRequestSchema,\n JSONRPCNotificationSchema,\n JSONRPCResponseSchema,\n JSONRPCErrorSchema,\n]);\n\nexport type JSONRPCMessage = z.infer<typeof JSONRPCMessageSchema>;\n\nexport async function parseJSONRPCMessage(\n text: string,\n): Promise<JSONRPCMessage> {\n return JSONRPCMessageSchema.parse(await parseJSON({ text }));\n}\n","import { z } from 'zod/v4';\nimport type { JSONObject } from '@ai-sdk/provider';\nimport type { FlexibleSchema, Tool } from '@ai-sdk/provider-utils';\n\nexport const LATEST_PROTOCOL_VERSION = '2025-11-25';\nexport const SUPPORTED_PROTOCOL_VERSIONS = [\n LATEST_PROTOCOL_VERSION,\n '2025-06-18',\n '2025-03-26',\n '2024-11-05',\n];\n\nexport type McpProviderMetadata = {\n clientName?: string;\n title?: string;\n toolName?: string;\n app?: JSONObject;\n};\n\n/** MCP tool metadata - keys should follow MCP _meta key format specification */\nconst ToolMetaSchema = z.optional(z.record(z.string(), z.unknown()));\nexport type ToolMeta = z.infer<typeof ToolMetaSchema>;\n\nexport type ToolSchemas =\n | Record<\n string,\n {\n inputSchema: FlexibleSchema<JSONObject | unknown>;\n outputSchema?: FlexibleSchema<JSONObject | unknown>;\n }\n >\n | 'automatic'\n | undefined;\n\n/** Base MCP tool type with execute and _meta */\ntype McpToolBase<INPUT = unknown, OUTPUT = CallToolResult> = Tool<\n INPUT,\n OUTPUT\n> &\n Required<Pick<Tool<INPUT, OUTPUT>, 'execute'>> & {\n _meta?: ToolMeta;\n };\n\nexport type McpToolSet<TOOL_SCHEMAS extends ToolSchemas = 'automatic'> =\n TOOL_SCHEMAS extends Record<\n string,\n { inputSchema: FlexibleSchema<any>; outputSchema?: FlexibleSchema<any> }\n >\n ? {\n [K in keyof TOOL_SCHEMAS]: TOOL_SCHEMAS[K] extends {\n inputSchema: FlexibleSchema<infer INPUT>;\n outputSchema: FlexibleSchema<infer OUTPUT>;\n }\n ? McpToolBase<INPUT, OUTPUT>\n : TOOL_SCHEMAS[K] extends {\n inputSchema: FlexibleSchema<infer INPUT>;\n }\n ? McpToolBase<INPUT, CallToolResult>\n : never;\n }\n : Record<string, McpToolBase<unknown, CallToolResult>>;\n\nconst ClientOrServerImplementationSchema = z.looseObject({\n name: z.string(),\n version: z.string(),\n title: z.optional(z.string()),\n});\n\n// Maps to `Implementation` in the MCP specification\nexport type Configuration = z.infer<typeof ClientOrServerImplementationSchema>;\n\nexport const BaseParamsSchema = z.looseObject({\n _meta: z.optional(z.object({}).loose()),\n});\ntype BaseParams = z.infer<typeof BaseParamsSchema>;\nexport const ResultSchema = BaseParamsSchema;\n\nexport const RequestSchema = z.object({\n method: z.string(),\n params: z.optional(BaseParamsSchema),\n});\nexport type Request = z.infer<typeof RequestSchema>;\nexport type RequestOptions = {\n signal?: AbortSignal;\n timeout?: number;\n maxTotalTimeout?: number;\n};\n\nexport type Notification = z.infer<typeof RequestSchema>;\n\n/** @see https://modelcontextprotocol.io/specification/2025-06-18/client/elicitation */\nconst ElicitationCapabilitySchema = z\n .object({\n applyDefaults: z.optional(z.boolean()),\n })\n .loose();\n\nconst ServerCapabilitiesSchema = z.looseObject({\n experimental: z.optional(z.object({}).loose()),\n logging: z.optional(z.object({}).loose()),\n prompts: z.optional(\n z.looseObject({\n listChanged: z.optional(z.boolean()),\n }),\n ),\n resources: z.optional(\n z.looseObject({\n subscribe: z.optional(z.boolean()),\n listChanged: z.optional(z.boolean()),\n }),\n ),\n tools: z.optional(\n z.looseObject({\n listChanged: z.optional(z.boolean()),\n }),\n ),\n elicitation: z.optional(ElicitationCapabilitySchema),\n});\n\nexport type ServerCapabilities = z.infer<typeof ServerCapabilitiesSchema>;\nexport const ClientCapabilitiesSchema = z\n .object({\n elicitation: z.optional(ElicitationCapabilitySchema),\n })\n .loose();\n\nexport type ClientCapabilities = z.infer<typeof ClientCapabilitiesSchema>;\nexport type ElicitationCapability = z.infer<typeof ElicitationCapabilitySchema>;\n\nexport const InitializeResultSchema = ResultSchema.extend({\n protocolVersion: z.string(),\n capabilities: ServerCapabilitiesSchema,\n serverInfo: ClientOrServerImplementationSchema,\n instructions: z.optional(z.string()),\n});\nexport type InitializeResult = z.infer<typeof InitializeResultSchema>;\n\nexport type PaginatedRequest = Request & {\n params?: BaseParams & {\n cursor?: string;\n };\n};\n\nconst PaginatedResultSchema = ResultSchema.extend({\n nextCursor: z.optional(z.string()),\n});\n\nconst ToolSchema = z\n .object({\n name: z.string(),\n /**\n * @see https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool\n */\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n inputSchema: z\n .object({\n type: z.literal('object'),\n properties: z.optional(z.object({}).loose()),\n })\n .loose(),\n /**\n * @see https://modelcontextprotocol.io/specification/2025-06-18/server/tools#output-schema\n */\n outputSchema: z.optional(z.object({}).loose()),\n annotations: z.optional(\n z\n .object({\n title: z.optional(z.string()),\n })\n .loose(),\n ),\n _meta: ToolMetaSchema,\n })\n .loose();\nexport type MCPTool = z.infer<typeof ToolSchema>;\nexport const ListToolsResultSchema = PaginatedResultSchema.extend({\n tools: z.array(ToolSchema),\n});\nexport type ListToolsResult = z.infer<typeof ListToolsResultSchema>;\n\nconst TextContentSchema = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n })\n .loose();\nconst ImageContentSchema = z\n .object({\n type: z.literal('image'),\n data: z.base64(),\n mimeType: z.string(),\n })\n .loose();\nexport const ResourceSchema = z\n .object({\n uri: z.string(),\n name: z.string(),\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n mimeType: z.optional(z.string()),\n size: z.optional(z.number()),\n })\n .loose();\nexport type MCPResource = z.infer<typeof ResourceSchema>;\n\nexport const ListResourcesResultSchema = PaginatedResultSchema.extend({\n resources: z.array(ResourceSchema),\n});\nexport type ListResourcesResult = z.infer<typeof ListResourcesResultSchema>;\n\nconst ResourceContentsSchema = z\n .object({\n /**\n * The URI of this resource.\n */\n uri: z.string(),\n /**\n * Optional display name of the resource content.\n */\n name: z.optional(z.string()),\n /**\n * Optional human readable title.\n */\n title: z.optional(z.string()),\n /**\n * The MIME type of this resource, if known.\n */\n mimeType: z.optional(z.string()),\n })\n .loose();\nconst TextResourceContentsSchema = ResourceContentsSchema.extend({\n text: z.string(),\n});\nconst BlobResourceContentsSchema = ResourceContentsSchema.extend({\n blob: z.base64(),\n});\nconst EmbeddedResourceSchema = z\n .object({\n type: z.literal('resource'),\n resource: z.union([TextResourceContentsSchema, BlobResourceContentsSchema]),\n })\n .loose();\nconst ResourceLinkContentSchema = z\n .object({\n type: z.literal('resource_link'),\n uri: z.string(),\n name: z.string(),\n description: z.optional(z.string()),\n mimeType: z.optional(z.string()),\n })\n .loose();\n\nexport const CallToolResultSchema = ResultSchema.extend({\n content: z.array(\n z.union([\n TextContentSchema,\n ImageContentSchema,\n EmbeddedResourceSchema,\n ResourceLinkContentSchema,\n ]),\n ),\n /**\n * @see https://modelcontextprotocol.io/specification/2025-06-18/server/tools#structured-content\n */\n structuredContent: z.optional(z.unknown()),\n isError: z.boolean().default(false).optional(),\n}).or(\n ResultSchema.extend({\n toolResult: z.unknown(),\n }),\n);\nexport type CallToolResult = z.infer<typeof CallToolResultSchema>;\n\nconst ResourceTemplateSchema = z\n .object({\n uriTemplate: z.string(),\n name: z.string(),\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n mimeType: z.optional(z.string()),\n })\n .loose();\n\nexport const ListResourceTemplatesResultSchema = ResultSchema.extend({\n resourceTemplates: z.array(ResourceTemplateSchema),\n});\nexport type ListResourceTemplatesResult = z.infer<\n typeof ListResourceTemplatesResultSchema\n>;\n\nexport const ReadResourceResultSchema = ResultSchema.extend({\n contents: z.array(\n z.union([TextResourceContentsSchema, BlobResourceContentsSchema]),\n ),\n});\nexport type ReadResourceResult = z.infer<typeof ReadResourceResultSchema>;\n\n// Prompts\nconst PromptArgumentSchema = z\n .object({\n name: z.string(),\n description: z.optional(z.string()),\n required: z.optional(z.boolean()),\n })\n .loose();\n\nexport const PromptSchema = z\n .object({\n name: z.string(),\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n arguments: z.optional(z.array(PromptArgumentSchema)),\n })\n .loose();\nexport type MCPPrompt = z.infer<typeof PromptSchema>;\n\nexport const ListPromptsResultSchema = PaginatedResultSchema.extend({\n prompts: z.array(PromptSchema),\n});\nexport type ListPromptsResult = z.infer<typeof ListPromptsResultSchema>;\n\nconst PromptMessageSchema = z\n .object({\n role: z.union([z.literal('user'), z.literal('assistant')]),\n content: z.union([\n TextContentSchema,\n ImageContentSchema,\n EmbeddedResourceSchema,\n ResourceLinkContentSchema,\n ]),\n })\n .loose();\nexport type MCPPromptMessage = z.infer<typeof PromptMessageSchema>;\n\nexport const GetPromptResultSchema = ResultSchema.extend({\n description: z.optional(z.string()),\n messages: z.array(PromptMessageSchema),\n});\nexport type GetPromptResult = z.infer<typeof GetPromptResultSchema>;\n\nconst ElicitationRequestParamsSchema = BaseParamsSchema.extend({\n message: z.string(),\n requestedSchema: z.unknown(),\n});\n\nexport const ElicitationRequestSchema = RequestSchema.extend({\n method: z.literal('elicitation/create'),\n params: ElicitationRequestParamsSchema,\n});\n\nexport type ElicitationRequest = z.infer<typeof ElicitationRequestSchema>;\n\nexport const ElicitResultSchema = ResultSchema.extend({\n action: z.union([\n z.literal('accept'),\n z.literal('decline'),\n z.literal('cancel'),\n ]),\n content: z.optional(z.record(z.string(), z.unknown())),\n});\n\nexport type ElicitResult = z.infer<typeof ElicitResultSchema>;\n","declare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import pkceChallenge from 'pkce-challenge';\nimport {\n OAuthProtectedResourceMetadataSchema,\n OAuthMetadataSchema,\n OpenIdProviderDiscoveryMetadataSchema,\n OAuthTokensSchema,\n OAuthErrorResponseSchema,\n OAuthClientInformationFullSchema,\n type OAuthTokens,\n type OAuthProtectedResourceMetadata,\n type AuthorizationServerMetadata,\n type OAuthClientInformation,\n type OAuthClientMetadata,\n type OAuthClientInformationFull,\n} from './oauth-types';\nimport {\n MCPClientOAuthError,\n ServerError,\n OAUTH_ERRORS,\n InvalidClientError,\n InvalidGrantError,\n UnauthorizedClientError,\n} from '../error/oauth-error';\nimport {\n resourceUrlFromServerUrl,\n checkResourceAllowed,\n resourceUrlStripSlash,\n} from '../util/oauth-util';\nimport { LATEST_PROTOCOL_VERSION } from './types';\nimport { parseJSON, type FetchFunction } from '@ai-sdk/provider-utils';\nexport type AuthResult = 'AUTHORIZED' | 'REDIRECT';\n\nexport interface OAuthAuthorizationServerInformation {\n authorizationServerUrl: string;\n tokenEndpoint: string;\n}\n\nexport interface OAuthClientProvider {\n /**\n * Returns current access token if present; undefined otherwise.\n */\n tokens(): OAuthTokens | undefined | Promise<OAuthTokens | undefined>;\n saveTokens(tokens: OAuthTokens): void | Promise<void>;\n redirectToAuthorization(authorizationUrl: URL): void | Promise<void>;\n saveCodeVerifier(codeVerifier: string): void | Promise<void>;\n codeVerifier(): string | Promise<string>;\n\n /**\n * Adds custom client authentication to OAuth token requests.\n *\n * This optional method allows implementations to customize how client credentials\n * are included in token exchange and refresh requests. When provided, this method\n * is called instead of the default authentication logic, giving full control over\n * the authentication mechanism.\n *\n * Common use cases include:\n * - Supporting authentication methods beyond the standard OAuth 2.0 methods\n * - Adding custom headers for proprietary authentication schemes\n * - Implementing client assertion-based authentication (e.g., JWT bearer tokens)\n *\n * @param headers - The request headers (can be modified to add authentication)\n * @param params - The request body parameters (can be modified to add credentials)\n * @param url - The token endpoint URL being called\n * @param metadata - Optional OAuth metadata for the server, which may include supported authentication methods\n */\n addClientAuthentication?(\n headers: Headers,\n params: URLSearchParams,\n url: string | URL,\n metadata?: AuthorizationServerMetadata,\n ): void | Promise<void>;\n\n /**\n * If implemented, provides a way for the client to invalidate (e.g. delete) the specified\n * credentials, in the case where the server has indicated that they are no longer valid.\n * This avoids requiring the user to intervene manually.\n */\n invalidateCredentials?(\n scope: 'all' | 'client' | 'tokens' | 'verifier',\n ): void | Promise<void>;\n get redirectUrl(): string | URL;\n get clientMetadata(): OAuthClientMetadata;\n clientInformation():\n | OAuthClientInformation\n | undefined\n | Promise<OAuthClientInformation | undefined>;\n saveClientInformation?(\n clientInformation: OAuthClientInformation,\n ): void | Promise<void>;\n authorizationServerInformation?():\n | OAuthAuthorizationServerInformation\n | undefined\n | Promise<OAuthAuthorizationServerInformation | undefined>;\n saveAuthorizationServerInformation?(\n authorizationServerInformation: OAuthAuthorizationServerInformation,\n ): void | Promise<void>;\n /**\n * Validates an authorization server URL discovered from MCP protected resource\n * metadata before the client fetches its OAuth metadata.\n */\n validateAuthorizationServerURL?(\n serverUrl: string | URL,\n authorizationServerUrl: string | URL,\n ): void | Promise<void>;\n state?(): string | Promise<string>;\n saveState?(state: string): void | Promise<void>;\n storedState?(): string | undefined | Promise<string | undefined>;\n validateResourceURL?(\n serverUrl: string | URL,\n resource?: string,\n ): Promise<URL | undefined>;\n}\n\nexport class UnauthorizedError extends Error {\n constructor(message = 'Unauthorized') {\n super(message);\n this.name = 'UnauthorizedError';\n }\n}\n\nfunction normalizeUrl(url: string | URL): string {\n return new URL(url).href;\n}\n\nfunction createAuthorizationServerInformation(\n authorizationServerUrl: string | URL,\n metadata?: AuthorizationServerMetadata,\n): OAuthAuthorizationServerInformation {\n return {\n authorizationServerUrl: normalizeUrl(authorizationServerUrl),\n tokenEndpoint: normalizeUrl(\n metadata?.token_endpoint\n ? new URL(metadata.token_endpoint)\n : new URL('/token', authorizationServerUrl),\n ),\n };\n}\n\nfunction addAuthorizationServerInformationToTokens(\n tokens: OAuthTokens,\n authorizationServerInformation: OAuthAuthorizationServerInformation,\n): OAuthTokens {\n return {\n ...tokens,\n authorization_server: authorizationServerInformation.authorizationServerUrl,\n token_endpoint: authorizationServerInformation.tokenEndpoint,\n };\n}\n\nfunction addAuthorizationServerInformationToClientInformation<\n CLIENT_INFORMATION extends OAuthClientInformation,\n>(\n clientInformation: CLIENT_INFORMATION,\n authorizationServerInformation: OAuthAuthorizationServerInformation,\n): CLIENT_INFORMATION {\n return {\n ...clientInformation,\n authorization_server: authorizationServerInformation.authorizationServerUrl,\n token_endpoint: authorizationServerInformation.tokenEndpoint,\n };\n}\n\nfunction getAuthorizationServerInformationFromCredentials(credentials?: {\n authorization_server?: string;\n token_endpoint?: string;\n}): OAuthAuthorizationServerInformation | undefined {\n if (!credentials?.authorization_server || !credentials.token_endpoint) {\n return undefined;\n }\n\n return {\n authorizationServerUrl: normalizeUrl(credentials.authorization_server),\n tokenEndpoint: normalizeUrl(credentials.token_endpoint),\n };\n}\n\nasync function getStoredAuthorizationServerInformation({\n provider,\n clientInformation,\n tokens,\n}: {\n provider: OAuthClientProvider;\n clientInformation: OAuthClientInformation;\n tokens?: OAuthTokens;\n}): Promise<OAuthAuthorizationServerInformation | undefined> {\n const tokenAuthorizationServerInformation =\n getAuthorizationServerInformationFromCredentials(tokens);\n if (tokenAuthorizationServerInformation) {\n return tokenAuthorizationServerInformation;\n }\n\n const providerAuthorizationServerInformation =\n await provider.authorizationServerInformation?.();\n if (providerAuthorizationServerInformation) {\n return {\n authorizationServerUrl: normalizeUrl(\n providerAuthorizationServerInformation.authorizationServerUrl,\n ),\n tokenEndpoint: normalizeUrl(\n providerAuthorizationServerInformation.tokenEndpoint,\n ),\n };\n }\n\n return getAuthorizationServerInformationFromCredentials(clientInformation);\n}\n\nasync function saveAuthorizationServerInformation({\n provider,\n clientInformation,\n authorizationServerInformation,\n}: {\n provider: OAuthClientProvider;\n clientInformation: OAuthClientInformation;\n authorizationServerInformation: OAuthAuthorizationServerInformation;\n}): Promise<boolean> {\n if (provider.saveAuthorizationServerInformation) {\n await provider.saveAuthorizationServerInformation(\n authorizationServerInformation,\n );\n return true;\n }\n\n if (provider.saveClientInformation) {\n await provider.saveClientInformation(\n addAuthorizationServerInformationToClientInformation(\n clientInformation,\n authorizationServerInformation,\n ),\n );\n return true;\n }\n\n return false;\n}\n\nfunction assertResourceMetadataUrlSameOrigin(\n serverUrl: string | URL,\n resourceMetadataUrl?: URL,\n): void {\n if (!resourceMetadataUrl) {\n return;\n }\n\n const expectedOrigin = new URL(serverUrl).origin;\n if (resourceMetadataUrl.origin !== expectedOrigin) {\n throw new MCPClientOAuthError({\n message: `OAuth protected resource metadata URL ${resourceMetadataUrl.href} must have the same origin as the MCP server URL ${expectedOrigin}`,\n });\n }\n}\n\nfunction assertAuthorizationServerInformationMatches({\n storedAuthorizationServerInformation,\n currentAuthorizationServerInformation,\n}: {\n storedAuthorizationServerInformation: OAuthAuthorizationServerInformation;\n currentAuthorizationServerInformation: OAuthAuthorizationServerInformation;\n}): void {\n if (\n storedAuthorizationServerInformation.authorizationServerUrl !==\n currentAuthorizationServerInformation.authorizationServerUrl ||\n storedAuthorizationServerInformation.tokenEndpoint !==\n currentAuthorizationServerInformation.tokenEndpoint\n ) {\n throw new MCPClientOAuthError({\n message:\n 'OAuth authorization server metadata does not match the metadata that issued the stored credentials',\n });\n }\n}\n\n/**\n * Extracts the OAuth 2.0 Protected Resource Metadata URL from a WWW-Authenticate header (RFC9728).\n * Looks for a resource=\"...\" parameter.\n */\nexport function extractResourceMetadataUrl(\n response: Response,\n): URL | undefined {\n const header =\n response.headers.get('www-authenticate') ??\n response.headers.get('WWW-Authenticate');\n if (!header) {\n return undefined;\n }\n\n const [type, scheme] = header.split(' ');\n if (type.toLowerCase() !== 'bearer' || !scheme) {\n return undefined;\n }\n\n // regex taken from MCP spec\n const regex = /resource_metadata=\"([^\"]*)\"/;\n const match = header.match(regex);\n if (!match) {\n return undefined;\n }\n\n try {\n return new URL(match[1]);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Constructs the well-known path for auth-related metadata discovery\n */\nfunction buildWellKnownPath(\n wellKnownPrefix:\n | 'oauth-authorization-server'\n | 'oauth-protected-resource'\n | 'openid-configuration',\n pathname: string = '',\n options: { prependPathname?: boolean } = {},\n): string {\n if (pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1);\n }\n\n return options.prependPathname\n ? `${pathname}/.well-known/${wellKnownPrefix}`\n : `/.well-known/${wellKnownPrefix}${pathname}`;\n}\n\nasync function fetchWithCorsRetry(\n url: URL,\n headers?: Record<string, string>,\n fetchFn: FetchFunction = fetch,\n): Promise<Response | undefined> {\n try {\n return await fetchFn(url, { headers });\n } catch (error) {\n if (error instanceof TypeError) {\n if (headers) {\n return fetchWithCorsRetry(url, undefined, fetchFn);\n } else {\n return undefined;\n }\n }\n throw error;\n }\n}\n\n/**\n * Tries to discover OAuth metadata at a specific URL\n */\nasync function tryMetadataDiscovery(\n url: URL,\n protocolVersion: string,\n fetchFn: FetchFunction = fetch,\n): Promise<Response | undefined> {\n const headers = {\n 'MCP-Protocol-Version': protocolVersion,\n };\n return await fetchWithCorsRetry(url, headers, fetchFn);\n}\n\n/**\n * Determines if fallback to root discovery should be attempted\n */\nfunction shouldAttemptFallback(\n response: Response | undefined,\n pathname: string,\n): boolean {\n return (\n !response ||\n (response.status >= 400 && response.status < 500 && pathname !== '/')\n );\n}\n\n/**\n * Generic function for discovering OAuth metadata with fallback support\n */\nasync function discoverMetadataWithFallback(\n serverUrl: string | URL,\n wellKnownType: 'oauth-authorization-server' | 'oauth-protected-resource',\n fetchFn: FetchFunction,\n opts?: {\n protocolVersion?: string;\n metadataUrl?: string | URL;\n metadataServerUrl?: string | URL;\n },\n): Promise<Response | undefined> {\n const issuer = new URL(serverUrl);\n const protocolVersion = opts?.protocolVersion ?? LATEST_PROTOCOL_VERSION;\n\n let url: URL;\n if (opts?.metadataUrl) {\n url = new URL(opts.metadataUrl);\n } else {\n const wellKnownPath = buildWellKnownPath(wellKnownType, issuer.pathname);\n url = new URL(wellKnownPath, opts?.metadataServerUrl ?? issuer);\n url.search = issuer.search;\n }\n\n let response = await tryMetadataDiscovery(url, protocolVersion, fetchFn);\n\n if (!opts?.metadataUrl && shouldAttemptFallback(response, issuer.pathname)) {\n const rootUrl = new URL(`/.well-known/${wellKnownType}`, issuer);\n response = await tryMetadataDiscovery(rootUrl, protocolVersion, fetchFn);\n }\n\n return response;\n}\n\nexport async function discoverOAuthProtectedResourceMetadata(\n serverUrl: string | URL,\n opts?: { protocolVersion?: string; resourceMetadataUrl?: string | URL },\n fetchFn: FetchFunction = fetch,\n): Promise<OAuthProtectedResourceMetadata> {\n const response = await discoverMetadataWithFallback(\n serverUrl,\n 'oauth-protected-resource',\n fetchFn,\n {\n protocolVersion: opts?.protocolVersion,\n metadataUrl: opts?.resourceMetadataUrl,\n },\n );\n\n if (!response || response.status === 404) {\n throw new Error(\n `Resource server does not implement OAuth 2.0 Protected Resource Metadata.`,\n );\n }\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status} trying to load well-known OAuth protected resource metadata.`,\n );\n }\n return OAuthProtectedResourceMetadataSchema.parse(await response.json());\n}\n\n/**\n * Builds a list of discovery URLs to try for authorization server metadata.\n * URLs are returned in priority order:\n * 1. OAuth metadata at the given URL\n * 2. OAuth metadata at root (if URL has path)\n * 3. OIDC metadata endpoints\n */\nexport function buildDiscoveryUrls(\n authorizationServerUrl: string | URL,\n): { url: URL; type: 'oauth' | 'oidc'; expectedIssuer: string }[] {\n const url =\n typeof authorizationServerUrl === 'string'\n ? new URL(authorizationServerUrl)\n : authorizationServerUrl;\n const hasPath = url.pathname !== '/';\n const rootIssuer = url.origin;\n const urlsToTry: {\n url: URL;\n type: 'oauth' | 'oidc';\n expectedIssuer: string;\n }[] = [];\n\n if (!hasPath) {\n urlsToTry.push({\n url: new URL('/.well-known/oauth-authorization-server', url.origin),\n type: 'oauth',\n expectedIssuer: rootIssuer,\n });\n\n urlsToTry.push({\n url: new URL('/.well-known/openid-configuration', url.origin),\n type: 'oidc',\n expectedIssuer: rootIssuer,\n });\n\n return urlsToTry;\n }\n\n let pathname = url.pathname;\n if (pathname.endsWith('/')) {\n pathname = pathname.slice(0, -1);\n }\n const pathIssuer = `${url.origin}${pathname}`;\n\n urlsToTry.push({\n url: new URL(\n `/.well-known/oauth-authorization-server${pathname}`,\n url.origin,\n ),\n type: 'oauth',\n expectedIssuer: pathIssuer,\n });\n\n urlsToTry.push({\n url: new URL('/.well-known/oauth-authorization-server', url.origin),\n type: 'oauth',\n expectedIssuer: rootIssuer,\n });\n\n urlsToTry.push({\n url: new URL(`/.well-known/openid-configuration${pathname}`, url.origin),\n type: 'oidc',\n expectedIssuer: pathIssuer,\n });\n\n urlsToTry.push({\n url: new URL(`${pathname}/.well-known/openid-configuration`, url.origin),\n type: 'oidc',\n expectedIssuer: pathIssuer,\n });\n\n return urlsToTry;\n}\n\nfunction assertMetadataIssuerMatches(\n metadata: AuthorizationServerMetadata,\n expectedIssuer: string,\n): void {\n if (metadata.issuer !== expectedIssuer) {\n throw new MCPClientOAuthError({\n message: `OAuth authorization server metadata issuer ${metadata.issuer} does not match expected issuer ${expectedIssuer}`,\n });\n }\n}\n\nexport async function discoverAuthorizationServerMetadata(\n authorizationServerUrl: string | URL,\n {\n fetchFn = fetch,\n protocolVersion = LATEST_PROTOCOL_VERSION,\n }: {\n fetchFn?: FetchFunction;\n protocolVersion?: string;\n } = {},\n): Promise<AuthorizationServerMetadata | undefined> {\n const headers = { 'MCP-Protocol-Version': protocolVersion };\n\n const urlsToTry = buildDiscoveryUrls(authorizationServerUrl);\n\n for (const { url: endpointUrl, type, expectedIssuer } of urlsToTry) {\n const response = await fetchWithCorsRetry(endpointUrl, headers, fetchFn);\n\n if (!response) {\n /**\n * CORS error occurred - don't throw as the endpoint may not allow CORS,\n * continue trying other possible endpoints\n */\n continue;\n }\n\n if (!response.ok) {\n // Continue looking for any 4xx response code.\n if (response.status >= 400 && response.status < 500) {\n continue;\n }\n throw new Error(\n `HTTP ${response.status} trying to load ${type === 'oauth' ? 'OAuth' : 'OpenID provider'} metadata from ${endpointUrl}`,\n );\n }\n\n if (type === 'oauth') {\n const metadata = OAuthMetadataSchema.parse(await response.json());\n assertMetadataIssuerMatches(metadata, expectedIssuer);\n return metadata;\n } else {\n const metadata = OpenIdProviderDiscoveryMetadataSchema.parse(\n await response.json(),\n );\n assertMetadataIssuerMatches(metadata, expectedIssuer);\n\n // MCP spec requires OIDC providers to support S256 PKCE\n if (!metadata.code_challenge_methods_supported?.includes('S256')) {\n throw new Error(\n `Incompatible OIDC provider at ${endpointUrl}: does not support S256 code challenge method required by MCP specification`,\n );\n }\n\n return metadata;\n }\n }\n\n return undefined;\n}\n\nexport async function startAuthorization(\n authorizationServerUrl: string | URL,\n {\n metadata,\n clientInformation,\n redirectUrl,\n scope,\n state,\n resource,\n }: {\n metadata?: AuthorizationServerMetadata;\n clientInformation: OAuthClientInformation;\n redirectUrl: string | URL;\n scope?: string;\n state?: string;\n resource?: URL;\n },\n): Promise<{ authorizationUrl: URL; codeVerifier: string }> {\n const responseType = 'code';\n const codeChallengeMethod = 'S256';\n\n let authorizationUrl: URL;\n if (metadata) {\n authorizationUrl = new URL(metadata.authorization_endpoint);\n\n if (!metadata.response_types_supported.includes(responseType)) {\n throw new Error(\n `Incompatible auth server: does not support response type ${responseType}`,\n );\n }\n\n if (\n !metadata.code_challenge_methods_supported ||\n !metadata.code_challenge_methods_supported.includes(codeChallengeMethod)\n ) {\n throw new Error(\n `Incompatible auth server: does not support code challenge method ${codeChallengeMethod}`,\n );\n }\n } else {\n authorizationUrl = new URL('/authorize', authorizationServerUrl);\n }\n\n const challenge = await pkceChallenge();\n const codeVerifier = challenge.code_verifier;\n const codeChallenge = challenge.code_challenge;\n\n authorizationUrl.searchParams.set('response_type', responseType);\n authorizationUrl.searchParams.set('client_id', clientInformation.client_id);\n authorizationUrl.searchParams.set('code_challenge', codeChallenge);\n authorizationUrl.searchParams.set(\n 'code_challenge_method',\n codeChallengeMethod,\n );\n authorizationUrl.searchParams.set('redirect_uri', String(redirectUrl));\n\n if (state) {\n authorizationUrl.searchParams.set('state', state);\n }\n\n if (scope) {\n authorizationUrl.searchParams.set('scope', scope);\n }\n\n if (scope?.includes('offline_access')) {\n // if the request includes the OIDC-only \"offline_access\" scope,\n // we need to set the prompt to \"consent\" to ensure the user is prompted to grant offline access\n // https://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess\n authorizationUrl.searchParams.append('prompt', 'consent');\n }\n\n if (resource) {\n authorizationUrl.searchParams.set(\n 'resource',\n resourceUrlStripSlash(resource),\n );\n }\n\n return { authorizationUrl, codeVerifier };\n}\n\ntype ClientAuthMethod = 'client_secret_basic' | 'client_secret_post' | 'none';\n\n/**\n * Determines the best client authentication method to use based on server support and client configuration.\n *\n * Priority order (highest to lowest):\n * 1. client_secret_basic (if client secret is available)\n * 2. client_secret_post (if client secret is available)\n * 3. none (for public clients)\n *\n * @param clientInformation - OAuth client information containing credentials\n * @param supportedMethods - Authentication methods supported by the authorization server\n * @returns The selected authentication method\n */\nfunction selectClientAuthMethod(\n clientInformation: OAuthClientInformation,\n supportedMethods: string[],\n): ClientAuthMethod {\n const hasClientSecret = clientInformation.client_secret !== undefined;\n\n if (supportedMethods.length === 0) {\n return hasClientSecret ? 'client_secret_post' : 'none';\n }\n\n if (hasClientSecret && supportedMethods.includes('client_secret_basic')) {\n return 'client_secret_basic';\n }\n\n if (hasClientSecret && supportedMethods.includes('client_secret_post')) {\n return 'client_secret_post';\n }\n\n if (supportedMethods.includes('none')) {\n return 'none';\n }\n\n return hasClientSecret ? 'client_secret_post' : 'none';\n}\n\n/**\n * Applies client authentication to the request based on the specified method.\n *\n * Implements OAuth 2.1 client authentication methods:\n * - client_secret_basic: HTTP Basic authentication (RFC 6749 Section 2.3.1)\n * - client_secret_post: Credentials in request body (RFC 6749 Section 2.3.1)\n * - none: Public client authentication (RFC 6749 Section 2.1)\n *\n * @param method - The authentication method to use\n * @param clientInformation - OAuth client information containing credentials\n * @param headers - HTTP headers object to modify\n * @param params - URL search parameters to modify\n * @throws {Error} When required credentials are missing\n */\nfunction applyClientAuthentication(\n method: ClientAuthMethod,\n clientInformation: OAuthClientInformation,\n headers: Headers,\n params: URLSearchParams,\n): void {\n const { client_id, client_secret } = clientInformation;\n\n switch (method) {\n case 'client_secret_basic':\n applyBasicAuth(client_id, client_secret, headers);\n return;\n case 'client_secret_post':\n applyPostAuth(client_id, client_secret, params);\n return;\n case 'none':\n applyPublicAuth(client_id, params);\n return;\n default:\n throw new Error(`Unsupported client authentication method: ${method}`);\n }\n}\n\nfunction applyBasicAuth(\n clientId: string,\n clientSecret: string | undefined,\n headers: Headers,\n): void {\n if (!clientSecret) {\n throw new Error(\n 'client_secret_basic authentication requires a client_secret',\n );\n }\n\n const credentials = btoa(`${clientId}:${clientSecret}`);\n headers.set('Authorization', `Basic ${credentials}`);\n}\n\n/**\n * Applies POST body authentication (RFC 6749 Section 2.3.1)\n */\nfunction applyPostAuth(\n clientId: string,\n clientSecret: string | undefined,\n params: URLSearchParams,\n): void {\n params.set('client_id', clientId);\n if (clientSecret) {\n params.set('client_secret', clientSecret);\n }\n}\n\n/**\n * Applies public client authentication (RFC 6749 Section 2.1)\n */\nfunction applyPublicAuth(clientId: string, params: URLSearchParams): void {\n params.set('client_id', clientId);\n}\n\n/**\n * Parses an OAuth error response from a string or Response object.\n *\n * If the input is a standard OAuth2.0 error response, it will be parsed according to the spec\n * and an instance of the appropriate OAuthError subclass will be returned.\n * If parsing fails, it falls back to a generic ServerError that includes\n * the response status (if available) and original content.\n *\n * @param input - A Response object or string containing the error response\n * @returns A Promise that resolves to an OAuthError instance\n */\nexport async function parseErrorResponse(\n input: Response | string,\n): Promise<MCPClientOAuthError> {\n const statusCode = input instanceof Response ? input.status : undefined;\n const body = input instanceof Response ? await input.text() : input;\n\n try {\n const result = OAuthErrorResponseSchema.parse(\n await parseJSON({ text: body }),\n );\n const { error, error_description, error_uri } = result;\n const errorClass = OAUTH_ERRORS[error] || ServerError;\n return new errorClass({\n message: error_description || '',\n cause: error_uri,\n });\n } catch (error) {\n // Not a valid OAuth error response, but try to inform the user of the raw data anyway\n const errorMessage = `${statusCode ? `HTTP ${statusCode}: ` : ''}Invalid OAuth error response: ${error}. Raw body: ${body}`;\n return new ServerError({ message: errorMessage });\n }\n}\n\n/**\n * Exchanges an authorization code for an access token with the given server.\n *\n * Supports multiple client authentication methods as specified in OAuth 2.1:\n * - Automatically selects the best authentication method based on server support\n * - Falls back to appropriate defaults when server metadata is unavailable\n *\n * @param authorizationServerUrl - The authorization server's base URL\n * @param options - Configuration object containing client info, auth code, etc.\n * @returns Promise resolving to OAuth tokens\n * @throws {Error} When token exchange fails or authentication is invalid\n */\nexport async function exchangeAuthorization(\n authorizationServerUrl: string | URL,\n {\n metadata,\n clientInformation,\n authorizationCode,\n codeVerifier,\n redirectUri,\n resource,\n addClientAuthentication,\n fetchFn,\n }: {\n metadata?: AuthorizationServerMetadata;\n clientInformation: OAuthClientInformation;\n authorizationCode: string;\n codeVerifier: string;\n redirectUri: string | URL;\n resource?: URL;\n addClientAuthentication?: OAuthClientProvider['addClientAuthentication'];\n fetchFn?: FetchFunction;\n },\n): Promise<OAuthTokens> {\n const grantType = 'authorization_code';\n\n const tokenUrl = metadata?.token_endpoint\n ? new URL(metadata.token_endpoint)\n : new URL('/token', authorizationServerUrl);\n\n if (\n metadata?.grant_types_supported &&\n !metadata.grant_types_supported.includes(grantType)\n ) {\n throw new Error(\n `Incompatible auth server: does not support grant type ${grantType}`,\n );\n }\n\n const headers = new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n });\n const params = new URLSearchParams({\n grant_type: grantType,\n code: authorizationCode,\n code_verifier: codeVerifier,\n redirect_uri: String(redirectUri),\n });\n\n if (addClientAuthentication) {\n await addClientAuthentication(\n headers,\n params,\n authorizationServerUrl,\n metadata,\n );\n } else {\n const supportedMethods =\n metadata?.token_endpoint_auth_methods_supported ?? [];\n const authMethod = selectClientAuthMethod(\n clientInformation,\n supportedMethods,\n );\n\n applyClientAuthentication(authMethod, clientInformation, headers, params);\n }\n\n if (resource) {\n params.set('resource', resourceUrlStripSlash(resource));\n }\n\n const response = await (fetchFn ?? fetch)(tokenUrl, {\n method: 'POST',\n headers,\n body: params,\n });\n\n if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n return OAuthTokensSchema.parse(await response.json());\n}\n\n/**\n * Exchange a refresh token for an updated access token.\n *\n * Supports multiple client authentication methods as specified in OAuth 2.1:\n * - Automatically selects the best authentication method based on server support\n * - Preserves the original refresh token if a new one is not returned\n *\n * @param authorizationServerUrl - The authorization server's base URL\n * @param options - Configuration object containing client info, refresh token, etc.\n * @returns Promise resolving to OAuth tokens (preserves original refresh_token if not replaced)\n * @throws {Error} When token refresh fails or authentication is invalid\n */\nexport async function refreshAuthorization(\n authorizationServerUrl: string | URL,\n {\n metadata,\n clientInformation,\n refreshToken,\n resource,\n addClientAuthentication,\n fetchFn,\n }: {\n metadata?: AuthorizationServerMetadata;\n clientInformation: OAuthClientInformation;\n refreshToken: string;\n resource?: URL;\n addClientAuthentication?: OAuthClientProvider['addClientAuthentication'];\n fetchFn?: FetchFunction;\n },\n): Promise<OAuthTokens> {\n const grantType = 'refresh_token';\n\n let tokenUrl: URL;\n if (metadata) {\n tokenUrl = new URL(metadata.token_endpoint);\n\n if (\n metadata.grant_types_supported &&\n !metadata.grant_types_supported.includes(grantType)\n ) {\n throw new Error(\n `Incompatible auth server: does not support grant type ${grantType}`,\n );\n }\n } else {\n tokenUrl = new URL('/token', authorizationServerUrl);\n }\n\n const headers = new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n });\n const params = new URLSearchParams({\n grant_type: grantType,\n refresh_token: refreshToken,\n });\n\n if (addClientAuthentication) {\n await addClientAuthentication(\n headers,\n params,\n authorizationServerUrl,\n metadata,\n );\n } else {\n const supportedMethods =\n metadata?.token_endpoint_auth_methods_supported ?? [];\n const authMethod = selectClientAuthMethod(\n clientInformation,\n supportedMethods,\n );\n\n applyClientAuthentication(authMethod, clientInformation, headers, params);\n }\n\n if (resource) {\n params.set('resource', resourceUrlStripSlash(resource));\n }\n\n const response = await (fetchFn ?? fetch)(tokenUrl, {\n method: 'POST',\n headers,\n body: params,\n });\n if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n return OAuthTokensSchema.parse({\n refresh_token: refreshToken,\n ...(await response.json()),\n });\n}\n\n/**\n * Performs OAuth 2.0 Dynamic Client Registration according to RFC 7591.\n */\nexport async function registerClient(\n authorizationServerUrl: string | URL,\n {\n metadata,\n clientMetadata,\n fetchFn,\n }: {\n metadata?: AuthorizationServerMetadata;\n clientMetadata: OAuthClientMetadata;\n fetchFn?: FetchFunction;\n },\n): Promise<OAuthClientInformationFull> {\n let registrationUrl: URL;\n\n if (metadata) {\n if (!metadata.registration_endpoint) {\n throw new Error(\n 'Incompatible auth server: does not support dynamic client registration',\n );\n }\n\n registrationUrl = new URL(metadata.registration_endpoint);\n } else {\n registrationUrl = new URL('/register', authorizationServerUrl);\n }\n\n const response = await (fetchFn ?? fetch)(registrationUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(clientMetadata),\n });\n\n if (!response.ok) {\n throw await parseErrorResponse(response);\n }\n\n return OAuthClientInformationFullSchema.parse(await response.json());\n}\n\nexport async function auth(\n provider: OAuthClientProvider,\n options: {\n serverUrl: string | URL;\n authorizationCode?: string;\n callbackState?: string;\n scope?: string;\n resourceMetadataUrl?: URL;\n fetchFn?: FetchFunction;\n },\n): Promise<AuthResult> {\n try {\n return await authInternal(provider, options);\n } catch (error) {\n if (\n error instanceof InvalidClientError ||\n error instanceof UnauthorizedClientError\n ) {\n await provider.invalidateCredentials?.('all');\n return await authInternal(provider, options);\n } else if (error instanceof InvalidGrantError) {\n await provider.invalidateCredentials?.('tokens');\n return await authInternal(provider, options);\n }\n\n throw error;\n }\n}\n\nexport async function selectResourceURL(\n serverUrl: string | URL,\n provider: OAuthClientProvider,\n resourceMetadata?: OAuthProtectedResourceMetadata,\n): Promise<URL | undefined> {\n const defaultResource = resourceUrlFromServerUrl(serverUrl);\n\n if (provider.validateResourceURL) {\n return await provider.validateResourceURL(\n defaultResource,\n resourceMetadata?.resource,\n );\n }\n\n if (!resourceMetadata) {\n return undefined;\n }\n\n if (\n !checkResourceAllowed({\n requestedResource: defaultResource,\n configuredResource: resourceMetadata.resource,\n })\n ) {\n throw new Error(\n `Protected resource ${resourceMetadata.resource} does not match expected ${defaultResource} (or origin)`,\n );\n }\n return new URL(resourceMetadata.resource);\n}\n\nasync function authInternal(\n provider: OAuthClientProvider,\n {\n serverUrl,\n authorizationCode,\n callbackState,\n scope,\n resourceMetadataUrl,\n fetchFn,\n }: {\n serverUrl: string | URL;\n authorizationCode?: string;\n callbackState?: string;\n scope?: string;\n resourceMetadataUrl?: URL;\n fetchFn?: FetchFunction;\n },\n): Promise<AuthResult> {\n let resourceMetadata: OAuthProtectedResourceMetadata | undefined;\n let authorizationServerUrl: string | URL | undefined;\n\n /** Reject Protected Resource Metadata URLs outside the configured MCP server origin. */\n assertResourceMetadataUrlSameOrigin(serverUrl, resourceMetadataUrl);\n\n /** Discover PRM and select its advertised authorization server. */\n try {\n resourceMetadata = await discoverOAuthProtectedResourceMetadata(\n serverUrl,\n { resourceMetadataUrl },\n fetchFn,\n );\n if (\n resourceMetadata.authorization_servers &&\n resourceMetadata.authorization_servers.length > 0\n ) {\n authorizationServerUrl = resourceMetadata.authorization_servers[0];\n }\n } catch {}\n\n /** Fall back to legacy MCP behavior where the MCP server is the Authorization Server */\n if (!authorizationServerUrl) {\n authorizationServerUrl = serverUrl;\n }\n\n /** Validate and select the resource value sent to the AS */\n const resource: URL | undefined = await selectResourceURL(\n serverUrl,\n provider,\n resourceMetadata,\n );\n\n /** Let applications constrain discovered AS URLs before metadata fetches. */\n await provider.validateAuthorizationServerURL?.(\n serverUrl,\n authorizationServerUrl,\n );\n\n /** Discover AS metadata and derive the credential pin for this flow */\n const metadata = await discoverAuthorizationServerMetadata(\n authorizationServerUrl,\n {\n fetchFn,\n },\n );\n const currentAuthorizationServerInformation =\n createAuthorizationServerInformation(authorizationServerUrl, metadata);\n\n /** Load or register client credentials with the AS pin attached. */\n let clientInformation = await Promise.resolve(provider.clientInformation());\n if (!clientInformation) {\n if (authorizationCode !== undefined) {\n throw new Error(\n 'Existing OAuth client information is required when exchanging an authorization code',\n );\n }\n\n if (!provider.saveClientInformation) {\n throw new Error(\n 'OAuth client information must be saveable for dynamic registration',\n );\n }\n\n const fullInformation = await registerClient(authorizationServerUrl, {\n metadata,\n clientMetadata: provider.clientMetadata,\n fetchFn,\n });\n\n clientInformation = addAuthorizationServerInformationToClientInformation(\n fullInformation,\n currentAuthorizationServerInformation,\n );\n await provider.saveClientInformation(clientInformation);\n }\n\n /** On callback, validate state and AS pin before code exchange */\n if (authorizationCode !== undefined) {\n if (provider.storedState) {\n const expectedState = await provider.storedState();\n if (expectedState !== undefined && expectedState !== callbackState) {\n throw new Error(\n 'OAuth state parameter mismatch - possible CSRF attack',\n );\n }\n }\n\n const storedAuthorizationServerInformation =\n await getStoredAuthorizationServerInformation({\n provider,\n clientInformation,\n });\n if (!storedAuthorizationServerInformation) {\n throw new MCPClientOAuthError({\n message:\n 'Stored OAuth authorization server metadata is required when exchanging an authorization code',\n });\n }\n assertAuthorizationServerInformationMatches({\n storedAuthorizationServerInformation,\n currentAuthorizationServerInformation,\n });\n\n const codeVerifier = await provider.codeVerifier();\n const tokens = await exchangeAuthorization(authorizationServerUrl, {\n metadata,\n clientInformation,\n authorizationCode,\n codeVerifier,\n redirectUri: provider.redirectUrl,\n resource,\n addClientAuthentication: provider.addClientAuthentication,\n fetchFn: fetchFn,\n });\n\n await provider.saveTokens(\n addAuthorizationServerInformationToTokens(\n tokens,\n currentAuthorizationServerInformation,\n ),\n );\n return 'AUTHORIZED';\n }\n\n const tokens = await provider.tokens();\n\n /** Refresh only when stored credentials match the current AS pin */\n if (tokens?.refresh_token) {\n const storedAuthorizationServerInformation =\n await getStoredAuthorizationServerInformation({\n provider,\n clientInformation,\n tokens,\n });\n\n if (storedAuthorizationServerInformation) {\n assertAuthorizationServerInformationMatches({\n storedAuthorizationServerInformation,\n currentAuthorizationServerInformation,\n });\n } else {\n await provider.invalidateCredentials?.('tokens');\n }\n\n try {\n if (storedAuthorizationServerInformation) {\n // Attempt to refresh the token\n const newTokens = await refreshAuthorization(authorizationServerUrl, {\n metadata,\n clientInformation,\n refreshToken: tokens.refresh_token,\n resource,\n addClientAuthentication: provider.addClientAuthentication,\n fetchFn,\n });\n\n await provider.saveTokens(\n addAuthorizationServerInformationToTokens(\n newTokens,\n currentAuthorizationServerInformation,\n ),\n );\n return 'AUTHORIZED';\n }\n } catch (error) {\n if (\n // If this is a ServerError, or an unknown type, log it out and try to continue. Otherwise, escalate so we can fix things and retry.\n !(error instanceof MCPClientOAuthError) ||\n error instanceof ServerError\n ) {\n // Could not refresh OAuth tokens\n } else {\n // Refresh failed for another reason, re-throw\n throw error;\n }\n }\n }\n\n /** Start authorization and persist the AS pin before redirecting */\n const state = provider.state ? await provider.state() : undefined;\n if (state && provider.saveState) {\n await provider.saveState(state);\n }\n\n // Start new authorization flow\n const { authorizationUrl, codeVerifier } = await startAuthorization(\n authorizationServerUrl,\n {\n metadata,\n clientInformation,\n state,\n redirectUrl: provider.redirectUrl,\n scope: scope || provider.clientMetadata.scope,\n resource,\n },\n );\n\n const savedAuthorizationServerInformation =\n await saveAuthorizationServerInformation({\n provider,\n clientInformation,\n authorizationServerInformation: currentAuthorizationServerInformation,\n });\n if (!savedAuthorizationServerInformation) {\n throw new MCPClientOAuthError({\n message:\n 'OAuth authorization server metadata must be saveable before starting authorization',\n });\n }\n\n await provider.saveCodeVerifier(codeVerifier);\n await provider.redirectToAuthorization(authorizationUrl);\n return 'REDIRECT';\n}\n","import { z } from 'zod/v4';\n/**\n * Reusable URL validation that disallows javascript: scheme\n */\nexport const SafeUrlSchema = z\n .string()\n .url()\n .superRefine((val, ctx) => {\n if (!URL.canParse(val)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'URL must be parseable',\n fatal: true,\n });\n\n return z.NEVER;\n }\n })\n .refine(\n url => {\n const parsedUrl = new URL(url);\n return (\n parsedUrl.protocol !== 'javascript:' &&\n parsedUrl.protocol !== 'data:' &&\n parsedUrl.protocol !== 'vbscript:'\n );\n },\n { message: 'URL cannot use javascript:, data:, or vbscript: scheme' },\n );\n\n/**\n * OAuth 2.1 token response\n */\nexport const OAuthTokensSchema = z\n .object({\n access_token: z.string(),\n id_token: z.string().optional(), // Optional for OAuth 2.1, but necessary in OpenID Connect\n token_type: z.string(),\n expires_in: z.number().optional(),\n scope: z.string().optional(),\n refresh_token: z.string().optional(),\n authorization_server: SafeUrlSchema.optional(),\n token_endpoint: SafeUrlSchema.optional(),\n })\n .strip();\n\nexport const OAuthProtectedResourceMetadataSchema = z\n .object({\n resource: z.string().url(),\n authorization_servers: z.array(SafeUrlSchema).optional(),\n jwks_uri: z.string().url().optional(),\n scopes_supported: z.array(z.string()).optional(),\n bearer_methods_supported: z.array(z.string()).optional(),\n resource_signing_alg_values_supported: z.array(z.string()).optional(),\n resource_name: z.string().optional(),\n resource_documentation: z.string().optional(),\n resource_policy_uri: z.string().url().optional(),\n resource_tos_uri: z.string().url().optional(),\n tls_client_certificate_bound_access_tokens: z.boolean().optional(),\n authorization_details_types_supported: z.array(z.string()).optional(),\n dpop_signing_alg_values_supported: z.array(z.string()).optional(),\n dpop_bound_access_tokens_required: z.boolean().optional(),\n })\n .passthrough();\n\nexport const OAuthMetadataSchema = z\n .object({\n issuer: z.string(),\n authorization_endpoint: SafeUrlSchema,\n token_endpoint: SafeUrlSchema,\n registration_endpoint: SafeUrlSchema.optional(),\n scopes_supported: z.array(z.string()).optional(),\n response_types_supported: z.array(z.string()),\n grant_types_supported: z.array(z.string()).optional(),\n code_challenge_methods_supported: z.array(z.string()),\n token_endpoint_auth_methods_supported: z.array(z.string()).optional(),\n token_endpoint_auth_signing_alg_values_supported: z\n .array(z.string())\n .optional(),\n })\n .passthrough();\n\n/**\n * OpenID Connect Discovery 1.0 Provider Metadata\n * see: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata\n */\nexport const OpenIdProviderMetadataSchema = z\n .object({\n issuer: z.string(),\n authorization_endpoint: SafeUrlSchema,\n token_endpoint: SafeUrlSchema,\n userinfo_endpoint: SafeUrlSchema.optional(),\n jwks_uri: SafeUrlSchema,\n registration_endpoint: SafeUrlSchema.optional(),\n scopes_supported: z.array(z.string()).optional(),\n response_types_supported: z.array(z.string()),\n grant_types_supported: z.array(z.string()).optional(),\n subject_types_supported: z.array(z.string()),\n id_token_signing_alg_values_supported: z.array(z.string()),\n claims_supported: z.array(z.string()).optional(),\n token_endpoint_auth_methods_supported: z.array(z.string()).optional(),\n })\n .passthrough();\n\n/**\n * OpenID Connect Discovery metadata that may include OAuth 2.0 fields\n * This schema represents the real-world scenario where OIDC providers\n * return a mix of OpenID Connect and OAuth 2.0 metadata fields\n */\nexport const OpenIdProviderDiscoveryMetadataSchema =\n OpenIdProviderMetadataSchema.merge(\n OAuthMetadataSchema.pick({\n code_challenge_methods_supported: true,\n }),\n );\n\nexport const OAuthClientInformationSchema = z\n .object({\n client_id: z.string(),\n client_secret: z.string().optional(),\n client_id_issued_at: z.number().optional(),\n client_secret_expires_at: z.number().optional(),\n authorization_server: SafeUrlSchema.optional(),\n token_endpoint: SafeUrlSchema.optional(),\n })\n .strip();\n\nexport const OAuthClientMetadataSchema = z\n .object({\n redirect_uris: z.array(SafeUrlSchema),\n token_endpoint_auth_method: z.string().optional(),\n grant_types: z.array(z.string()).optional(),\n response_types: z.array(z.string()).optional(),\n client_name: z.string().optional(),\n client_uri: SafeUrlSchema.optional(),\n logo_uri: SafeUrlSchema.optional(),\n scope: z.string().optional(),\n contacts: z.array(z.string()).optional(),\n tos_uri: SafeUrlSchema.optional(),\n policy_uri: z.string().optional(),\n jwks_uri: SafeUrlSchema.optional(),\n jwks: z.any().optional(),\n software_id: z.string().optional(),\n software_version: z.string().optional(),\n software_statement: z.string().optional(),\n })\n .strip();\n\nexport type OAuthMetadata = z.infer<typeof OAuthMetadataSchema>;\nexport type OpenIdProviderDiscoveryMetadata = z.infer<\n typeof OpenIdProviderDiscoveryMetadataSchema\n>;\nexport type OAuthTokens = z.infer<typeof OAuthTokensSchema>;\nexport type OAuthProtectedResourceMetadata = z.infer<\n typeof OAuthProtectedResourceMetadataSchema\n>;\nexport type OAuthClientInformation = z.infer<\n typeof OAuthClientInformationSchema\n>;\nexport type AuthorizationServerMetadata =\n | OAuthMetadata\n | OpenIdProviderDiscoveryMetadata;\n\nexport const OAuthErrorResponseSchema = z.object({\n error: z.string(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\nexport const OAuthClientInformationFullSchema = OAuthClientMetadataSchema.merge(\n OAuthClientInformationSchema,\n);\nexport type OAuthClientMetadata = z.infer<typeof OAuthClientMetadataSchema>;\nexport type OAuthClientInformationFull = z.infer<\n typeof OAuthClientInformationFullSchema\n>;\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_MCPClientOAuthError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * An error occurred with the MCP client within the OAuth flow.\n */\nexport class MCPClientOAuthError extends AISDKError {\n private readonly [symbol] = true;\n\n constructor({\n name = 'MCPClientOAuthError',\n message,\n cause,\n }: {\n name?: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n }\n\n static isInstance(error: unknown): error is MCPClientOAuthError {\n return AISDKError.hasMarker(error, marker);\n }\n}\nexport class ServerError extends MCPClientOAuthError {\n static errorCode = 'server_error';\n}\n\nexport class InvalidClientError extends MCPClientOAuthError {\n static errorCode = 'invalid_client';\n}\n\nexport class InvalidGrantError extends MCPClientOAuthError {\n static errorCode = 'invalid_grant';\n}\n\nexport class UnauthorizedClientError extends MCPClientOAuthError {\n static errorCode = 'unauthorized_client';\n}\n\nexport const OAUTH_ERRORS = {\n [ServerError.errorCode]: ServerError,\n [InvalidClientError.errorCode]: InvalidClientError,\n [InvalidGrantError.errorCode]: InvalidGrantError,\n [UnauthorizedClientError.errorCode]: UnauthorizedClientError,\n};\n","/**\n * Utilities for handling OAuth resource URIs.\n */\n\n/**\n * Converts a server URL to a resource URL by removing the fragment.\n * RFC 8707 section 2 states that resource URIs \"MUST NOT include a fragment component\".\n * Keeps everything else unchanged (scheme, domain, port, path, query).\n */\nexport function resourceUrlFromServerUrl(url: URL | string): URL {\n const resourceURL =\n typeof url === 'string' ? new URL(url) : new URL(url.href);\n resourceURL.hash = ''; // Remove fragment\n return resourceURL;\n}\n\n/**\n * Serializes a resource URL to a string, removing the trailing slash that\n * URL.href adds to pathless URLs. Per the MCP spec, implementations SHOULD\n * use the form without the trailing slash for better interoperability.\n */\nexport function resourceUrlStripSlash(resource: URL): string {\n const href = resource.href;\n if (resource.pathname === '/' && href.endsWith('/')) {\n return href.slice(0, -1);\n }\n return href;\n}\n\n/**\n * Checks if a requested resource URL matches a configured resource URL.\n * A requested resource matches if it has the same scheme, domain, port,\n * and its path starts with the configured resource's path.\n *\n * @param requestedResource The resource URL being requested\n * @param configuredResource The resource URL that has been configured\n * @returns true if the requested resource matches the configured resource, false otherwise\n */\nexport function checkResourceAllowed({\n requestedResource,\n configuredResource,\n}: {\n requestedResource: URL | string;\n configuredResource: URL | string;\n}): boolean {\n const requested =\n typeof requestedResource === 'string'\n ? new URL(requestedResource)\n : new URL(requestedResource.href);\n const configured =\n typeof configuredResource === 'string'\n ? new URL(configuredResource)\n : new URL(configuredResource.href);\n\n // Compare the origin (scheme, domain, and port)\n if (requested.origin !== configured.origin) {\n return false;\n }\n\n // Handle cases like requested=/foo and configured=/foo/\n if (requested.pathname.length < configured.pathname.length) {\n return false;\n }\n\n // Check if the requested path starts with the configured path\n // Ensure both paths end with / for proper comparison\n // This ensures that if we have paths like \"/api\" and \"/api/users\",\n // we properly detect that \"/api/users\" is a subpath of \"/api\"\n // By adding a trailing slash if missing, we avoid false positives\n // where paths like \"/api123\" would incorrectly match \"/api\"\n const requestedPath = requested.pathname.endsWith('/')\n ? requested.pathname\n : requested.pathname + '/';\n const configuredPath = configured.pathname.endsWith('/')\n ? configured.pathname\n : configured.pathname + '/';\n\n return requestedPath.startsWith(configuredPath);\n}\n","import {\n EventSourceParserStream,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { MCPClientError } from '../error/mcp-client-error';\nimport {\n JSONRPCMessageSchema,\n parseJSONRPCMessage,\n type JSONRPCMessage,\n} from './json-rpc-message';\nimport type { MCPTransport } from './mcp-transport';\nimport { VERSION } from '../version';\nimport {\n extractResourceMetadataUrl,\n UnauthorizedError,\n auth,\n type AuthResult,\n type OAuthClientProvider,\n} from './oauth';\nimport { LATEST_PROTOCOL_VERSION } from './types';\n\nfunction isMessageEvent(event: string | undefined): boolean {\n return event === undefined || event === 'message';\n}\n\n/**\n * HTTP MCP transport implementing the Streamable HTTP style.\n *\n * Client transport for Streamable HTTP: this implements the MCP Streamable HTTP transport specification.\n * It will connect to a server using HTTP POST for sending messages and HTTP GET with Server-Sent Events\n * for receiving messages.\n */\nexport class HttpMCPTransport implements MCPTransport {\n private url: URL;\n private abortController?: AbortController;\n private headers?: Record<string, string>;\n private authProvider?: OAuthClientProvider;\n private resourceMetadataUrl?: URL;\n private sessionId?: string;\n private inboundSseConnection?: { close: () => void };\n private redirectMode: RequestRedirect;\n private fetchFn: FetchFunction;\n private authPromise?: Promise<AuthResult>;\n\n // Inbound SSE resumption and reconnection state\n private lastInboundEventId?: string;\n private inboundReconnectAttempts = 0;\n private readonly reconnectionOptions = {\n initialReconnectionDelay: 1000,\n maxReconnectionDelay: 30000,\n reconnectionDelayGrowFactor: 1.5,\n maxRetries: 2,\n } as const;\n\n onclose?: () => void;\n onerror?: (error: unknown) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n protocolVersion?: string;\n\n constructor({\n url,\n headers,\n authProvider,\n redirect = 'error',\n fetch: fetchFn,\n }: {\n url: string;\n headers?: Record<string, string>;\n authProvider?: OAuthClientProvider;\n redirect?: 'follow' | 'error';\n fetch?: FetchFunction;\n }) {\n this.url = new URL(url);\n this.headers = headers;\n this.authProvider = authProvider;\n this.redirectMode = redirect;\n this.fetchFn = fetchFn ?? globalThis.fetch;\n }\n\n setProtocolVersion(version: string): void {\n this.protocolVersion = version;\n }\n\n private async commonHeaders(\n base: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n ...this.headers,\n ...base,\n 'mcp-protocol-version': this.protocolVersion ?? LATEST_PROTOCOL_VERSION,\n };\n\n if (this.sessionId) {\n headers['mcp-session-id'] = this.sessionId;\n }\n\n if (this.authProvider) {\n const tokens = await this.authProvider.tokens();\n if (tokens?.access_token) {\n headers['Authorization'] = `Bearer ${tokens.access_token}`;\n }\n }\n\n return withUserAgentSuffix(\n headers,\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n );\n }\n\n /**\n * Runs a single OAuth recovery flow for concurrent 401 responses.\n */\n private authorizeOnce(resourceMetadataUrl?: URL): Promise<AuthResult> {\n if (!this.authProvider) {\n return Promise.resolve('REDIRECT');\n }\n\n if (!this.authPromise) {\n this.authPromise = auth(this.authProvider, {\n serverUrl: this.url,\n resourceMetadataUrl,\n fetchFn: this.fetchFn,\n }).finally(() => {\n this.authPromise = undefined;\n });\n }\n\n return this.authPromise;\n }\n\n async start(): Promise<void> {\n if (this.abortController) {\n throw new MCPClientError({\n message:\n 'MCP HTTP Transport Error: Transport already started. Note: client.connect() calls start() automatically.',\n });\n }\n this.abortController = new AbortController();\n\n void this.openInboundSse();\n }\n\n async close(): Promise<void> {\n this.inboundSseConnection?.close();\n try {\n if (\n this.sessionId &&\n this.abortController &&\n !this.abortController.signal.aborted\n ) {\n const headers = await this.commonHeaders({});\n await this.fetchFn(this.url.href, {\n method: 'DELETE',\n headers,\n signal: this.abortController.signal,\n redirect: this.redirectMode,\n }).catch(() => undefined);\n }\n } catch {}\n\n this.abortController?.abort();\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n const attempt = async (triedAuth: boolean = false): Promise<void> => {\n try {\n const headers = await this.commonHeaders({\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n });\n\n const init = {\n method: 'POST',\n headers,\n body: JSON.stringify(message),\n signal: this.abortController?.signal,\n redirect: this.redirectMode,\n } satisfies RequestInit;\n\n const response = await this.fetchFn(this.url.href, init);\n\n const sessionId = response.headers.get('mcp-session-id');\n if (sessionId) {\n this.sessionId = sessionId;\n }\n\n if (response.status === 401 && this.authProvider && !triedAuth) {\n this.resourceMetadataUrl = extractResourceMetadataUrl(response);\n try {\n const result = await this.authorizeOnce(this.resourceMetadataUrl);\n if (result !== 'AUTHORIZED') {\n const error = new UnauthorizedError();\n throw error;\n }\n } catch (error) {\n this.onerror?.(error);\n throw error;\n }\n return attempt(true);\n }\n\n // If server accepted the message (e.g. initialized notification), optionally (re)start inbound SSE\n if (response.status === 202) {\n // If inbound SSE was not available earlier (e.g. 405 before init), try again now\n // Do not await to avoid blocking send()\n if (!this.inboundSseConnection) {\n void this.openInboundSse();\n }\n return;\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => null);\n let errorMessage = `MCP HTTP Transport Error: POSTing to endpoint (HTTP ${response.status}): ${text}`;\n\n // 404 since this is a GET request which the server does not support\n if (response.status === 404) {\n errorMessage +=\n '. This server does not support HTTP transport. Try using `sse` transport instead';\n }\n\n const error = new MCPClientError({\n message: errorMessage,\n statusCode: response.status,\n url: this.url.href,\n responseBody: text ?? undefined,\n });\n this.onerror?.(error);\n throw error;\n }\n\n // Notifications (messages without 'id') don't expect a JSON-RPC response\n // Some servers return 200 with acknowledgment JSON instead of 202\n const isNotification = !('id' in message);\n if (isNotification) {\n return;\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n const data = await response.json();\n const messages: JSONRPCMessage[] = Array.isArray(data)\n ? data.map((message: unknown) =>\n JSONRPCMessageSchema.parse(message),\n )\n : [JSONRPCMessageSchema.parse(data)];\n for (const jsonRpcMessage of messages) {\n this.onmessage?.(jsonRpcMessage);\n }\n return;\n }\n\n if (contentType.includes('text/event-stream')) {\n if (!response.body) {\n const error = new MCPClientError({\n message:\n 'MCP HTTP Transport Error: text/event-stream response without body',\n statusCode: response.status,\n url: this.url.href,\n });\n this.onerror?.(error);\n throw error;\n }\n\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n const reader = stream.getReader();\n\n const processEvents = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) return;\n const { event, data } = value;\n if (isMessageEvent(event)) {\n try {\n const jsonRpcMessage = await parseJSONRPCMessage(data);\n this.onmessage?.(jsonRpcMessage);\n } catch (error) {\n const e = new MCPClientError({\n message:\n 'MCP HTTP Transport Error: Failed to parse message',\n cause: error,\n });\n this.onerror?.(e);\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n this.onerror?.(error);\n }\n };\n\n processEvents();\n return;\n }\n\n const error = new MCPClientError({\n message: `MCP HTTP Transport Error: Unexpected content type: ${contentType}`,\n statusCode: response.status,\n url: this.url.href,\n });\n this.onerror?.(error);\n throw error;\n } catch (error) {\n this.onerror?.(error);\n throw error;\n }\n };\n\n await attempt();\n }\n\n private getNextReconnectionDelay(attempt: number): number {\n const {\n initialReconnectionDelay,\n reconnectionDelayGrowFactor,\n maxReconnectionDelay,\n } = this.reconnectionOptions;\n return Math.min(\n initialReconnectionDelay * Math.pow(reconnectionDelayGrowFactor, attempt),\n maxReconnectionDelay,\n );\n }\n\n private scheduleInboundSseReconnection(): void {\n const { maxRetries } = this.reconnectionOptions;\n if (maxRetries > 0 && this.inboundReconnectAttempts >= maxRetries) {\n this.onerror?.(\n new MCPClientError({\n message: `MCP HTTP Transport Error: Maximum reconnection attempts (${maxRetries}) exceeded.`,\n }),\n );\n return;\n }\n\n const delay = this.getNextReconnectionDelay(this.inboundReconnectAttempts);\n this.inboundReconnectAttempts += 1;\n setTimeout(async () => {\n if (this.abortController?.signal.aborted) return;\n await this.openInboundSse(false, this.lastInboundEventId);\n }, delay);\n }\n\n // Open optional inbound SSE stream; best-effort and resumable\n private async openInboundSse(\n triedAuth: boolean = false,\n resumeToken?: string,\n ): Promise<void> {\n try {\n const headers = await this.commonHeaders({\n Accept: 'text/event-stream',\n });\n if (resumeToken) {\n headers['last-event-id'] = resumeToken;\n }\n\n const response = await this.fetchFn(this.url.href, {\n method: 'GET',\n headers,\n signal: this.abortController?.signal,\n redirect: this.redirectMode,\n });\n\n const sessionId = response.headers.get('mcp-session-id');\n if (sessionId) {\n this.sessionId = sessionId;\n }\n\n if (response.status === 401 && this.authProvider && !triedAuth) {\n this.resourceMetadataUrl = extractResourceMetadataUrl(response);\n try {\n const result = await this.authorizeOnce(this.resourceMetadataUrl);\n if (result !== 'AUTHORIZED') {\n const error = new UnauthorizedError();\n this.onerror?.(error);\n return;\n }\n } catch (error) {\n this.onerror?.(error);\n return;\n }\n return this.openInboundSse(true, resumeToken);\n }\n\n if (response.status === 405) {\n return;\n }\n\n if (!response.ok || !response.body) {\n const error = new MCPClientError({\n message: `MCP HTTP Transport Error: GET SSE failed: ${response.status} ${response.statusText}`,\n statusCode: response.status,\n url: this.url.href,\n });\n this.onerror?.(error);\n return;\n }\n\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n const reader = stream.getReader();\n\n const processEvents = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) return;\n const { event, data, id } = value as {\n event?: string;\n data: string;\n id?: string;\n };\n\n if (id) {\n this.lastInboundEventId = id;\n }\n\n if (isMessageEvent(event)) {\n try {\n const jsonRpcMessage = await parseJSONRPCMessage(data);\n this.onmessage?.(jsonRpcMessage);\n } catch (error) {\n const e = new MCPClientError({\n message: 'MCP HTTP Transport Error: Failed to parse message',\n cause: error,\n });\n this.onerror?.(e);\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n this.onerror?.(error);\n if (!this.abortController?.signal.aborted) {\n this.scheduleInboundSseReconnection();\n }\n }\n };\n\n this.inboundSseConnection = {\n close: () => reader.cancel(),\n };\n this.inboundReconnectAttempts = 0;\n processEvents();\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n this.onerror?.(error);\n if (!this.abortController?.signal.aborted) {\n this.scheduleInboundSseReconnection();\n }\n }\n }\n}\n","import type { FetchFunction } from '@ai-sdk/provider-utils';\nimport { MCPClientError } from '../error/mcp-client-error';\nimport type { JSONRPCMessage } from './json-rpc-message';\nimport { SseMCPTransport } from './mcp-sse-transport';\nimport { HttpMCPTransport } from './mcp-http-transport';\nimport type { OAuthClientProvider } from './oauth';\n\n/**\n * Transport interface for MCP (Model Context Protocol) communication.\n * Maps to the `Transport` interface in the MCP spec.\n */\nexport interface MCPTransport {\n /**\n * Initialize and start the transport\n */\n start(): Promise<void>;\n\n /**\n * Send a JSON-RPC message through the transport\n * @param message The JSON-RPC message to send\n */\n send(message: JSONRPCMessage): Promise<void>;\n\n /**\n * Clean up and close the transport\n */\n close(): Promise<void>;\n\n /**\n * Event handler for transport closure\n */\n onclose?: () => void;\n\n /**\n * Event handler for transport errors\n */\n onerror?: (error: Error) => void;\n\n /**\n * Event handler for received messages\n */\n onmessage?: (message: JSONRPCMessage) => void;\n\n /**\n * The protocol version negotiated during initialization.\n */\n protocolVersion?: string;\n\n /**\n * Set the protocol version negotiated during initialization.\n */\n setProtocolVersion?(version: string): void;\n}\n\nexport type MCPTransportConfig = {\n type: 'sse' | 'http';\n\n /**\n * The URL of the MCP server.\n */\n url: string;\n\n /**\n * Additional HTTP headers to be sent with requests.\n */\n headers?: Record<string, string>;\n\n /**\n * An optional OAuth client provider to use for authentication for MCP servers.\n */\n authProvider?: OAuthClientProvider;\n\n /**\n * Controls how HTTP redirects are handled for transport requests.\n * - `'follow'`: Follow redirects automatically (standard fetch behavior).\n * - `'error'`: Reject any redirect response with an error.\n * @default 'error'\n */\n redirect?: 'follow' | 'error';\n\n /**\n * Optional custom fetch implementation to use for HTTP requests.\n * Useful for runtimes that need a request-local fetch.\n * @default globalThis.fetch\n */\n fetch?: FetchFunction;\n};\n\nexport function createMcpTransport(config: MCPTransportConfig): MCPTransport {\n switch (config.type) {\n case 'sse':\n return new SseMCPTransport(config);\n case 'http':\n return new HttpMCPTransport(config);\n default:\n throw new MCPClientError({\n message:\n 'Unsupported or invalid transport configuration. If you are using a custom transport, make sure it implements the MCPTransport interface.',\n });\n }\n}\n\nexport function isCustomMcpTransport(\n transport: MCPTransportConfig | MCPTransport,\n): transport is MCPTransport {\n return (\n 'start' in transport &&\n typeof transport.start === 'function' &&\n 'send' in transport &&\n typeof transport.send === 'function' &&\n 'close' in transport &&\n typeof transport.close === 'function'\n );\n}\n","import { isJSONObject, type JSONObject } from '@ai-sdk/provider';\nimport { convertBase64ToUint8Array } from '@ai-sdk/provider-utils';\nimport type { MCPClient } from './mcp-client';\nimport type {\n ClientCapabilities,\n ListToolsResult,\n ReadResourceResult,\n RequestOptions,\n ToolMeta,\n} from './types';\n\n/**\n * MCP capability extension name used by hosts that can render MCP Apps.\n */\nexport const MCP_APP_EXTENSION_NAME = 'io.modelcontextprotocol/ui' as const;\n\n/**\n * MIME type for HTML resources that are meant to be rendered as MCP Apps.\n */\nexport const MCP_APP_MIME_TYPE = 'text/html;profile=mcp-app' as const;\n\n/**\n * Deprecated flat metadata key for app resource URIs.\n * Hosts still check it for compatibility with older MCP Apps servers.\n */\nexport const MCP_APP_LEGACY_RESOURCE_URI_META_KEY = 'ui/resourceUri' as const;\n\n/**\n * Client capabilities to pass to `createMCPClient` when the host supports MCP Apps.\n */\nexport const mcpAppClientCapabilities = {\n extensions: {\n [MCP_APP_EXTENSION_NAME]: {\n mimeTypes: [MCP_APP_MIME_TYPE],\n },\n },\n} as const satisfies ClientCapabilities;\n\nexport type MCPAppToolVisibility = 'model' | 'app';\n\n/**\n * Normalized `_meta.ui` metadata from an MCP tool definition.\n */\nexport type MCPAppToolMeta = {\n resourceUri?: string;\n visibility?: MCPAppToolVisibility[];\n [key: string]: unknown;\n};\n\n/**\n * Content security policy metadata requested by an MCP App resource.\n */\nexport type MCPAppResourceCSP = {\n connectDomains?: string[];\n resourceDomains?: string[];\n frameDomains?: string[];\n [key: string]: unknown;\n};\n\n/**\n * Host rendering metadata from an MCP App resource.\n */\nexport type MCPAppResourceMeta = {\n prefersBorder?: boolean;\n csp?: MCPAppResourceCSP;\n permissions?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n/**\n * HTML and metadata needed by a host to render an MCP App.\n */\nexport type MCPAppResource = {\n uri: string;\n mimeType: typeof MCP_APP_MIME_TYPE;\n html: string;\n meta?: MCPAppResourceMeta;\n};\n\ntype MCPAppToolLike = {\n _meta?: ToolMeta;\n [key: string]: unknown;\n};\n\nfunction getToolUiMeta(meta?: ToolMeta): JSONObject | undefined {\n const uiMeta = meta?.ui;\n return isJSONObject(uiMeta) ? uiMeta : undefined;\n}\n\nfunction getResourceUiMeta(meta: unknown): MCPAppResourceMeta | undefined {\n const resourceMeta = isJSONObject(meta) ? meta : undefined;\n const rawUiMeta = resourceMeta?.ui;\n const uiMeta = isJSONObject(rawUiMeta) ? rawUiMeta : undefined;\n\n return uiMeta as MCPAppResourceMeta | undefined;\n}\n\nfunction parseVisibility(value: unknown): MCPAppToolVisibility[] | undefined {\n return Array.isArray(value)\n ? value.filter(\n (v): v is MCPAppToolVisibility => v === 'model' || v === 'app',\n )\n : undefined;\n}\n\n/**\n * Reads and validates MCP Apps metadata from a tool definition.\n */\nexport function getMCPAppToolMeta(\n tool: MCPAppToolLike,\n): MCPAppToolMeta | undefined {\n const uiMeta = getToolUiMeta(tool._meta);\n const resourceUri =\n uiMeta?.resourceUri ?? tool._meta?.[MCP_APP_LEGACY_RESOURCE_URI_META_KEY];\n const visibility = parseVisibility(uiMeta?.visibility);\n\n if (resourceUri !== undefined) {\n if (typeof resourceUri !== 'string' || !resourceUri.startsWith('ui://')) {\n throw new Error(\n `Invalid MCP App resource URI: ${JSON.stringify(resourceUri)}`,\n );\n }\n } else if (uiMeta == null) {\n return undefined;\n }\n\n return {\n ...uiMeta,\n ...(resourceUri != null ? { resourceUri } : {}),\n ...(visibility != null ? { visibility } : {}),\n };\n}\n\n/**\n * Returns the `ui://` app resource URI attached to a tool, if present.\n */\nexport function getMCPAppResourceUri(tool: MCPAppToolLike): string | undefined {\n return getMCPAppToolMeta(tool)?.resourceUri;\n}\n\n/**\n * Checks whether a tool has an MCP App resource attached.\n */\nexport function isMCPAppTool(tool: MCPAppToolLike): boolean {\n return getMCPAppResourceUri(tool) != null;\n}\n\n/**\n * Splits tool definitions into model-visible tools and app-visible tools.\n */\nexport function splitMCPAppTools(definitions: ListToolsResult): {\n modelVisible: ListToolsResult;\n appVisible: ListToolsResult;\n} {\n const modelVisibleTools = [];\n const appVisibleTools = [];\n\n for (const tool of definitions.tools) {\n const visibility = getMCPAppToolMeta(tool)?.visibility;\n\n // Tools without app visibility metadata remain model-visible.\n if (visibility == null || visibility.includes('model')) {\n modelVisibleTools.push(tool);\n }\n\n if (visibility?.includes('app') === true) {\n appVisibleTools.push(tool);\n }\n }\n\n return {\n modelVisible: {\n ...definitions,\n tools: modelVisibleTools,\n },\n appVisible: {\n ...definitions,\n tools: appVisibleTools,\n },\n };\n}\n\n/**\n * Returns the unique MCP App resource URIs referenced by tool definitions.\n */\nexport function getMCPAppResourceUris(definitions: ListToolsResult): string[] {\n return [\n ...new Set(\n definitions.tools\n .map(tool => getMCPAppResourceUri(tool))\n .filter((uri): uri is string => uri != null),\n ),\n ];\n}\n\n/**\n * Extracts app HTML and rendering metadata from a `resources/read` result.\n */\nexport function getMCPAppResourceFromReadResult({\n uri,\n resource,\n}: {\n uri: string;\n resource: ReadResourceResult;\n}): MCPAppResource {\n const content = resource.contents.find(content => content.uri === uri);\n\n if (content == null) {\n throw new Error(`MCP App resource not found in read result: ${uri}`);\n }\n\n if (content.mimeType !== MCP_APP_MIME_TYPE) {\n throw new Error(\n `Unsupported MCP App resource MIME type: ${content.mimeType}`,\n );\n }\n\n const html =\n 'text' in content && typeof content.text === 'string'\n ? content.text\n : 'blob' in content && typeof content.blob === 'string'\n ? new TextDecoder().decode(convertBase64ToUint8Array(content.blob))\n : undefined;\n\n if (html == null) {\n throw new Error(`Unsupported MCP App resource content format: ${uri}`);\n }\n\n const meta = getResourceUiMeta(content._meta);\n\n return { uri, mimeType: MCP_APP_MIME_TYPE, html, meta };\n}\n\n/**\n * Reads a `ui://` resource from an MCP server and normalizes it for rendering.\n */\nexport async function readMCPAppResource({\n client,\n uri,\n options,\n}: {\n client: Pick<MCPClient, 'readResource'>;\n uri: string;\n options?: RequestOptions;\n}): Promise<MCPAppResource> {\n if (!uri.startsWith('ui://')) {\n throw new Error(`Unsupported MCP App resource URI: ${uri}`);\n }\n\n return getMCPAppResourceFromReadResult({\n uri,\n resource: await client.readResource({ uri, options }),\n });\n}\n"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;;;ACZP,SAAS,kBAAkB;AAE3B,IAAM,OAAO;AACb,IAAM,SAAS,mBAAmB,IAAI;AACtC,IAAM,SAAS,OAAO,IAAI,MAAM;AAJhC;AASO,IAAM,iBAAN,eAA6B,iBAChB,aADgB,IAAW;AAAA,EAoC7C,YAAY;AAAA,IACV,MAAAA,QAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GASG;AACD,UAAM,EAAE,MAAAA,OAAM,SAAS,MAAM,CAAC;AAtDhC,SAAkB,MAAU;AAuD1B,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,MAAM;AACX,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,OAAO,WAAW,OAAyC;AACzD,WAAO,WAAW,UAAU,OAAO,MAAM;AAAA,EAC3C;AACF;;;AC3EA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACLP,SAAS,iBAAiB;AAC1B,SAAS,KAAAC,UAAS;;;ACDlB,SAAS,SAAS;AAIX,IAAM,0BAA0B;AAChC,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUA,IAAM,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC;AA0CnE,IAAM,qCAAqC,EAAE,YAAY;AAAA,EACvD,MAAM,EAAE,OAAO;AAAA,EACf,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AAC9B,CAAC;AAKM,IAAM,mBAAmB,EAAE,YAAY;AAAA,EAC5C,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AACxC,CAAC;AAEM,IAAM,eAAe;AAErB,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,QAAQ,EAAE,OAAO;AAAA,EACjB,QAAQ,EAAE,SAAS,gBAAgB;AACrC,CAAC;AAWD,IAAM,8BAA8B,EACjC,OAAO;AAAA,EACN,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;AACvC,CAAC,EACA,MAAM;AAET,IAAM,2BAA2B,EAAE,YAAY;AAAA,EAC7C,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EAC7C,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EACxC,SAAS,EAAE;AAAA,IACT,EAAE,YAAY;AAAA,MACZ,aAAa,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EACA,WAAW,EAAE;AAAA,IACX,EAAE,YAAY;AAAA,MACZ,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,MACjC,aAAa,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EACA,OAAO,EAAE;AAAA,IACP,EAAE,YAAY;AAAA,MACZ,aAAa,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EACA,aAAa,EAAE,SAAS,2BAA2B;AACrD,CAAC;AAGM,IAAM,2BAA2B,EACrC,OAAO;AAAA,EACN,aAAa,EAAE,SAAS,2BAA2B;AACrD,CAAC,EACA,MAAM;AAKF,IAAM,yBAAyB,aAAa,OAAO;AAAA,EACxD,iBAAiB,EAAE,OAAO;AAAA,EAC1B,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AACrC,CAAC;AASD,IAAM,wBAAwB,aAAa,OAAO;AAAA,EAChD,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC;AACnC,CAAC;AAED,IAAM,aAAa,EAChB,OAAO;AAAA,EACN,MAAM,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAIf,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC5B,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,aAAa,EACV,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,QAAQ;AAAA,IACxB,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EAC7C,CAAC,EACA,MAAM;AAAA;AAAA;AAAA;AAAA,EAIT,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EAC7C,aAAa,EAAE;AAAA,IACb,EACG,OAAO;AAAA,MACN,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,IAC9B,CAAC,EACA,MAAM;AAAA,EACX;AAAA,EACA,OAAO;AACT,CAAC,EACA,MAAM;AAEF,IAAM,wBAAwB,sBAAsB,OAAO;AAAA,EAChE,OAAO,EAAE,MAAM,UAAU;AAC3B,CAAC;AAGD,IAAM,oBAAoB,EACvB,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,MAAM;AAAA,EACtB,MAAM,EAAE,OAAO;AACjB,CAAC,EACA,MAAM;AACT,IAAM,qBAAqB,EACxB,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,OAAO;AAAA,EACvB,MAAM,EAAE,OAAO;AAAA,EACf,UAAU,EAAE,OAAO;AACrB,CAAC,EACA,MAAM;AACF,IAAM,iBAAiB,EAC3B,OAAO;AAAA,EACN,KAAK,EAAE,OAAO;AAAA,EACd,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC5B,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC/B,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC;AAC7B,CAAC,EACA,MAAM;AAGF,IAAM,4BAA4B,sBAAsB,OAAO;AAAA,EACpE,WAAW,EAAE,MAAM,cAAc;AACnC,CAAC;AAGD,IAAM,yBAAyB,EAC5B,OAAO;AAAA;AAAA;AAAA;AAAA,EAIN,KAAK,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAId,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,EAI3B,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,EAI5B,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;AACjC,CAAC,EACA,MAAM;AACT,IAAM,6BAA6B,uBAAuB,OAAO;AAAA,EAC/D,MAAM,EAAE,OAAO;AACjB,CAAC;AACD,IAAM,6BAA6B,uBAAuB,OAAO;AAAA,EAC/D,MAAM,EAAE,OAAO;AACjB,CAAC;AACD,IAAM,yBAAyB,EAC5B,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,UAAU;AAAA,EAC1B,UAAU,EAAE,MAAM,CAAC,4BAA4B,0BAA0B,CAAC;AAC5E,CAAC,EACA,MAAM;AACT,IAAM,4BAA4B,EAC/B,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,eAAe;AAAA,EAC/B,KAAK,EAAE,OAAO;AAAA,EACd,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;AACjC,CAAC,EACA,MAAM;AAEF,IAAM,uBAAuB,aAAa,OAAO;AAAA,EACtD,SAAS,EAAE;AAAA,IACT,EAAE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAIA,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACzC,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS;AAC/C,CAAC,EAAE;AAAA,EACD,aAAa,OAAO;AAAA,IAClB,YAAY,EAAE,QAAQ;AAAA,EACxB,CAAC;AACH;AAGA,IAAM,yBAAyB,EAC5B,OAAO;AAAA,EACN,aAAa,EAAE,OAAO;AAAA,EACtB,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC5B,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;AACjC,CAAC,EACA,MAAM;AAEF,IAAM,oCAAoC,aAAa,OAAO;AAAA,EACnE,mBAAmB,EAAE,MAAM,sBAAsB;AACnD,CAAC;AAKM,IAAM,2BAA2B,aAAa,OAAO;AAAA,EAC1D,UAAU,EAAE;AAAA,IACV,EAAE,MAAM,CAAC,4BAA4B,0BAA0B,CAAC;AAAA,EAClE;AACF,CAAC;AAID,IAAM,uBAAuB,EAC1B,OAAO;AAAA,EACN,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;AAClC,CAAC,EACA,MAAM;AAEF,IAAM,eAAe,EACzB,OAAO;AAAA,EACN,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC5B,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACrD,CAAC,EACA,MAAM;AAGF,IAAM,0BAA0B,sBAAsB,OAAO;AAAA,EAClE,SAAS,EAAE,MAAM,YAAY;AAC/B,CAAC;AAGD,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,WAAW,CAAC,CAAC;AAAA,EACzD,SAAS,EAAE,MAAM;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH,CAAC,EACA,MAAM;AAGF,IAAM,wBAAwB,aAAa,OAAO;AAAA,EACvD,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAClC,UAAU,EAAE,MAAM,mBAAmB;AACvC,CAAC;AAGD,IAAM,iCAAiC,iBAAiB,OAAO;AAAA,EAC7D,SAAS,EAAE,OAAO;AAAA,EAClB,iBAAiB,EAAE,QAAQ;AAC7B,CAAC;AAEM,IAAM,2BAA2B,cAAc,OAAO;AAAA,EAC3D,QAAQ,EAAE,QAAQ,oBAAoB;AAAA,EACtC,QAAQ;AACV,CAAC;AAIM,IAAM,qBAAqB,aAAa,OAAO;AAAA,EACpD,QAAQ,EAAE,MAAM;AAAA,IACd,EAAE,QAAQ,QAAQ;AAAA,IAClB,EAAE,QAAQ,SAAS;AAAA,IACnB,EAAE,QAAQ,QAAQ;AAAA,EACpB,CAAC;AAAA,EACD,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;;;ADpWD,IAAM,kBAAkB;AAExB,IAAM,uBAAuBC,GAC1B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,eAAe;AAAA,EAClC,IAAIA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,EACA,MAAM,aAAa,EACnB,OAAO;AAIV,IAAM,wBAAwBA,GAC3B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,eAAe;AAAA,EAClC,IAAIA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,EAC1C,QAAQ;AACV,CAAC,EACA,OAAO;AAIV,IAAM,qBAAqBA,GACxB,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,eAAe;AAAA,EAClC,IAAIA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,EAC1C,OAAOA,GAAE,OAAO;AAAA,IACd,MAAMA,GAAE,OAAO,EAAE,IAAI;AAAA,IACrB,SAASA,GAAE,OAAO;AAAA,IAClB,MAAMA,GAAE,SAASA,GAAE,QAAQ,CAAC;AAAA,EAC9B,CAAC;AACH,CAAC,EACA,OAAO;AAIV,IAAM,4BAA4BA,GAC/B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,eAAe;AACpC,CAAC,EACA;AAAA,EACCA,GAAE,OAAO;AAAA,IACP,QAAQA,GAAE,OAAO;AAAA,IACjB,QAAQA,GAAE,SAAS,gBAAgB;AAAA,EACrC,CAAC;AACH,EACC,OAAO;AAIH,IAAM,uBAAuBA,GAAE,MAAM;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAID,eAAsB,oBACpB,MACyB;AACzB,SAAO,qBAAqB,MAAM,MAAM,UAAU,EAAE,KAAK,CAAC,CAAC;AAC7D;;;AElEO,IAAM,UACX,OAAO,wBAAwB,cAC3B,sBACA;;;ACJN,OAAO,mBAAmB;;;ACA1B,SAAS,KAAAC,UAAS;AAIX,IAAM,gBAAgBA,GAC1B,OAAO,EACP,IAAI,EACJ,YAAY,CAAC,KAAK,QAAQ;AACzB,MAAI,CAAC,IAAI,SAAS,GAAG,GAAG;AACtB,QAAI,SAAS;AAAA,MACX,MAAMA,GAAE,aAAa;AAAA,MACrB,SAAS;AAAA,MACT,OAAO;AAAA,IACT,CAAC;AAED,WAAOA,GAAE;AAAA,EACX;AACF,CAAC,EACA;AAAA,EACC,SAAO;AACL,UAAM,YAAY,IAAI,IAAI,GAAG;AAC7B,WACE,UAAU,aAAa,iBACvB,UAAU,aAAa,WACvB,UAAU,aAAa;AAAA,EAE3B;AAAA,EACA,EAAE,SAAS,yDAAyD;AACtE;AAKK,IAAM,oBAAoBA,GAC9B,OAAO;AAAA,EACN,cAAcA,GAAE,OAAO;AAAA,EACvB,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC9B,YAAYA,GAAE,OAAO;AAAA,EACrB,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,sBAAsB,cAAc,SAAS;AAAA,EAC7C,gBAAgB,cAAc,SAAS;AACzC,CAAC,EACA,MAAM;AAEF,IAAM,uCAAuCA,GACjD,OAAO;AAAA,EACN,UAAUA,GAAE,OAAO,EAAE,IAAI;AAAA,EACzB,uBAAuBA,GAAE,MAAM,aAAa,EAAE,SAAS;AAAA,EACvD,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACpC,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,0BAA0BA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvD,uCAAuCA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpE,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,wBAAwBA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5C,qBAAqBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAC/C,kBAAkBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAC5C,4CAA4CA,GAAE,QAAQ,EAAE,SAAS;AAAA,EACjE,uCAAuCA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpE,mCAAmCA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAChE,mCAAmCA,GAAE,QAAQ,EAAE,SAAS;AAC1D,CAAC,EACA,YAAY;AAER,IAAM,sBAAsBA,GAChC,OAAO;AAAA,EACN,QAAQA,GAAE,OAAO;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,uBAAuB,cAAc,SAAS;AAAA,EAC9C,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,0BAA0BA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC5C,uBAAuBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpD,kCAAkCA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EACpD,uCAAuCA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpE,kDAAkDA,GAC/C,MAAMA,GAAE,OAAO,CAAC,EAChB,SAAS;AACd,CAAC,EACA,YAAY;AAMR,IAAM,+BAA+BA,GACzC,OAAO;AAAA,EACN,QAAQA,GAAE,OAAO;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,mBAAmB,cAAc,SAAS;AAAA,EAC1C,UAAU;AAAA,EACV,uBAAuB,cAAc,SAAS;AAAA,EAC9C,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,0BAA0BA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC5C,uBAAuBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpD,yBAAyBA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC3C,uCAAuCA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EACzD,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,uCAAuCA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AACtE,CAAC,EACA,YAAY;AAOR,IAAM,wCACX,6BAA6B;AAAA,EAC3B,oBAAoB,KAAK;AAAA,IACvB,kCAAkC;AAAA,EACpC,CAAC;AACH;AAEK,IAAM,+BAA+BA,GACzC,OAAO;AAAA,EACN,WAAWA,GAAE,OAAO;AAAA,EACpB,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,qBAAqBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACzC,0BAA0BA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9C,sBAAsB,cAAc,SAAS;AAAA,EAC7C,gBAAgB,cAAc,SAAS;AACzC,CAAC,EACA,MAAM;AAEF,IAAM,4BAA4BA,GACtC,OAAO;AAAA,EACN,eAAeA,GAAE,MAAM,aAAa;AAAA,EACpC,4BAA4BA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChD,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC1C,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC7C,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAY,cAAc,SAAS;AAAA,EACnC,UAAU,cAAc,SAAS;AAAA,EACjC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,SAAS,cAAc,SAAS;AAAA,EAChC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,UAAU,cAAc,SAAS;AAAA,EACjC,MAAMA,GAAE,IAAI,EAAE,SAAS;AAAA,EACvB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,kBAAkBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACtC,oBAAoBA,GAAE,OAAO,EAAE,SAAS;AAC1C,CAAC,EACA,MAAM;AAiBF,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EAC/C,OAAOA,GAAE,OAAO;AAAA,EAChB,mBAAmBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACvC,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AACM,IAAM,mCAAmC,0BAA0B;AAAA,EACxE;AACF;;;AC1KA,SAAS,cAAAC,mBAAkB;AAE3B,IAAMC,QAAO;AACb,IAAMC,UAAS,mBAAmBD,KAAI;AACtC,IAAME,UAAS,OAAO,IAAID,OAAM;AAJhC,IAAAE,KAAAC;AASO,IAAM,sBAAN,eAAkCA,MAAAL,aACrBI,MAAAD,SADqBE,KAAW;AAAA,EAGlD,YAAY;AAAA,IACV,MAAAJ,QAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,EAAE,MAAAA,OAAM,SAAS,MAAM,CAAC;AAXhC,SAAkBG,OAAU;AAAA,EAY5B;AAAA,EAEA,OAAO,WAAW,OAA8C;AAC9D,WAAOJ,YAAW,UAAU,OAAOE,OAAM;AAAA,EAC3C;AACF;AACO,IAAM,cAAN,cAA0B,oBAAoB;AAErD;AAFa,YACJ,YAAY;AAGd,IAAM,qBAAN,cAAiC,oBAAoB;AAE5D;AAFa,mBACJ,YAAY;AAGd,IAAM,oBAAN,cAAgC,oBAAoB;AAE3D;AAFa,kBACJ,YAAY;AAGd,IAAM,0BAAN,cAAsC,oBAAoB;AAEjE;AAFa,wBACJ,YAAY;AAGd,IAAM,eAAe;AAAA,EAC1B,CAAC,YAAY,SAAS,GAAG;AAAA,EACzB,CAAC,mBAAmB,SAAS,GAAG;AAAA,EAChC,CAAC,kBAAkB,SAAS,GAAG;AAAA,EAC/B,CAAC,wBAAwB,SAAS,GAAG;AACvC;;;ACxCO,SAAS,yBAAyB,KAAwB;AAC/D,QAAM,cACJ,OAAO,QAAQ,WAAW,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI;AAC3D,cAAY,OAAO;AACnB,SAAO;AACT;AAOO,SAAS,sBAAsB,UAAuB;AAC3D,QAAM,OAAO,SAAS;AACtB,MAAI,SAAS,aAAa,OAAO,KAAK,SAAS,GAAG,GAAG;AACnD,WAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EACzB;AACA,SAAO;AACT;AAWO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGY;AACV,QAAM,YACJ,OAAO,sBAAsB,WACzB,IAAI,IAAI,iBAAiB,IACzB,IAAI,IAAI,kBAAkB,IAAI;AACpC,QAAM,aACJ,OAAO,uBAAuB,WAC1B,IAAI,IAAI,kBAAkB,IAC1B,IAAI,IAAI,mBAAmB,IAAI;AAGrC,MAAI,UAAU,WAAW,WAAW,QAAQ;AAC1C,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,SAAS,SAAS,WAAW,SAAS,QAAQ;AAC1D,WAAO;AAAA,EACT;AAQA,QAAM,gBAAgB,UAAU,SAAS,SAAS,GAAG,IACjD,UAAU,WACV,UAAU,WAAW;AACzB,QAAM,iBAAiB,WAAW,SAAS,SAAS,GAAG,IACnD,WAAW,WACX,WAAW,WAAW;AAE1B,SAAO,cAAc,WAAW,cAAc;AAChD;;;AHjDA,SAAS,aAAAI,kBAAqC;AAoFvC,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,UAAU,gBAAgB;AACpC,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,aAAa,KAA2B;AAC/C,SAAO,IAAI,IAAI,GAAG,EAAE;AACtB;AAEA,SAAS,qCACP,wBACA,UACqC;AACrC,SAAO;AAAA,IACL,wBAAwB,aAAa,sBAAsB;AAAA,IAC3D,eAAe;AAAA,OACb,qCAAU,kBACN,IAAI,IAAI,SAAS,cAAc,IAC/B,IAAI,IAAI,UAAU,sBAAsB;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,SAAS,0CACP,QACA,gCACa;AACb,SAAO;AAAA,IACL,GAAG;AAAA,IACH,sBAAsB,+BAA+B;AAAA,IACrD,gBAAgB,+BAA+B;AAAA,EACjD;AACF;AAEA,SAAS,qDAGP,mBACA,gCACoB;AACpB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,sBAAsB,+BAA+B;AAAA,IACrD,gBAAgB,+BAA+B;AAAA,EACjD;AACF;AAEA,SAAS,iDAAiD,aAGN;AAClD,MAAI,EAAC,2CAAa,yBAAwB,CAAC,YAAY,gBAAgB;AACrE,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,wBAAwB,aAAa,YAAY,oBAAoB;AAAA,IACrE,eAAe,aAAa,YAAY,cAAc;AAAA,EACxD;AACF;AAEA,eAAe,wCAAwC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AACF,GAI6D;AAxL7D,MAAAC;AAyLE,QAAM,sCACJ,iDAAiD,MAAM;AACzD,MAAI,qCAAqC;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,yCACJ,QAAMA,MAAA,SAAS,mCAAT,gBAAAA,IAAA;AACR,MAAI,wCAAwC;AAC1C,WAAO;AAAA,MACL,wBAAwB;AAAA,QACtB,uCAAuC;AAAA,MACzC;AAAA,MACA,eAAe;AAAA,QACb,uCAAuC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,iDAAiD,iBAAiB;AAC3E;AAEA,eAAe,mCAAmC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AACF,GAIqB;AACnB,MAAI,SAAS,oCAAoC;AAC/C,UAAM,SAAS;AAAA,MACb;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,uBAAuB;AAClC,UAAM,SAAS;AAAA,MACb;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,oCACP,WACA,qBACM;AACN,MAAI,CAAC,qBAAqB;AACxB;AAAA,EACF;AAEA,QAAM,iBAAiB,IAAI,IAAI,SAAS,EAAE;AAC1C,MAAI,oBAAoB,WAAW,gBAAgB;AACjD,UAAM,IAAI,oBAAoB;AAAA,MAC5B,SAAS,yCAAyC,oBAAoB,IAAI,oDAAoD,cAAc;AAAA,IAC9I,CAAC;AAAA,EACH;AACF;AAEA,SAAS,4CAA4C;AAAA,EACnD;AAAA,EACA;AACF,GAGS;AACP,MACE,qCAAqC,2BACnC,sCAAsC,0BACxC,qCAAqC,kBACnC,sCAAsC,eACxC;AACA,UAAM,IAAI,oBAAoB;AAAA,MAC5B,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AACF;AAMO,SAAS,2BACd,UACiB;AAtRnB,MAAAA;AAuRE,QAAM,UACJA,MAAA,SAAS,QAAQ,IAAI,kBAAkB,MAAvC,OAAAA,MACA,SAAS,QAAQ,IAAI,kBAAkB;AACzC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,MAAM,MAAM,IAAI,OAAO,MAAM,GAAG;AACvC,MAAI,KAAK,YAAY,MAAM,YAAY,CAAC,QAAQ;AAC9C,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ;AACd,QAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,IAAI,IAAI,MAAM,CAAC,CAAC;AAAA,EACzB,SAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,mBACP,iBAIA,WAAmB,IACnB,UAAyC,CAAC,GAClC;AACR,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,eAAW,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AAEA,SAAO,QAAQ,kBACX,GAAG,QAAQ,gBAAgB,eAAe,KAC1C,gBAAgB,eAAe,GAAG,QAAQ;AAChD;AAEA,eAAe,mBACb,KACA,SACA,UAAyB,OACM;AAC/B,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,EAAE,QAAQ,CAAC;AAAA,EACvC,SAAS,OAAO;AACd,QAAI,iBAAiB,WAAW;AAC9B,UAAI,SAAS;AACX,eAAO,mBAAmB,KAAK,QAAW,OAAO;AAAA,MACnD,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAKA,eAAe,qBACb,KACA,iBACA,UAAyB,OACM;AAC/B,QAAM,UAAU;AAAA,IACd,wBAAwB;AAAA,EAC1B;AACA,SAAO,MAAM,mBAAmB,KAAK,SAAS,OAAO;AACvD;AAKA,SAAS,sBACP,UACA,UACS;AACT,SACE,CAAC,YACA,SAAS,UAAU,OAAO,SAAS,SAAS,OAAO,aAAa;AAErE;AAKA,eAAe,6BACb,WACA,eACA,SACA,MAK+B;AA/XjC,MAAAA,KAAAC;AAgYE,QAAM,SAAS,IAAI,IAAI,SAAS;AAChC,QAAM,mBAAkBD,MAAA,6BAAM,oBAAN,OAAAA,MAAyB;AAEjD,MAAI;AACJ,MAAI,6BAAM,aAAa;AACrB,UAAM,IAAI,IAAI,KAAK,WAAW;AAAA,EAChC,OAAO;AACL,UAAM,gBAAgB,mBAAmB,eAAe,OAAO,QAAQ;AACvE,UAAM,IAAI,IAAI,gBAAeC,MAAA,6BAAM,sBAAN,OAAAA,MAA2B,MAAM;AAC9D,QAAI,SAAS,OAAO;AAAA,EACtB;AAEA,MAAI,WAAW,MAAM,qBAAqB,KAAK,iBAAiB,OAAO;AAEvE,MAAI,EAAC,6BAAM,gBAAe,sBAAsB,UAAU,OAAO,QAAQ,GAAG;AAC1E,UAAM,UAAU,IAAI,IAAI,gBAAgB,aAAa,IAAI,MAAM;AAC/D,eAAW,MAAM,qBAAqB,SAAS,iBAAiB,OAAO;AAAA,EACzE;AAEA,SAAO;AACT;AAEA,eAAsB,uCACpB,WACA,MACA,UAAyB,OACgB;AACzC,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,iBAAiB,6BAAM;AAAA,MACvB,aAAa,6BAAM;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,SAAS,WAAW,KAAK;AACxC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,QAAQ,SAAS,MAAM;AAAA,IACzB;AAAA,EACF;AACA,SAAO,qCAAqC,MAAM,MAAM,SAAS,KAAK,CAAC;AACzE;AASO,SAAS,mBACd,wBACgE;AAChE,QAAM,MACJ,OAAO,2BAA2B,WAC9B,IAAI,IAAI,sBAAsB,IAC9B;AACN,QAAM,UAAU,IAAI,aAAa;AACjC,QAAM,aAAa,IAAI;AACvB,QAAM,YAIA,CAAC;AAEP,MAAI,CAAC,SAAS;AACZ,cAAU,KAAK;AAAA,MACb,KAAK,IAAI,IAAI,2CAA2C,IAAI,MAAM;AAAA,MAClE,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB,CAAC;AAED,cAAU,KAAK;AAAA,MACb,KAAK,IAAI,IAAI,qCAAqC,IAAI,MAAM;AAAA,MAC5D,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB,CAAC;AAED,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,IAAI;AACnB,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,eAAW,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AACA,QAAM,aAAa,GAAG,IAAI,MAAM,GAAG,QAAQ;AAE3C,YAAU,KAAK;AAAA,IACb,KAAK,IAAI;AAAA,MACP,0CAA0C,QAAQ;AAAA,MAClD,IAAI;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB,CAAC;AAED,YAAU,KAAK;AAAA,IACb,KAAK,IAAI,IAAI,2CAA2C,IAAI,MAAM;AAAA,IAClE,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB,CAAC;AAED,YAAU,KAAK;AAAA,IACb,KAAK,IAAI,IAAI,oCAAoC,QAAQ,IAAI,IAAI,MAAM;AAAA,IACvE,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB,CAAC;AAED,YAAU,KAAK;AAAA,IACb,KAAK,IAAI,IAAI,GAAG,QAAQ,qCAAqC,IAAI,MAAM;AAAA,IACvE,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB,CAAC;AAED,SAAO;AACT;AAEA,SAAS,4BACP,UACA,gBACM;AACN,MAAI,SAAS,WAAW,gBAAgB;AACtC,UAAM,IAAI,oBAAoB;AAAA,MAC5B,SAAS,8CAA8C,SAAS,MAAM,mCAAmC,cAAc;AAAA,IACzH,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,oCACpB,wBACA;AAAA,EACE,UAAU;AAAA,EACV,kBAAkB;AACpB,IAGI,CAAC,GAC6C;AAjhBpD,MAAAD;AAkhBE,QAAM,UAAU,EAAE,wBAAwB,gBAAgB;AAE1D,QAAM,YAAY,mBAAmB,sBAAsB;AAE3D,aAAW,EAAE,KAAK,aAAa,MAAM,eAAe,KAAK,WAAW;AAClE,UAAM,WAAW,MAAM,mBAAmB,aAAa,SAAS,OAAO;AAEvE,QAAI,CAAC,UAAU;AAKb;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAEhB,UAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;AACnD;AAAA,MACF;AACA,YAAM,IAAI;AAAA,QACR,QAAQ,SAAS,MAAM,mBAAmB,SAAS,UAAU,UAAU,iBAAiB,kBAAkB,WAAW;AAAA,MACvH;AAAA,IACF;AAEA,QAAI,SAAS,SAAS;AACpB,YAAM,WAAW,oBAAoB,MAAM,MAAM,SAAS,KAAK,CAAC;AAChE,kCAA4B,UAAU,cAAc;AACpD,aAAO;AAAA,IACT,OAAO;AACL,YAAM,WAAW,sCAAsC;AAAA,QACrD,MAAM,SAAS,KAAK;AAAA,MACtB;AACA,kCAA4B,UAAU,cAAc;AAGpD,UAAI,GAACA,MAAA,SAAS,qCAAT,gBAAAA,IAA2C,SAAS,UAAS;AAChE,cAAM,IAAI;AAAA,UACR,iCAAiC,WAAW;AAAA,QAC9C;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,mBACpB,wBACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQ0D;AAC1D,QAAM,eAAe;AACrB,QAAM,sBAAsB;AAE5B,MAAI;AACJ,MAAI,UAAU;AACZ,uBAAmB,IAAI,IAAI,SAAS,sBAAsB;AAE1D,QAAI,CAAC,SAAS,yBAAyB,SAAS,YAAY,GAAG;AAC7D,YAAM,IAAI;AAAA,QACR,4DAA4D,YAAY;AAAA,MAC1E;AAAA,IACF;AAEA,QACE,CAAC,SAAS,oCACV,CAAC,SAAS,iCAAiC,SAAS,mBAAmB,GACvE;AACA,YAAM,IAAI;AAAA,QACR,oEAAoE,mBAAmB;AAAA,MACzF;AAAA,IACF;AAAA,EACF,OAAO;AACL,uBAAmB,IAAI,IAAI,cAAc,sBAAsB;AAAA,EACjE;AAEA,QAAM,YAAY,MAAM,cAAc;AACtC,QAAM,eAAe,UAAU;AAC/B,QAAM,gBAAgB,UAAU;AAEhC,mBAAiB,aAAa,IAAI,iBAAiB,YAAY;AAC/D,mBAAiB,aAAa,IAAI,aAAa,kBAAkB,SAAS;AAC1E,mBAAiB,aAAa,IAAI,kBAAkB,aAAa;AACjE,mBAAiB,aAAa;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACA,mBAAiB,aAAa,IAAI,gBAAgB,OAAO,WAAW,CAAC;AAErE,MAAI,OAAO;AACT,qBAAiB,aAAa,IAAI,SAAS,KAAK;AAAA,EAClD;AAEA,MAAI,OAAO;AACT,qBAAiB,aAAa,IAAI,SAAS,KAAK;AAAA,EAClD;AAEA,MAAI,+BAAO,SAAS,mBAAmB;AAIrC,qBAAiB,aAAa,OAAO,UAAU,SAAS;AAAA,EAC1D;AAEA,MAAI,UAAU;AACZ,qBAAiB,aAAa;AAAA,MAC5B;AAAA,MACA,sBAAsB,QAAQ;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB,aAAa;AAC1C;AAgBA,SAAS,uBACP,mBACA,kBACkB;AAClB,QAAM,kBAAkB,kBAAkB,kBAAkB;AAE5D,MAAI,iBAAiB,WAAW,GAAG;AACjC,WAAO,kBAAkB,uBAAuB;AAAA,EAClD;AAEA,MAAI,mBAAmB,iBAAiB,SAAS,qBAAqB,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,iBAAiB,SAAS,oBAAoB,GAAG;AACtE,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,SAAS,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,uBAAuB;AAClD;AAgBA,SAAS,0BACP,QACA,mBACA,SACA,QACM;AACN,QAAM,EAAE,WAAW,cAAc,IAAI;AAErC,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,qBAAe,WAAW,eAAe,OAAO;AAChD;AAAA,IACF,KAAK;AACH,oBAAc,WAAW,eAAe,MAAM;AAC9C;AAAA,IACF,KAAK;AACH,sBAAgB,WAAW,MAAM;AACjC;AAAA,IACF;AACE,YAAM,IAAI,MAAM,6CAA6C,MAAM,EAAE;AAAA,EACzE;AACF;AAEA,SAAS,eACP,UACA,cACA,SACM;AACN,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,GAAG,QAAQ,IAAI,YAAY,EAAE;AACtD,UAAQ,IAAI,iBAAiB,SAAS,WAAW,EAAE;AACrD;AAKA,SAAS,cACP,UACA,cACA,QACM;AACN,SAAO,IAAI,aAAa,QAAQ;AAChC,MAAI,cAAc;AAChB,WAAO,IAAI,iBAAiB,YAAY;AAAA,EAC1C;AACF;AAKA,SAAS,gBAAgB,UAAkB,QAA+B;AACxE,SAAO,IAAI,aAAa,QAAQ;AAClC;AAaA,eAAsB,mBACpB,OAC8B;AAC9B,QAAM,aAAa,iBAAiB,WAAW,MAAM,SAAS;AAC9D,QAAM,OAAO,iBAAiB,WAAW,MAAM,MAAM,KAAK,IAAI;AAE9D,MAAI;AACF,UAAM,SAAS,yBAAyB;AAAA,MACtC,MAAMD,WAAU,EAAE,MAAM,KAAK,CAAC;AAAA,IAChC;AACA,UAAM,EAAE,OAAO,mBAAmB,UAAU,IAAI;AAChD,UAAM,aAAa,aAAa,KAAK,KAAK;AAC1C,WAAO,IAAI,WAAW;AAAA,MACpB,SAAS,qBAAqB;AAAA,MAC9B,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,OAAO;AAEd,UAAM,eAAe,GAAG,aAAa,QAAQ,UAAU,OAAO,EAAE,iCAAiC,KAAK,eAAe,IAAI;AACzH,WAAO,IAAI,YAAY,EAAE,SAAS,aAAa,CAAC;AAAA,EAClD;AACF;AAcA,eAAsB,sBACpB,wBACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUsB;AAv0BxB,MAAAC;AAw0BE,QAAM,YAAY;AAElB,QAAM,YAAW,qCAAU,kBACvB,IAAI,IAAI,SAAS,cAAc,IAC/B,IAAI,IAAI,UAAU,sBAAsB;AAE5C,OACE,qCAAU,0BACV,CAAC,SAAS,sBAAsB,SAAS,SAAS,GAClD;AACA,UAAM,IAAI;AAAA,MACR,yDAAyD,SAAS;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,QAAQ;AAAA,IAC1B,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,eAAe;AAAA,IACf,cAAc,OAAO,WAAW;AAAA,EAClC,CAAC;AAED,MAAI,yBAAyB;AAC3B,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,oBACJA,MAAA,qCAAU,0CAAV,OAAAA,MAAmD,CAAC;AACtD,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAEA,8BAA0B,YAAY,mBAAmB,SAAS,MAAM;AAAA,EAC1E;AAEA,MAAI,UAAU;AACZ,WAAO,IAAI,YAAY,sBAAsB,QAAQ,CAAC;AAAA,EACxD;AAEA,QAAM,WAAW,OAAO,4BAAW,OAAO,UAAU;AAAA,IAClD,QAAQ;AAAA,IACR;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,mBAAmB,QAAQ;AAAA,EACzC;AAEA,SAAO,kBAAkB,MAAM,MAAM,SAAS,KAAK,CAAC;AACtD;AAcA,eAAsB,qBACpB,wBACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQsB;AAl6BxB,MAAAA;AAm6BE,QAAM,YAAY;AAElB,MAAI;AACJ,MAAI,UAAU;AACZ,eAAW,IAAI,IAAI,SAAS,cAAc;AAE1C,QACE,SAAS,yBACT,CAAC,SAAS,sBAAsB,SAAS,SAAS,GAClD;AACA,YAAM,IAAI;AAAA,QACR,yDAAyD,SAAS;AAAA,MACpE;AAAA,IACF;AAAA,EACF,OAAO;AACL,eAAW,IAAI,IAAI,UAAU,sBAAsB;AAAA,EACrD;AAEA,QAAM,UAAU,IAAI,QAAQ;AAAA,IAC1B,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,YAAY;AAAA,IACZ,eAAe;AAAA,EACjB,CAAC;AAED,MAAI,yBAAyB;AAC3B,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,oBACJA,MAAA,qCAAU,0CAAV,OAAAA,MAAmD,CAAC;AACtD,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAEA,8BAA0B,YAAY,mBAAmB,SAAS,MAAM;AAAA,EAC1E;AAEA,MAAI,UAAU;AACZ,WAAO,IAAI,YAAY,sBAAsB,QAAQ,CAAC;AAAA,EACxD;AAEA,QAAM,WAAW,OAAO,4BAAW,OAAO,UAAU;AAAA,IAClD,QAAQ;AAAA,IACR;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,mBAAmB,QAAQ;AAAA,EACzC;AAEA,SAAO,kBAAkB,MAAM;AAAA,IAC7B,eAAe;AAAA,IACf,GAAI,MAAM,SAAS,KAAK;AAAA,EAC1B,CAAC;AACH;AAKA,eAAsB,eACpB,wBACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAKqC;AACrC,MAAI;AAEJ,MAAI,UAAU;AACZ,QAAI,CAAC,SAAS,uBAAuB;AACnC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,sBAAkB,IAAI,IAAI,SAAS,qBAAqB;AAAA,EAC1D,OAAO;AACL,sBAAkB,IAAI,IAAI,aAAa,sBAAsB;AAAA,EAC/D;AAEA,QAAM,WAAW,OAAO,4BAAW,OAAO,iBAAiB;AAAA,IACzD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,IACA,MAAM,KAAK,UAAU,cAAc;AAAA,EACrC,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,mBAAmB,QAAQ;AAAA,EACzC;AAEA,SAAO,iCAAiC,MAAM,MAAM,SAAS,KAAK,CAAC;AACrE;AAEA,eAAsB,KACpB,UACA,SAQqB;AAzhCvB,MAAAA,KAAAC;AA0hCE,MAAI;AACF,WAAO,MAAM,aAAa,UAAU,OAAO;AAAA,EAC7C,SAAS,OAAO;AACd,QACE,iBAAiB,sBACjB,iBAAiB,yBACjB;AACA,cAAMD,MAAA,SAAS,0BAAT,gBAAAA,IAAA,eAAiC;AACvC,aAAO,MAAM,aAAa,UAAU,OAAO;AAAA,IAC7C,WAAW,iBAAiB,mBAAmB;AAC7C,cAAMC,MAAA,SAAS,0BAAT,gBAAAA,IAAA,eAAiC;AACvC,aAAO,MAAM,aAAa,UAAU,OAAO;AAAA,IAC7C;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,kBACpB,WACA,UACA,kBAC0B;AAC1B,QAAM,kBAAkB,yBAAyB,SAAS;AAE1D,MAAI,SAAS,qBAAqB;AAChC,WAAO,MAAM,SAAS;AAAA,MACpB;AAAA,MACA,qDAAkB;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,EACT;AAEA,MACE,CAAC,qBAAqB;AAAA,IACpB,mBAAmB;AAAA,IACnB,oBAAoB,iBAAiB;AAAA,EACvC,CAAC,GACD;AACA,UAAM,IAAI;AAAA,MACR,sBAAsB,iBAAiB,QAAQ,4BAA4B,eAAe;AAAA,IAC5F;AAAA,EACF;AACA,SAAO,IAAI,IAAI,iBAAiB,QAAQ;AAC1C;AAEA,eAAe,aACb,UACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQqB;AA5lCvB,MAAAD,KAAAC;AA6lCE,MAAI;AACJ,MAAI;AAGJ,sCAAoC,WAAW,mBAAmB;AAGlE,MAAI;AACF,uBAAmB,MAAM;AAAA,MACvB;AAAA,MACA,EAAE,oBAAoB;AAAA,MACtB;AAAA,IACF;AACA,QACE,iBAAiB,yBACjB,iBAAiB,sBAAsB,SAAS,GAChD;AACA,+BAAyB,iBAAiB,sBAAsB,CAAC;AAAA,IACnE;AAAA,EACF,SAAQ;AAAA,EAAC;AAGT,MAAI,CAAC,wBAAwB;AAC3B,6BAAyB;AAAA,EAC3B;AAGA,QAAM,WAA4B,MAAM;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,UAAMD,MAAA,SAAS,mCAAT,gBAAAA,IAAA;AAAA;AAAA,IACJ;AAAA,IACA;AAAA;AAIF,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,MACE;AAAA,IACF;AAAA,EACF;AACA,QAAM,wCACJ,qCAAqC,wBAAwB,QAAQ;AAGvE,MAAI,oBAAoB,MAAM,QAAQ,QAAQ,SAAS,kBAAkB,CAAC;AAC1E,MAAI,CAAC,mBAAmB;AACtB,QAAI,sBAAsB,QAAW;AACnC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,uBAAuB;AACnC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM,eAAe,wBAAwB;AAAA,MACnE;AAAA,MACA,gBAAgB,SAAS;AAAA,MACzB;AAAA,IACF,CAAC;AAED,wBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,sBAAsB,iBAAiB;AAAA,EACxD;AAGA,MAAI,sBAAsB,QAAW;AACnC,QAAI,SAAS,aAAa;AACxB,YAAM,gBAAgB,MAAM,SAAS,YAAY;AACjD,UAAI,kBAAkB,UAAa,kBAAkB,eAAe;AAClE,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,uCACJ,MAAM,wCAAwC;AAAA,MAC5C;AAAA,MACA;AAAA,IACF,CAAC;AACH,QAAI,CAAC,sCAAsC;AACzC,YAAM,IAAI,oBAAoB;AAAA,QAC5B,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,gDAA4C;AAAA,MAC1C;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAME,gBAAe,MAAM,SAAS,aAAa;AACjD,UAAMC,UAAS,MAAM,sBAAsB,wBAAwB;AAAA,MACjE;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAAD;AAAA,MACA,aAAa,SAAS;AAAA,MACtB;AAAA,MACA,yBAAyB,SAAS;AAAA,MAClC;AAAA,IACF,CAAC;AAED,UAAM,SAAS;AAAA,MACb;AAAA,QACEC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,SAAS,OAAO;AAGrC,MAAI,iCAAQ,eAAe;AACzB,UAAM,uCACJ,MAAM,wCAAwC;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAEH,QAAI,sCAAsC;AACxC,kDAA4C;AAAA,QAC1C;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,cAAMF,MAAA,SAAS,0BAAT,gBAAAA,IAAA,eAAiC;AAAA,IACzC;AAEA,QAAI;AACF,UAAI,sCAAsC;AAExC,cAAM,YAAY,MAAM,qBAAqB,wBAAwB;AAAA,UACnE;AAAA,UACA;AAAA,UACA,cAAc,OAAO;AAAA,UACrB;AAAA,UACA,yBAAyB,SAAS;AAAA,UAClC;AAAA,QACF,CAAC;AAED,cAAM,SAAS;AAAA,UACb;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd;AAAA;AAAA,QAEE,EAAE,iBAAiB,wBACnB,iBAAiB;AAAA,QACjB;AAAA,MAEF,OAAO;AAEL,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,SAAS,QAAQ,MAAM,SAAS,MAAM,IAAI;AACxD,MAAI,SAAS,SAAS,WAAW;AAC/B,UAAM,SAAS,UAAU,KAAK;AAAA,EAChC;AAGA,QAAM,EAAE,kBAAkB,aAAa,IAAI,MAAM;AAAA,IAC/C;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,OAAO,SAAS,SAAS,eAAe;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,sCACJ,MAAM,mCAAmC;AAAA,IACvC;AAAA,IACA;AAAA,IACA,gCAAgC;AAAA,EAClC,CAAC;AACH,MAAI,CAAC,qCAAqC;AACxC,UAAM,IAAI,oBAAoB;AAAA,MAC5B,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,iBAAiB,YAAY;AAC5C,QAAM,SAAS,wBAAwB,gBAAgB;AACvD,SAAO;AACT;;;AJjyCA,SAAS,eAAe,OAAoC;AAC1D,SAAO,UAAU,UAAa,UAAU;AAC1C;AAEO,IAAM,kBAAN,MAA8C;AAAA,EAmBnD,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,EACT,GAMG;AA3BH,SAAQ,YAAY;AA4BlB,SAAK,MAAM,IAAI,IAAI,GAAG;AACtB,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,UAAU,4BAAW,WAAW;AAAA,EACvC;AAAA,EAEA,mBAAmB,SAAuB;AACxC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAc,cACZ,MACiC;AAnErC,QAAAG;AAoEI,UAAM,UAAkC;AAAA,MACtC,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,MACH,yBAAwBA,MAAA,KAAK,oBAAL,OAAAA,MAAwB;AAAA,IAClD;AAEA,QAAI,KAAK,cAAc;AACrB,YAAM,SAAS,MAAM,KAAK,aAAa,OAAO;AAC9C,UAAI,iCAAQ,cAAc;AACxB,gBAAQ,eAAe,IAAI,UAAU,OAAO,YAAY;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU,OAAO;AAAA,MACjB,+BAA+B;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAI,KAAK,WAAW;AAClB,eAAO,QAAQ;AAAA,MACjB;AAEA,WAAK,kBAAkB,IAAI,gBAAgB;AAE3C,YAAM,sBAAsB,OAAO,YAAqB,UAAU;AAhGxE,YAAAA,KAAAC,KAAA;AAiGQ,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,cAAc;AAAA,YACvC,QAAQ;AAAA,UACV,CAAC;AACD,gBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,IAAI,MAAM;AAAA,YACjD;AAAA,YACA,SAAQD,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AAAA,YAC9B,UAAU,KAAK;AAAA,UACjB,CAAC;AAED,cAAI,SAAS,WAAW,OAAO,KAAK,gBAAgB,CAAC,WAAW;AAC9D,iBAAK,sBAAsB,2BAA2B,QAAQ;AAC9D,gBAAI;AACF,oBAAM,SAAS,MAAM,KAAK,KAAK,cAAc;AAAA,gBAC3C,WAAW,KAAK;AAAA,gBAChB,qBAAqB,KAAK;AAAA,gBAC1B,SAAS,KAAK;AAAA,cAChB,CAAC;AACD,kBAAI,WAAW,cAAc;AAC3B,sBAAM,QAAQ,IAAI,kBAAkB;AACpC,iBAAAC,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AACf,uBAAO,OAAO,KAAK;AAAA,cACrB;AAAA,YACF,SAAS,OAAO;AACd,yBAAK,YAAL,8BAAe;AACf,qBAAO,OAAO,KAAK;AAAA,YACrB;AACA,mBAAO,oBAAoB,IAAI;AAAA,UACjC;AAEA,cAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,gBAAI,eAAe,4BAA4B,SAAS,MAAM,IAAI,SAAS,UAAU;AAErF,gBAAI,SAAS,WAAW,KAAK;AAC3B,8BACE;AAAA,YACJ;AAEA,kBAAM,QAAQ,IAAI,eAAe;AAAA,cAC/B,SAAS;AAAA,YACX,CAAC;AACD,uBAAK,YAAL,8BAAe;AACf,mBAAO,OAAO,KAAK;AAAA,UACrB;AAEA,gBAAM,SAAS,SAAS,KACrB,YAAY,IAAI,kBAAkB,CAAC,EACnC,YAAY,IAAI,wBAAwB,CAAC;AAE5C,gBAAM,SAAS,OAAO,UAAU;AAEhC,gBAAM,gBAAgB,YAAY;AApJ5C,gBAAAD,KAAAC,KAAAC,KAAAC,KAAAC;AAqJY,gBAAI;AACF,qBAAO,MAAM;AACX,sBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,oBAAI,MAAM;AACR,sBAAI,KAAK,WAAW;AAClB,yBAAK,YAAY;AACjB,0BAAM,IAAI,eAAe;AAAA,sBACvB,SACE;AAAA,oBACJ,CAAC;AAAA,kBACH;AACA;AAAA,gBACF;AAEA,sBAAM,EAAE,OAAO,KAAK,IAAI;AAExB,oBAAI,UAAU,YAAY;AACxB,sBAAI,KAAK,UAAU;AACjB;AAAA,kBACF;AAEA,wBAAM,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG;AAEvC,sBAAI,SAAS,WAAW,KAAK,IAAI,QAAQ;AACvC,yBAAK,YAAY;AACjB,yBAAK,WAAW;AAChB,qBAAAJ,MAAA,KAAK,kBAAL,gBAAAA,IAAoB;AACpB,qBAAAC,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AACtB,0BAAM,IAAI,eAAe;AAAA,sBACvB,SAAS,8EAA8E,SAAS,MAAM;AAAA,oBACxG,CAAC;AAAA,kBACH;AAEA,uBAAK,WAAW;AAChB,uBAAK,YAAY;AACjB,0BAAQ;AAAA,gBACV,WAAW,eAAe,KAAK,GAAG;AAChC,sBAAI;AACF,0BAAM,UAAU,MAAM,oBAAoB,IAAI;AAC9C,qBAAAC,MAAA,KAAK,cAAL,gBAAAA,IAAA,WAAiB;AAAA,kBACnB,SAAS,OAAO;AACd,0BAAM,IAAI,IAAI,eAAe;AAAA,sBAC3B,SACE;AAAA,sBACF,OAAO;AAAA,oBACT,CAAC;AACD,qBAAAC,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AAAA,kBAEjB;AAAA,gBACF;AAAA,cACF;AAAA,YACF,SAAS,OAAO;AACd,kBAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD;AAAA,cACF;AAEA,eAAAC,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AACf,qBAAO,KAAK;AAAA,YACd;AAAA,UACF;AAEA,eAAK,gBAAgB;AAAA,YACnB,OAAO,MAAM,OAAO,OAAO;AAAA,UAC7B;AAEA,wBAAc;AAAA,QAChB,SAAS,OAAO;AACd,cAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD;AAAA,UACF;AAEA,qBAAK,YAAL,8BAAe;AACf,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAEA,WAAK,oBAAoB;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAtO/B,QAAAJ,KAAAC,KAAA;AAuOI,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,KAAAD,MAAA,KAAK,kBAAL,gBAAAA,IAAoB;AACpB,KAAAC,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AACtB,eAAK,YAAL;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,SAAwC;AACjD,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,WAAW;AACrC,YAAM,IAAI,eAAe;AAAA,QACvB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,KAAK;AAEtB,UAAM,UAAU,OAAO,YAAqB,UAAyB;AAvPzE,UAAAD,KAAAC,KAAA;AAwPM,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,cAAc;AAAA,UACvC,gBAAgB;AAAA,QAClB,CAAC;AACD,cAAM,OAAO;AAAA,UACX,QAAQ;AAAA,UACR;AAAA,UACA,MAAM,KAAK,UAAU,OAAO;AAAA,UAC5B,SAAQD,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AAAA,UAC9B,UAAU,KAAK;AAAA,QACjB;AAEA,cAAM,WAAW,MAAM,KAAK,QAAQ,SAAS,MAAM,IAAI;AAEvD,YAAI,SAAS,WAAW,OAAO,KAAK,gBAAgB,CAAC,WAAW;AAC9D,eAAK,sBAAsB,2BAA2B,QAAQ;AAC9D,cAAI;AACF,kBAAM,SAAS,MAAM,KAAK,KAAK,cAAc;AAAA,cAC3C,WAAW,KAAK;AAAA,cAChB,qBAAqB,KAAK;AAAA,cAC1B,SAAS,KAAK;AAAA,YAChB,CAAC;AACD,gBAAI,WAAW,cAAc;AAC3B,oBAAM,QAAQ,IAAI,kBAAkB;AACpC,eAAAC,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AACf;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,uBAAK,YAAL,8BAAe;AACf;AAAA,UACF;AACA,iBAAO,QAAQ,IAAI;AAAA,QACrB;AAEA,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,gBAAM,QAAQ,IAAI,eAAe;AAAA,YAC/B,SAAS,sDAAsD,SAAS,MAAM,MAAM,IAAI;AAAA,UAC1F,CAAC;AACD,qBAAK,YAAL,8BAAe;AACf;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,mBAAK,YAAL,8BAAe;AACf;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ;AAAA,EAChB;AACF;;;AQzSA;AAAA,EACE,2BAAAI;AAAA,EACA,uBAAAC;AAAA,EACA,kCAAAC;AAAA,OAEK;AAkBP,SAASC,gBAAe,OAAoC;AAC1D,SAAO,UAAU,UAAa,UAAU;AAC1C;AASO,IAAM,mBAAN,MAA+C;AAAA,EA2BpD,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,EACT,GAMG;AAzBH,SAAQ,2BAA2B;AACnC,SAAiB,sBAAsB;AAAA,MACrC,0BAA0B;AAAA,MAC1B,sBAAsB;AAAA,MACtB,6BAA6B;AAAA,MAC7B,YAAY;AAAA,IACd;AAoBE,SAAK,MAAM,IAAI,IAAI,GAAG;AACtB,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,UAAU,4BAAW,WAAW;AAAA,EACvC;AAAA,EAEA,mBAAmB,SAAuB;AACxC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAc,cACZ,MACiC;AAvFrC,QAAAC;AAwFI,UAAM,UAAkC;AAAA,MACtC,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,MACH,yBAAwBA,MAAA,KAAK,oBAAL,OAAAA,MAAwB;AAAA,IAClD;AAEA,QAAI,KAAK,WAAW;AAClB,cAAQ,gBAAgB,IAAI,KAAK;AAAA,IACnC;AAEA,QAAI,KAAK,cAAc;AACrB,YAAM,SAAS,MAAM,KAAK,aAAa,OAAO;AAC9C,UAAI,iCAAQ,cAAc;AACxB,gBAAQ,eAAe,IAAI,UAAU,OAAO,YAAY;AAAA,MAC1D;AAAA,IACF;AAEA,WAAOC;AAAA,MACL;AAAA,MACA,UAAU,OAAO;AAAA,MACjBC,gCAA+B;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,qBAAgD;AACpE,QAAI,CAAC,KAAK,cAAc;AACtB,aAAO,QAAQ,QAAQ,UAAU;AAAA,IACnC;AAEA,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc,KAAK,KAAK,cAAc;AAAA,QACzC,WAAW,KAAK;AAAA,QAChB;AAAA,QACA,SAAS,KAAK;AAAA,MAChB,CAAC,EAAE,QAAQ,MAAM;AACf,aAAK,cAAc;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,iBAAiB;AACxB,YAAM,IAAI,eAAe;AAAA,QACvB,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,SAAK,kBAAkB,IAAI,gBAAgB;AAE3C,SAAK,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,QAAuB;AAjJ/B,QAAAF,KAAAG,KAAA;AAkJI,KAAAH,MAAA,KAAK,yBAAL,gBAAAA,IAA2B;AAC3B,QAAI;AACF,UACE,KAAK,aACL,KAAK,mBACL,CAAC,KAAK,gBAAgB,OAAO,SAC7B;AACA,cAAM,UAAU,MAAM,KAAK,cAAc,CAAC,CAAC;AAC3C,cAAM,KAAK,QAAQ,KAAK,IAAI,MAAM;AAAA,UAChC,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,KAAK,gBAAgB;AAAA,UAC7B,UAAU,KAAK;AAAA,QACjB,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,MAC1B;AAAA,IACF,SAAQ;AAAA,IAAC;AAET,KAAAG,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AACtB,eAAK,YAAL;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,SAAwC;AACjD,UAAM,UAAU,OAAO,YAAqB,UAAyB;AAxKzE,UAAAH,KAAAG,KAAA;AAyKM,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,cAAc;AAAA,UACvC,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAED,cAAM,OAAO;AAAA,UACX,QAAQ;AAAA,UACR;AAAA,UACA,MAAM,KAAK,UAAU,OAAO;AAAA,UAC5B,SAAQH,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AAAA,UAC9B,UAAU,KAAK;AAAA,QACjB;AAEA,cAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,IAAI,MAAM,IAAI;AAEvD,cAAM,YAAY,SAAS,QAAQ,IAAI,gBAAgB;AACvD,YAAI,WAAW;AACb,eAAK,YAAY;AAAA,QACnB;AAEA,YAAI,SAAS,WAAW,OAAO,KAAK,gBAAgB,CAAC,WAAW;AAC9D,eAAK,sBAAsB,2BAA2B,QAAQ;AAC9D,cAAI;AACF,kBAAM,SAAS,MAAM,KAAK,cAAc,KAAK,mBAAmB;AAChE,gBAAI,WAAW,cAAc;AAC3B,oBAAMI,SAAQ,IAAI,kBAAkB;AACpC,oBAAMA;AAAA,YACR;AAAA,UACF,SAASA,QAAO;AACd,aAAAD,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAeC;AACf,kBAAMA;AAAA,UACR;AACA,iBAAO,QAAQ,IAAI;AAAA,QACrB;AAGA,YAAI,SAAS,WAAW,KAAK;AAG3B,cAAI,CAAC,KAAK,sBAAsB;AAC9B,iBAAK,KAAK,eAAe;AAAA,UAC3B;AACA;AAAA,QACF;AAEA,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,cAAI,eAAe,uDAAuD,SAAS,MAAM,MAAM,IAAI;AAGnG,cAAI,SAAS,WAAW,KAAK;AAC3B,4BACE;AAAA,UACJ;AAEA,gBAAMA,SAAQ,IAAI,eAAe;AAAA,YAC/B,SAAS;AAAA,YACT,YAAY,SAAS;AAAA,YACrB,KAAK,KAAK,IAAI;AAAA,YACd,cAAc,sBAAQ;AAAA,UACxB,CAAC;AACD,qBAAK,YAAL,8BAAeA;AACf,gBAAMA;AAAA,QACR;AAIA,cAAM,iBAAiB,EAAE,QAAQ;AACjC,YAAI,gBAAgB;AAClB;AAAA,QACF;AAEA,cAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,YAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAM,WAA6B,MAAM,QAAQ,IAAI,IACjD,KAAK;AAAA,YAAI,CAACC,aACR,qBAAqB,MAAMA,QAAO;AAAA,UACpC,IACA,CAAC,qBAAqB,MAAM,IAAI,CAAC;AACrC,qBAAW,kBAAkB,UAAU;AACrC,uBAAK,cAAL,8BAAiB;AAAA,UACnB;AACA;AAAA,QACF;AAEA,YAAI,YAAY,SAAS,mBAAmB,GAAG;AAC7C,cAAI,CAAC,SAAS,MAAM;AAClB,kBAAMD,SAAQ,IAAI,eAAe;AAAA,cAC/B,SACE;AAAA,cACF,YAAY,SAAS;AAAA,cACrB,KAAK,KAAK,IAAI;AAAA,YAChB,CAAC;AACD,uBAAK,YAAL,8BAAeA;AACf,kBAAMA;AAAA,UACR;AAEA,gBAAM,SAAS,SAAS,KACrB,YAAY,IAAI,kBAAkB,CAAC,EACnC,YAAY,IAAIE,yBAAwB,CAAC;AAC5C,gBAAM,SAAS,OAAO,UAAU;AAEhC,gBAAM,gBAAgB,YAAY;AAjR5C,gBAAAN,KAAAG,KAAAI;AAkRY,gBAAI;AACF,qBAAO,MAAM;AACX,sBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,oBAAI,KAAM;AACV,sBAAM,EAAE,OAAO,KAAK,IAAI;AACxB,oBAAIR,gBAAe,KAAK,GAAG;AACzB,sBAAI;AACF,0BAAM,iBAAiB,MAAM,oBAAoB,IAAI;AACrD,qBAAAC,MAAA,KAAK,cAAL,gBAAAA,IAAA,WAAiB;AAAA,kBACnB,SAASI,QAAO;AACd,0BAAM,IAAI,IAAI,eAAe;AAAA,sBAC3B,SACE;AAAA,sBACF,OAAOA;AAAA,oBACT,CAAC;AACD,qBAAAD,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AAAA,kBACjB;AAAA,gBACF;AAAA,cACF;AAAA,YACF,SAASC,QAAO;AACd,kBAAIA,kBAAiB,SAASA,OAAM,SAAS,cAAc;AACzD;AAAA,cACF;AACA,eAAAG,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAeH;AAAA,YACjB;AAAA,UACF;AAEA,wBAAc;AACd;AAAA,QACF;AAEA,cAAM,QAAQ,IAAI,eAAe;AAAA,UAC/B,SAAS,sDAAsD,WAAW;AAAA,UAC1E,YAAY,SAAS;AAAA,UACrB,KAAK,KAAK,IAAI;AAAA,QAChB,CAAC;AACD,mBAAK,YAAL,8BAAe;AACf,cAAM;AAAA,MACR,SAAS,OAAO;AACd,mBAAK,YAAL,8BAAe;AACf,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,EAChB;AAAA,EAEQ,yBAAyB,SAAyB;AACxD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,KAAK;AACT,WAAO,KAAK;AAAA,MACV,2BAA2B,KAAK,IAAI,6BAA6B,OAAO;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iCAAuC;AA7UjD,QAAAJ;AA8UI,UAAM,EAAE,WAAW,IAAI,KAAK;AAC5B,QAAI,aAAa,KAAK,KAAK,4BAA4B,YAAY;AACjE,OAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAA;AAAA;AAAA,QACE,IAAI,eAAe;AAAA,UACjB,SAAS,4DAA4D,UAAU;AAAA,QACjF,CAAC;AAAA;AAEH;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,yBAAyB,KAAK,wBAAwB;AACzE,SAAK,4BAA4B;AACjC,eAAW,YAAY;AA1V3B,UAAAA;AA2VM,WAAIA,MAAA,KAAK,oBAAL,gBAAAA,IAAsB,OAAO,QAAS;AAC1C,YAAM,KAAK,eAAe,OAAO,KAAK,kBAAkB;AAAA,IAC1D,GAAG,KAAK;AAAA,EACV;AAAA;AAAA,EAGA,MAAc,eACZ,YAAqB,OACrB,aACe;AApWnB,QAAAA,KAAAG,KAAA;AAqWI,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,cAAc;AAAA,QACvC,QAAQ;AAAA,MACV,CAAC;AACD,UAAI,aAAa;AACf,gBAAQ,eAAe,IAAI;AAAA,MAC7B;AAEA,YAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,IAAI,MAAM;AAAA,QACjD,QAAQ;AAAA,QACR;AAAA,QACA,SAAQH,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AAAA,QAC9B,UAAU,KAAK;AAAA,MACjB,CAAC;AAED,YAAM,YAAY,SAAS,QAAQ,IAAI,gBAAgB;AACvD,UAAI,WAAW;AACb,aAAK,YAAY;AAAA,MACnB;AAEA,UAAI,SAAS,WAAW,OAAO,KAAK,gBAAgB,CAAC,WAAW;AAC9D,aAAK,sBAAsB,2BAA2B,QAAQ;AAC9D,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK,cAAc,KAAK,mBAAmB;AAChE,cAAI,WAAW,cAAc;AAC3B,kBAAM,QAAQ,IAAI,kBAAkB;AACpC,aAAAG,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AACf;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,qBAAK,YAAL,8BAAe;AACf;AAAA,QACF;AACA,eAAO,KAAK,eAAe,MAAM,WAAW;AAAA,MAC9C;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,cAAM,QAAQ,IAAI,eAAe;AAAA,UAC/B,SAAS,6CAA6C,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,UAC5F,YAAY,SAAS;AAAA,UACrB,KAAK,KAAK,IAAI;AAAA,QAChB,CAAC;AACD,mBAAK,YAAL,8BAAe;AACf;AAAA,MACF;AAEA,YAAM,SAAS,SAAS,KACrB,YAAY,IAAI,kBAAkB,CAAC,EACnC,YAAY,IAAIG,yBAAwB,CAAC;AAC5C,YAAM,SAAS,OAAO,UAAU;AAEhC,YAAM,gBAAgB,YAAY;AA5ZxC,YAAAN,KAAAG,KAAAI,KAAAC;AA6ZQ,YAAI;AACF,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,gBAAI,KAAM;AACV,kBAAM,EAAE,OAAO,MAAM,GAAG,IAAI;AAM5B,gBAAI,IAAI;AACN,mBAAK,qBAAqB;AAAA,YAC5B;AAEA,gBAAIT,gBAAe,KAAK,GAAG;AACzB,kBAAI;AACF,sBAAM,iBAAiB,MAAM,oBAAoB,IAAI;AACrD,iBAAAC,MAAA,KAAK,cAAL,gBAAAA,IAAA,WAAiB;AAAA,cACnB,SAAS,OAAO;AACd,sBAAM,IAAI,IAAI,eAAe;AAAA,kBAC3B,SAAS;AAAA,kBACT,OAAO;AAAA,gBACT,CAAC;AACD,iBAAAG,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,cAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD;AAAA,UACF;AACA,WAAAI,MAAA,KAAK,YAAL,gBAAAA,IAAA,WAAe;AACf,cAAI,GAACC,MAAA,KAAK,oBAAL,gBAAAA,IAAsB,OAAO,UAAS;AACzC,iBAAK,+BAA+B;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAEA,WAAK,uBAAuB;AAAA,QAC1B,OAAO,MAAM,OAAO,OAAO;AAAA,MAC7B;AACA,WAAK,2BAA2B;AAChC,oBAAc;AAAA,IAChB,SAAS,OAAO;AACd,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD;AAAA,MACF;AACA,iBAAK,YAAL,8BAAe;AACf,UAAI,GAAC,UAAK,oBAAL,mBAAsB,OAAO,UAAS;AACzC,aAAK,+BAA+B;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF;;;AC1XO,SAAS,mBAAmB,QAA0C;AAC3E,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,IAAI,gBAAgB,MAAM;AAAA,IACnC,KAAK;AACH,aAAO,IAAI,iBAAiB,MAAM;AAAA,IACpC;AACE,YAAM,IAAI,eAAe;AAAA,QACvB,SACE;AAAA,MACJ,CAAC;AAAA,EACL;AACF;AAEO,SAAS,qBACd,WAC2B;AAC3B,SACE,WAAW,aACX,OAAO,UAAU,UAAU,cAC3B,UAAU,aACV,OAAO,UAAU,SAAS,cAC1B,WAAW,aACX,OAAO,UAAU,UAAU;AAE/B;;;ACjHA,SAAS,oBAAqC;AAC9C,SAAS,iCAAiC;AAanC,IAAM,yBAAyB;AAK/B,IAAM,oBAAoB;AAM1B,IAAM,uCAAuC;AAK7C,IAAM,2BAA2B;AAAA,EACtC,YAAY;AAAA,IACV,CAAC,sBAAsB,GAAG;AAAA,MACxB,WAAW,CAAC,iBAAiB;AAAA,IAC/B;AAAA,EACF;AACF;AAgDA,SAAS,cAAc,MAAyC;AAC9D,QAAM,SAAS,6BAAM;AACrB,SAAO,aAAa,MAAM,IAAI,SAAS;AACzC;AAEA,SAAS,kBAAkB,MAA+C;AACxE,QAAM,eAAe,aAAa,IAAI,IAAI,OAAO;AACjD,QAAM,YAAY,6CAAc;AAChC,QAAM,SAAS,aAAa,SAAS,IAAI,YAAY;AAErD,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAoD;AAC3E,SAAO,MAAM,QAAQ,KAAK,IACtB,MAAM;AAAA,IACJ,CAAC,MAAiC,MAAM,WAAW,MAAM;AAAA,EAC3D,IACA;AACN;AAKO,SAAS,kBACdC,OAC4B;AA9G9B,MAAAC,KAAAC;AA+GE,QAAM,SAAS,cAAcF,MAAK,KAAK;AACvC,QAAM,eACJE,MAAA,iCAAQ,gBAAR,OAAAA,OAAuBD,MAAAD,MAAK,UAAL,gBAAAC,IAAa;AACtC,QAAM,aAAa,gBAAgB,iCAAQ,UAAU;AAErD,MAAI,gBAAgB,QAAW;AAC7B,QAAI,OAAO,gBAAgB,YAAY,CAAC,YAAY,WAAW,OAAO,GAAG;AACvE,YAAM,IAAI;AAAA,QACR,iCAAiC,KAAK,UAAU,WAAW,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF,WAAW,UAAU,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,eAAe,OAAO,EAAE,YAAY,IAAI,CAAC;AAAA,IAC7C,GAAI,cAAc,OAAO,EAAE,WAAW,IAAI,CAAC;AAAA,EAC7C;AACF;AAmBO,SAAS,iBAAiB,aAG/B;AAzJF,MAAAE;AA0JE,QAAM,oBAAoB,CAAC;AAC3B,QAAM,kBAAkB,CAAC;AAEzB,aAAWC,SAAQ,YAAY,OAAO;AACpC,UAAM,cAAaD,MAAA,kBAAkBC,KAAI,MAAtB,gBAAAD,IAAyB;AAG5C,QAAI,cAAc,QAAQ,WAAW,SAAS,OAAO,GAAG;AACtD,wBAAkB,KAAKC,KAAI;AAAA,IAC7B;AAEA,SAAI,yCAAY,SAAS,YAAW,MAAM;AACxC,sBAAgB,KAAKA,KAAI;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc;AAAA,MACZ,GAAG;AAAA,MACH,OAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,MACV,GAAG;AAAA,MACH,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAkBO,SAAS,gCAAgC;AAAA,EAC9C;AAAA,EACA;AACF,GAGmB;AACjB,QAAM,UAAU,SAAS,SAAS,KAAK,CAAAC,aAAWA,SAAQ,QAAQ,GAAG;AAErE,MAAI,WAAW,MAAM;AACnB,UAAM,IAAI,MAAM,8CAA8C,GAAG,EAAE;AAAA,EACrE;AAEA,MAAI,QAAQ,aAAa,mBAAmB;AAC1C,UAAM,IAAI;AAAA,MACR,2CAA2C,QAAQ,QAAQ;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,OACJ,UAAU,WAAW,OAAO,QAAQ,SAAS,WACzC,QAAQ,OACR,UAAU,WAAW,OAAO,QAAQ,SAAS,WAC3C,IAAI,YAAY,EAAE,OAAO,0BAA0B,QAAQ,IAAI,CAAC,IAChE;AAER,MAAI,QAAQ,MAAM;AAChB,UAAM,IAAI,MAAM,gDAAgD,GAAG,EAAE;AAAA,EACvE;AAEA,QAAM,OAAO,kBAAkB,QAAQ,KAAK;AAE5C,SAAO,EAAE,KAAK,UAAU,mBAAmB,MAAM,KAAK;AACxD;AAKA,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,GAI4B;AAC1B,MAAI,CAAC,IAAI,WAAW,OAAO,GAAG;AAC5B,UAAM,IAAI,MAAM,qCAAqC,GAAG,EAAE;AAAA,EAC5D;AAEA,SAAO,gCAAgC;AAAA,IACrC;AAAA,IACA,UAAU,MAAM,OAAO,aAAa,EAAE,KAAK,QAAQ,CAAC;AAAA,EACtD,CAAC;AACH;;;AZ9LA,IAAM,iBAAiB;AAEvB,SAAS,iBAAiB;AAAA,EACxB;AACF,GAIqB;AACnB,QAAM,SAAS;AAEf,MAAI,EAAE,aAAa,WAAW,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AAC5D,WAAO,EAAE,MAAM,QAAQ,OAAO,OAAoB;AAAA,EACpD;AAEA,QAAM,mBAAmB,OAAO,QAAQ;AAAA,IACtC,CAAC,SAAmD;AAClD,UAAI,KAAK,SAAS,UAAU,UAAU,MAAM;AAC1C,eAAO,EAAE,MAAM,QAAiB,MAAM,KAAK,KAAe;AAAA,MAC5D;AACA,UAAI,KAAK,SAAS,WAAW,UAAU,QAAQ,cAAc,MAAM;AACjE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,KAAK;AAAA,UAChB,MAAM,EAAE,MAAM,QAAiB,MAAM,KAAK,KAAe;AAAA,QAC3D;AAAA,MACF;AACA,aAAO,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,WAAW,OAAO,iBAAiB;AACpD;AAyBA,eAAsB,gBACpB,QACoB;AACpB,QAAM,SAAS,IAAI,iBAAiB,MAAM;AAC1C,QAAM,OAAO,KAAK;AAClB,SAAO;AACT;AAmGA,IAAM,mBAAN,MAA4C;AAAA,EAkB1C,YAAY;AAAA,IACV,WAAW;AAAA,IACX,MAAAC;AAAA,IACA,aAAaA,SAAA,OAAAA,QAAQ;AAAA,IACrB,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF,GAAoB;AApBpB,SAAQ,mBAAmB;AAC3B,SAAQ,mBAGJ,oBAAI,IAAI;AACZ,SAAQ,qBAAyC,CAAC;AAClD,SAAQ,cAA6B,EAAE,MAAM,IAAI,SAAS,GAAG;AAE7D,SAAQ,WAAW;AAajB,SAAK,kBAAkB;AACvB,SAAK,qBAAqB,sCAAgB,CAAC;AAE3C,QAAI,qBAAqB,eAAe,GAAG;AACzC,WAAK,YAAY;AAAA,IACnB,OAAO;AACL,WAAK,YAAY,mBAAmB,eAAe;AAAA,IACrD;AAEA,SAAK,UAAU,UAAU,MAAM,KAAK,QAAQ;AAC5C,SAAK,UAAU,UAAU,CAAC,UAAiB,KAAK,QAAQ,KAAK;AAC7D,SAAK,UAAU,YAAY,aAAW;AACpC,UAAI,YAAY,SAAS;AACvB,YAAI,QAAQ,SAAS;AACnB,eAAK,iBAAiB,OAAO;AAAA,QAC/B,OAAO;AACL,eAAK;AAAA,YACH,IAAI,eAAe;AAAA,cACjB,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AACA;AAAA,MACF;AAEA,WAAK,WAAW,OAAO;AAAA,IACzB;AAEA,SAAK,aAAa;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,aAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAmC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI;AACF,YAAM,KAAK,UAAU,MAAM;AAC3B,WAAK,WAAW;AAEhB,YAAM,SAAS,MAAM,KAAK,QAAQ;AAAA,QAChC,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,iBAAiB;AAAA,YACjB,cAAc,KAAK;AAAA,YACnB,YAAY,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,QACA,cAAc;AAAA,MAChB,CAAC;AAED,UAAI,WAAW,QAAW;AACxB,cAAM,IAAI,eAAe;AAAA,UACvB,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAEA,UAAI,CAAC,4BAA4B,SAAS,OAAO,eAAe,GAAG;AACjE,cAAM,IAAI,eAAe;AAAA,UACvB,SAAS,+CAA+C,OAAO,eAAe;AAAA,QAChF,CAAC;AAAA,MACH;AAEA,WAAK,qBAAqB,OAAO;AACjC,WAAK,cAAc,OAAO;AAC1B,UAAI,KAAK,UAAU,oBAAoB;AACrC,aAAK,UAAU,mBAAmB,OAAO,eAAe;AAAA,MAC1D,OAAO;AACL,aAAK,UAAU,kBAAkB,OAAO;AAAA,MAC1C;AACA,WAAK,sBAAsB,OAAO;AAGlC,YAAM,KAAK,aAAa;AAAA,QACtB,QAAQ;AAAA,MACV,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,KAAK,MAAM;AACjB,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAvV/B,QAAAC;AAwVI,QAAI,KAAK,SAAU;AACnB,YAAMA,MAAA,KAAK,cAAL,gBAAAA,IAAgB;AACtB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,iBAAiB,QAAsB;AAC7C,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,CAAC,KAAK,mBAAmB,OAAO;AAClC,gBAAM,IAAI,eAAe;AAAA,YACvB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,YAAI,CAAC,KAAK,mBAAmB,WAAW;AACtC,gBAAM,IAAI,eAAe;AAAA,YACvB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,CAAC,KAAK,mBAAmB,SAAS;AACpC,gBAAM,IAAI,eAAe;AAAA,YACvB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACE,cAAM,IAAI,eAAe;AAAA,UACvB,SAAS,uBAAuB,MAAM;AAAA,QACxC,CAAC;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAc,QAAqC;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIwB;AACtB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,KAAK,UAAU;AACjB,eAAO;AAAA,UACL,IAAI,eAAe;AAAA,YACjB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAEA,WAAK,iBAAiB,QAAQ,MAAM;AAEpC,YAAM,SAAS,mCAAS;AACxB,uCAAQ;AAER,YAAM,YAAY,KAAK;AACvB,YAAM,iBAAiC;AAAA,QACrC,GAAG;AAAA,QACH,SAAS;AAAA,QACT,IAAI;AAAA,MACN;AAEA,YAAM,UAAU,MAAM;AACpB,aAAK,iBAAiB,OAAO,SAAS;AAAA,MACxC;AAEA,WAAK,iBAAiB,IAAI,WAAW,cAAY;AAC/C,YAAI,iCAAQ,SAAS;AACnB,iBAAO;AAAA,YACL,IAAI,eAAe;AAAA,cACjB,SAAS;AAAA,cACT,OAAO,OAAO;AAAA,YAChB,CAAC;AAAA,UACH;AAAA,QACF;AAEA,YAAI,oBAAoB,OAAO;AAC7B,iBAAO,OAAO,QAAQ;AAAA,QACxB;AAEA,YAAI;AACF,gBAAM,SAAS,aAAa,MAAM,SAAS,MAAM;AACjD,kBAAQ,MAAM;AAAA,QAChB,SAAS,OAAO;AACd,gBAAM,aAAa,IAAI,eAAe;AAAA,YACpC,SAAS;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AACD,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF,CAAC;AAED,WAAK,UAAU,KAAK,cAAc,EAAE,MAAM,WAAS;AACjD,gBAAQ;AACR,eAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,EACF,IAGI,CAAC,GAA6B;AAChC,WAAO,KAAK,QAAQ;AAAA,MAClB,SAAS,EAAE,QAAQ,cAAc,OAAO;AAAA,MACxC,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS;AAAA,IACb,MAAAD;AAAA,IACA,WAAW,OAAO,CAAC;AAAA,IACnB;AAAA,EACF,GAI4B;AAC1B,QAAI;AACF,aAAO,KAAK,QAAQ;AAAA,QAClB,SAAS,EAAE,QAAQ,cAAc,QAAQ,EAAE,MAAAA,OAAM,WAAW,KAAK,EAAE;AAAA,QACnE,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB;AAAA,IAClC;AAAA,IACA;AAAA,EACF,IAGI,CAAC,GAAiC;AACpC,QAAI;AACF,aAAO,KAAK,QAAQ;AAAA,QAClB,SAAS,EAAE,QAAQ,kBAAkB,OAAO;AAAA,QAC5C,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB;AAAA,IACjC;AAAA,IACA;AAAA,EACF,GAGgC;AAC9B,QAAI;AACF,aAAO,KAAK,QAAQ;AAAA,QAClB,SAAS,EAAE,QAAQ,kBAAkB,QAAQ,EAAE,IAAI,EAAE;AAAA,QACrD,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,8BAA8B;AAAA,IAC1C;AAAA,EACF,IAEI,CAAC,GAAyC;AAC5C,QAAI;AACF,aAAO,KAAK,QAAQ;AAAA,QAClB,SAAS,EAAE,QAAQ,2BAA2B;AAAA,QAC9C,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB;AAAA,IAChC;AAAA,IACA;AAAA,EACF,IAGI,CAAC,GAA+B;AAClC,QAAI;AACF,aAAO,KAAK,QAAQ;AAAA,QAClB,SAAS,EAAE,QAAQ,gBAAgB,OAAO;AAAA,QAC1C,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB;AAAA,IAC9B,MAAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAI6B;AAC3B,QAAI;AACF,aAAO,KAAK,QAAQ;AAAA,QAClB,SAAS,EAAE,QAAQ,eAAe,QAAQ,EAAE,MAAAA,OAAM,WAAW,KAAK,EAAE;AAAA,QACpE,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,cAA2C;AACpE,UAAM,sBAA2C;AAAA,MAC/C,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AACA,UAAM,KAAK,UAAU,KAAK,mBAAmB;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAsD;AAAA,IAC1D,UAAU;AAAA,EACZ,IAEI,CAAC,GAAsC;AACzC,UAAM,cAAc,MAAM,KAAK,UAAU;AACzC,WAAO,KAAK,qBAAqB,aAAa;AAAA,MAC5C;AAAA,IACF,CAA+B;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,qBACE,aACA,EAAE,UAAU,YAAY,IAAgC,CAAC,GAG/B;AAhmB9B,QAAAC,KAAAC;AAimBI,UAAM,QAAqD,CAAC;AAE5D,eAAW;AAAA,MACT,MAAAF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,KAAK,YAAY,OAAO;AACtB,YAAM,gBAAgB,wBAAS,2CAAa;AAC5C,UACE,YAAY,eACZ,CAAC,OAAO,UAAU,eAAe,KAAK,SAASA,KAAI,GACnD;AACA;AAAA,MACF;AAEA,YAAM,OAAO;AACb,YAAM,eACJ,YAAY,eAAcC,MAAA,QAAQD,KAAI,MAAZ,gBAAAC,IAAe,eAAe;AAC1D,YAAM,UAAU,kBAAkB,EAAE,MAAM,CAAC;AAC3C,YAAM,WAAW;AAAA,QACf,YAAY,KAAK,WAAW;AAAA,QAC5B,UAAUD;AAAA,QACV,GAAI,iBAAiB,OAAO,EAAE,OAAO,cAAc,IAAI,CAAC;AAAA,QACxD,IAAI,mCAAS,gBAAe,OACxB;AAAA,UACE,KAAK;AAAA,YACH,GAAG;AAAA,YACH,UAAU;AAAA,UACZ;AAAA,QACF,IACA,CAAC;AAAA,MACP;AAEA,YAAM,UAAU,OACd,MACA,YACqB;AAxoB7B,YAAAC;AAyoBQ,SAAAA,MAAA,mCAAS,gBAAT,gBAAAA,IAAsB;AACtB,cAAM,SAAS,MAAM,KAAK,SAAS;AAAA,UACjC,MAAAD;AAAA,UACA,WAAW;AAAA,UACX,SAAS,EAAE,QAAQ,mCAAS,YAAY;AAAA,QAC1C,CAAC;AAED,YAAI,OAAO,SAAS;AAClB,iBAAO;AAAA,QACT;AAEA,YAAI,gBAAgB,MAAM;AACxB,iBAAO,KAAK,yBAAyB,QAAQ,cAAcA,KAAI;AAAA,QACjE;AAEA,eAAO;AAAA,MACT;AAEA,YAAM,kBACJ,YAAY,cACR,YAAY;AAAA,QACV;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,aAAa,WAAW;AAAA,UACtB,GAAG;AAAA,UACH,aAAYE,MAAA,YAAY,eAAZ,OAAAA,MAA0B,CAAC;AAAA,UACvC,sBAAsB;AAAA,QACxB,CAAgB;AAAA,QAChB;AAAA,QACA,eAAe;AAAA,MACjB,CAAC,IACD,KAAK;AAAA,QACH;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,aAAa,QAAQF,KAAI,EAAE;AAAA,QAC3B,GAAI,gBAAgB,OAAO,EAAE,aAAa,IAAI,CAAC;AAAA,QAC/C;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AAEP,YAAMA,KAAI,IAAI,EAAE,GAAG,iBAAiB,MAAM;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,yBACZ,QACA,cACA,UACkB;AAClB,QAAI,uBAAuB,UAAU,OAAO,qBAAqB,MAAM;AACrE,YAAM,mBAAmB,MAAM,kBAAkB;AAAA,QAC/C,OAAO,OAAO;AAAA,QACd,QAAQ,SAAS,YAAY;AAAA,MAC/B,CAAC;AAED,UAAI,CAAC,iBAAiB,SAAS;AAC7B,cAAM,IAAI,eAAe;AAAA,UACvB,SAAS,SAAS,QAAQ;AAAA,UAC1B,OAAO,iBAAiB;AAAA,QAC1B,CAAC;AAAA,MACH;AAEA,aAAO,iBAAiB;AAAA,IAC1B;AAGA,QAAI,aAAa,UAAU,MAAM,QAAQ,OAAO,OAAO,GAAG;AACxD,YAAM,cAAc,OAAO,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AAC9D,UAAI,eAAe,UAAU,aAAa;AACxC,cAAM,cAAc,MAAM,cAAc;AAAA,UACtC,MAAM,YAAY;AAAA,UAClB,QAAQ;AAAA,QACV,CAAC;AAED,YAAI,CAAC,YAAY,SAAS;AACxB,gBAAM,IAAI,eAAe;AAAA,YACvB,SAAS,SAAS,QAAQ;AAAA,YAC1B,OAAO,YAAY;AAAA,UACrB,CAAC;AAAA,QACH;AAEA,eAAO,YAAY;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,IAAI,eAAe;AAAA,MACvB,SAAS,SAAS,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,EACF,IAGI,CAAC,GAAiC;AACpC,WAAO,KAAK,sBAAsB,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,EACF,GAGgC;AAC9B,WAAO,KAAK,qBAAqB,EAAE,KAAK,QAAQ,CAAC;AAAA,EACnD;AAAA,EAEA,sBAAsB;AAAA,IACpB;AAAA,EACF,IAEI,CAAC,GAAyC;AAC5C,WAAO,KAAK,8BAA8B,EAAE,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,yBAAyB;AAAA,IACvB;AAAA,IACA;AAAA,EACF,IAGI,CAAC,GAA+B;AAClC,WAAO,KAAK,oBAAoB,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACrD;AAAA,EAEA,uBAAuB;AAAA,IACrB,MAAAA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,EACF,GAI6B;AAC3B,WAAO,KAAK,kBAAkB,EAAE,MAAAA,OAAM,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,qBACE,QACA,SAGM;AACN,QAAI,WAAW,0BAA0B;AACvC,YAAM,IAAI,eAAe;AAAA,QACvB,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,SAAK,4BAA4B;AAAA,EACnC;AAAA,EAEA,MAAc,iBAAiB,SAAwC;AACrE,QAAI;AACF,UAAI,QAAQ,WAAW,QAAQ;AAC7B,cAAM,KAAK,UAAU,KAAK;AAAA,UACxB,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,QAAQ,CAAC;AAAA,QACX,CAAC;AACD;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,sBAAsB;AAC3C,cAAM,KAAK,UAAU,KAAK;AAAA,UACxB,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS,+BAA+B,QAAQ,MAAM;AAAA,UACxD;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,2BAA2B;AACnC,cAAM,KAAK,UAAU,KAAK;AAAA,UACxB,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAEA,YAAM,gBAAgB,yBAAyB,UAAU;AAAA,QACvD,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,UAAI,CAAC,cAAc,SAAS;AAC1B,cAAM,KAAK,UAAU,KAAK;AAAA,UACxB,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS,gCAAgC,cAAc,MAAM,OAAO;AAAA,YACpE,MAAM,cAAc,MAAM;AAAA,UAC5B;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,0BAA0B,cAAc,IAAI;AACtE,cAAM,kBAAkB,mBAAmB,MAAM,MAAM;AAEvD,cAAM,KAAK,UAAU,KAAK;AAAA,UACxB,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,SAAS,OAAO;AACd,cAAM,KAAK,UAAU,KAAK;AAAA,UACxB,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SACE,iBAAiB,QACb,MAAM,UACN;AAAA,UACR;AAAA,QACF,CAAC;AACD,aAAK,QAAQ,KAAK;AAAA,MACpB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,QAAQ,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,UAAgB;AACtB,QAAI,KAAK,SAAU;AAEnB,SAAK,WAAW;AAChB,UAAM,QAAQ,IAAI,eAAe;AAAA,MAC/B,SAAS;AAAA,IACX,CAAC;AAED,eAAW,WAAW,KAAK,iBAAiB,OAAO,GAAG;AACpD,cAAQ,KAAK;AAAA,IACf;AAEA,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AAAA,EAEQ,QAAQ,OAAsB;AACpC,QAAI,KAAK,iBAAiB;AACxB,WAAK,gBAAgB,KAAK;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,WAAW,UAAgD;AACjE,UAAM,YAAY,OAAO,SAAS,EAAE;AACpC,UAAM,UAAU,KAAK,iBAAiB,IAAI,SAAS;AAEnD,QAAI,YAAY,QAAW;AACzB,YAAM,IAAI,eAAe;AAAA,QACvB,SAAS,kEAAkE,KAAK;AAAA,UAC9E;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,SAAK,iBAAiB,OAAO,SAAS;AAEtC;AAAA,MACE,YAAY,WACR,WACA,IAAI,eAAe;AAAA,QACjB,SAAS,SAAS,MAAM;AAAA,QACxB,MAAM,SAAS,MAAM;AAAA,QACrB,MAAM,SAAS,MAAM;AAAA,QACrB,OAAO,SAAS;AAAA,MAClB,CAAC;AAAA,IACP;AAAA,EACF;AACF;","names":["name","z","z","z","AISDKError","name","marker","symbol","_a","_b","parseJSON","_a","_b","codeVerifier","tokens","_a","_b","_c","_d","_e","EventSourceParserStream","withUserAgentSuffix","getRuntimeEnvironmentUserAgent","isMessageEvent","_a","withUserAgentSuffix","getRuntimeEnvironmentUserAgent","_b","error","message","EventSourceParserStream","_c","_d","tool","_a","_b","_a","tool","content","name","_a","_b"]}
|
package/package.json
CHANGED
|
@@ -21,6 +21,10 @@ import {
|
|
|
21
21
|
} from './oauth';
|
|
22
22
|
import { LATEST_PROTOCOL_VERSION } from './types';
|
|
23
23
|
|
|
24
|
+
function isMessageEvent(event: string | undefined): boolean {
|
|
25
|
+
return event === undefined || event === 'message';
|
|
26
|
+
}
|
|
27
|
+
|
|
24
28
|
/**
|
|
25
29
|
* HTTP MCP transport implementing the Streamable HTTP style.
|
|
26
30
|
*
|
|
@@ -273,7 +277,7 @@ export class HttpMCPTransport implements MCPTransport {
|
|
|
273
277
|
const { done, value } = await reader.read();
|
|
274
278
|
if (done) return;
|
|
275
279
|
const { event, data } = value;
|
|
276
|
-
if (event
|
|
280
|
+
if (isMessageEvent(event)) {
|
|
277
281
|
try {
|
|
278
282
|
const jsonRpcMessage = await parseJSONRPCMessage(data);
|
|
279
283
|
this.onmessage?.(jsonRpcMessage);
|
|
@@ -421,7 +425,7 @@ export class HttpMCPTransport implements MCPTransport {
|
|
|
421
425
|
this.lastInboundEventId = id;
|
|
422
426
|
}
|
|
423
427
|
|
|
424
|
-
if (event
|
|
428
|
+
if (isMessageEvent(event)) {
|
|
425
429
|
try {
|
|
426
430
|
const jsonRpcMessage = await parseJSONRPCMessage(data);
|
|
427
431
|
this.onmessage?.(jsonRpcMessage);
|
|
@@ -16,6 +16,10 @@ import {
|
|
|
16
16
|
} from './oauth';
|
|
17
17
|
import { LATEST_PROTOCOL_VERSION } from './types';
|
|
18
18
|
|
|
19
|
+
function isMessageEvent(event: string | undefined): boolean {
|
|
20
|
+
return event === undefined || event === 'message';
|
|
21
|
+
}
|
|
22
|
+
|
|
19
23
|
export class SseMCPTransport implements MCPTransport {
|
|
20
24
|
private endpoint?: URL;
|
|
21
25
|
private abortController?: AbortController;
|
|
@@ -180,7 +184,7 @@ export class SseMCPTransport implements MCPTransport {
|
|
|
180
184
|
this.endpoint = endpoint;
|
|
181
185
|
this.connected = true;
|
|
182
186
|
resolve();
|
|
183
|
-
} else if (event
|
|
187
|
+
} else if (isMessageEvent(event)) {
|
|
184
188
|
try {
|
|
185
189
|
const message = await parseJSONRPCMessage(data);
|
|
186
190
|
this.onmessage?.(message);
|
package/src/tool/oauth.ts
CHANGED
|
@@ -442,23 +442,30 @@ export async function discoverOAuthProtectedResourceMetadata(
|
|
|
442
442
|
*/
|
|
443
443
|
export function buildDiscoveryUrls(
|
|
444
444
|
authorizationServerUrl: string | URL,
|
|
445
|
-
): { url: URL; type: 'oauth' | 'oidc' }[] {
|
|
445
|
+
): { url: URL; type: 'oauth' | 'oidc'; expectedIssuer: string }[] {
|
|
446
446
|
const url =
|
|
447
447
|
typeof authorizationServerUrl === 'string'
|
|
448
448
|
? new URL(authorizationServerUrl)
|
|
449
449
|
: authorizationServerUrl;
|
|
450
450
|
const hasPath = url.pathname !== '/';
|
|
451
|
-
const
|
|
451
|
+
const rootIssuer = url.origin;
|
|
452
|
+
const urlsToTry: {
|
|
453
|
+
url: URL;
|
|
454
|
+
type: 'oauth' | 'oidc';
|
|
455
|
+
expectedIssuer: string;
|
|
456
|
+
}[] = [];
|
|
452
457
|
|
|
453
458
|
if (!hasPath) {
|
|
454
459
|
urlsToTry.push({
|
|
455
460
|
url: new URL('/.well-known/oauth-authorization-server', url.origin),
|
|
456
461
|
type: 'oauth',
|
|
462
|
+
expectedIssuer: rootIssuer,
|
|
457
463
|
});
|
|
458
464
|
|
|
459
465
|
urlsToTry.push({
|
|
460
466
|
url: new URL('/.well-known/openid-configuration', url.origin),
|
|
461
467
|
type: 'oidc',
|
|
468
|
+
expectedIssuer: rootIssuer,
|
|
462
469
|
});
|
|
463
470
|
|
|
464
471
|
return urlsToTry;
|
|
@@ -468,6 +475,7 @@ export function buildDiscoveryUrls(
|
|
|
468
475
|
if (pathname.endsWith('/')) {
|
|
469
476
|
pathname = pathname.slice(0, -1);
|
|
470
477
|
}
|
|
478
|
+
const pathIssuer = `${url.origin}${pathname}`;
|
|
471
479
|
|
|
472
480
|
urlsToTry.push({
|
|
473
481
|
url: new URL(
|
|
@@ -475,26 +483,41 @@ export function buildDiscoveryUrls(
|
|
|
475
483
|
url.origin,
|
|
476
484
|
),
|
|
477
485
|
type: 'oauth',
|
|
486
|
+
expectedIssuer: pathIssuer,
|
|
478
487
|
});
|
|
479
488
|
|
|
480
489
|
urlsToTry.push({
|
|
481
490
|
url: new URL('/.well-known/oauth-authorization-server', url.origin),
|
|
482
491
|
type: 'oauth',
|
|
492
|
+
expectedIssuer: rootIssuer,
|
|
483
493
|
});
|
|
484
494
|
|
|
485
495
|
urlsToTry.push({
|
|
486
496
|
url: new URL(`/.well-known/openid-configuration${pathname}`, url.origin),
|
|
487
497
|
type: 'oidc',
|
|
498
|
+
expectedIssuer: pathIssuer,
|
|
488
499
|
});
|
|
489
500
|
|
|
490
501
|
urlsToTry.push({
|
|
491
502
|
url: new URL(`${pathname}/.well-known/openid-configuration`, url.origin),
|
|
492
503
|
type: 'oidc',
|
|
504
|
+
expectedIssuer: pathIssuer,
|
|
493
505
|
});
|
|
494
506
|
|
|
495
507
|
return urlsToTry;
|
|
496
508
|
}
|
|
497
509
|
|
|
510
|
+
function assertMetadataIssuerMatches(
|
|
511
|
+
metadata: AuthorizationServerMetadata,
|
|
512
|
+
expectedIssuer: string,
|
|
513
|
+
): void {
|
|
514
|
+
if (metadata.issuer !== expectedIssuer) {
|
|
515
|
+
throw new MCPClientOAuthError({
|
|
516
|
+
message: `OAuth authorization server metadata issuer ${metadata.issuer} does not match expected issuer ${expectedIssuer}`,
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
498
521
|
export async function discoverAuthorizationServerMetadata(
|
|
499
522
|
authorizationServerUrl: string | URL,
|
|
500
523
|
{
|
|
@@ -509,7 +532,7 @@ export async function discoverAuthorizationServerMetadata(
|
|
|
509
532
|
|
|
510
533
|
const urlsToTry = buildDiscoveryUrls(authorizationServerUrl);
|
|
511
534
|
|
|
512
|
-
for (const { url: endpointUrl, type } of urlsToTry) {
|
|
535
|
+
for (const { url: endpointUrl, type, expectedIssuer } of urlsToTry) {
|
|
513
536
|
const response = await fetchWithCorsRetry(endpointUrl, headers, fetchFn);
|
|
514
537
|
|
|
515
538
|
if (!response) {
|
|
@@ -531,11 +554,14 @@ export async function discoverAuthorizationServerMetadata(
|
|
|
531
554
|
}
|
|
532
555
|
|
|
533
556
|
if (type === 'oauth') {
|
|
534
|
-
|
|
557
|
+
const metadata = OAuthMetadataSchema.parse(await response.json());
|
|
558
|
+
assertMetadataIssuerMatches(metadata, expectedIssuer);
|
|
559
|
+
return metadata;
|
|
535
560
|
} else {
|
|
536
561
|
const metadata = OpenIdProviderDiscoveryMetadataSchema.parse(
|
|
537
562
|
await response.json(),
|
|
538
563
|
);
|
|
564
|
+
assertMetadataIssuerMatches(metadata, expectedIssuer);
|
|
539
565
|
|
|
540
566
|
// MCP spec requires OIDC providers to support S256 PKCE
|
|
541
567
|
if (!metadata.code_challenge_methods_supported?.includes('S256')) {
|