@mcp-ts/sdk 1.3.10 → 1.5.0
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/README.md +20 -27
- package/dist/adapters/agui-adapter.d.mts +16 -0
- package/dist/adapters/agui-adapter.d.ts +16 -0
- package/dist/adapters/agui-adapter.js +185 -0
- package/dist/adapters/agui-adapter.js.map +1 -1
- package/dist/adapters/agui-adapter.mjs +185 -0
- package/dist/adapters/agui-adapter.mjs.map +1 -1
- package/dist/adapters/agui-middleware.d.mts +2 -0
- package/dist/adapters/agui-middleware.d.ts +2 -0
- package/dist/adapters/agui-middleware.js.map +1 -1
- package/dist/adapters/agui-middleware.mjs.map +1 -1
- package/dist/adapters/ai-adapter.d.mts +21 -0
- package/dist/adapters/ai-adapter.d.ts +21 -0
- package/dist/adapters/ai-adapter.js +175 -0
- package/dist/adapters/ai-adapter.js.map +1 -1
- package/dist/adapters/ai-adapter.mjs +175 -0
- package/dist/adapters/ai-adapter.mjs.map +1 -1
- package/dist/adapters/langchain-adapter.d.mts +16 -0
- package/dist/adapters/langchain-adapter.d.ts +16 -0
- package/dist/adapters/langchain-adapter.js +179 -0
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langchain-adapter.mjs +179 -0
- package/dist/adapters/langchain-adapter.mjs.map +1 -1
- package/dist/client/index.d.mts +4 -190
- package/dist/client/index.d.ts +4 -190
- package/dist/client/index.js +218 -54
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +215 -55
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/react.d.mts +31 -17
- package/dist/client/react.d.ts +31 -17
- package/dist/client/react.js +447 -103
- package/dist/client/react.js.map +1 -1
- package/dist/client/react.mjs +443 -105
- package/dist/client/react.mjs.map +1 -1
- package/dist/client/vue.d.mts +5 -4
- package/dist/client/vue.d.ts +5 -4
- package/dist/client/vue.js +239 -63
- package/dist/client/vue.js.map +1 -1
- package/dist/client/vue.mjs +236 -64
- package/dist/client/vue.mjs.map +1 -1
- package/dist/index-DcYfpY3H.d.mts +295 -0
- package/dist/index-GfC_eNEv.d.ts +295 -0
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +1120 -59
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1097 -60
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.d.mts +2 -2
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +18 -5
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +18 -5
- package/dist/server/index.mjs.map +1 -1
- package/dist/shared/index.d.mts +86 -4
- package/dist/shared/index.d.ts +86 -4
- package/dist/shared/index.js +874 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +865 -1
- package/dist/shared/index.mjs.map +1 -1
- package/dist/tool-router-Bo8qZbsD.d.ts +325 -0
- package/dist/tool-router-XnWVxPzv.d.mts +325 -0
- package/dist/{types-CW6lghof.d.mts → types-CfCoIsWI.d.mts} +27 -1
- package/dist/{types-CW6lghof.d.ts → types-CfCoIsWI.d.ts} +27 -1
- package/package.json +15 -12
- package/src/adapters/agui-adapter.ts +79 -0
- package/src/adapters/ai-adapter.ts +75 -0
- package/src/adapters/langchain-adapter.ts +75 -1
- package/src/client/core/app-host.ts +252 -65
- package/src/client/core/constants.ts +30 -0
- package/src/client/index.ts +6 -1
- package/src/client/react/index.ts +3 -0
- package/src/client/react/use-app-host.ts +8 -15
- package/src/client/react/use-mcp-apps.tsx +262 -49
- package/src/client/react/use-mcp.ts +23 -12
- package/src/client/utils/app-host-utils.ts +62 -0
- package/src/client/vue/use-mcp.ts +23 -12
- package/src/server/index.ts +2 -0
- package/src/server/mcp/oauth-client.ts +34 -9
- package/src/shared/index.ts +36 -0
- package/src/shared/meta-tools.ts +387 -0
- package/src/shared/schema-compressor.ts +124 -0
- package/src/shared/tool-index.ts +499 -0
- package/src/shared/tool-router.ts +469 -0
- package/src/shared/types.ts +30 -0
package/dist/client/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/core/sse-client.ts","../../src/client/react/use-mcp.ts","../../src/client/core/app-host.ts","../../src/client/react/use-app-host.ts","../../src/client/react/use-mcp-apps.tsx"],"names":["nanoid","data","useRef","useState","useEffect","useCallback","useMemo","AppBridge","PostMessageTransport","memo","McpAppView","jsx","McpAppRenderer"],"mappings":"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","file":"react.js","sourcesContent":["/**\n * Stateless RPC-over-stream client for MCP connections.\n *\n * Uses single POST requests with `Accept: text/event-stream` for every RPC call.\n * Progress events and the final rpc-response are delivered in the same response.\n */\n\nimport { nanoid } from 'nanoid';\nimport type {\n McpConnectionEvent,\n McpObservabilityEvent,\n McpAppsUIEvent\n} from '../../shared/events.js';\nimport type {\n McpRpcRequest,\n McpRpcResponse,\n McpRpcMethod,\n McpRpcParams,\n ConnectParams,\n SessionListResult,\n ConnectResult,\n DisconnectResult,\n RestoreSessionResult,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n} from '../../shared/types.js';\n\nexport interface SSEClientOptions {\n /** MCP endpoint URL */\n url: string;\n\n /** User/Client identifier */\n identity: string;\n\n /** Optional auth token for authenticated requests */\n authToken?: string;\n\n /** Callback for MCP connection state changes */\n onConnectionEvent?: (event: McpConnectionEvent) => void;\n\n /** Callback for observability/logging events */\n onObservabilityEvent?: (event: McpObservabilityEvent) => void;\n\n /** Callback for connection status changes */\n onStatusChange?: (status: ConnectionStatus) => void;\n\n /** Callback for MCP App UI events */\n onEvent?: (event: McpAppsUIEvent) => void;\n\n /** Enable debug logging @default false */\n debug?: boolean;\n}\n\nexport type ConnectionStatus = 'connecting' | 'connected' | 'disconnected' | 'error';\n\nconst CONNECTION_EVENT_INTERVAL_MS = 300;\n\ninterface ToolUiMetadata {\n resourceUri?: string;\n uri?: string;\n visibility?: string[];\n}\n\nexport class SSEClient {\n private resourceCache = new Map<string, Promise<unknown>>();\n private connected = false;\n\n constructor(private readonly options: SSEClientOptions) {}\n\n connect(): void {\n if (this.connected) {\n return;\n }\n this.connected = true;\n this.options.onStatusChange?.('connected');\n this.log('RPC mode: post_stream');\n }\n\n disconnect(): void {\n this.connected = false;\n this.options.onStatusChange?.('disconnected');\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n async getSessions(): Promise<SessionListResult> {\n return this.sendRequest<SessionListResult>('getSessions');\n }\n\n async connectToServer(params: ConnectParams): Promise<ConnectResult> {\n return this.sendRequest<ConnectResult>('connect', params);\n }\n\n async disconnectFromServer(sessionId: string): Promise<DisconnectResult> {\n return this.sendRequest<DisconnectResult>('disconnect', { sessionId });\n }\n\n async listTools(sessionId: string): Promise<ListToolsRpcResult> {\n return this.sendRequest<ListToolsRpcResult>('listTools', { sessionId });\n }\n\n async callTool(\n sessionId: string,\n toolName: string,\n toolArgs: Record<string, unknown>\n ): Promise<unknown> {\n const result = await this.sendRequest('callTool', { sessionId, toolName, toolArgs });\n this.emitUiEventIfPresent(result, sessionId, toolName);\n return result;\n }\n\n async restoreSession(sessionId: string): Promise<RestoreSessionResult> {\n return this.sendRequest<RestoreSessionResult>('restoreSession', { sessionId });\n }\n\n async finishAuth(sessionId: string, code: string): Promise<FinishAuthResult> {\n return this.sendRequest<FinishAuthResult>('finishAuth', { sessionId, code });\n }\n\n async listPrompts(sessionId: string): Promise<ListPromptsResult> {\n return this.sendRequest<ListPromptsResult>('listPrompts', { sessionId });\n }\n\n async getPrompt(sessionId: string, name: string, args?: Record<string, string>): Promise<unknown> {\n return this.sendRequest('getPrompt', { sessionId, name, args });\n }\n\n async listResources(sessionId: string): Promise<ListResourcesResult> {\n return this.sendRequest<ListResourcesResult>('listResources', { sessionId });\n }\n\n async readResource(sessionId: string, uri: string): Promise<unknown> {\n return this.sendRequest('readResource', { sessionId, uri });\n }\n\n preloadToolUiResources(sessionId: string, tools: Array<{ name: string; _meta?: unknown }>): void {\n for (const tool of tools) {\n const uri = this.extractUiResourceUri(tool);\n if (!uri || this.resourceCache.has(uri)) continue;\n const promise = this.sendRequest('readResource', { sessionId, uri }).catch((err) => {\n this.log(`Failed to preload resource ${uri}: ${err.message}`, 'warn');\n this.resourceCache.delete(uri);\n return null;\n });\n this.resourceCache.set(uri, promise);\n }\n }\n\n getOrFetchResource(sessionId: string, uri: string): Promise<unknown> {\n const cached = this.resourceCache.get(uri);\n if (cached) return cached;\n const promise = this.sendRequest('readResource', { sessionId, uri });\n this.resourceCache.set(uri, promise);\n return promise;\n }\n\n hasPreloadedResource(uri: string): boolean {\n return this.resourceCache.has(uri);\n }\n\n clearResourceCache(): void {\n this.resourceCache.clear();\n }\n\n private async sendRequest<T = unknown>(method: McpRpcMethod, params?: McpRpcParams): Promise<T> {\n if (!this.connected) {\n this.connect();\n }\n\n this.log(`RPC request via post_stream: ${method}`);\n\n const request: McpRpcRequest = {\n id: `rpc_${nanoid(10)}`,\n method,\n params,\n };\n\n const response = await fetch(this.buildUrl(), {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const contentType = (response.headers.get('content-type') || '').toLowerCase();\n if (!contentType.includes('text/event-stream')) {\n const data = await response.json() as McpRpcResponse;\n return this.parseRpcResponse<T>(data);\n }\n\n const data = await this.readRpcResponseFromStream(response, {\n delayConnectionEvents:\n method === 'connect' ||\n method === 'restoreSession' ||\n method === 'finishAuth',\n });\n return this.parseRpcResponse<T>(data);\n }\n\n private async readRpcResponseFromStream(\n response: Response,\n options: { delayConnectionEvents?: boolean } = {}\n ): Promise<McpRpcResponse> {\n if (!response.body) {\n throw new Error('Streaming response body is missing');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let rpcResponse: McpRpcResponse | null = null;\n\n const dispatchBlock = async (block: string) => {\n const lines = block.split('\\n');\n let eventName = 'message';\n const dataLines: string[] = [];\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\r$/, '');\n if (!line || line.startsWith(':')) continue;\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim();\n continue;\n }\n if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n\n if (!dataLines.length) return;\n const payloadText = dataLines.join('\\n');\n let payload: unknown = payloadText;\n try {\n payload = JSON.parse(payloadText);\n } catch {\n // Keep raw text\n }\n\n switch (eventName) {\n case 'connected':\n this.options.onStatusChange?.('connected');\n break;\n case 'connection':\n this.options.onConnectionEvent?.(payload as McpConnectionEvent);\n if (options.delayConnectionEvents) {\n await this.sleep(CONNECTION_EVENT_INTERVAL_MS);\n }\n break;\n case 'observability':\n this.options.onObservabilityEvent?.(payload as McpObservabilityEvent);\n break;\n case 'rpc-response':\n rpcResponse = payload as McpRpcResponse;\n break;\n default:\n break;\n }\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let separatorMatch = buffer.match(/\\r?\\n\\r?\\n/);\n while (separatorMatch && separatorMatch.index !== undefined) {\n const separatorIndex = separatorMatch.index;\n const separatorLength = separatorMatch[0].length;\n const block = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + separatorLength);\n await dispatchBlock(block);\n separatorMatch = buffer.match(/\\r?\\n\\r?\\n/);\n }\n }\n\n if (buffer.trim()) {\n await dispatchBlock(buffer);\n }\n\n if (!rpcResponse) {\n throw new Error('Missing rpc-response event in streamed RPC result');\n }\n\n return rpcResponse;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private parseRpcResponse<T>(data: McpRpcResponse): T {\n if ('result' in data) {\n return data.result as T;\n }\n if ('error' in data && data.error) {\n throw new Error(data.error.message || 'Unknown RPC error');\n }\n // JSON omits `result` when it is `undefined` (response becomes `{ id: ... }`).\n // Treat that shape as a successful void result.\n if (data && typeof data === 'object' && 'id' in data) {\n return undefined as T;\n }\n throw new Error('Invalid RPC response format');\n }\n\n private buildUrl(): string {\n const url = new URL(this.options.url, globalThis.location?.origin);\n url.searchParams.set('identity', this.options.identity);\n if (this.options.authToken) {\n url.searchParams.set('token', this.options.authToken);\n }\n return url.toString();\n }\n\n private buildHeaders(): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n };\n if (this.options.authToken) {\n headers['Authorization'] = `Bearer ${this.options.authToken}`;\n }\n return headers;\n }\n\n private extractUiResourceUri(tool: { name: string; _meta?: unknown }): string | undefined {\n const meta = (tool._meta as { ui?: ToolUiMetadata })?.ui;\n if (!meta || typeof meta !== 'object') return undefined;\n if (meta.visibility && !meta.visibility.includes('app')) return undefined;\n return meta.resourceUri ?? meta.uri;\n }\n\n private emitUiEventIfPresent(result: unknown, sessionId: string, toolName: string): void {\n const meta = (result as { _meta?: { ui?: ToolUiMetadata } })?._meta;\n const resourceUri = meta?.ui?.resourceUri ?? (meta as any)?.['ui/resourceUri'];\n\n if (resourceUri) {\n this.options.onEvent?.({\n type: 'mcp-apps-ui',\n sessionId,\n resourceUri,\n toolName,\n result,\n timestamp: Date.now(),\n });\n }\n }\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.options.debug && level === 'info') return;\n\n const prefix = '[SSEClient]';\n switch (level) {\n case 'warn':\n console.warn(prefix, message);\n break;\n case 'error':\n console.error(prefix, message);\n break;\n default:\n console.log(prefix, message);\n }\n }\n}\n","/**\n * useMcp React Hook\n * Manages MCP connections with SSE-based real-time updates\n * Based on Cloudflare's agents pattern\n */\n\nimport { useEffect, useRef, useState, useCallback, useMemo } from 'react';\nimport { SSEClient, type SSEClientOptions } from '../core/sse-client';\nimport type { McpConnectionEvent, McpConnectionState } from '../../shared/events';\nimport type {\n ToolInfo,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n SessionInfo,\n} from '../../shared/types';\n\nexport interface UseMcpOptions {\n /**\n * SSE endpoint URL\n */\n url: string;\n\n /**\n * User/Client identifier\n */\n identity: string;\n\n /**\n * Optional auth token\n */\n authToken?: string;\n\n /**\n * Auto-connect on mount\n * @default true\n */\n autoConnect?: boolean;\n\n /**\n * Auto-initialize sessions on mount\n * @default true\n */\n autoInitialize?: boolean;\n\n /**\n * Connection event callback\n */\n onConnectionEvent?: (event: McpConnectionEvent) => void;\n\n /**\n * Debug logging callback\n */\n onLog?: (level: string, message: string, metadata?: Record<string, unknown>) => void;\n /**\n * Optional callback to handle OAuth redirects (e.g. for popup flow)\n * If provided, this will be called instead of window.location.href assignment\n */\n onRedirect?: (url: string) => void;\n\n /**\n * Request timeout in milliseconds\n * @default 60000\n */\n requestTimeout?: number;\n\n /**\n * Enable client debug logs.\n * @default false\n */\n debug?: boolean;\n\n}\n\nexport interface McpConnection {\n sessionId: string;\n serverId: string;\n serverName: string;\n serverUrl?: string;\n transport?: string;\n state: McpConnectionState;\n tools: ToolInfo[];\n authUrl?: string;\n error?: string;\n createdAt?: Date;\n}\n\nexport interface McpClient {\n /**\n * All connections\n */\n connections: McpConnection[];\n\n /**\n * SSE connection status\n */\n status: 'connecting' | 'connected' | 'disconnected' | 'error';\n\n /**\n * Whether initializing\n */\n isInitializing: boolean;\n\n /**\n * Connect to an MCP server\n */\n connect: (params: {\n serverId: string;\n serverName: string;\n serverUrl: string;\n callbackUrl: string;\n transportType?: 'sse' | 'streamable_http';\n }) => Promise<string>;\n\n /**\n * Disconnect from an MCP server\n */\n disconnect: (sessionId: string) => Promise<void>;\n\n /**\n * Get connection by session ID\n */\n getConnection: (sessionId: string) => McpConnection | undefined;\n\n /**\n * Get connection by server ID\n */\n getConnectionByServerId: (serverId: string) => McpConnection | undefined;\n\n /**\n * Check if server is connected\n */\n isServerConnected: (serverId: string) => boolean;\n\n /**\n * Get tools for a session\n */\n getTools: (sessionId: string) => ToolInfo[];\n\n /**\n * Refresh all connections\n */\n refresh: () => Promise<void>;\n\n /**\n * Manually connect SSE\n */\n connectSSE: () => void;\n\n /**\n * Manually disconnect SSE\n */\n disconnectSSE: () => void;\n\n /**\n * Complete OAuth authorization\n */\n finishAuth: (sessionId: string, code: string) => Promise<FinishAuthResult>;\n\n /**\n * Explicitly resume OAuth flow for an existing session\n */\n resumeAuth: (sessionId: string) => Promise<void>;\n\n /**\n * Call a tool from a session\n */\n callTool: (\n sessionId: string,\n toolName: string,\n toolArgs: Record<string, unknown>\n ) => Promise<unknown>;\n\n /**\n * List available tools for a session\n */\n listTools: (sessionId: string) => Promise<ListToolsRpcResult>;\n\n /**\n * List available prompts for a session\n */\n listPrompts: (sessionId: string) => Promise<ListPromptsResult>;\n\n /**\n * Get a specific prompt with arguments\n */\n getPrompt: (sessionId: string, name: string, args?: Record<string, string>) => Promise<unknown>;\n\n /**\n * List available resources for a session\n */\n listResources: (sessionId: string) => Promise<ListResourcesResult>;\n\n /**\n * Read a specific resource\n */\n readResource: (sessionId: string, uri: string) => Promise<unknown>;\n\n /**\n * Access the underlying SSEClient instance (for advanced usage like AppHost)\n */\n sseClient: SSEClient | null;\n}\n\n/**\n * React hook for MCP connection management with SSE\n */\nexport function useMcp(options: UseMcpOptions): McpClient {\n const {\n url,\n identity,\n authToken,\n autoConnect = true,\n autoInitialize = true,\n onConnectionEvent,\n onLog,\n onRedirect,\n } = options;\n\n const clientRef = useRef<SSEClient | null>(null);\n const isMountedRef = useRef(true);\n const suppressAuthRedirectSessionsRef = useRef<Set<string>>(new Set());\n\n const [connections, setConnections] = useState<McpConnection[]>([]);\n const [status, setStatus] = useState<'connecting' | 'connected' | 'disconnected' | 'error'>(\n 'disconnected'\n );\n const [isInitializing, setIsInitializing] = useState(false);\n /** Mirrored from `clientRef` so the public `McpClient` object can be memoized when the instance is ready. */\n const [sseClient, setSseClient] = useState<SSEClient | null>(null);\n\n /**\n * Initialize SSE client\n */\n useEffect(() => {\n isMountedRef.current = true;\n\n const clientOptions: SSEClientOptions = {\n url,\n identity,\n authToken,\n onConnectionEvent: (event) => {\n // Update local state based on event\n updateConnectionsFromEvent(event);\n\n // Call user callback\n onConnectionEvent?.(event);\n },\n onObservabilityEvent: (event) => {\n onLog?.(event.level || 'info', event.message || event.displayMessage || 'No message', event.metadata);\n },\n onStatusChange: (newStatus) => {\n if (isMountedRef.current) {\n setStatus(newStatus);\n }\n },\n debug: options.debug,\n };\n\n const client = new SSEClient(clientOptions);\n clientRef.current = client;\n setSseClient(client);\n\n if (autoConnect) {\n client.connect();\n\n if (autoInitialize) {\n loadSessions();\n }\n }\n\n return () => {\n isMountedRef.current = false;\n client.disconnect();\n };\n }, [url, identity, authToken, autoConnect, autoInitialize]);\n\n /**\n * Update connections based on event\n */\n const updateConnectionsFromEvent = useCallback((event: McpConnectionEvent) => {\n if (!isMountedRef.current) return;\n\n const isTransientReconnectState = (state: McpConnectionState): boolean =>\n state === 'INITIALIZING' ||\n state === 'VALIDATING' ||\n state === 'RECONNECTING' ||\n state === 'CONNECTING' ||\n state === 'CONNECTED' ||\n state === 'DISCOVERING';\n\n setConnections((prev: McpConnection[]) => {\n switch (event.type) {\n case 'state_changed': {\n const existing = prev.find((c: McpConnection) => c.sessionId === event.sessionId);\n if (existing) {\n // In stateless per-request transport, tool calls can emit transient reconnect states.\n // Keep READY sticky to avoid UI flicker from READY -> CONNECTING -> CONNECTED.\n const nextState =\n existing.state === 'READY' && isTransientReconnectState(event.state)\n ? existing.state\n : event.state;\n\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId ? {\n ...c,\n state: nextState,\n // update createdAt if present in event, otherwise keep existing\n createdAt: event.createdAt ? new Date(event.createdAt) : c.createdAt\n } : c\n );\n } else {\n // Fix: Don't add back disconnected sessions that were just removed\n if (event.state === 'DISCONNECTED') {\n return prev;\n }\n\n return [\n ...prev,\n {\n sessionId: event.sessionId,\n serverId: event.serverId,\n serverName: event.serverName,\n serverUrl: event.serverUrl,\n state: event.state,\n createdAt: event.createdAt ? new Date(event.createdAt) : undefined,\n tools: [],\n },\n ];\n }\n }\n\n case 'tools_discovered': {\n // Preload UI resources for instant loading when tools are discovered\n if (clientRef.current && event.tools?.length) {\n clientRef.current.preloadToolUiResources(event.sessionId, event.tools);\n }\n\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId ? { ...c, tools: event.tools, state: 'READY' } : c\n );\n }\n\n case 'auth_required': {\n // Handle OAuth redirect\n if (event.authUrl) {\n onLog?.('info', `OAuth required - redirecting to ${event.authUrl}`, { authUrl: event.authUrl });\n\n // Suppress redirects/popups for auto-restore on page load.\n if (!suppressAuthRedirectSessionsRef.current.has(event.sessionId)) {\n if (onRedirect) {\n onRedirect(event.authUrl);\n } else if (typeof window !== 'undefined') {\n window.location.href = event.authUrl;\n }\n }\n }\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId ? { ...c, state: 'AUTHENTICATING', authUrl: event.authUrl } : c\n );\n }\n\n case 'error': {\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId ? { ...c, state: 'FAILED', error: event.error } : c\n );\n }\n\n case 'disconnected': {\n return prev.filter((c: McpConnection) => c.sessionId !== event.sessionId);\n }\n\n default:\n return prev;\n }\n });\n }, [onLog, onRedirect]);\n\n /**\n * Load sessions from server\n */\n const loadSessions = useCallback(async () => {\n if (!clientRef.current) return;\n\n try {\n setIsInitializing(true);\n\n const result = await clientRef.current.getSessions();\n const sessions = result.sessions || [];\n\n // Initialize connections\n if (isMountedRef.current) {\n setConnections(\n sessions.map((s: SessionInfo) => ({\n sessionId: s.sessionId,\n serverId: s.serverId ?? 'unknown',\n serverName: s.serverName ?? 'Unknown Server',\n serverUrl: s.serverUrl,\n transport: s.transport,\n state: (s.active === false ? 'AUTHENTICATING' : 'VALIDATING') as McpConnectionState,\n createdAt: new Date(s.createdAt),\n tools: [],\n }))\n );\n }\n\n // Validate each session in parallel\n await Promise.all(\n sessions.map(async (session: SessionInfo) => {\n if (clientRef.current) {\n try {\n // Pending auth sessions should not auto-trigger popup/redirect on reload.\n if (session.active === false) {\n return;\n }\n suppressAuthRedirectSessionsRef.current.add(session.sessionId);\n await clientRef.current.restoreSession(session.sessionId);\n } catch (error) {\n console.error(`[useMcp] Failed to validate session ${session.sessionId}:`, error);\n } finally {\n suppressAuthRedirectSessionsRef.current.delete(session.sessionId);\n }\n }\n })\n );\n } catch (error) {\n console.error('[useMcp] Failed to load sessions:', error);\n onLog?.('error', 'Failed to load sessions', { error });\n } finally {\n if (isMountedRef.current) {\n setIsInitializing(false);\n }\n }\n }, [onLog]);\n\n /**\n * Connect to an MCP server\n */\n const connect = useCallback(\n async (params: {\n serverId: string;\n serverName: string;\n serverUrl: string;\n callbackUrl: string;\n transportType?: 'sse' | 'streamable_http';\n }): Promise<string> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n const result = await clientRef.current.connectToServer(params);\n return result.sessionId;\n },\n []\n );\n\n /**\n * Disconnect from an MCP server\n */\n const disconnect = useCallback(async (sessionId: string): Promise<void> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n await clientRef.current.disconnectFromServer(sessionId);\n\n // Remove from local state\n if (isMountedRef.current) {\n setConnections((prev: McpConnection[]) => prev.filter((c: McpConnection) => c.sessionId !== sessionId));\n }\n }, []);\n\n /**\n * Refresh all connections\n */\n const refresh = useCallback(async () => {\n await loadSessions();\n }, [loadSessions]);\n\n /**\n * Manually connect SSE\n */\n const connectSSE = useCallback(() => {\n clientRef.current?.connect();\n }, []);\n\n /**\n * Manually disconnect SSE\n */\n const disconnectSSE = useCallback(() => {\n clientRef.current?.disconnect();\n }, []);\n\n /**\n * Complete OAuth authorization\n */\n const finishAuth = useCallback(async (sessionId: string, code: string): Promise<FinishAuthResult> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.finishAuth(sessionId, code);\n }, []);\n\n /**\n * Explicit user action to resume OAuth for an existing pending session.\n */\n const resumeAuth = useCallback(async (sessionId: string): Promise<void> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n // Ensure this attempt is not suppressed as background restore.\n suppressAuthRedirectSessionsRef.current.delete(sessionId);\n await clientRef.current.restoreSession(sessionId);\n }, []);\n\n /**\n * Call a tool\n */\n const callTool = useCallback(\n async (\n sessionId: string,\n toolName: string,\n toolArgs: Record<string, unknown>\n ): Promise<unknown> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.callTool(sessionId, toolName, toolArgs);\n },\n []\n );\n\n /**\n * List tools (refresh tool list)\n */\n const listTools = useCallback(async (sessionId: string): Promise<ListToolsRpcResult> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.listTools(sessionId);\n }, []);\n\n /**\n * List prompts\n */\n const listPrompts = useCallback(async (sessionId: string): Promise<ListPromptsResult> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.listPrompts(sessionId);\n }, []);\n\n /**\n * Get a specific prompt\n */\n const getPrompt = useCallback(\n async (sessionId: string, name: string, args?: Record<string, string>): Promise<unknown> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.getPrompt(sessionId, name, args);\n },\n []\n );\n\n /**\n * List resources\n */\n const listResources = useCallback(async (sessionId: string): Promise<ListResourcesResult> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.listResources(sessionId);\n }, []);\n\n /**\n * Read a specific resource\n */\n const readResource = useCallback(async (sessionId: string, uri: string): Promise<unknown> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.readResource(sessionId, uri);\n }, []);\n\n // Utility functions\n const getConnection = useCallback(\n (sessionId: string) => connections.find((c: McpConnection) => c.sessionId === sessionId),\n [connections]\n );\n\n const getConnectionByServerId = useCallback(\n (serverId: string) => connections.find((c: McpConnection) => c.serverId === serverId),\n [connections]\n );\n\n const isServerConnected = useCallback(\n (serverId: string) => {\n const conn = getConnectionByServerId(serverId);\n return conn ? conn.state === 'CONNECTED' || conn.state === 'DISCOVERING' || conn.state === 'READY' : false;\n },\n [getConnectionByServerId]\n );\n\n const getTools = useCallback(\n (sessionId: string) => {\n const conn = getConnection(sessionId);\n return conn?.tools || [];\n },\n [getConnection]\n );\n\n return useMemo(\n () => ({\n connections,\n status,\n isInitializing,\n connect,\n disconnect,\n getConnection,\n getConnectionByServerId,\n isServerConnected,\n getTools,\n refresh,\n connectSSE,\n disconnectSSE,\n finishAuth,\n resumeAuth,\n callTool,\n listTools,\n listPrompts,\n getPrompt,\n listResources,\n readResource,\n sseClient,\n }),\n [\n connections,\n status,\n isInitializing,\n connect,\n disconnect,\n getConnection,\n getConnectionByServerId,\n isServerConnected,\n getTools,\n refresh,\n connectSSE,\n disconnectSSE,\n finishAuth,\n resumeAuth,\n callTool,\n listTools,\n listPrompts,\n getPrompt,\n listResources,\n readResource,\n sseClient,\n ]\n );\n}\n","/**\n * MCP App Host\n *\n * Bridges the gap between an iframe (MCP App) and the SSEClient (MCP Server).\n * Handles secure iframe sandboxing, resource loading, and bi-directional\n * communication via the AppBridge protocol.\n *\n * Key features:\n * - Secure iframe sandboxing with minimal permissions\n * - Resource preloading for instant MCP App UI loading\n * - Cache-aware resource fetching (SSEClient cache → local cache → direct fetch)\n * - Support for ui:// and mcp-app:// resource URIs\n */\n\nimport { AppBridge, PostMessageTransport } from '@modelcontextprotocol/ext-apps/app-bridge';\nimport type { AppHostClient } from './types';\n\n// ============================================\n// Types & Interfaces\n// ============================================\n\nexport interface AppHostOptions {\n /** Enable debug logging @default false */\n debug?: boolean;\n}\n\nexport interface AppMessageParams {\n role: string;\n content: unknown;\n}\n\ninterface ToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\ninterface ResourceContent {\n blob?: string;\n text?: string;\n}\n\ninterface ResourceResponse {\n contents: ResourceContent[];\n}\n\n// ============================================\n// Constants\n// ============================================\n\nconst HOST_INFO = { name: 'mcp-ts-host', version: '1.0.0' };\n\n/** Sandbox permissions - minimal set required for MCP Apps to function */\nconst SANDBOX_PERMISSIONS = [\n 'allow-scripts', // Required for app JavaScript execution\n 'allow-forms', // Required for form submissions\n 'allow-same-origin', // Required for Blob URL correctness\n 'allow-modals', // Required for dialogs/alerts\n 'allow-popups', // Required for opening links\n 'allow-downloads' // Required for file downloads\n].join(' ');\n\n/** Supported MCP App URI schemes */\nconst MCP_URI_SCHEMES = ['ui://', 'mcp-app://'] as const;\n\n// ============================================\n// AppHost Class\n// ============================================\n\n/**\n * Host for MCP Apps embedded in iframes.\n * Manages secure communication between the app and the MCP server.\n */\nexport class AppHost {\n private bridge: AppBridge;\n private sessionId?: string;\n private resourceCache = new Map<string, Promise<ResourceResponse | null>>();\n private debug: boolean;\n\n /** Callback for app messages (e.g., chat messages from the app) */\n public onAppMessage?: (params: AppMessageParams) => void;\n\n constructor(\n private readonly client: AppHostClient,\n private readonly iframe: HTMLIFrameElement,\n options?: AppHostOptions\n ) {\n this.debug = options?.debug ?? false;\n this.configureSandbox();\n this.bridge = this.initializeBridge();\n }\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Start the host. This prepares the bridge handlers but doesn't connect yet.\n * The actual connection happens in launch() after HTML is loaded.\n * @returns Promise that resolves immediately (bridge connects during launch)\n */\n async start(): Promise<void> {\n // Bridge handlers are already registered in constructor.\n // Connection happens in launch() after HTML is loaded.\n this.log('Host started, ready to launch');\n }\n\n /**\n * Preload UI resources to enable instant app loading.\n * Call this when tools are discovered to cache their UI resources.\n */\n preload(tools: Array<{ _meta?: unknown }>): void {\n for (const tool of tools) {\n const uri = this.extractUiResourceUri(tool);\n if (!uri || this.resourceCache.has(uri)) continue;\n\n const promise = this.preloadResource(uri);\n this.resourceCache.set(uri, promise);\n }\n }\n\n /**\n * Launch an MCP App from a URL or MCP resource URI.\n * Loads the HTML first, then establishes bridge connection.\n */\n async launch(url: string, sessionId?: string): Promise<void> {\n if (sessionId) this.sessionId = sessionId;\n\n // Set up initialization promise BEFORE connecting\n const initializedPromise = this.onAppReady();\n\n // Load HTML into iframe first\n if (this.isMcpUri(url)) {\n await this.launchMcpApp(url);\n } else {\n this.iframe.src = url;\n }\n\n // Wait for iframe to load before connecting bridge\n await this.onIframeReady();\n\n // Connect the bridge (HTML is loaded, contentWindow is ready)\n await this.connectBridge();\n\n // Wait for app to signal it's initialized (with timeout)\n this.log('Waiting for app initialization');\n await Promise.race([\n initializedPromise,\n new Promise<void>((resolve) => setTimeout(() => {\n this.log('Initialization timeout - continuing anyway', 'warn');\n resolve();\n }, 3000))\n ]);\n this.log('App launched and ready');\n }\n\n /**\n * Wait for app to signal initialization complete\n */\n private onAppReady(): Promise<void> {\n return new Promise<void>((resolve) => {\n const originalHandler = this.bridge.oninitialized;\n this.bridge.oninitialized = (...args) => {\n this.log('App initialized');\n resolve();\n this.bridge.oninitialized = originalHandler;\n originalHandler?.(...args);\n };\n });\n }\n\n /**\n * Wait for iframe to finish loading\n */\n private onIframeReady(): Promise<void> {\n return new Promise((resolve) => {\n if (this.iframe.contentDocument?.readyState === 'complete') {\n resolve();\n return;\n }\n this.iframe.addEventListener('load', () => resolve(), { once: true });\n });\n }\n\n /**\n * Send tool input arguments to the MCP App.\n * Call this after launch() when tool input is available.\n */\n sendToolInput(args: Record<string, unknown>): void {\n this.log('Sending tool input to app');\n this.bridge.sendToolInput({ arguments: args });\n }\n\n /**\n * Send tool result to the MCP App.\n * Call this when the tool call completes.\n */\n sendToolResult(result: unknown): void {\n this.log('Sending tool result to app');\n this.bridge.sendToolResult(result as any);\n }\n\n /**\n * Send tool cancellation to the MCP App.\n * Call this when the tool call is cancelled or fails.\n */\n sendToolCancelled(reason: string): void {\n this.log('Sending tool cancellation to app');\n this.bridge.sendToolCancelled({ reason });\n }\n\n // ============================================\n // Private: Initialization\n // ============================================\n\n private configureSandbox(): void {\n if (this.iframe.sandbox.value !== SANDBOX_PERMISSIONS) {\n this.iframe.sandbox.value = SANDBOX_PERMISSIONS;\n }\n }\n\n private initializeBridge(): AppBridge {\n const bridge = new AppBridge(\n null,\n HOST_INFO,\n {\n openLinks: {},\n serverTools: {},\n logging: {},\n // Declare support for model context updates\n updateModelContext: { text: {} },\n },\n {\n // Initial host context\n hostContext: {\n theme: 'dark',\n platform: 'web',\n containerDimensions: { maxHeight: 6000 },\n displayMode: 'inline',\n availableDisplayModes: ['inline', 'fullscreen'],\n },\n }\n );\n\n // Register handlers - must be done BEFORE connect()\n bridge.oncalltool = (params) => this.handleToolCall(params);\n bridge.onopenlink = this.handleOpenLink.bind(this);\n bridge.onmessage = this.handleMessage.bind(this);\n bridge.onloggingmessage = (params) => this.log(`App log [${params.level}]: ${params.data}`);\n bridge.onupdatemodelcontext = async () => ({});\n bridge.onsizechange = async ({ width, height }) => {\n if (height !== undefined) this.iframe.style.height = `${height}px`;\n if (width !== undefined) this.iframe.style.minWidth = `min(${width}px, 100%)`;\n return {};\n };\n bridge.onrequestdisplaymode = async (params) => ({\n mode: params.mode === 'fullscreen' ? 'fullscreen' : 'inline'\n });\n\n return bridge;\n }\n\n private async connectBridge(): Promise<void> {\n this.log('Connecting bridge to iframe');\n\n const transport = new PostMessageTransport(\n this.iframe.contentWindow!,\n this.iframe.contentWindow!\n );\n\n try {\n await this.bridge.connect(transport);\n this.log('Bridge connected successfully');\n } catch (error) {\n this.log('Bridge connection failed', 'error');\n throw error;\n }\n }\n\n // ============================================\n // Private: Bridge Event Handlers\n // ============================================\n\n private async handleToolCall(params: ToolCallParams) {\n if (!this.client.isConnected()) {\n throw new Error('Client disconnected');\n }\n\n const sessionId = await this.getSessionId();\n if (!sessionId) {\n throw new Error('No active session');\n }\n\n const result = await this.client.callTool(\n sessionId,\n params.name,\n params.arguments ?? {}\n );\n return result as any;\n }\n\n private async handleOpenLink(params: { url: string }): Promise<Record<string, never>> {\n window.open(params.url, '_blank', 'noopener,noreferrer');\n return {};\n }\n\n private async handleMessage(params: AppMessageParams): Promise<Record<string, never>> {\n this.onAppMessage?.(params);\n return {};\n }\n\n // ============================================\n // Private: Resource Loading\n // ============================================\n\n private async launchMcpApp(uri: string): Promise<void> {\n if (!this.client.isConnected()) {\n throw new Error('Client must be connected');\n }\n\n const sessionId = await this.getSessionId();\n if (!sessionId) {\n throw new Error('No active session');\n }\n\n // Fetch resource using cache hierarchy: SSEClient cache → local cache → direct fetch\n const response = await this.fetchResourceWithCache(sessionId, uri);\n if (!response?.contents?.length) {\n throw new Error(`Empty resource: ${uri}`);\n }\n\n const content = response.contents[0];\n const html = this.decodeContent(content);\n if (!html) {\n throw new Error(`Invalid content in resource: ${uri}`);\n }\n\n // Render via Blob URL for clean isolation\n const blob = new Blob([html], { type: 'text/html' });\n this.iframe.src = URL.createObjectURL(blob);\n }\n\n private async fetchResourceWithCache(sessionId: string, uri: string): Promise<ResourceResponse> {\n // Priority 1: SSEClient's built-in cache (best performance)\n if (this.hasClientCache()) {\n return (this.client as any).getOrFetchResource(sessionId, uri);\n }\n\n // Priority 2: Local preload cache\n const cached = this.resourceCache.get(uri);\n if (cached) {\n const result = await cached;\n if (result) return result;\n }\n\n // Priority 3: Direct fetch\n return this.client.readResource(sessionId, uri) as Promise<ResourceResponse>;\n }\n\n private async preloadResource(uri: string): Promise<ResourceResponse | null> {\n try {\n const sessionId = await this.getSessionId();\n if (!sessionId) return null;\n return await this.client.readResource(sessionId, uri) as ResourceResponse;\n } catch (error) {\n this.log(`Preload failed for ${uri}`, 'warn');\n return null;\n }\n }\n\n // ============================================\n // Private: Utilities\n // ============================================\n\n private async getSessionId(): Promise<string | undefined> {\n if (this.sessionId) return this.sessionId;\n const result = await this.client.getSessions();\n return result.sessions?.[0]?.sessionId;\n }\n\n private isMcpUri(url: string): boolean {\n return MCP_URI_SCHEMES.some(scheme => url.startsWith(scheme));\n }\n\n private hasClientCache(): boolean {\n return 'getOrFetchResource' in this.client &&\n typeof (this.client as any).getOrFetchResource === 'function';\n }\n\n private extractUiResourceUri(tool: { _meta?: unknown }): string | undefined {\n const meta = tool._meta as { ui?: { resourceUri?: string; uri?: string } } | undefined;\n if (!meta?.ui) return undefined;\n return meta.ui.resourceUri ?? meta.ui.uri;\n }\n\n private decodeContent(content: ResourceContent): string | undefined {\n if (content.blob) {\n return atob(content.blob);\n }\n return content.text;\n }\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.debug && level === 'info') return;\n\n const prefix = '[AppHost]';\n switch (level) {\n case 'warn':\n console.warn(prefix, message);\n break;\n case 'error':\n console.error(prefix, message);\n break;\n default:\n console.log(prefix, message);\n }\n }\n}\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport type { SSEClient } from '../core/sse-client';\nimport { AppHost } from '../core/app-host';\n\n/**\n * Hook to host an MCP App in a React component\n *\n * Initialization is async but optimized for instant availability:\n * - Constructor runs synchronously (sandbox + bridge handler setup)\n * - Host is set in state immediately so launch() can be called right away\n * - start() is a lightweight no-op reserved for future async pre-init work\n * - The real async work (iframe load, bridge connect) happens inside launch()\n *\n * @param client - Connected SSEClient instance\n * @param iframeRef - Reference to the iframe element\n * @param options - Optional configuration\n * @returns Object containing the AppHost instance (or null) and error state\n */\nexport function useAppHost(\n client: SSEClient,\n iframeRef: React.RefObject<HTMLIFrameElement>,\n options?: {\n /** Callback when the App sends a message (e.g. to chat) */\n onMessage?: (params: { role: string; content: unknown }) => void;\n }\n) {\n const [host, setHost] = useState<AppHost | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const initializingRef = useRef(false);\n\n // Store latest callback in ref to avoid re-initializing AppHost on callback change\n const onMessageRef = useRef(options?.onMessage);\n useEffect(() => {\n onMessageRef.current = options?.onMessage;\n }, [options?.onMessage]);\n\n useEffect(() => {\n if (!client || !iframeRef.current || initializingRef.current) return;\n\n // Prevent double initialization in strict mode\n initializingRef.current = true;\n\n const initHost = async () => {\n try {\n // Initialize AppHost with security enforcement\n const appHost = new AppHost(client, iframeRef.current!);\n\n // Register message handler\n appHost.onAppMessage = (params) => {\n onMessageRef.current?.(params);\n };\n\n // Set host immediately so launch can be called\n // (launch will wait for bridge if needed)\n setHost(appHost);\n\n // Start bridge connection (this is fast, just sets up PostMessage)\n await appHost.start();\n } catch (err) {\n console.error('[useAppHost] Failed to initialize AppHost:', err);\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n initHost();\n\n return () => {\n initializingRef.current = false;\n setHost(null);\n };\n }, [client, iframeRef]);\n\n return { host, error };\n}\n","/**\n * MCP Apps Hook\n *\n * Provides utilities for rendering interactive UI components from MCP servers.\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n memo,\n useMemo,\n type MutableRefObject,\n} from 'react';\nimport { useAppHost } from './use-app-host.js';\nimport type { SSEClient } from '../core/sse-client.js';\n\nexport interface McpClient {\n connections: Array<{\n sessionId: string;\n tools: Array<{\n name: string;\n mcpApp?: {\n resourceUri: string;\n };\n _meta?: {\n ui?: {\n resourceUri?: string;\n };\n 'ui/resourceUri'?: string;\n };\n }>;\n }>;\n sseClient?: SSEClient | null;\n}\n\nexport interface McpAppMetadata {\n toolName: string;\n resourceUri: string;\n sessionId: string;\n}\n\n/** Props for {@link useMcpApps}'s `McpAppRenderer` (client is supplied via the hook). */\nexport interface McpAppRendererProps {\n name: string;\n input?: Record<string, unknown>;\n result?: unknown;\n status: 'executing' | 'inProgress' | 'complete' | 'idle';\n /** Custom CSS class for the container */\n className?: string;\n}\n\ntype McpAppViewProps = McpAppRendererProps & {\n /**\n * Ref avoids tying `McpAppRenderer` identity to `mcpClient`: when `connections` updates, `useMcp()` still\n * returns a new object (correct for `useEffect` deps), but the iframe must not remount.\n */\n clientRef: MutableRefObject<McpClient | null>;\n};\n\n/** Renders one MCP App in a sandboxed iframe; reads the latest client from `clientRef` each render. */\nconst McpAppView = memo(function McpAppView({\n clientRef,\n name,\n input,\n result,\n status,\n className,\n}: McpAppViewProps) {\n const mcpClient = clientRef.current;\n const metadata = getMcpAppMetadata(mcpClient, name);\n const sseClient = mcpClient?.sseClient ?? null;\n const resourceUri = metadata?.resourceUri;\n const appSessionId = metadata?.sessionId;\n\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const { host, error: hostError } = useAppHost(sseClient as SSEClient, iframeRef);\n const [isLaunched, setIsLaunched] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const sentInputRef = useRef(false);\n const sentResultRef = useRef(false);\n const lastInputRef = useRef(input);\n const lastResultRef = useRef(result);\n const lastStatusRef = useRef(status);\n\n useEffect(() => {\n setIsLaunched(false);\n setError(null);\n }, [resourceUri, appSessionId]);\n\n useEffect(() => {\n if (!host || !resourceUri || !appSessionId) return;\n\n host\n .launch(resourceUri, appSessionId)\n .then(() => setIsLaunched(true))\n .catch((err) => setError(err instanceof Error ? err : new Error(String(err))));\n }, [host, resourceUri, appSessionId]);\n\n useEffect(() => {\n if (!host || !isLaunched || !resourceUri || !appSessionId || !input) return;\n\n if (!sentInputRef.current || JSON.stringify(input) !== JSON.stringify(lastInputRef.current)) {\n sentInputRef.current = true;\n lastInputRef.current = input;\n host.sendToolInput(input);\n }\n }, [host, isLaunched, input, resourceUri, appSessionId, name]);\n\n useEffect(() => {\n if (!host || !isLaunched || !resourceUri || !appSessionId || result === undefined) return;\n if (status !== 'complete') return;\n\n if (!sentResultRef.current || JSON.stringify(result) !== JSON.stringify(lastResultRef.current)) {\n sentResultRef.current = true;\n lastResultRef.current = result;\n const formattedResult =\n typeof result === 'string'\n ? { content: [{ type: 'text', text: result }] }\n : result;\n host.sendToolResult(formattedResult);\n }\n }, [host, isLaunched, result, status, resourceUri, appSessionId, name]);\n\n useEffect(() => {\n if (status === 'executing' && lastStatusRef.current !== 'executing') {\n sentInputRef.current = false;\n sentResultRef.current = false;\n }\n lastStatusRef.current = status;\n }, [status]);\n\n if (!metadata || !sseClient) {\n return null;\n }\n\n const displayError = error || hostError;\n if (displayError) {\n return (\n <div className={`p-4 bg-red-900/20 border border-red-700 rounded text-red-200 ${className || ''}`}>\n Error: {displayError.message || String(displayError)}\n </div>\n );\n }\n\n return (\n <div className={`w-full border border-gray-700 rounded overflow-hidden bg-white min-h-96 my-2 relative ${className || ''}`}>\n <iframe\n ref={iframeRef}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads\"\n className=\"w-full h-full min-h-96\"\n style={{ height: 'auto' }}\n title=\"MCP App\"\n />\n {!isLaunched && (\n <div className=\"absolute inset-0 bg-gray-900/50 flex items-center justify-center pointer-events-none\">\n <div className=\"w-6 h-6 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n </div>\n )}\n </div>\n );\n});\n\n/**\n * Helpers scoped to one `mcpClient`. Pass the client here once; `McpAppRenderer` only needs per-tool props (`name`, `input`, `result`, `status`).\n *\n * @param mcpClient - From `useMcp()` or context (for example `useMcpContext()`).\n */\nexport function useMcpApps(mcpClient: McpClient | null) {\n // Stable `McpAppRenderer` type: parent re-renders and `connections` updates must not remount the iframe.\n const clientRef = useRef(mcpClient);\n clientRef.current = mcpClient;\n\n const getAppMetadata = useCallback(\n (toolName: string) => getMcpAppMetadata(clientRef.current, toolName),\n []\n );\n\n const McpAppRenderer = useMemo(() => {\n const Renderer = memo(function McpAppRenderer(props: McpAppRendererProps) {\n return <McpAppView clientRef={clientRef} {...props} />;\n });\n Renderer.displayName = 'McpAppRenderer';\n return Renderer;\n }, []);\n\n return { getAppMetadata, McpAppRenderer };\n}\n\nfunction extractToolName(fullName: string): string {\n const match = fullName.match(/(?:tool_[^_]+_)?(.+)$/);\n return match?.[1] || fullName;\n}\n\nfunction getMcpAppMetadata(\n mcpClient: McpClient | null,\n toolName: string\n): McpAppMetadata | undefined {\n if (!mcpClient) return undefined;\n\n const extractedName = extractToolName(toolName);\n\n for (const conn of mcpClient.connections) {\n for (const tool of conn.tools) {\n const candidateName = extractToolName(tool.name);\n const resourceUri =\n tool.mcpApp?.resourceUri ??\n tool._meta?.ui?.resourceUri ??\n tool._meta?.['ui/resourceUri'];\n\n if (resourceUri && candidateName === extractedName) {\n return {\n toolName: candidateName,\n resourceUri,\n sessionId: conn.sessionId,\n };\n }\n }\n }\n\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/core/sse-client.ts","../../src/client/react/use-mcp.ts","../../src/client/core/constants.ts","../../src/client/utils/app-host-utils.ts","../../src/client/core/app-host.ts","../../src/client/react/use-app-host.ts","../../src/shared/meta-tools.ts","../../src/client/react/use-mcp-apps.tsx"],"names":["nanoid","data","useRef","useState","useEffect","useCallback","url","useMemo","AppBridge","PostMessageTransport","forwardRef","useImperativeHandle","jsxs","jsx","McpAppView","memo","McpAppRenderer","BoundMcpAppRenderer"],"mappings":"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","file":"react.js","sourcesContent":["/**\n * Stateless RPC-over-stream client for MCP connections.\n *\n * Uses single POST requests with `Accept: text/event-stream` for every RPC call.\n * Progress events and the final rpc-response are delivered in the same response.\n */\n\nimport { nanoid } from 'nanoid';\nimport type {\n McpConnectionEvent,\n McpObservabilityEvent,\n McpAppsUIEvent\n} from '../../shared/events.js';\nimport type {\n McpRpcRequest,\n McpRpcResponse,\n McpRpcMethod,\n McpRpcParams,\n ConnectParams,\n SessionListResult,\n ConnectResult,\n DisconnectResult,\n RestoreSessionResult,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n} from '../../shared/types.js';\n\nexport interface SSEClientOptions {\n /** MCP endpoint URL */\n url: string;\n\n /** User/Client identifier */\n identity: string;\n\n /** Optional auth token for authenticated requests */\n authToken?: string;\n\n /** Callback for MCP connection state changes */\n onConnectionEvent?: (event: McpConnectionEvent) => void;\n\n /** Callback for observability/logging events */\n onObservabilityEvent?: (event: McpObservabilityEvent) => void;\n\n /** Callback for connection status changes */\n onStatusChange?: (status: ConnectionStatus) => void;\n\n /** Callback for MCP App UI events */\n onEvent?: (event: McpAppsUIEvent) => void;\n\n /** Enable debug logging @default false */\n debug?: boolean;\n}\n\nexport type ConnectionStatus = 'connecting' | 'connected' | 'disconnected' | 'error';\n\nconst CONNECTION_EVENT_INTERVAL_MS = 300;\n\ninterface ToolUiMetadata {\n resourceUri?: string;\n uri?: string;\n visibility?: string[];\n}\n\nexport class SSEClient {\n private resourceCache = new Map<string, Promise<unknown>>();\n private connected = false;\n\n constructor(private readonly options: SSEClientOptions) {}\n\n connect(): void {\n if (this.connected) {\n return;\n }\n this.connected = true;\n this.options.onStatusChange?.('connected');\n this.log('RPC mode: post_stream');\n }\n\n disconnect(): void {\n this.connected = false;\n this.options.onStatusChange?.('disconnected');\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n async getSessions(): Promise<SessionListResult> {\n return this.sendRequest<SessionListResult>('getSessions');\n }\n\n async connectToServer(params: ConnectParams): Promise<ConnectResult> {\n return this.sendRequest<ConnectResult>('connect', params);\n }\n\n async disconnectFromServer(sessionId: string): Promise<DisconnectResult> {\n return this.sendRequest<DisconnectResult>('disconnect', { sessionId });\n }\n\n async listTools(sessionId: string): Promise<ListToolsRpcResult> {\n return this.sendRequest<ListToolsRpcResult>('listTools', { sessionId });\n }\n\n async callTool(\n sessionId: string,\n toolName: string,\n toolArgs: Record<string, unknown>\n ): Promise<unknown> {\n const result = await this.sendRequest('callTool', { sessionId, toolName, toolArgs });\n this.emitUiEventIfPresent(result, sessionId, toolName);\n return result;\n }\n\n async restoreSession(sessionId: string): Promise<RestoreSessionResult> {\n return this.sendRequest<RestoreSessionResult>('restoreSession', { sessionId });\n }\n\n async finishAuth(sessionId: string, code: string): Promise<FinishAuthResult> {\n return this.sendRequest<FinishAuthResult>('finishAuth', { sessionId, code });\n }\n\n async listPrompts(sessionId: string): Promise<ListPromptsResult> {\n return this.sendRequest<ListPromptsResult>('listPrompts', { sessionId });\n }\n\n async getPrompt(sessionId: string, name: string, args?: Record<string, string>): Promise<unknown> {\n return this.sendRequest('getPrompt', { sessionId, name, args });\n }\n\n async listResources(sessionId: string): Promise<ListResourcesResult> {\n return this.sendRequest<ListResourcesResult>('listResources', { sessionId });\n }\n\n async readResource(sessionId: string, uri: string): Promise<unknown> {\n return this.sendRequest('readResource', { sessionId, uri });\n }\n\n preloadToolUiResources(sessionId: string, tools: Array<{ name: string; _meta?: unknown }>): void {\n for (const tool of tools) {\n const uri = this.extractUiResourceUri(tool);\n if (!uri || this.resourceCache.has(uri)) continue;\n const promise = this.sendRequest('readResource', { sessionId, uri }).catch((err) => {\n this.log(`Failed to preload resource ${uri}: ${err.message}`, 'warn');\n this.resourceCache.delete(uri);\n return null;\n });\n this.resourceCache.set(uri, promise);\n }\n }\n\n getOrFetchResource(sessionId: string, uri: string): Promise<unknown> {\n const cached = this.resourceCache.get(uri);\n if (cached) return cached;\n const promise = this.sendRequest('readResource', { sessionId, uri });\n this.resourceCache.set(uri, promise);\n return promise;\n }\n\n hasPreloadedResource(uri: string): boolean {\n return this.resourceCache.has(uri);\n }\n\n clearResourceCache(): void {\n this.resourceCache.clear();\n }\n\n private async sendRequest<T = unknown>(method: McpRpcMethod, params?: McpRpcParams): Promise<T> {\n if (!this.connected) {\n this.connect();\n }\n\n this.log(`RPC request via post_stream: ${method}`);\n\n const request: McpRpcRequest = {\n id: `rpc_${nanoid(10)}`,\n method,\n params,\n };\n\n const response = await fetch(this.buildUrl(), {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const contentType = (response.headers.get('content-type') || '').toLowerCase();\n if (!contentType.includes('text/event-stream')) {\n const data = await response.json() as McpRpcResponse;\n return this.parseRpcResponse<T>(data);\n }\n\n const data = await this.readRpcResponseFromStream(response, {\n delayConnectionEvents:\n method === 'connect' ||\n method === 'restoreSession' ||\n method === 'finishAuth',\n });\n return this.parseRpcResponse<T>(data);\n }\n\n private async readRpcResponseFromStream(\n response: Response,\n options: { delayConnectionEvents?: boolean } = {}\n ): Promise<McpRpcResponse> {\n if (!response.body) {\n throw new Error('Streaming response body is missing');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let rpcResponse: McpRpcResponse | null = null;\n\n const dispatchBlock = async (block: string) => {\n const lines = block.split('\\n');\n let eventName = 'message';\n const dataLines: string[] = [];\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\r$/, '');\n if (!line || line.startsWith(':')) continue;\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim();\n continue;\n }\n if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n\n if (!dataLines.length) return;\n const payloadText = dataLines.join('\\n');\n let payload: unknown = payloadText;\n try {\n payload = JSON.parse(payloadText);\n } catch {\n // Keep raw text\n }\n\n switch (eventName) {\n case 'connected':\n this.options.onStatusChange?.('connected');\n break;\n case 'connection':\n this.options.onConnectionEvent?.(payload as McpConnectionEvent);\n if (options.delayConnectionEvents) {\n await this.sleep(CONNECTION_EVENT_INTERVAL_MS);\n }\n break;\n case 'observability':\n this.options.onObservabilityEvent?.(payload as McpObservabilityEvent);\n break;\n case 'rpc-response':\n rpcResponse = payload as McpRpcResponse;\n break;\n default:\n break;\n }\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let separatorMatch = buffer.match(/\\r?\\n\\r?\\n/);\n while (separatorMatch && separatorMatch.index !== undefined) {\n const separatorIndex = separatorMatch.index;\n const separatorLength = separatorMatch[0].length;\n const block = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + separatorLength);\n await dispatchBlock(block);\n separatorMatch = buffer.match(/\\r?\\n\\r?\\n/);\n }\n }\n\n if (buffer.trim()) {\n await dispatchBlock(buffer);\n }\n\n if (!rpcResponse) {\n throw new Error('Missing rpc-response event in streamed RPC result');\n }\n\n return rpcResponse;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private parseRpcResponse<T>(data: McpRpcResponse): T {\n if ('result' in data) {\n return data.result as T;\n }\n if ('error' in data && data.error) {\n throw new Error(data.error.message || 'Unknown RPC error');\n }\n // JSON omits `result` when it is `undefined` (response becomes `{ id: ... }`).\n // Treat that shape as a successful void result.\n if (data && typeof data === 'object' && 'id' in data) {\n return undefined as T;\n }\n throw new Error('Invalid RPC response format');\n }\n\n private buildUrl(): string {\n const url = new URL(this.options.url, globalThis.location?.origin);\n url.searchParams.set('identity', this.options.identity);\n if (this.options.authToken) {\n url.searchParams.set('token', this.options.authToken);\n }\n return url.toString();\n }\n\n private buildHeaders(): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n };\n if (this.options.authToken) {\n headers['Authorization'] = `Bearer ${this.options.authToken}`;\n }\n return headers;\n }\n\n private extractUiResourceUri(tool: { name: string; _meta?: unknown }): string | undefined {\n const meta = (tool._meta as { ui?: ToolUiMetadata })?.ui;\n if (!meta || typeof meta !== 'object') return undefined;\n if (meta.visibility && !meta.visibility.includes('app')) return undefined;\n return meta.resourceUri ?? meta.uri;\n }\n\n private emitUiEventIfPresent(result: unknown, sessionId: string, toolName: string): void {\n const meta = (result as { _meta?: { ui?: ToolUiMetadata } })?._meta;\n const resourceUri = meta?.ui?.resourceUri ?? (meta as any)?.['ui/resourceUri'];\n\n if (resourceUri) {\n this.options.onEvent?.({\n type: 'mcp-apps-ui',\n sessionId,\n resourceUri,\n toolName,\n result,\n timestamp: Date.now(),\n });\n }\n }\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.options.debug && level === 'info') return;\n\n const prefix = '[SSEClient]';\n switch (level) {\n case 'warn':\n console.warn(prefix, message);\n break;\n case 'error':\n console.error(prefix, message);\n break;\n default:\n console.log(prefix, message);\n }\n }\n}\n","/**\n * useMcp React Hook\n * Manages MCP connections with SSE-based real-time updates\n * Based on Cloudflare's agents pattern\n */\n\nimport { useEffect, useRef, useState, useCallback, useMemo } from 'react';\nimport { SSEClient, type SSEClientOptions } from '../core/sse-client';\nimport type { McpConnectionEvent, McpConnectionState } from '../../shared/events';\nimport type {\n ToolInfo,\n FinishAuthResult,\n ListToolsRpcResult,\n ListPromptsResult,\n ListResourcesResult,\n SessionInfo,\n} from '../../shared/types';\n\nexport interface UseMcpOptions {\n /**\n * SSE endpoint URL\n */\n url: string;\n\n /**\n * User/Client identifier\n */\n identity: string;\n\n /**\n * Optional auth token\n */\n authToken?: string;\n\n /**\n * Auto-connect on mount\n * @default true\n */\n autoConnect?: boolean;\n\n /**\n * Auto-initialize sessions on mount\n * @default true\n */\n autoInitialize?: boolean;\n\n /**\n * Connection event callback\n */\n onConnectionEvent?: (event: McpConnectionEvent) => void;\n\n /**\n * Debug logging callback\n */\n onLog?: (level: string, message: string, metadata?: Record<string, unknown>) => void;\n /**\n * Optional callback to handle OAuth redirects (e.g. for popup flow)\n * If provided, this will be called instead of window.location.href assignment\n */\n onRedirect?: (url: string) => void;\n\n /**\n * Request timeout in milliseconds\n * @default 60000\n */\n requestTimeout?: number;\n\n /**\n * Enable client debug logs.\n * @default false\n */\n debug?: boolean;\n\n}\n\nexport interface McpConnection {\n sessionId: string;\n serverId: string;\n serverName: string;\n serverUrl?: string;\n transport?: string;\n state: McpConnectionState;\n tools: ToolInfo[];\n authUrl?: string;\n error?: string;\n createdAt?: Date;\n}\n\nexport interface McpClient {\n /**\n * All connections\n */\n connections: McpConnection[];\n\n /**\n * SSE connection status\n */\n status: 'connecting' | 'connected' | 'disconnected' | 'error';\n\n /**\n * Whether initializing\n */\n isInitializing: boolean;\n\n /**\n * Connect to an MCP server\n */\n connect: (params: {\n serverId: string;\n serverName: string;\n serverUrl: string;\n callbackUrl: string;\n transportType?: 'sse' | 'streamable_http';\n }) => Promise<string>;\n\n /**\n * Disconnect from an MCP server\n */\n disconnect: (sessionId: string) => Promise<void>;\n\n /**\n * Get connection by session ID\n */\n getConnection: (sessionId: string) => McpConnection | undefined;\n\n /**\n * Get connection by server ID\n */\n getConnectionByServerId: (serverId: string) => McpConnection | undefined;\n\n /**\n * Check if server is connected\n */\n isServerConnected: (serverId: string) => boolean;\n\n /**\n * Get tools for a session\n */\n getTools: (sessionId: string) => ToolInfo[];\n\n /**\n * Refresh all connections\n */\n refresh: () => Promise<void>;\n\n /**\n * Manually connect SSE\n */\n connectSSE: () => void;\n\n /**\n * Manually disconnect SSE\n */\n disconnectSSE: () => void;\n\n /**\n * Complete OAuth authorization\n */\n finishAuth: (sessionId: string, code: string) => Promise<FinishAuthResult>;\n\n /**\n * Explicitly resume OAuth flow for an existing session\n */\n resumeAuth: (sessionId: string) => Promise<void>;\n\n /**\n * Call a tool from a session\n */\n callTool: (\n sessionId: string,\n toolName: string,\n toolArgs: Record<string, unknown>\n ) => Promise<unknown>;\n\n /**\n * List available tools for a session\n */\n listTools: (sessionId: string) => Promise<ListToolsRpcResult>;\n\n /**\n * List available prompts for a session\n */\n listPrompts: (sessionId: string) => Promise<ListPromptsResult>;\n\n /**\n * Get a specific prompt with arguments\n */\n getPrompt: (sessionId: string, name: string, args?: Record<string, string>) => Promise<unknown>;\n\n /**\n * List available resources for a session\n */\n listResources: (sessionId: string) => Promise<ListResourcesResult>;\n\n /**\n * Read a specific resource\n */\n readResource: (sessionId: string, uri: string) => Promise<unknown>;\n\n /**\n * Access the underlying SSEClient instance (for advanced usage like AppHost)\n */\n sseClient: SSEClient | null;\n}\n\n/**\n * React hook for MCP connection management with SSE\n */\nexport function useMcp(options: UseMcpOptions): McpClient {\n const {\n url,\n identity,\n authToken,\n autoConnect = true,\n autoInitialize = true,\n onConnectionEvent,\n onLog,\n onRedirect,\n } = options;\n\n const clientRef = useRef<SSEClient | null>(null);\n const isMountedRef = useRef(true);\n const suppressAuthRedirectSessionsRef = useRef<Set<string>>(new Set());\n\n const [connections, setConnections] = useState<McpConnection[]>([]);\n const [status, setStatus] = useState<'connecting' | 'connected' | 'disconnected' | 'error'>(\n 'disconnected'\n );\n const [isInitializing, setIsInitializing] = useState(false);\n /** Mirrored from `clientRef` so the public `McpClient` object can be memoized when the instance is ready. */\n const [sseClient, setSseClient] = useState<SSEClient | null>(null);\n\n /**\n * Initialize SSE client\n */\n useEffect(() => {\n isMountedRef.current = true;\n\n const clientOptions: SSEClientOptions = {\n url,\n identity,\n authToken,\n onConnectionEvent: (event) => {\n // Update local state based on event\n updateConnectionsFromEvent(event);\n\n // Call user callback\n onConnectionEvent?.(event);\n },\n onObservabilityEvent: (event) => {\n onLog?.(event.level || 'info', event.message || event.displayMessage || 'No message', event.metadata);\n },\n onStatusChange: (newStatus) => {\n if (isMountedRef.current) {\n setStatus(newStatus);\n }\n },\n debug: options.debug,\n };\n\n const client = new SSEClient(clientOptions);\n clientRef.current = client;\n setSseClient(client);\n\n if (autoConnect) {\n client.connect();\n\n if (autoInitialize) {\n loadSessions();\n }\n }\n\n return () => {\n isMountedRef.current = false;\n client.disconnect();\n };\n }, [url, identity, authToken, autoConnect, autoInitialize]);\n\n /**\n * Update connections based on event\n */\n const updateConnectionsFromEvent = useCallback((event: McpConnectionEvent) => {\n if (!isMountedRef.current) return;\n\n const isTransientReconnectState = (state: McpConnectionState): boolean =>\n state === 'INITIALIZING' ||\n state === 'VALIDATING' ||\n state === 'RECONNECTING' ||\n state === 'CONNECTING' ||\n state === 'CONNECTED' ||\n state === 'DISCOVERING';\n\n setConnections((prev: McpConnection[]) => {\n switch (event.type) {\n case 'state_changed': {\n const existing = prev.find((c: McpConnection) => c.sessionId === event.sessionId);\n if (existing) {\n // In stateless per-request transport, tool calls can emit transient reconnect states.\n // Keep READY sticky to avoid UI flicker from READY -> CONNECTING -> CONNECTED.\n const nextState =\n existing.state === 'READY' && isTransientReconnectState(event.state)\n ? existing.state\n : event.state;\n\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId ? {\n ...c,\n state: nextState,\n // update createdAt if present in event, otherwise keep existing\n createdAt: event.createdAt ? new Date(event.createdAt) : c.createdAt\n } : c\n );\n } else {\n // Fix: Don't add back disconnected sessions that were just removed\n if (event.state === 'DISCONNECTED') {\n return prev;\n }\n\n return [\n ...prev,\n {\n sessionId: event.sessionId,\n serverId: event.serverId,\n serverName: event.serverName,\n serverUrl: event.serverUrl,\n state: event.state,\n createdAt: event.createdAt ? new Date(event.createdAt) : undefined,\n tools: [],\n },\n ];\n }\n }\n\n case 'tools_discovered': {\n // Preload UI resources for instant loading when tools are discovered\n if (clientRef.current && event.tools?.length) {\n clientRef.current.preloadToolUiResources(event.sessionId, event.tools);\n }\n\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId ? { ...c, tools: event.tools, state: 'READY' } : c\n );\n }\n\n case 'auth_required': {\n const url = (event.authUrl || '').trim();\n if (!url) {\n onLog?.('error', 'OAuth required but authorization URL is missing', { sessionId: event.sessionId });\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId\n ? {\n ...c,\n state: 'FAILED',\n error: 'OAuth authorization URL not available',\n authUrl: undefined,\n }\n : c\n );\n }\n onLog?.('info', `OAuth required - redirecting to ${url}`, { authUrl: url });\n\n // Suppress redirects/popups for auto-restore on page load.\n if (!suppressAuthRedirectSessionsRef.current.has(event.sessionId)) {\n if (onRedirect) {\n onRedirect(url);\n } else if (typeof window !== 'undefined') {\n window.location.href = url;\n }\n }\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId ? { ...c, state: 'AUTHENTICATING', authUrl: url } : c\n );\n }\n\n case 'error': {\n return prev.map((c: McpConnection) =>\n c.sessionId === event.sessionId ? { ...c, state: 'FAILED', error: event.error } : c\n );\n }\n\n case 'disconnected': {\n return prev.filter((c: McpConnection) => c.sessionId !== event.sessionId);\n }\n\n default:\n return prev;\n }\n });\n }, [onLog, onRedirect]);\n\n /**\n * Load sessions from server\n */\n const loadSessions = useCallback(async () => {\n if (!clientRef.current) return;\n\n try {\n setIsInitializing(true);\n\n const result = await clientRef.current.getSessions();\n const sessions = result.sessions || [];\n\n // Initialize connections\n if (isMountedRef.current) {\n setConnections(\n sessions.map((s: SessionInfo) => ({\n sessionId: s.sessionId,\n serverId: s.serverId ?? 'unknown',\n serverName: s.serverName ?? 'Unknown Server',\n serverUrl: s.serverUrl,\n transport: s.transport,\n state: (s.active === false ? 'AUTHENTICATING' : 'VALIDATING') as McpConnectionState,\n createdAt: new Date(s.createdAt),\n tools: [],\n }))\n );\n }\n\n // Validate each session in parallel\n await Promise.all(\n sessions.map(async (session: SessionInfo) => {\n if (clientRef.current) {\n try {\n // Pending auth sessions should not auto-trigger popup/redirect on reload.\n if (session.active === false) {\n return;\n }\n suppressAuthRedirectSessionsRef.current.add(session.sessionId);\n await clientRef.current.restoreSession(session.sessionId);\n } catch (error) {\n console.error(`[useMcp] Failed to validate session ${session.sessionId}:`, error);\n } finally {\n suppressAuthRedirectSessionsRef.current.delete(session.sessionId);\n }\n }\n })\n );\n } catch (error) {\n console.error('[useMcp] Failed to load sessions:', error);\n onLog?.('error', 'Failed to load sessions', { error });\n } finally {\n if (isMountedRef.current) {\n setIsInitializing(false);\n }\n }\n }, [onLog]);\n\n /**\n * Connect to an MCP server\n */\n const connect = useCallback(\n async (params: {\n serverId: string;\n serverName: string;\n serverUrl: string;\n callbackUrl: string;\n transportType?: 'sse' | 'streamable_http';\n }): Promise<string> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n const result = await clientRef.current.connectToServer(params);\n return result.sessionId;\n },\n []\n );\n\n /**\n * Disconnect from an MCP server\n */\n const disconnect = useCallback(async (sessionId: string): Promise<void> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n await clientRef.current.disconnectFromServer(sessionId);\n\n // Remove from local state\n if (isMountedRef.current) {\n setConnections((prev: McpConnection[]) => prev.filter((c: McpConnection) => c.sessionId !== sessionId));\n }\n }, []);\n\n /**\n * Refresh all connections\n */\n const refresh = useCallback(async () => {\n await loadSessions();\n }, [loadSessions]);\n\n /**\n * Manually connect SSE\n */\n const connectSSE = useCallback(() => {\n clientRef.current?.connect();\n }, []);\n\n /**\n * Manually disconnect SSE\n */\n const disconnectSSE = useCallback(() => {\n clientRef.current?.disconnect();\n }, []);\n\n /**\n * Complete OAuth authorization\n */\n const finishAuth = useCallback(async (sessionId: string, code: string): Promise<FinishAuthResult> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.finishAuth(sessionId, code);\n }, []);\n\n /**\n * Explicit user action to resume OAuth for an existing pending session.\n */\n const resumeAuth = useCallback(async (sessionId: string): Promise<void> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n // Ensure this attempt is not suppressed as background restore.\n suppressAuthRedirectSessionsRef.current.delete(sessionId);\n await clientRef.current.restoreSession(sessionId);\n }, []);\n\n /**\n * Call a tool\n */\n const callTool = useCallback(\n async (\n sessionId: string,\n toolName: string,\n toolArgs: Record<string, unknown>\n ): Promise<unknown> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.callTool(sessionId, toolName, toolArgs);\n },\n []\n );\n\n /**\n * List tools (refresh tool list)\n */\n const listTools = useCallback(async (sessionId: string): Promise<ListToolsRpcResult> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.listTools(sessionId);\n }, []);\n\n /**\n * List prompts\n */\n const listPrompts = useCallback(async (sessionId: string): Promise<ListPromptsResult> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.listPrompts(sessionId);\n }, []);\n\n /**\n * Get a specific prompt\n */\n const getPrompt = useCallback(\n async (sessionId: string, name: string, args?: Record<string, string>): Promise<unknown> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.getPrompt(sessionId, name, args);\n },\n []\n );\n\n /**\n * List resources\n */\n const listResources = useCallback(async (sessionId: string): Promise<ListResourcesResult> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.listResources(sessionId);\n }, []);\n\n /**\n * Read a specific resource\n */\n const readResource = useCallback(async (sessionId: string, uri: string): Promise<unknown> => {\n if (!clientRef.current) {\n throw new Error('SSE client not initialized');\n }\n\n return await clientRef.current.readResource(sessionId, uri);\n }, []);\n\n // Utility functions\n const getConnection = useCallback(\n (sessionId: string) => connections.find((c: McpConnection) => c.sessionId === sessionId),\n [connections]\n );\n\n const getConnectionByServerId = useCallback(\n (serverId: string) => connections.find((c: McpConnection) => c.serverId === serverId),\n [connections]\n );\n\n const isServerConnected = useCallback(\n (serverId: string) => {\n const conn = getConnectionByServerId(serverId);\n return conn ? conn.state === 'CONNECTED' || conn.state === 'DISCOVERING' || conn.state === 'READY' : false;\n },\n [getConnectionByServerId]\n );\n\n const getTools = useCallback(\n (sessionId: string) => {\n const conn = getConnection(sessionId);\n return conn?.tools || [];\n },\n [getConnection]\n );\n\n return useMemo(\n () => ({\n connections,\n status,\n isInitializing,\n connect,\n disconnect,\n getConnection,\n getConnectionByServerId,\n isServerConnected,\n getTools,\n refresh,\n connectSSE,\n disconnectSSE,\n finishAuth,\n resumeAuth,\n callTool,\n listTools,\n listPrompts,\n getPrompt,\n listResources,\n readResource,\n sseClient,\n }),\n [\n connections,\n status,\n isInitializing,\n connect,\n disconnect,\n getConnection,\n getConnectionByServerId,\n isServerConnected,\n getTools,\n refresh,\n connectSSE,\n disconnectSSE,\n finishAuth,\n resumeAuth,\n callTool,\n listTools,\n listPrompts,\n getPrompt,\n listResources,\n readResource,\n sseClient,\n ]\n );\n}\n","/**\n * Default configuration values for the App Host.\n *\n * `SANDBOX_*_READY_METHOD` match `@modelcontextprotocol/ext-apps` (see\n * https://github.com/modelcontextprotocol/ext-apps/blob/main/src/types.ts ).\n * Duplicated here because the package root `app.d.ts` often omits these value exports under\n * `moduleResolution: \"NodeNext\"`.\n */\nexport const SANDBOX_PROXY_READY_METHOD = 'ui/notifications/sandbox-proxy-ready' as const;\nexport const SANDBOX_RESOURCE_READY_METHOD = 'ui/notifications/sandbox-resource-ready' as const;\n\nexport const APP_HOST_DEFAULTS = {\n /** Default timeout for waiting for the sandbox proxy to be ready (ms). */\n SANDBOX_TIMEOUT_MS: 10000,\n \n /** Default host info reported to guest apps. */\n HOST_INFO: { name: 'mcp-ts-host', version: '1.0.0' },\n\n /** Supported MCP App URI schemes. */\n URI_SCHEMES: ['ui://', 'mcp-app://'] as const,\n\n /** Default theme for the host context. */\n THEME: 'dark',\n\n /** Default platform for the host context. */\n PLATFORM: 'web',\n\n /** Default max height for the iframe container (px). */\n MAX_HEIGHT: 6000,\n} as const;\n","import { APP_HOST_DEFAULTS, SANDBOX_PROXY_READY_METHOD } from '../core/constants.js';\n\nconst DEFAULT_SANDBOX_TIMEOUT_MS = APP_HOST_DEFAULTS.SANDBOX_TIMEOUT_MS;\n\nexport async function setupSandboxProxyIframe(\n iframe: HTMLIFrameElement,\n sandboxProxyUrl: URL\n): Promise<{\n onReady: Promise<void>;\n}> {\n iframe.style.width = '100%';\n iframe.style.height = '100%';\n iframe.style.border = 'none';\n iframe.style.backgroundColor = 'transparent';\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads');\n\n const onReady = new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n window.removeEventListener('message', messageListener);\n iframe.removeEventListener('error', errorListener);\n };\n\n const timeoutId = setTimeout(() => {\n if (!settled) {\n settled = true;\n cleanup();\n reject(new Error('Timed out waiting for sandbox proxy iframe to be ready'));\n }\n }, DEFAULT_SANDBOX_TIMEOUT_MS);\n\n const messageListener = (event: MessageEvent) => {\n if (event.source === iframe.contentWindow) {\n if (event.data?.method === SANDBOX_PROXY_READY_METHOD) {\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n cleanup();\n resolve();\n }\n }\n }\n };\n\n const errorListener = () => {\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n cleanup();\n reject(new Error('Failed to load sandbox proxy iframe'));\n }\n };\n\n window.addEventListener('message', messageListener);\n iframe.addEventListener('error', errorListener);\n });\n\n iframe.src = sandboxProxyUrl.href;\n\n return { onReady };\n}\n","/**\n * MCP App Host\n *\n * Bridges the gap between an iframe (MCP App) and the SSEClient (MCP Server).\n * Handles secure iframe sandboxing, resource loading, and bi-directional\n * communication via the AppBridge protocol.\n *\n * Key features:\n * - Secure iframe sandboxing with minimal permissions (proxy-based)\n * - Resource preloading for instant MCP App UI loading\n * - Cache-aware resource fetching (SSEClient cache → local cache → direct fetch)\n * - Support for ui:// and mcp-app:// resource URIs\n */\n\nimport { \n AppBridge, \n PostMessageTransport\n} from '@modelcontextprotocol/ext-apps/app-bridge';\nimport type { LoggingMessageNotification } from '@modelcontextprotocol/sdk/types.js';\nimport type { AppHostClient } from './types';\nimport { setupSandboxProxyIframe } from '../utils/app-host-utils.js';\nimport { APP_HOST_DEFAULTS } from './constants.js';\n\nexport type McpUiResourceCsp = Record<string, string>;\nexport type McpUiHostContext = Record<string, unknown>;\n\n// Define types dynamically from AppBridge properties instead of direct imports\n// which seem to fail in this tsconfig environment\ntype OnMessageHandler = NonNullable<AppBridge['onmessage']>;\nexport type McpUiMessageParams = Parameters<OnMessageHandler>[0];\nexport type RequestHandlerExtra = Parameters<OnMessageHandler>[1];\nexport type McpUiMessageResult = ReturnType<OnMessageHandler> extends Promise<infer R> ? R : never;\n\ntype OnOpenLinkHandler = NonNullable<AppBridge['onopenlink']>;\nexport type McpUiOpenLinkParams = Parameters<OnOpenLinkHandler>[0];\nexport type McpUiOpenLinkResult = ReturnType<OnOpenLinkHandler> extends Promise<infer R> ? R : never;\n\ntype OnSizeChangeHandler = NonNullable<AppBridge['onsizechange']>;\nexport type McpUiSizeChangedParams = Parameters<OnSizeChangeHandler>[0];\n\ntype OnRequestDisplayModeHandler = NonNullable<AppBridge['onrequestdisplaymode']>;\nexport type McpUiRequestDisplayModeParams = Parameters<OnRequestDisplayModeHandler>[0];\nexport type McpUiRequestDisplayModeResult = ReturnType<OnRequestDisplayModeHandler> extends Promise<infer R> ? R : never;\n\n\n// ============================================\n// Types & Interfaces\n// ============================================\n\nexport interface SandboxConfig {\n url: URL | string;\n permissions?: string;\n csp?: McpUiResourceCsp;\n}\n\n/**\n * Default Content-Security-Policy for MCP App iframes.\n *\n * Allows inline scripts/styles (required by most MCP App frameworks),\n * outbound network connections, and common asset sources, while blocking\n * nested frames and plugin objects.\n *\n * Pass this (or a spread of it) as `sandbox.csp` to enforce it:\n * @example\n * sandbox={{ url: '/sandbox.html', csp: DEFAULT_MCP_APP_CSP }}\n * // or to extend:\n * sandbox={{ url: '/sandbox.html', csp: { ...DEFAULT_MCP_APP_CSP, 'connect-src': \"'self' https://api.example.com\" } }}\n */\nexport const DEFAULT_MCP_APP_CSP: McpUiResourceCsp = {\n 'default-src': \"'self'\",\n 'script-src': \"'self' 'unsafe-inline' 'unsafe-eval' https: blob:\",\n 'style-src': \"'self' 'unsafe-inline' https:\",\n 'connect-src': \"'self' https: wss:\",\n 'img-src': \"'self' data: https: blob:\",\n 'font-src': \"'self' data: https:\",\n 'media-src': \"'self' https: blob:\",\n 'frame-src': \"'none'\",\n 'object-src': \"'none'\",\n 'base-uri': \"'self'\",\n};\n\nexport interface AppHostOptions {\n /** Enable debug logging @default false */\n debug?: boolean;\n /** Sandbox proxy configuration */\n sandbox?: SandboxConfig;\n /** Host context for theming, viewport, locale */\n hostContext?: McpUiHostContext;\n /** Custom handler for call tool requests, overriding automatic client forwarding */\n onCallTool?: (params: ToolCallParams) => Promise<unknown>;\n /** Custom handler for resources/read */\n onReadResource?: (uri: string) => Promise<ResourceResponse>;\n /** Custom handler for fallback JSON-RPC requests */\n onFallbackRequest?: (request: any) => Promise<any>;\n \n /** Handler for open-link requests from the guest UI */\n onOpenLink?: (\n params: McpUiOpenLinkParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiOpenLinkResult>;\n\n /** Handler for message requests from the guest UI */\n onMessage?: (\n params: McpUiMessageParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiMessageResult>;\n\n /** Handler for logging messages from the guest UI */\n onLoggingMessage?: (params: LoggingMessageNotification['params']) => void;\n\n /** Handler for size change notifications from the guest UI */\n onSizeChanged?: (params: McpUiSizeChangedParams) => void;\n\n /** Callback invoked when an error occurs during setup or message handling */\n onError?: (error: Error) => void;\n\n /** Handler for display mode change requests from the guest UI */\n onRequestDisplayMode?: (\n params: McpUiRequestDisplayModeParams,\n extra: RequestHandlerExtra,\n ) => Promise<McpUiRequestDisplayModeResult>;\n}\n\nexport interface AppMessageParams {\n role: string;\n content: unknown;\n}\n\ninterface ToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\ninterface ResourceContent {\n blob?: string;\n text?: string;\n}\n\ninterface ResourceResponse {\n contents: ResourceContent[];\n}\n\n// ============================================\n// Constants\n// ============================================\n\nconst HOST_INFO = APP_HOST_DEFAULTS.HOST_INFO;\n\n\n/** Supported MCP App URI schemes */\nconst MCP_URI_SCHEMES = APP_HOST_DEFAULTS.URI_SCHEMES;\n\n// ============================================\n// AppHost Class\n// ============================================\n\n/**\n * Host for MCP Apps embedded in iframes.\n * Manages secure communication between the app and the MCP server.\n */\nexport class AppHost {\n private bridge: AppBridge;\n private sessionId?: string;\n private resourceCache = new Map<string, Promise<ResourceResponse | null>>();\n private debug: boolean;\n\n private sandboxConfig?: SandboxConfig;\n private options: AppHostOptions;\n public onAppMessage?: (params: AppMessageParams) => void;\n\n constructor(\n private readonly client: AppHostClient | null,\n private readonly iframe: HTMLIFrameElement,\n options?: AppHostOptions\n ) {\n this.options = options || {};\n this.debug = this.options.debug ?? false;\n this.sandboxConfig = this.options.sandbox;\n\n this.bridge = this.initializeBridge();\n }\n\n // ============================================\n // Public API\n // ============================================\n\n /**\n * Start the host. This prepares the bridge handlers but doesn't connect yet.\n * The actual connection happens in launch() after HTML is loaded.\n * @returns Promise that resolves immediately (bridge connects during launch)\n */\n async start(): Promise<void> {\n // Bridge handlers are already registered in constructor.\n // Connection happens in launch() after HTML is loaded.\n this.log('Host started, ready to launch');\n }\n\n /**\n * Preload UI resources to enable instant app loading.\n * Call this when tools are discovered to cache their UI resources.\n */\n preload(tools: Array<{ _meta?: unknown }>): void {\n for (const tool of tools) {\n const uri = this.extractUiResourceUri(tool);\n if (!uri || this.resourceCache.has(uri)) continue;\n\n const promise = this.preloadResource(uri);\n this.resourceCache.set(uri, promise);\n }\n }\n\n /**\n * Launch an MCP App from a URL, MCP resource URI, or RAW HTML.\n * Loads the HTML first, then establishes bridge connection.\n */\n async launch(source: { uri?: string; html?: string }, sessionId?: string): Promise<void> {\n if (sessionId) this.sessionId = sessionId;\n\n const initializedPromise = this.onAppReady();\n\n let htmlToRender = source.html;\n\n if (!htmlToRender && source.uri) {\n if (this.isMcpUri(source.uri)) {\n htmlToRender = await this.readMcpAppHtml(source.uri);\n }\n }\n\n if (!htmlToRender && source.uri && !this.isMcpUri(source.uri)) {\n // Fallback for regular urls without proxy\n this.iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads');\n this.iframe.src = source.uri;\n await this.onIframeReady();\n await this.connectBridge();\n } else if (htmlToRender) {\n if (!this.sandboxConfig) {\n throw new Error(\"Sandbox configuration requires a proxy URL to render HTML safely.\");\n }\n await this.launchSandboxedHtml(htmlToRender, this.sandboxConfig);\n await this.connectBridge();\n\n this.log('Sending HTML resource to sandbox proxy (MCP Apps notification)');\n await this.bridge.sendSandboxResourceReady({\n html: htmlToRender,\n csp: this.sandboxConfig.csp,\n });\n }\n\n this.log('Waiting for app initialization');\n await Promise.race([\n initializedPromise,\n new Promise<void>((resolve) => setTimeout(() => {\n this.log('Initialization timeout - continuing anyway', 'warn');\n resolve();\n }, 3000))\n ]);\n this.log('App launched and ready');\n }\n\n // Set host context manually\n setHostContext(context: McpUiHostContext): void {\n this.options.hostContext = context;\n if (this.bridge) {\n this.bridge.setHostContext(context);\n }\n }\n\n // Send streaming inputs manually\n sendToolInputPartial(params: any): void {\n if (this.bridge) {\n (this.bridge as any).sendToolInputPartial(params);\n }\n }\n\n /**\n * Wait for app to signal initialization complete\n */\n private onAppReady(): Promise<void> {\n return new Promise<void>((resolve) => {\n const originalHandler = this.bridge.oninitialized;\n this.bridge.oninitialized = (...args) => {\n this.log('App initialized');\n resolve();\n this.bridge.oninitialized = originalHandler;\n originalHandler?.(...args);\n };\n });\n }\n\n /**\n * Wait for iframe to finish loading\n */\n private onIframeReady(): Promise<void> {\n return new Promise((resolve) => {\n if (this.iframe.contentDocument?.readyState === 'complete') {\n resolve();\n return;\n }\n this.iframe.addEventListener('load', () => resolve(), { once: true });\n });\n }\n\n /**\n * Send tool input arguments to the MCP App.\n * Call this after launch() when tool input is available.\n */\n sendToolInput(args: Record<string, unknown>): void {\n this.log('Sending tool input to app');\n this.bridge.sendToolInput({ arguments: args });\n }\n\n /**\n * Send tool result to the MCP App.\n * Call this when the tool call completes.\n */\n sendToolResult(result: unknown): void {\n this.log('Sending tool result to app');\n this.bridge.sendToolResult(result as any);\n }\n\n /**\n * Send tool cancellation to the MCP App.\n * Call this when the tool call is cancelled or fails.\n */\n sendToolCancelled(reason: string): void {\n this.log('Sending tool cancellation to app');\n this.bridge.sendToolCancelled({ reason });\n }\n\n /**\n * Tell the guest UI the resource is being torn down (unload / cleanup).\n * Forwards to {@link AppBridge.teardownResource} on `@modelcontextprotocol/ext-apps/app-bridge`.\n */\n teardownResource(params: Record<string, unknown> = {}): void {\n this.log('Sending resource teardown to app');\n this.bridge.teardownResource(params as never);\n }\n\n // ============================================\n // Private: Initialization\n // ============================================\n\n\n private initializeBridge(): AppBridge {\n const bridge = new AppBridge(\n null,\n HOST_INFO,\n {\n openLinks: {},\n serverTools: {},\n logging: {},\n updateModelContext: { text: {} },\n },\n {\n hostContext: this.options.hostContext || {\n theme: 'dark',\n platform: 'web',\n containerDimensions: { maxHeight: 6000 },\n displayMode: 'inline',\n availableDisplayModes: ['inline', 'fullscreen'],\n },\n }\n );\n\n ;(bridge as any).fallbackRequestHandler = this.options.onFallbackRequest;\n \n bridge.oncalltool = (params) => this.handleToolCall(params);\n if (this.options.onReadResource) {\n bridge.onreadresource = async (params) => {\n const resp = await this.options.onReadResource!(params.uri);\n return { \n contents: resp.contents.map(c => ({\n uri: params.uri,\n text: c.text as string,\n blob: c.blob as string,\n }))\n };\n };\n }\n\n bridge.onopenlink = async (params, extra) => {\n if (this.options.onOpenLink) {\n return await this.options.onOpenLink(params, extra as any);\n }\n return this.handleOpenLink(params);\n };\n bridge.onmessage = async (params, extra) => {\n if (this.options.onMessage) {\n return await this.options.onMessage(params, extra as any);\n }\n return this.handleMessage(params as any);\n };\n bridge.onloggingmessage = (params) => {\n this.log(`App log [${params.level}]: ${params.data}`);\n if (this.options.onLoggingMessage) {\n this.options.onLoggingMessage(params);\n }\n };\n bridge.onupdatemodelcontext = async () => ({});\n bridge.onsizechange = async (params) => {\n const { width, height } = params;\n // Guard: ignore transient 0px resize events (e.g. fired by guest during viewport transitions)\n if (height !== undefined && height > 0) {\n this.iframe.style.height = `${height}px`;\n }\n if (width !== undefined && width > 0) this.iframe.style.minWidth = `min(${width}px, 100%)`;\n if (this.options.onSizeChanged) {\n this.options.onSizeChanged(params);\n }\n return {};\n };\n bridge.onrequestdisplaymode = async (params, extra) => {\n if (this.options.onRequestDisplayMode) {\n return await this.options.onRequestDisplayMode(params, extra as any);\n }\n return { mode: params.mode === 'fullscreen' ? 'fullscreen' : 'inline' };\n };\n\n return bridge;\n }\n\n private async connectBridge(): Promise<void> {\n this.log('Connecting bridge to iframe');\n\n const transport = new PostMessageTransport(\n this.iframe.contentWindow!,\n this.iframe.contentWindow!\n );\n\n try {\n await this.bridge.connect(transport);\n this.log('Bridge connected successfully');\n } catch (error) {\n this.log('Bridge connection failed', 'error');\n if (this.options.onError) {\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n }\n throw error;\n }\n }\n\n // ============================================\n // Private: Bridge Event Handlers\n // ============================================\n\n private async handleToolCall(params: ToolCallParams) {\n if (this.options.onCallTool) {\n return await this.options.onCallTool(params);\n }\n \n if (!this.client || !this.client.isConnected()) {\n throw new Error('Client disconnected or not provided');\n }\n\n const sessionId = await this.getSessionId();\n if (!sessionId) {\n throw new Error('No active session');\n }\n\n const result = await this.client.callTool(\n sessionId,\n params.name,\n params.arguments ?? {}\n );\n return result as any;\n }\n\n private async handleOpenLink(params: { url: string }): Promise<Record<string, never>> {\n window.open(params.url, '_blank', 'noopener,noreferrer');\n return {};\n }\n\n private async handleMessage(params: AppMessageParams): Promise<Record<string, never>> {\n this.onAppMessage?.(params);\n return {};\n }\n\n // ============================================\n // Private: Resource Loading\n // ============================================\n\n private async launchSandboxedHtml(html: string, config: SandboxConfig): Promise<void> {\n const sandboxUrlString = config.url instanceof URL ? config.url.href : config.url;\n const url = new URL(sandboxUrlString, globalThis.location?.href);\n if (config.csp && Object.keys(config.csp).length > 0) {\n url.searchParams.set('csp', JSON.stringify(config.csp));\n }\n\n const { onReady } = await setupSandboxProxyIframe(this.iframe, url);\n await onReady;\n }\n\n\n private async readMcpAppHtml(uri: string): Promise<string> {\n const sessionId = await this.getSessionId();\n if (!sessionId && !this.options.onReadResource) {\n throw new Error('No active session.');\n }\n const response = await this.fetchResourceWithCache(sessionId, uri);\n if (!response?.contents?.length) {\n throw new Error(`Empty resource: ${uri}`);\n }\n \n const content = response.contents[0];\n const html = this.decodeContent(content);\n if (!html) {\n throw new Error(`Invalid content in resource: ${uri}`);\n }\n return html;\n }\n\n private async fetchResourceWithCache(sessionId: string | undefined, uri: string): Promise<ResourceResponse> {\n if (this.options.onReadResource) {\n return await this.options.onReadResource(uri);\n }\n \n if (!sessionId) {\n throw new Error('No active session');\n }\n\n if (!this.client) {\n throw new Error('No client to read resource from');\n }\n \n // Priority 1: SSEClient's built-in cache (best performance)\n if (this.hasClientCache()) {\n return (this.client as any).getOrFetchResource(sessionId, uri);\n }\n\n // Priority 2: Local preload cache\n const cached = this.resourceCache.get(uri);\n if (cached) {\n const result = await cached;\n if (result) return result;\n }\n\n // Priority 3: Direct fetch\n return this.client.readResource(sessionId, uri) as Promise<ResourceResponse>;\n }\n\n private async preloadResource(uri: string): Promise<ResourceResponse | null> {\n try {\n if (this.options.onReadResource) {\n return await this.options.onReadResource(uri);\n }\n const sessionId = await this.getSessionId();\n if (!sessionId || !this.client) return null;\n return await this.client.readResource(sessionId, uri) as ResourceResponse;\n } catch (error) {\n this.log(`Preload failed for ${uri}`, 'warn');\n return null;\n }\n }\n\n // ============================================\n // Private: Utilities\n // ============================================\n\n private async getSessionId(): Promise<string | undefined> {\n if (this.sessionId) return this.sessionId;\n if (!this.client) return undefined;\n const result = await this.client.getSessions();\n return result.sessions?.[0]?.sessionId;\n }\n\n private isMcpUri(url: string): boolean {\n return MCP_URI_SCHEMES.some(scheme => url.startsWith(scheme));\n }\n\n private hasClientCache(): boolean {\n if (!this.client) return false;\n return 'getOrFetchResource' in this.client &&\n typeof (this.client as any).getOrFetchResource === 'function';\n }\n\n private extractUiResourceUri(tool: { _meta?: unknown }): string | undefined {\n const meta = tool._meta as { ui?: { resourceUri?: string; uri?: string } } | undefined;\n if (!meta?.ui) return undefined;\n return meta.ui.resourceUri ?? meta.ui.uri;\n }\n\n private decodeContent(content: ResourceContent): string | undefined {\n if (content.blob) {\n return atob(content.blob);\n }\n return content.text;\n }\n\n private log(message: string, level: 'info' | 'warn' | 'error' = 'info'): void {\n if (!this.debug && level === 'info') return;\n\n const prefix = '[AppHost]';\n switch (level) {\n case 'warn':\n console.warn(prefix, message);\n break;\n case 'error':\n console.error(prefix, message);\n break;\n default:\n console.log(prefix, message);\n }\n }\n}\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport type { AppHostClient } from '../core/types';\nimport { AppHost, type AppHostOptions } from '../core/app-host';\n\n/**\n * Hook to host an MCP App in a React component\n *\n * Initialization is async but optimized for instant availability:\n * - Constructor runs synchronously (sandbox + bridge handler setup)\n * - Host is set in state immediately so launch() can be called right away\n * - start() is a lightweight no-op reserved for future async pre-init work\n * - The real async work (iframe load, bridge connect) happens inside launch()\n *\n * @param client - Connected SSEClient instance\n * @param iframeRef - Reference to the iframe element\n * @param options - Optional configuration\n * @returns Object containing the AppHost instance (or null) and error state\n */\nexport type UseAppHostOptions = AppHostOptions;\n\nexport function useAppHost(\n client: AppHostClient | null,\n iframeRef: React.RefObject<HTMLIFrameElement>,\n options?: UseAppHostOptions\n) {\n const [host, setHost] = useState<AppHost | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const initializingRef = useRef(false);\n\n const onMessageRef = useRef(options?.onMessage);\n useEffect(() => {\n onMessageRef.current = options?.onMessage;\n }, [options?.onMessage]);\n\n useEffect(() => {\n if (!client || !iframeRef.current || initializingRef.current) return;\n\n // Prevent double initialization in strict mode\n initializingRef.current = true;\n\n const initHost = async () => {\n try {\n // Initialize AppHost with security enforcement and options\n const appHost = new AppHost(client, iframeRef.current!, options);\n\n // Set host immediately so launch can be called\n // (launch will wait for bridge if needed)\n setHost(appHost);\n\n // Start bridge connection (this is fast, just sets up PostMessage)\n await appHost.start();\n } catch (err) {\n console.error('[useAppHost] Failed to initialize AppHost:', err);\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n initHost();\n\n return () => {\n initializingRef.current = false;\n setHost(null);\n };\n }, [client, iframeRef]);\n\n return { host, error };\n}\n","/**\n * Meta-tools — Injectable tool definitions that let the LLM discover and\n * load MCP tools on-demand, following Anthropic's Tool Search pattern.\n *\n * Instead of injecting 50+ full tool schemas into the context window, you\n * inject just these 4 meta-tools. The LLM calls them to find and load\n * only the tools it actually needs.\n *\n * Meta-tools:\n * • `mcp_search_tool_bm25` — BM25 natural language search\n * • `mcp_search_tool_regex` — Regex pattern search\n * • `mcp_get_tool_schema` — Get full inputSchema for a discovered tool\n * • `mcp_execute_tool` — Execute a discovered tool\n *\n * @packageDocumentation\n */\n\nimport type { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { ToolRouter } from './tool-router.js';\n\n// ---------------------------------------------------------------------------\n// Tool Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `mcp_search_tool_bm25` tool definition.\n *\n * This tool lets the LLM search the full catalog of available MCP tools\n * using a BM25 natural-language query. Returns tool names and descriptions\n * without the full inputSchema to save context space.\n */\nexport function createSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tool_bm25',\n description:\n 'Search the catalog of available tools using BM25 natural language ranking. ' +\n 'Returns tool names, descriptions, and server info. ' +\n 'Use this FIRST to find relevant tools before calling them. ' +\n 'Example queries: \"database query\", \"send email\", \"github pull request\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Natural language description of the capability you need.',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5, max: 20).',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_search_tool_regex` tool definition.\n * \n * Matches Anthropic's tool_search_tool_regex exactly (takes a 'query' regex pattern).\n */\nexport function createRegexSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tool_regex',\n description:\n 'Search the catalog of available tools using a Python-style regex pattern. ' +\n 'Matches against tool names, descriptions, and parameter descriptions. ' +\n 'Example patterns: \"^github_\", \"weather\", \"(?i)slack\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Regex pattern to search for (e.g., \"^get_.*_data\", \"database\").',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5, max: 20).',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_get_tool_schema` tool definition.\n *\n * After discovering tools via `mcp_search_tool_bm25` or\n * `mcp_search_tool_regex`, the LLM calls this to load the full\n * inputSchema for a specific tool so it can construct the correct\n * arguments.\n */\nexport function createGetSchemaToolDefinition(): Tool {\n return {\n name: 'mcp_get_tool_schema',\n description:\n 'Get the full input schema (parameters) for a specific tool. ' +\n 'Call this after mcp_search_tool_bm25 to get the parameter details ' +\n 'needed to call a tool correctly.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name returned by mcp_search_tool_bm25.',\n },\n serverName: {\n type: 'string',\n description:\n 'Optional: The server name provided in mcp_search_tool_bm25. Required if multiple tools have the same name.',\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n/**\n * Creates the `mcp_execute_tool` tool definition.\n *\n * This is the execution meta-tool — the LLM calls this to execute any\n * tool discovered via `mcp_search_tool_bm25` or `mcp_search_tool_regex`.\n * The LLM should first call `mcp_get_tool_schema` to know the correct\n * arguments.\n *\n * Instead of registering every real tool with the framework, we proxy\n * all execution through a single meta-tool.\n */\nexport function createExecuteToolDefinition(): Tool {\n return {\n name: 'mcp_execute_tool',\n description:\n 'Execute a tool that was discovered via mcp_search_tool_bm25. ' +\n 'You MUST call mcp_get_tool_schema first to know the correct parameters. ' +\n 'Pass the exact tool name and its arguments.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name from mcp_search_tool_bm25 results.',\n },\n serverName: {\n type: 'string',\n description:\n 'Optional: The server name provided in mcp_search_tool_bm25. Required if multiple tools have the same name.',\n },\n args: {\n type: 'object',\n description:\n \"Arguments matching the tool's inputSchema. Omit or pass {} if the tool takes no parameters.\",\n additionalProperties: true,\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Meta-tool Executors\n// ---------------------------------------------------------------------------\n\n/**\n * Callback for executing a real MCP tool via the correct client.\n * Provided by adapters that wire up client routing.\n */\nexport type CallToolFn = (\n toolName: string,\n args: Record<string, unknown>,\n namespace?: string\n) => Promise<any>;\n\n/**\n * Execute a meta-tool call and return the result in MCP CallToolResult format.\n *\n * @param toolName - One of the meta-tool names (mcp_search_tool_bm25, mcp_search_tool_regex, etc.)\n * @param args - The arguments from the LLM's tool call\n * @param router - The ToolRouter to query\n * @param callToolFn - Optional callback for executing real tools (required for mcp_execute_tool)\n * @returns MCP-compatible CallToolResult, or null if this isn't a meta-tool\n */\nexport async function executeMetaTool(\n toolName: string,\n args: Record<string, unknown>,\n router: ToolRouter,\n callToolFn?: CallToolFn\n): Promise<CallToolResult | null> {\n const resolveToolSchema = (name: string, namespace?: string): { tool?: Tool; error?: CallToolResult } => {\n try {\n return { tool: router.getToolSchema(name, namespace) };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n error: {\n content: [{ type: 'text', text: errorMessage }],\n isError: true,\n },\n };\n }\n };\n\n switch (toolName) {\n case 'mcp_search_tool_bm25': {\n const query = String(args.query ?? '');\n const limit = Math.min(Number(args.limit) || 5, 20);\n\n const results = await router.searchTools(query, limit);\n\n const text = results.length === 0\n ? 'No tools found matching your query. Try different keywords.'\n : results\n .map(\n (t, i) =>\n `${i + 1}. **${t.name}** (server: ${t.serverName})\\n` +\n ` ${t.description}\\n` +\n ` Estimated tokens: ${t.estimatedTokens}`\n )\n .join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_search_tool_regex': {\n const pattern = String(args.query ?? '');\n const limit = Math.min(Number(args.limit) || 5, 20);\n\n const results = await router.searchToolsRegex(pattern, limit);\n\n const text = results.length === 0\n ? 'No tools matched your regex pattern. Try a broader pattern.'\n : results\n .map(\n (t, i) =>\n `${i + 1}. **${t.name}** (server: ${t.serverName})\\n` +\n ` ${t.description}\\n` +\n ` Estimated tokens: ${t.estimatedTokens}`\n )\n .join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_get_tool_schema': {\n const name = String(args.toolName ?? '');\n const namespace = String(args.serverName ?? '') || undefined;\n const { tool, error } = resolveToolSchema(name, namespace);\n\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${name}\" not found. Use mcp_search_tool_bm25 to find available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n const schema = {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n };\n\n return {\n content: [{ type: 'text', text: JSON.stringify(schema, null, 2) }],\n isError: false,\n };\n }\n\n case 'mcp_execute_tool': {\n const targetToolName = String(args.toolName ?? '');\n const namespace = String(args.serverName ?? '') || undefined;\n const toolArgs = (args.args as Record<string, unknown>) ?? {};\n\n if (!targetToolName) {\n return {\n content: [{ type: 'text', text: 'Missing required parameter \"toolName\". Specify which tool to execute.' }],\n isError: true,\n };\n }\n\n // Verify the tool exists in our index\n const { tool, error } = resolveToolSchema(targetToolName, namespace);\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${targetToolName}\" not found. Use mcp_search_tool_bm25 to discover available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n if (!callToolFn) {\n return {\n content: [{ type: 'text', text: 'Tool execution is not available. No callToolFn was configured.' }],\n isError: true,\n };\n }\n\n try {\n const result = await callToolFn(targetToolName, toolArgs, namespace);\n\n // Normalize result to text\n if (result && typeof result === 'object' && 'content' in result) {\n // Already MCP CallToolResult format\n return result as CallToolResult;\n }\n\n const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `Tool execution failed: ${errorMessage}` }],\n isError: true,\n };\n }\n }\n\n default:\n return null;\n }\n}\n\n/** Check if a tool name is one of the meta-tools. */\nexport function isMetaTool(toolName: string): boolean {\n return (\n toolName === 'mcp_search_tool_bm25' ||\n toolName === 'mcp_search_tool_regex' ||\n toolName === 'mcp_get_tool_schema' ||\n toolName === 'mcp_execute_tool'\n );\n}\n\n/**\n * Unwraps a meta-tool proxy call (like mcp_execute_tool) to find the real target tool name and arguments.\n * Also automatically strips routing prefixes like tool_{serverId}_.\n * \n * Useful for frontend components that need to determine the actual tool being executed by an AI agent.\n */\nexport function resolveMetaToolProxy(\n toolName: string,\n args: Record<string, unknown> | null | undefined\n): { toolName: string; args: Record<string, unknown> } {\n // Unwrap mcp_execute_tool proxy arguments\n if (toolName === 'mcp_execute_tool') {\n const innerName = args?.toolName;\n const innerArgs = args?.args;\n return {\n toolName: typeof innerName === 'string' && innerName ? innerName : toolName,\n args: innerArgs && typeof innerArgs === 'object' && !Array.isArray(innerArgs)\n ? (innerArgs as Record<string, unknown>)\n : {},\n };\n }\n\n // Strip tool_<serverId>_ prefix used by AIAdapter\n const match = toolName.match(/(?:tool_[^_]+_)?(.+)$/);\n const resolvedName = match?.[1] ?? toolName;\n\n return { toolName: resolvedName, args: args ?? {} };\n}\n\n","/**\n * MCP Apps Hook\n *\n * Provides utilities for rendering interactive UI components from MCP servers.\n */\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n memo,\n useMemo,\n forwardRef,\n useImperativeHandle,\n type MutableRefObject,\n} from 'react';\nimport type { UseAppHostOptions } from './use-app-host.js';\nimport { useAppHost } from './use-app-host.js';\nimport { resolveMetaToolProxy } from '../../shared/meta-tools.js';\nimport type { SSEClient } from '../core/sse-client.js';\nimport { APP_HOST_DEFAULTS } from '../core/constants.js';\nimport type { SandboxConfig } from '../core/app-host.js';\n\nexport interface McpClient {\n connections: Array<{\n sessionId: string;\n tools: Array<{\n name: string;\n mcpApp?: {\n resourceUri: string;\n };\n _meta?: {\n ui?: {\n resourceUri?: string;\n };\n 'ui/resourceUri'?: string;\n };\n }>;\n }>;\n sseClient?: SSEClient | null;\n}\n\nexport interface McpAppMetadata {\n toolName: string;\n resourceUri: string;\n sessionId: string;\n}\n\n/**\n * Imperative handle for {@link useMcpApps}'s `McpAppRenderer` (via `ref`),\n * aligned with `@mcp-ui/client`'s `AppRendererHandle.teardownResource`.\n */\nexport interface McpAppRendererHandle {\n teardownResource: (params?: Record<string, unknown>) => void;\n}\n\n/** Props for {@link useMcpApps}'s `McpAppRenderer` (client is supplied via the hook). */\nexport interface McpAppRendererProps extends Pick<UseAppHostOptions, 'sandbox' | 'hostContext' | 'onCallTool' | 'onReadResource' | 'onFallbackRequest' | 'onMessage' | 'onOpenLink' | 'onLoggingMessage' | 'onSizeChanged' | 'onError'> {\n name: string;\n client?: McpClient | null;\n toolResourceUri?: string;\n html?: string;\n input?: Record<string, unknown> | null;\n result?: unknown;\n status?: 'executing' | 'inProgress' | 'complete' | 'idle';\n toolInputPartial?: any;\n toolCancelled?: boolean;\n className?: string;\n loader?: React.ReactNode;\n}\n\ntype McpAppViewProps = McpAppRendererProps & {\n /**\n * Ref avoids tying `McpAppRenderer` identity to `mcpClient`: when `connections` updates, `useMcp()` still\n * returns a new object (correct for `useEffect` deps), but the iframe must not remount.\n */\n clientRef: MutableRefObject<McpClient | null>;\n};\n\n/** Renders one MCP App in a sandboxed iframe; reads the latest client from `clientRef` each render. */\nconst McpAppViewInner = forwardRef<McpAppRendererHandle, McpAppViewProps>(function McpAppView(\n {\n clientRef,\n name,\n toolResourceUri,\n html,\n input,\n result,\n status = 'idle',\n toolInputPartial,\n toolCancelled,\n sandbox,\n hostContext,\n onCallTool,\n onReadResource,\n onFallbackRequest,\n onMessage,\n onOpenLink,\n onLoggingMessage,\n onSizeChanged,\n onError: onHostError,\n className,\n loader,\n },\n ref,\n) {\n \n const mcpClient = clientRef.current;\n const { toolName: resolvedToolName, args: resolvedInput } = resolveMetaToolProxy(name, input);\n const metadata = getMcpAppMetadata(mcpClient, resolvedToolName, resolvedInput);\n const sseClient = mcpClient?.sseClient ?? null;\n const resourceUri = toolResourceUri || metadata?.resourceUri;\n const appSessionId = metadata?.sessionId;\n\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n // Tracks the last height (px) reported by the guest before/after fullscreen so we\n // can restore it when the native fullscreen API exits and the guest fires a stale\n // resize event that would otherwise collapse the iframe to 0.\n const preFullscreenHeightRef = useRef<number | null>(null);\n const displayModeRef = useRef<'inline' | 'fullscreen'>('inline');\n const [displayMode, setDisplayMode] = useState<'inline' | 'fullscreen'>('inline');\n\n const setDisplayModeWithRef = (mode: 'inline' | 'fullscreen') => {\n displayModeRef.current = mode;\n setDisplayMode(mode);\n };\n\n const { host, error: hostError } = useAppHost(sseClient as any, iframeRef, {\n sandbox,\n hostContext,\n onCallTool,\n onReadResource,\n onFallbackRequest,\n onMessage,\n onOpenLink,\n onLoggingMessage,\n // Intercept onSizeChanged: when exiting fullscreen, ignore guest resize events\n // that arrive with the shrunken viewport dimensions, and restore the pre-fullscreen height.\n onSizeChanged: (params) => {\n if (displayModeRef.current === 'inline' && preFullscreenHeightRef.current !== null) {\n // Guest fired a resize right after fullscreen exit – restore the saved height\n const savedHeight = preFullscreenHeightRef.current;\n preFullscreenHeightRef.current = null;\n if (iframeRef.current) {\n iframeRef.current.style.height = `${savedHeight}px`;\n }\n return;\n }\n onSizeChanged?.(params);\n },\n onError: onHostError,\n onRequestDisplayMode: async (params) => {\n if (params.mode === 'fullscreen') {\n // Snapshot current iframe height so we can restore on exit\n if (iframeRef.current) {\n const h = iframeRef.current.getBoundingClientRect().height;\n if (h > 0) preFullscreenHeightRef.current = h;\n }\n try {\n if (containerRef.current?.requestFullscreen) {\n await containerRef.current.requestFullscreen();\n } else if ((containerRef.current as any)?.webkitRequestFullscreen) {\n await (containerRef.current as any).webkitRequestFullscreen();\n }\n setDisplayModeWithRef('fullscreen');\n } catch (err) {\n console.warn('[McpAppHost] requestFullscreen failed:', err);\n preFullscreenHeightRef.current = null;\n return { mode: 'inline' };\n }\n } else if (params.mode === 'inline') {\n // Eagerly restore height — don't wait for a guest onsizechange that may never arrive\n restoreHeightAfterFullscreen();\n try {\n if (document.fullscreenElement) {\n await document.exitFullscreen();\n }\n } catch (err) {}\n setDisplayModeWithRef('inline');\n }\n return { mode: params.mode };\n }\n });\n\n useImperativeHandle(\n ref,\n () => ({\n teardownResource: (params?: Record<string, unknown>) => {\n host?.teardownResource(params ?? {});\n },\n }),\n [host],\n );\n\n const [isLaunched, setIsLaunched] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const sentInputRef = useRef(false);\n const sentResultRef = useRef(false);\n const lastInputRef = useRef(resolvedInput);\n const lastResultRef = useRef(result);\n const lastStatusRef = useRef(status);\n\n useEffect(() => {\n setIsLaunched(false);\n setError(null);\n }, [resourceUri, appSessionId]);\n\n // Eagerly restore the iframe's pre-fullscreen height at every exit point.\n // The guest app may NOT fire onSizeChanged after exiting fullscreen, so we cannot\n // rely on the onSizeChanged interceptor to restore the height.\n const restoreHeightAfterFullscreen = () => {\n const savedHeight = preFullscreenHeightRef.current;\n if (savedHeight && iframeRef.current) {\n iframeRef.current.style.height = `${savedHeight}px`;\n }\n preFullscreenHeightRef.current = null;\n };\n\n useEffect(() => {\n const onFullscreenChange = () => {\n const isFullscreen = !!document.fullscreenElement;\n // Use ref to avoid stale closure (ESC key exit path)\n if (!isFullscreen && displayModeRef.current === 'fullscreen') {\n restoreHeightAfterFullscreen();\n setDisplayModeWithRef('inline');\n }\n };\n document.addEventListener('fullscreenchange', onFullscreenChange);\n return () => document.removeEventListener('fullscreenchange', onFullscreenChange);\n }, []); // stable – reads from refs only, no stale closure over state\n\n useEffect(() => {\n if (!host || (!resourceUri && !html)) return;\n\n host\n .launch({ uri: resourceUri, html }, appSessionId)\n .then(() => setIsLaunched(true))\n .catch((err) => setError(err instanceof Error ? err : new Error(String(err))));\n }, [host, resourceUri, html, appSessionId]);\n\n // Send tool inputs\n useEffect(() => {\n if (!host || !isLaunched || !resourceUri || !appSessionId || !resolvedInput) return;\n\n if (!sentInputRef.current || JSON.stringify(resolvedInput) !== JSON.stringify(lastInputRef.current)) {\n sentInputRef.current = true;\n lastInputRef.current = resolvedInput;\n host.sendToolInput(resolvedInput);\n }\n }, [host, isLaunched, resolvedInput, resourceUri, appSessionId, resolvedToolName]);\n\n useEffect(() => {\n if (!host || !isLaunched || !resourceUri || !appSessionId || result === undefined) return;\n if (status !== 'complete') return;\n\n if (!sentResultRef.current || JSON.stringify(result) !== JSON.stringify(lastResultRef.current)) {\n sentResultRef.current = true;\n lastResultRef.current = result;\n const formattedResult =\n typeof result === 'string'\n ? { content: [{ type: 'text', text: result }] }\n : result;\n host.sendToolResult(formattedResult);\n }\n }, [host, isLaunched, result, status, resourceUri, appSessionId, resolvedToolName]);\n\n useEffect(() => {\n if (status === 'executing' && lastStatusRef.current !== 'executing') {\n sentInputRef.current = false;\n sentResultRef.current = false;\n }\n lastStatusRef.current = status;\n }, [status]);\n\n useEffect(() => {\n if (!host) return;\n // Merge user-provided hostContext with our internal displayMode, then notify the guest.\n // This causes Excalidraw (and other MCP apps) to switch between inline/fullscreen UI mode.\n const mergedCtx = {\n theme: APP_HOST_DEFAULTS.THEME,\n platform: APP_HOST_DEFAULTS.PLATFORM,\n containerDimensions: { maxHeight: APP_HOST_DEFAULTS.MAX_HEIGHT },\n availableDisplayModes: ['inline', 'fullscreen'],\n ...(hostContext || {}),\n displayMode, // always override with our authoritative state\n };\n host.setHostContext(mergedCtx);\n }, [host, hostContext, displayMode]);\n\n useEffect(() => {\n if (host && toolInputPartial) host.sendToolInputPartial(toolInputPartial);\n }, [host, toolInputPartial]);\n\n useEffect(() => {\n if (host && toolCancelled) host.sendToolCancelled(\"User cancelled\");\n }, [host, toolCancelled]);\n\n if (!metadata && !html && !toolResourceUri) {\n return null;\n }\n\n const displayError = error || hostError;\n if (displayError) {\n return (\n <div className={`p-4 bg-red-900/20 border border-red-700 rounded text-red-200 ${className || ''}`}>\n Error: {displayError.message || String(displayError)}\n </div>\n );\n }\n\n const opacityClass = isLaunched ? 'opacity-100' : 'opacity-0';\n let containerClass = `w-full border border-gray-700 rounded bg-transparent my-2 relative ${className || ''}`;\n let iframeClass = `w-full transition-opacity duration-300 ${opacityClass}`;\n\n // When native fullscreen is active, the container naturally expands via the browser API.\n // We only need to satisfy flex layout so the iframe fills 100% of the fullscreen viewport.\n if (displayMode === 'fullscreen') {\n containerClass = `w-full h-full bg-black m-0 p-0 flex flex-col relative`;\n iframeClass = `w-full flex-1 transition-opacity duration-300 ${opacityClass}`;\n }\n\n return (\n <div ref={containerRef} className={containerClass}>\n {displayMode === 'fullscreen' && (\n <div className=\"absolute top-0 right-0 p-2 z-[100000] w-full bg-gradient-to-b from-black/80 to-transparent flex justify-end\">\n <button \n title=\"Exit Fullscreen\"\n onClick={() => {\n // Eagerly restore height before the browser animation completes\n restoreHeightAfterFullscreen();\n if (document.fullscreenElement) document.exitFullscreen();\n setDisplayModeWithRef('inline');\n }} \n className=\"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-white rounded-md shadow flex items-center gap-2 border border-gray-600 transition-colors\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\"/></svg>\n <span className=\"text-sm font-medium\">Exit</span>\n </button>\n </div>\n )}\n <iframe\n ref={iframeRef}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads\"\n allow=\"fullscreen\"\n className={iframeClass}\n title=\"MCP App\"\n />\n {!isLaunched && loader && (\n <div className=\"absolute inset-0 bg-transparent flex items-center justify-center pointer-events-none z-10\">\n {loader}\n </div>\n )}\n </div>\n );\n});\n\nconst McpAppView = memo(McpAppViewInner);\nMcpAppView.displayName = 'McpAppView';\n\n/**\n * Renders an interactive MCP application inside a sandboxed iframe.\n */\nexport const McpAppRenderer = memo(\n forwardRef<McpAppRendererHandle, McpAppRendererProps>(function McpAppRenderer(\n { client, ...props },\n ref\n ) {\n const clientRef = useRef(client || null);\n clientRef.current = client || null;\n\n return <McpAppView ref={ref} clientRef={clientRef} {...props} />;\n })\n);\n\n/**\n * Helpers scoped to one `mcpClient`. Pass the client here once; `McpAppRenderer` only needs per-tool props (`name`, `input`, `result`, `status`).\n *\n * @param mcpClient - From `useMcp()` or context (for example `useMcpContext()`).\n * @deprecated Use the standalone `<McpAppRenderer>` component and `getMcpAppMetadata` utility directly.\n */\nexport function useMcpApps(mcpClient: McpClient | null) {\n const getAppMetadata = useCallback(\n (toolName: string) => getMcpAppMetadata(mcpClient, toolName),\n [mcpClient]\n );\n\n const BoundMcpAppRenderer = useMemo(() => {\n const Renderer = forwardRef<McpAppRendererHandle, Omit<McpAppRendererProps, 'client'>>(\n function BoundMcpAppRenderer(props, ref) {\n return <McpAppRenderer ref={ref} client={mcpClient} {...props} />;\n }\n );\n Renderer.displayName = 'BoundMcpAppRenderer';\n return memo(Renderer);\n }, [mcpClient]);\n\n return { getAppMetadata, McpAppRenderer: BoundMcpAppRenderer };\n}\n\nfunction extractToolName(fullName: string): string {\n const match = fullName.match(/(?:tool_[^_]+_)?(.+)$/);\n return match?.[1] || fullName;\n}\n\nexport function getMcpAppMetadata(\n mcpClient: McpClient | null,\n toolName: string,\n input?: Record<string, unknown> | null\n): McpAppMetadata | undefined {\n if (!mcpClient) return undefined;\n\n const { toolName: proxyToolName } = resolveMetaToolProxy(toolName, input);\n const extractedName = extractToolName(proxyToolName);\n\n for (const conn of mcpClient.connections) {\n for (const tool of conn.tools) {\n const candidateName = extractToolName(tool.name);\n const resourceUri =\n tool.mcpApp?.resourceUri ??\n tool._meta?.ui?.resourceUri ??\n tool._meta?.['ui/resourceUri'];\n\n if (resourceUri && candidateName === extractedName) {\n return {\n toolName: candidateName,\n resourceUri,\n sessionId: conn.sessionId,\n };\n }\n }\n }\n\n return undefined;\n}\n"]}
|