UNPKG

@assistant-ui/react

Version:

Open-source TypeScript/React library for building production-grade AI chat experiences

177 lines (155 loc) • 5.03 kB
import type { McpAppMetadata, ToolCallMessagePartMcpMetadata, } from "@assistant-ui/core"; import type { SandboxHostConfig } from "../sandbox-host/SandboxHost"; export type { McpAppMetadata, ToolCallMessagePartMcpMetadata }; export const MCP_APP_MIME_TYPE = "text/html;profile=mcp-app" as const; export const MCP_APP_PROTOCOL_VERSION = "0.1" as const; export type McpAppResourceCSP = { connectDomains?: string[]; resourceDomains?: string[]; frameDomains?: string[]; baseUriDomains?: string[]; [k: string]: unknown; }; export type McpAppResourceMeta = { prefersBorder?: boolean; csp?: McpAppResourceCSP; permissions?: Record<string, unknown>; [k: string]: unknown; }; export type McpAppResource = { uri: string; mimeType: typeof MCP_APP_MIME_TYPE; html: string; meta?: McpAppResourceMeta; }; export type McpAppDisplayMode = "inline" | "fullscreen" | "pip"; export type McpAppHostContext = { theme?: "light" | "dark"; displayMode?: McpAppDisplayMode; availableDisplayModes?: McpAppDisplayMode[]; [k: string]: unknown; }; export type McpAppHostInfo = { name: string; version: string; }; /** * What `McpAppRenderer` needs from its host — the data-plane operations * the widget can request. Provided by a host resource like * `McpAppsRemoteHost`. */ export type McpAppsHost = { loadResource: (params: { uri: string; serverId?: string; }) => Promise<McpAppResource>; callTool: ( params: McpAppToolCallParams & { serverId?: string }, ) => Promise<unknown>; readResource: (params: { uri: string; serverId?: string; }) => Promise<unknown>; listResources: (params?: unknown) => Promise<unknown>; }; /** * Options for `McpAppsRemoteHost`. The host POSTs `{ method, params }` to * `url` and expects JSON responses. Params may carry `serverId` for host-side routing. Method names sent: * - `mcp-apps/read-resource` (`{ uri, serverId? }`) → `McpAppResource` * - `tools/call` (`{ name, arguments?, serverId? }`) → tool result * - `resources/read` (`{ uri, serverId? }`) → resource read result * - `resources/list` (`{ serverId?, ...params }?`) → list result */ export type McpAppsRemoteHostOptions = { url: string; fetch?: typeof fetch; headers?: | Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>); }; export type McpAppToolCallParams = { name: string; arguments?: Record<string, unknown>; }; /** * The params of the app's `ui/initialize` request, as `onInitialized` * receives them. A field that fails validation is omitted, and * `availableDisplayModes` keeps only the modes the bridge recognizes. */ export type McpAppInitializeParams = { appInfo?: { name: string; version: string; [k: string]: unknown }; appCapabilities?: { availableDisplayModes?: McpAppDisplayMode[]; [k: string]: unknown; }; protocolVersion?: string; }; export type McpAppBridgeHandlers = { allowedTools?: readonly string[]; callTool?: (params: McpAppToolCallParams) => Promise<unknown> | unknown; readResource?: (params: { uri: string }) => Promise<unknown> | unknown; listResources?: (params?: unknown) => Promise<unknown> | unknown; openLink?: (params: { url: string }) => Promise<unknown> | unknown; sendMessage?: (params: unknown) => Promise<unknown> | unknown; updateModelContext?: (params: unknown) => Promise<unknown> | unknown; requestDisplayMode?: (params: { mode: McpAppDisplayMode; }) => Promise<{ mode: McpAppDisplayMode }> | { mode: McpAppDisplayMode }; onSizeChange?: (params: { width?: number; height?: number }) => void; onInitialized?: (params: McpAppInitializeParams) => void; onRequestTeardown?: (params: unknown) => void; onLog?: (params: unknown) => void; onError?: (error: Error) => void; }; export type McpAppSandboxConfig = SandboxHostConfig; export type McpAppFrameProps = { app: McpAppMetadata; resource: McpAppResource; input?: unknown; output?: unknown; sandbox?: McpAppSandboxConfig | undefined; handlers?: McpAppBridgeHandlers | undefined; hostInfo?: McpAppHostInfo | undefined; hostContext?: McpAppHostContext | undefined; /** * Upper bound (in pixels) for the auto-resize height driven by the widget's * `notifications/size_changed`. Defaults to 800. */ maxHeight?: number | undefined; }; export type McpAppJsonRpcRequest = { jsonrpc: "2.0"; id: string | number; method: string; params?: unknown; }; export type McpAppJsonRpcNotification = { jsonrpc: "2.0"; method: string; params?: unknown; }; export type McpAppJsonRpcError = { code: number; message: string; data?: unknown; }; export type McpAppJsonRpcResponse = | { jsonrpc: "2.0"; id: string | number; result: unknown; error?: never; } | { jsonrpc: "2.0"; id: string | number; result?: never; error: McpAppJsonRpcError; }; export type McpAppJsonRpcMessage = | McpAppJsonRpcRequest | McpAppJsonRpcNotification | McpAppJsonRpcResponse;