@mcp-native/webview 0.3.0 → 0.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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # @mcp-native/webview
4
4
 
5
- ### Deny-by-default HTML policy primitives for a future MCP Apps host
5
+ ### Stable MCP Apps discovery, native sandbox, and JSON-RPC bridge
6
6
 
7
7
  [![npm](https://img.shields.io/npm/v/@mcp-native/webview)](https://www.npmjs.com/package/@mcp-native/webview)
8
8
  [![downloads](https://img.shields.io/npm/dm/@mcp-native/webview)](https://www.npmjs.com/package/@mcp-native/webview)
@@ -12,11 +12,79 @@
12
12
 
13
13
  </div>
14
14
 
15
- > **Experimental:** this package defines document validation and one policy decision. It does not mount or sandbox a platform WebView and is not a complete MCP Apps host.
15
+ > **Experimental:** this package implements the documented stable MCP Apps `2026-01-26` native
16
+ > host-adapter profile. A shipping host must map the closed descriptor into its audited platform
17
+ > WebView and lifecycle; native isolation is not equivalent to a browser's cross-origin iframe.
16
18
 
17
- `@mcp-native/webview` handles the compatibility path for MCP resources that contain HTML. It recognizes supported MIME types and rejects both inline and remote documents unless the host explicitly grants them through policy. Inline base URLs are limited to non-network `ui:` / `mcp:` schemes. Remote loads require an exact origin allowlist, accept only credential-free `http:` / `https:` URIs, and use a dedicated `{ uri, mimeType }` input rather than an MCP blob/text body.
19
+ `@mcp-native/webview` handles the compatibility path for MCP resources that contain HTML. The stable
20
+ path negotiates `io.modelcontextprotocol/ui`, discovers strict `_meta.ui` tool metadata, reads one
21
+ exact `ui://` resource with `text/html;profile=mcp-app`, preserves closed CSP and permission
22
+ metadata, builds a CSP-first native sandbox, and runs the bounded Apps JSON-RPC lifecycle. The
23
+ legacy generic helpers still recognize older HTML MIME types and reject both inline and remote
24
+ documents unless the host explicitly grants them through policy.
18
25
 
19
- Current support does not include tool `_meta.ui.resourceUri` discovery, `ui://` preloading, resource CSP or permission metadata, `ui/initialize`, AppBridge, the Apps JSON-RPC protocol, or a postMessage bridge. Those are required before this package can claim [MCP Apps](https://modelcontextprotocol.io/extensions/apps/overview) host compatibility.
26
+ The exact protocol pin, message set, bounds, exclusions, native/browser differences, and official
27
+ schema evidence are documented in the [MCP Apps compatibility
28
+ profile](https://github.com/pablospaniard/mcp-native/blob/main/docs/mcp-apps-compatibility.md).
29
+
30
+ ## Stable MCP Apps host flow
31
+
32
+ ```ts
33
+ import {
34
+ MCP_APPS_EXTENSION_CAPABILITIES,
35
+ McpAppsBridge,
36
+ createMcpAppsNativeDeliveryScript,
37
+ createMcpAppsNativeSandbox,
38
+ createMcpAppsReactNativeWebViewProps,
39
+ loadMcpAppsResource,
40
+ negotiateMcpApps,
41
+ } from "@mcp-native/webview";
42
+
43
+ const grant = negotiateMcpApps(
44
+ adapter.getClientExtensionSettings(),
45
+ adapter.getServerExtensionSettings(),
46
+ );
47
+ if (grant.kind !== "negotiated") {
48
+ // Render the tool's ordinary MCP text/structured fallback.
49
+ throw new Error(grant.reason);
50
+ }
51
+
52
+ const resource = await loadMcpAppsResource(tool, runtime, grant);
53
+ const sandbox = createMcpAppsNativeSandbox(resource); // no sensitive permissions by default
54
+
55
+ let webViewRef;
56
+ const bridge = new McpAppsBridge({
57
+ resource,
58
+ sandbox,
59
+ hostInfo: { name: "my-native-host", version: "1.0.0" },
60
+ tools,
61
+ postMessage(serialized) {
62
+ webViewRef.injectJavaScript(createMcpAppsNativeDeliveryScript(serialized));
63
+ },
64
+ handlers: {
65
+ callTool: (name, arguments_) => runtime.callTool(name, arguments_),
66
+ readResource: (uri) => runtime.readResource(uri),
67
+ openLink: async (url) => {
68
+ if (!hostPolicyAllows(url)) return false;
69
+ await openExternalUrl(url);
70
+ return true;
71
+ },
72
+ },
73
+ });
74
+
75
+ const webViewProps = createMcpAppsReactNativeWebViewProps(sandbox, {
76
+ onMessage: (message) => bridge.receive(message),
77
+ onExternalLink: openExternalUrl,
78
+ onError: reportMcpAppsHostError,
79
+ });
80
+ ```
81
+
82
+ Advertise `MCP_APPS_EXTENSION_CAPABILITIES` through `createMcpNativeClientOptions()` and pass the
83
+ same snapshot into the SDK adapter. Capabilities are not inferred from the tool or resource MIME
84
+ type. The bridge advertises View-facing host features only when the matching host callback exists.
85
+ The native adapter requires `onError` so rejected message and external-link callbacks remain inside
86
+ the host's controlled error boundary. Bridge work is capped at 128 concurrent inbound messages, and
87
+ exactly-once tool lifecycle sends are serialized across asynchronous transports.
20
88
 
21
89
  ## Install
22
90
 
@@ -73,27 +141,32 @@ Remote inputs are `{ uri, mimeType }` references (not MCP text/blob resource bod
73
141
 
74
142
  ## Public API
75
143
 
76
- | Export | Purpose |
77
- | ----------------------- | ----------------------------------------------------------------------------------------- |
78
- | `isHtmlResource` | Returns whether a resource declares a supported HTML MIME type. |
79
- | `createWebViewDocument` | Validates a text or remote HTML input and returns a policy-approved document descriptor. |
80
- | `WebViewDocumentInput` | `McpTextResourceContents` or `{ uri, mimeType }` remote reference (never blob resources). |
81
- | `WebViewRemoteResource` | Remote HTML reference without a resource body. |
82
- | `WebViewPolicy` | Host policy for inline opt-in, remote opt-in, and remote origin allowlists. |
83
- | `WebViewDocument` | Discriminated union for inline and remote documents. |
84
- | `WebViewPolicyError` | Error thrown for unsupported MIME types, schemes, credentials, or denied documents. |
85
-
86
- Supported MIME types are `text/html` and `text/html+skybridge`.
144
+ | Export | Purpose |
145
+ | ------------------------------------------------------------ | ------------------------------------------------------------------------------- |
146
+ | `MCP_APPS_EXTENSION_CAPABILITIES` | Exact stable extension settings for SDK advertisement and negotiation. |
147
+ | `negotiateMcpApps` / `isMcpAppsGrant` | Require explicit mutual support before the stable resource path. |
148
+ | `parseMcpAppsToolMeta` / `filterMcpAppsModelTools` | Validate discovery and enforce model/app visibility. |
149
+ | `loadMcpAppsResource` / `resolveMcpAppsResource` | Read and validate one exact stable text/blob resource and metadata. |
150
+ | `createMcpAppsNativeSandbox` | Build the closed CSP, navigation, storage, permission, and document descriptor. |
151
+ | `createMcpAppsReactNativeWebViewProps` | Select an explicit safe subset for a locally bundled React Native WebView. |
152
+ | `createMcpAppsNativeDeliveryScript` | Deliver JSON data through the fixed local native bridge shim. |
153
+ | `McpAppsBridge` | Run the bounded stable View/host JSON-RPC lifecycle. |
154
+ | `isHtmlResource` / `createWebViewDocument` | Legacy generic HTML detection and deny-by-default document policy. |
155
+ | `McpAppsError` / `McpAppsBridgeError` / `WebViewPolicyError` | Controlled validation and policy failures. |
156
+
157
+ The stable Apps path accepts only `text/html;profile=mcp-app`. The separate generic helpers support
158
+ `text/html` and `text/html+skybridge`; those MIME types never negotiate or resolve a stable App.
87
159
 
88
160
  ## Host responsibilities
89
161
 
90
- Returning a `WebViewDocument` is not permission to render it without further controls. A production host must still define:
162
+ Returning a `WebViewDocument` or sandbox descriptor is not permission to weaken platform controls.
163
+ A production host must still verify:
91
164
 
92
165
  - allowed origins and navigation rules;
93
- - bridge message schemas and directionality;
94
- - storage, cookie, download, and external-link policy;
95
- - camera, microphone, location, clipboard, and filesystem permissions;
96
- - process isolation and platform-specific WebView hardening.
166
+ - ephemeral website data and cookie/process-pool isolation on each supported OS version;
167
+ - native download, permission, safe-browsing, custom-scheme, and teardown delegates;
168
+ - that every descriptor field maps to the intended locally bundled WebView implementation; and
169
+ - user approval before any sensitive device capability or external effect.
97
170
 
98
171
  See the repository's [security policy](https://github.com/pablospaniard/mcp-native/blob/main/SECURITY.md) before expanding this boundary. Install [`mcp-native`](https://www.npmjs.com/package/mcp-native) for the combined runtime and UI APIs.
99
172
 
package/dist/apps.d.ts ADDED
@@ -0,0 +1,82 @@
1
+ import type { JsonObject, McpExtensionSettings, McpReadResourceResult, McpTool } from "@mcp-native/core";
2
+ /** Stable MCP Apps extension identifier. */
3
+ export declare const MCP_APPS_EXTENSION_ID: "io.modelcontextprotocol/ui";
4
+ /** Stable MCP Apps protocol revision implemented by this package. */
5
+ export declare const MCP_APPS_PROTOCOL_VERSION: "2026-01-26";
6
+ /** The only resource media type in the stable MCP Apps profile. */
7
+ export declare const MCP_APPS_MIME_TYPE: "text/html;profile=mcp-app";
8
+ /** Maximum decoded HTML accepted from one Apps resource. */
9
+ export declare const MCP_APPS_MAX_HTML_LENGTH = 2097152;
10
+ /** Maximum number of origins accepted across one resource CSP. */
11
+ export declare const MCP_APPS_MAX_CSP_DOMAINS = 64;
12
+ /** Maximum number of bridge-visible tools retained for one Apps view. */
13
+ export declare const MCP_APPS_MAX_TOOLS = 1024;
14
+ /** Reuse this exact map for SDK advertisement and stable Apps negotiation. */
15
+ export declare const MCP_APPS_EXTENSION_CAPABILITIES: McpExtensionSettings;
16
+ export type McpAppsNegotiation = {
17
+ readonly kind: "fallback";
18
+ readonly identifier: typeof MCP_APPS_EXTENSION_ID;
19
+ readonly reason: "client-unsupported" | "server-unsupported" | "incompatible-settings";
20
+ } | {
21
+ readonly kind: "negotiated";
22
+ readonly identifier: typeof MCP_APPS_EXTENSION_ID;
23
+ readonly protocolVersion: typeof MCP_APPS_PROTOCOL_VERSION;
24
+ readonly mimeType: typeof MCP_APPS_MIME_TYPE;
25
+ };
26
+ export type McpAppsGrant = Extract<McpAppsNegotiation, {
27
+ kind: "negotiated";
28
+ }>;
29
+ /** Negotiates the stable HTML profile only when both peers explicitly declare it. */
30
+ export declare function negotiateMcpApps(clientExtensions: unknown, serverExtensions: unknown): McpAppsNegotiation;
31
+ export declare function isMcpAppsGrant(value: unknown): value is McpAppsGrant;
32
+ export type McpAppsToolVisibility = "app" | "model";
33
+ export interface McpAppsToolMeta {
34
+ readonly resourceUri?: string;
35
+ readonly visibility: readonly McpAppsToolVisibility[];
36
+ }
37
+ /** Parses stable `_meta.ui` discovery data without treating metadata as authority. */
38
+ export declare function parseMcpAppsToolMeta(tool: McpTool): McpAppsToolMeta | undefined;
39
+ /** Applies the stable visibility rule before tools are exposed to an agent. */
40
+ export declare function filterMcpAppsModelTools(tools: readonly McpTool[]): readonly McpTool[];
41
+ /** Returns whether a tool may be called by a View on this same server connection. */
42
+ export declare function isMcpAppsToolCallableByApp(tool: McpTool): boolean;
43
+ export interface McpAppsResourceCsp {
44
+ readonly connectDomains?: readonly string[];
45
+ readonly resourceDomains?: readonly string[];
46
+ readonly frameDomains?: readonly string[];
47
+ readonly baseUriDomains?: readonly string[];
48
+ }
49
+ export type McpAppsPermission = "camera" | "clipboardWrite" | "geolocation" | "microphone";
50
+ export interface McpAppsResourcePermissions {
51
+ readonly camera?: JsonObject;
52
+ readonly microphone?: JsonObject;
53
+ readonly geolocation?: JsonObject;
54
+ readonly clipboardWrite?: JsonObject;
55
+ }
56
+ export interface McpAppsResourceMeta {
57
+ readonly csp?: McpAppsResourceCsp;
58
+ readonly permissions?: McpAppsResourcePermissions;
59
+ readonly domain?: string;
60
+ readonly prefersBorder?: boolean;
61
+ }
62
+ export interface McpAppsResource {
63
+ readonly uri: string;
64
+ readonly mimeType: typeof MCP_APPS_MIME_TYPE;
65
+ readonly html: string;
66
+ readonly meta: McpAppsResourceMeta;
67
+ }
68
+ export interface McpAppsResourceReader {
69
+ readResource(uri: string): Promise<McpReadResourceResult>;
70
+ }
71
+ /** Reads the predeclared `ui://` resource and resolves the stable Apps profile. */
72
+ export declare function loadMcpAppsResource(tool: McpTool, reader: McpAppsResourceReader, grant: McpAppsGrant): Promise<McpAppsResource>;
73
+ /**
74
+ * Resolves one predeclared stable Apps resource from a tool and read result.
75
+ * Exactly one matching resource is required so a server cannot create selection ambiguity.
76
+ */
77
+ export declare function resolveMcpAppsResource(tool: McpTool, readResult: McpReadResourceResult, grant: McpAppsGrant): McpAppsResource;
78
+ /** Controlled error for stable Apps discovery, resources, sandboxing, and bridge input. */
79
+ export declare class McpAppsError extends Error {
80
+ constructor(message: string, options?: ErrorOptions);
81
+ }
82
+ //# sourceMappingURL=apps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../src/apps.ts"],"names":[],"mappings":"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"}
package/dist/apps.js ADDED
@@ -0,0 +1,381 @@
1
+ import { JSON_MAX_STRING_LENGTH, negotiateMcpExtension, parseJsonObject } from "@mcp-native/core";
2
+ /** Stable MCP Apps extension identifier. */
3
+ export const MCP_APPS_EXTENSION_ID = "io.modelcontextprotocol/ui";
4
+ /** Stable MCP Apps protocol revision implemented by this package. */
5
+ export const MCP_APPS_PROTOCOL_VERSION = "2026-01-26";
6
+ /** The only resource media type in the stable MCP Apps profile. */
7
+ export const MCP_APPS_MIME_TYPE = "text/html;profile=mcp-app";
8
+ /** Maximum decoded HTML accepted from one Apps resource. */
9
+ export const MCP_APPS_MAX_HTML_LENGTH = 2_097_152;
10
+ /** Maximum number of origins accepted across one resource CSP. */
11
+ export const MCP_APPS_MAX_CSP_DOMAINS = 64;
12
+ /** Maximum number of bridge-visible tools retained for one Apps view. */
13
+ export const MCP_APPS_MAX_TOOLS = 1_024;
14
+ const mcpAppsMimeTypes = Object.freeze([MCP_APPS_MIME_TYPE]);
15
+ const mcpAppsSettings = Object.freeze({ mimeTypes: mcpAppsMimeTypes });
16
+ /** Reuse this exact map for SDK advertisement and stable Apps negotiation. */
17
+ export const MCP_APPS_EXTENSION_CAPABILITIES = Object.freeze({
18
+ [MCP_APPS_EXTENSION_ID]: mcpAppsSettings,
19
+ });
20
+ /** Negotiates the stable HTML profile only when both peers explicitly declare it. */
21
+ export function negotiateMcpApps(clientExtensions, serverExtensions) {
22
+ const negotiation = negotiateMcpExtension(MCP_APPS_EXTENSION_ID, clientExtensions, serverExtensions);
23
+ if (negotiation.kind === "fallback") {
24
+ return { ...negotiation, identifier: MCP_APPS_EXTENSION_ID };
25
+ }
26
+ if (!supportsStableAppsMimeType(negotiation.clientSettings) ||
27
+ !supportsStableAppsMimeType(negotiation.serverSettings)) {
28
+ return {
29
+ kind: "fallback",
30
+ identifier: MCP_APPS_EXTENSION_ID,
31
+ reason: "incompatible-settings",
32
+ };
33
+ }
34
+ return {
35
+ kind: "negotiated",
36
+ identifier: MCP_APPS_EXTENSION_ID,
37
+ protocolVersion: MCP_APPS_PROTOCOL_VERSION,
38
+ mimeType: MCP_APPS_MIME_TYPE,
39
+ };
40
+ }
41
+ export function isMcpAppsGrant(value) {
42
+ if (!isPlainObject(value)) {
43
+ return false;
44
+ }
45
+ return (Object.keys(value).length === 4 &&
46
+ value.kind === "negotiated" &&
47
+ value.identifier === MCP_APPS_EXTENSION_ID &&
48
+ value.protocolVersion === MCP_APPS_PROTOCOL_VERSION &&
49
+ value.mimeType === MCP_APPS_MIME_TYPE);
50
+ }
51
+ /** Parses stable `_meta.ui` discovery data without treating metadata as authority. */
52
+ export function parseMcpAppsToolMeta(tool) {
53
+ const uiValue = tool["_meta"]?.ui;
54
+ if (uiValue === undefined) {
55
+ return undefined;
56
+ }
57
+ const ui = expectObject(uiValue, `tool ${JSON.stringify(tool.name)}._meta.ui`);
58
+ expectOnlyKeys(ui, ["resourceUri", "visibility"], `tool ${JSON.stringify(tool.name)}._meta.ui`);
59
+ const resourceUri = ui.resourceUri === undefined
60
+ ? undefined
61
+ : expectUiUri(ui.resourceUri, `tool ${JSON.stringify(tool.name)}._meta.ui.resourceUri`);
62
+ const visibility = ui.visibility === undefined
63
+ ? ["model", "app"]
64
+ : parseVisibility(ui.visibility, `tool ${JSON.stringify(tool.name)}._meta.ui.visibility`);
65
+ return {
66
+ ...(resourceUri === undefined ? {} : { resourceUri }),
67
+ visibility,
68
+ };
69
+ }
70
+ /** Applies the stable visibility rule before tools are exposed to an agent. */
71
+ export function filterMcpAppsModelTools(tools) {
72
+ assertToolCount(tools);
73
+ return tools.filter((tool) => {
74
+ const meta = parseMcpAppsToolMeta(tool);
75
+ return meta === undefined || meta.visibility.includes("model");
76
+ });
77
+ }
78
+ /** Returns whether a tool may be called by a View on this same server connection. */
79
+ export function isMcpAppsToolCallableByApp(tool) {
80
+ return parseMcpAppsToolMeta(tool)?.visibility.includes("app") ?? true;
81
+ }
82
+ /** Reads the predeclared `ui://` resource and resolves the stable Apps profile. */
83
+ export async function loadMcpAppsResource(tool, reader, grant) {
84
+ const toolMeta = parseMcpAppsToolMeta(tool);
85
+ if (toolMeta?.resourceUri === undefined) {
86
+ throw new McpAppsError(`Tool ${JSON.stringify(tool.name)} does not declare _meta.ui.resourceUri`);
87
+ }
88
+ return resolveMcpAppsResource(tool, await reader.readResource(toolMeta.resourceUri), grant);
89
+ }
90
+ /**
91
+ * Resolves one predeclared stable Apps resource from a tool and read result.
92
+ * Exactly one matching resource is required so a server cannot create selection ambiguity.
93
+ */
94
+ export function resolveMcpAppsResource(tool, readResult, grant) {
95
+ if (!isMcpAppsGrant(grant)) {
96
+ throw new McpAppsError("Stable MCP Apps resource resolution requires a negotiated grant");
97
+ }
98
+ const toolMeta = parseMcpAppsToolMeta(tool);
99
+ if (toolMeta?.resourceUri === undefined) {
100
+ throw new McpAppsError(`Tool ${JSON.stringify(tool.name)} does not declare _meta.ui.resourceUri`);
101
+ }
102
+ if (readResult.contents.length !== 1) {
103
+ throw new McpAppsError(`Expected exactly one resource for ${toolMeta.resourceUri}, received ${readResult.contents.length}`);
104
+ }
105
+ const resource = readResult.contents[0];
106
+ if (resource.uri !== toolMeta.resourceUri) {
107
+ throw new McpAppsError(`Expected resource URI ${toolMeta.resourceUri}, received ${JSON.stringify(resource.uri)}`);
108
+ }
109
+ if (resource.mimeType !== MCP_APPS_MIME_TYPE) {
110
+ throw new McpAppsError(`Expected MCP Apps MIME type ${MCP_APPS_MIME_TYPE}, received ${JSON.stringify(resource.mimeType)}`);
111
+ }
112
+ return {
113
+ uri: expectUiUri(resource.uri, "resource.uri"),
114
+ mimeType: MCP_APPS_MIME_TYPE,
115
+ html: decodeResourceHtml(resource),
116
+ meta: parseResourceMeta(resource["_meta"]),
117
+ };
118
+ }
119
+ /** Controlled error for stable Apps discovery, resources, sandboxing, and bridge input. */
120
+ export class McpAppsError extends Error {
121
+ constructor(message, options) {
122
+ super(message, options);
123
+ this.name = "McpAppsError";
124
+ }
125
+ }
126
+ function supportsStableAppsMimeType(settings) {
127
+ const mimeTypes = settings.mimeTypes;
128
+ if (!Array.isArray(mimeTypes) || mimeTypes.length === 0 || mimeTypes.length > 16) {
129
+ return false;
130
+ }
131
+ return (mimeTypes.every((value) => typeof value === "string") && mimeTypes.includes(MCP_APPS_MIME_TYPE));
132
+ }
133
+ function parseVisibility(value, path) {
134
+ if (!Array.isArray(value) || value.length > 2) {
135
+ throw new McpAppsError(`Expected an array of at most two visibility values at ${path}`);
136
+ }
137
+ const result = [];
138
+ for (const [index, item] of value.entries()) {
139
+ if (item !== "model" && item !== "app") {
140
+ throw new McpAppsError(`Expected "model" or "app" at ${path}[${index}]`);
141
+ }
142
+ if (result.includes(item)) {
143
+ throw new McpAppsError(`Duplicate visibility ${JSON.stringify(item)} at ${path}[${index}]`);
144
+ }
145
+ result.push(item);
146
+ }
147
+ return result;
148
+ }
149
+ function parseResourceMeta(metaValue) {
150
+ if (metaValue === undefined || metaValue.ui === undefined) {
151
+ return {};
152
+ }
153
+ const ui = expectObject(metaValue.ui, "resource._meta.ui");
154
+ expectOnlyKeys(ui, ["csp", "permissions", "domain", "prefersBorder"], "resource._meta.ui");
155
+ const csp = ui.csp === undefined ? undefined : parseCsp(ui.csp);
156
+ const permissions = ui.permissions === undefined ? undefined : parsePermissions(ui.permissions);
157
+ const domain = optionalBoundedString(ui.domain, "resource._meta.ui.domain");
158
+ const prefersBorder = optionalBoolean(ui.prefersBorder, "resource._meta.ui.prefersBorder");
159
+ return {
160
+ ...(csp === undefined ? {} : { csp }),
161
+ ...(permissions === undefined ? {} : { permissions }),
162
+ ...(domain === undefined ? {} : { domain }),
163
+ ...(prefersBorder === undefined ? {} : { prefersBorder }),
164
+ };
165
+ }
166
+ function parseCsp(value) {
167
+ const csp = expectObject(value, "resource._meta.ui.csp");
168
+ expectOnlyKeys(csp, ["connectDomains", "resourceDomains", "frameDomains", "baseUriDomains"], "resource._meta.ui.csp");
169
+ const result = {};
170
+ let totalDomains = 0;
171
+ for (const key of [
172
+ "connectDomains",
173
+ "resourceDomains",
174
+ "frameDomains",
175
+ "baseUriDomains",
176
+ ]) {
177
+ const domains = csp[key];
178
+ if (domains === undefined) {
179
+ continue;
180
+ }
181
+ if (!Array.isArray(domains)) {
182
+ throw new McpAppsError(`Expected an array at resource._meta.ui.csp.${key}`);
183
+ }
184
+ totalDomains += domains.length;
185
+ if (totalDomains > MCP_APPS_MAX_CSP_DOMAINS) {
186
+ throw new McpAppsError(`Resource CSP exceeds ${MCP_APPS_MAX_CSP_DOMAINS} cumulative domains`);
187
+ }
188
+ result[key] = domains.map((domain, index) => parseCspSource(domain, key, `resource._meta.ui.csp.${key}[${index}]`));
189
+ }
190
+ return result;
191
+ }
192
+ function parsePermissions(value) {
193
+ const permissions = expectObject(value, "resource._meta.ui.permissions");
194
+ expectOnlyKeys(permissions, ["camera", "microphone", "geolocation", "clipboardWrite"], "resource._meta.ui.permissions");
195
+ const result = {};
196
+ for (const permission of ["camera", "microphone", "geolocation", "clipboardWrite"]) {
197
+ if (permissions[permission] !== undefined) {
198
+ const settings = parseJsonObject(permissions[permission], `resource._meta.ui.permissions.${permission}`);
199
+ if (Object.keys(settings).length !== 0) {
200
+ throw new McpAppsError(`Expected an empty object at resource._meta.ui.permissions.${permission}`);
201
+ }
202
+ Object.defineProperty(result, permission, {
203
+ value: settings,
204
+ enumerable: true,
205
+ configurable: true,
206
+ writable: true,
207
+ });
208
+ }
209
+ }
210
+ return result;
211
+ }
212
+ function decodeResourceHtml(resource) {
213
+ const html = "text" in resource ? resource.text : decodeBase64Utf8(resource.blob);
214
+ if (html.length > MCP_APPS_MAX_HTML_LENGTH) {
215
+ throw new McpAppsError(`MCP Apps HTML exceeds maximum length of ${MCP_APPS_MAX_HTML_LENGTH}`);
216
+ }
217
+ if (html.includes("\0")) {
218
+ throw new McpAppsError("MCP Apps HTML must not contain NUL characters");
219
+ }
220
+ return html;
221
+ }
222
+ function decodeBase64Utf8(value) {
223
+ if (value.length === 0 ||
224
+ value.length % 4 !== 0 ||
225
+ value.length > Math.ceil((MCP_APPS_MAX_HTML_LENGTH * 4) / 3) + 4 ||
226
+ !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value)) {
227
+ throw new McpAppsError("Invalid base64 MCP Apps HTML resource");
228
+ }
229
+ const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
230
+ const bytes = [];
231
+ for (let index = 0; index < value.length; index += 4) {
232
+ const a = alphabet.indexOf(value[index]);
233
+ const b = alphabet.indexOf(value[index + 1]);
234
+ const c = value[index + 2] === "=" ? 0 : alphabet.indexOf(value[index + 2]);
235
+ const d = value[index + 3] === "=" ? 0 : alphabet.indexOf(value[index + 3]);
236
+ bytes.push((a << 2) | (b >> 4));
237
+ if (value[index + 2] !== "=")
238
+ bytes.push(((b & 15) << 4) | (c >> 2));
239
+ if (value[index + 3] !== "=")
240
+ bytes.push(((c & 3) << 6) | d);
241
+ if (bytes.length > MCP_APPS_MAX_HTML_LENGTH * 4) {
242
+ throw new McpAppsError("Decoded MCP Apps HTML exceeds its byte budget");
243
+ }
244
+ }
245
+ return decodeUtf8(bytes);
246
+ }
247
+ function decodeUtf8(bytes) {
248
+ let result = "";
249
+ for (let index = 0; index < bytes.length;) {
250
+ const first = bytes[index];
251
+ let codePoint;
252
+ let length;
253
+ if (first <= 0x7f) {
254
+ codePoint = first;
255
+ length = 1;
256
+ }
257
+ else if (first >= 0xc2 && first <= 0xdf) {
258
+ codePoint = first & 0x1f;
259
+ length = 2;
260
+ }
261
+ else if (first >= 0xe0 && first <= 0xef) {
262
+ codePoint = first & 0x0f;
263
+ length = 3;
264
+ }
265
+ else if (first >= 0xf0 && first <= 0xf4) {
266
+ codePoint = first & 0x07;
267
+ length = 4;
268
+ }
269
+ else {
270
+ throw new McpAppsError("MCP Apps blob is not valid UTF-8");
271
+ }
272
+ if (index + length > bytes.length) {
273
+ throw new McpAppsError("MCP Apps blob ends in an incomplete UTF-8 sequence");
274
+ }
275
+ for (let offset = 1; offset < length; offset += 1) {
276
+ const continuation = bytes[index + offset];
277
+ if (continuation < 0x80 || continuation > 0xbf) {
278
+ throw new McpAppsError("MCP Apps blob contains invalid UTF-8 continuation bytes");
279
+ }
280
+ codePoint = (codePoint << 6) | (continuation & 0x3f);
281
+ }
282
+ if ((length === 3 && codePoint < 0x800) ||
283
+ (length === 4 && codePoint < 0x10000) ||
284
+ (codePoint >= 0xd800 && codePoint <= 0xdfff) ||
285
+ codePoint > 0x10ffff) {
286
+ throw new McpAppsError("MCP Apps blob contains a non-canonical UTF-8 sequence");
287
+ }
288
+ result += String.fromCodePoint(codePoint);
289
+ if (result.length > MCP_APPS_MAX_HTML_LENGTH) {
290
+ throw new McpAppsError(`MCP Apps HTML exceeds maximum length of ${MCP_APPS_MAX_HTML_LENGTH}`);
291
+ }
292
+ index += length;
293
+ }
294
+ return result;
295
+ }
296
+ function parseCspSource(value, kind, path) {
297
+ const source = expectBoundedString(value, path);
298
+ if (/\s|[;,'"`]/u.test(source)) {
299
+ throw new McpAppsError(`Invalid CSP source at ${path}`);
300
+ }
301
+ const wildcard = source.includes("*.");
302
+ if (wildcard && !/^https?:\/\/\*\.[A-Za-z0-9.-]+(?::[0-9]+)?$/.test(source)) {
303
+ throw new McpAppsError(`Invalid wildcard CSP source at ${path}`);
304
+ }
305
+ const parsable = wildcard ? source.replace("*.", "wildcard.") : source;
306
+ const url = parseUrl(parsable, path);
307
+ const allowedSchemes = kind === "connectDomains" ? ["http:", "https:", "ws:", "wss:"] : ["http:", "https:"];
308
+ if (!allowedSchemes.includes(url.protocol) || url.hostname.length === 0) {
309
+ throw new McpAppsError(`Unsupported CSP source scheme at ${path}`);
310
+ }
311
+ if (url.username.length > 0 || url.password.length > 0 || url.origin !== parsable) {
312
+ throw new McpAppsError(`CSP sources must be exact origins at ${path}`);
313
+ }
314
+ return source;
315
+ }
316
+ function expectUiUri(value, path) {
317
+ const uri = expectBoundedString(value, path);
318
+ const url = parseUrl(uri, path);
319
+ if (url.protocol !== "ui:" || url.username.length > 0 || url.password.length > 0) {
320
+ throw new McpAppsError(`Expected a credential-free ui:// URI at ${path}`);
321
+ }
322
+ return uri;
323
+ }
324
+ function parseUrl(value, path) {
325
+ const URLParser = globalThis.URL;
326
+ if (URLParser === undefined) {
327
+ throw new McpAppsError("URL parsing is unavailable in this runtime");
328
+ }
329
+ try {
330
+ return new URLParser(value);
331
+ }
332
+ catch (error) {
333
+ throw new McpAppsError(`Invalid URI at ${path}`, { cause: error });
334
+ }
335
+ }
336
+ function assertToolCount(tools) {
337
+ if (tools.length > MCP_APPS_MAX_TOOLS) {
338
+ throw new McpAppsError(`Tool list exceeds maximum length of ${MCP_APPS_MAX_TOOLS}`);
339
+ }
340
+ }
341
+ function isPlainObject(value) {
342
+ if (value === null || typeof value !== "object" || Array.isArray(value))
343
+ return false;
344
+ const prototype = Object.getPrototypeOf(value);
345
+ return prototype === Object.prototype || prototype === null;
346
+ }
347
+ function expectObject(value, path) {
348
+ if (!isPlainObject(value)) {
349
+ throw new McpAppsError(`Expected an object at ${path}`);
350
+ }
351
+ return value;
352
+ }
353
+ function expectOnlyKeys(value, keys, path) {
354
+ const allowed = new Set(keys);
355
+ for (const key of Object.keys(value)) {
356
+ if (!allowed.has(key)) {
357
+ throw new McpAppsError(`Unsupported field ${JSON.stringify(key)} at ${path}`);
358
+ }
359
+ }
360
+ }
361
+ function expectBoundedString(value, path) {
362
+ if (typeof value !== "string") {
363
+ throw new McpAppsError(`Expected a string at ${path}`);
364
+ }
365
+ if (value.length === 0 || value.length > JSON_MAX_STRING_LENGTH) {
366
+ throw new McpAppsError(`Expected a non-empty bounded string at ${path}`);
367
+ }
368
+ return value;
369
+ }
370
+ function optionalBoundedString(value, path) {
371
+ return value === undefined ? undefined : expectBoundedString(value, path);
372
+ }
373
+ function optionalBoolean(value, path) {
374
+ if (value === undefined)
375
+ return undefined;
376
+ if (typeof value !== "boolean") {
377
+ throw new McpAppsError(`Expected a boolean at ${path}`);
378
+ }
379
+ return value;
380
+ }
381
+ //# sourceMappingURL=apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.js","sourceRoot":"","sources":["../src/apps.ts"],"names":[],"mappings":"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"}