@mcp-native/a2ui 0.0.2 → 0.1.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
@@ -1,3 +1,139 @@
1
+ <div align="center">
2
+
1
3
  # @mcp-native/a2ui
2
4
 
3
- Validated A2UI surface parsing and bindings for MCP Native.
5
+ ### Strict parsing for declarative MCP Native surfaces
6
+
7
+ [![npm](https://img.shields.io/npm/v/@mcp-native/a2ui)](https://www.npmjs.com/package/@mcp-native/a2ui)
8
+ [![downloads](https://img.shields.io/npm/dm/@mcp-native/a2ui)](https://www.npmjs.com/package/@mcp-native/a2ui)
9
+ [![license](https://img.shields.io/npm/l/@mcp-native/a2ui)](https://github.com/pablospaniard/mcp-native/blob/main/LICENSE)
10
+
11
+ [GitHub](https://github.com/pablospaniard/mcp-native) · [Architecture](https://github.com/pablospaniard/mcp-native/blob/main/docs/RFC-0001-architecture.md) · [Standards status](https://github.com/pablospaniard/mcp-native/blob/main/docs/standards-compatibility.md) · [Security](https://github.com/pablospaniard/mcp-native/blob/main/SECURITY.md)
12
+
13
+ </div>
14
+
15
+ > **Experimental:** this package implements MCP Native's deliberately small internal `0.1` proof-of-concept surface. `0.1` is not an A2UI protocol version, and this package does not currently claim A2UI v1.0 compatibility.
16
+
17
+ `@mcp-native/a2ui` resolves explicitly typed resource links and parses untrusted JSON or JavaScript values into a validated, typed surface before a host renders anything. Unknown or ambiguous resources fail with `A2uiResourceError`; unknown versions, node types, action types, non-plain objects, oversized trees, and invalid JSON values fail with `A2uiParseError`. Surfaces are capped at `A2UI_MAX_DEPTH` (32) and `A2UI_MAX_NODES` (256).
18
+
19
+ ## Install
20
+
21
+ ```bash
22
+ npm install @mcp-native/a2ui
23
+ ```
24
+
25
+ `@mcp-native/core` is installed as a dependency. The package is ESM-only and includes TypeScript declarations.
26
+
27
+ ## Quick start
28
+
29
+ ```ts
30
+ import { parseA2uiSurface } from "@mcp-native/a2ui";
31
+
32
+ const surface = parseA2uiSurface({
33
+ version: "0.1",
34
+ root: {
35
+ id: "welcome",
36
+ type: "container",
37
+ children: [
38
+ { id: "title", type: "text", text: "Welcome" },
39
+ {
40
+ id: "name",
41
+ type: "text-input",
42
+ label: "Display name",
43
+ binding: "profile.displayName",
44
+ },
45
+ {
46
+ id: "save",
47
+ type: "button",
48
+ label: "Save",
49
+ action: {
50
+ type: "tool",
51
+ name: "save_profile",
52
+ arguments: { source: "onboarding" },
53
+ },
54
+ },
55
+ ],
56
+ },
57
+ });
58
+ ```
59
+
60
+ The parser also accepts a JSON string:
61
+
62
+ ```ts
63
+ const surface = parseA2uiSurface(
64
+ '{"version":"0.1","root":{"id":"title","type":"text","text":"Hello"}}',
65
+ );
66
+ ```
67
+
68
+ ## Resolve a tool-result resource
69
+
70
+ An MCP tool may return a `resource_link` for a declarative surface. Pass the connected runtime or any `A2uiResourceReader` to the resolver:
71
+
72
+ ```ts
73
+ import { resolveA2uiResourceFromToolResult } from "@mcp-native/a2ui";
74
+
75
+ const toolResult = await runtime.callTool("open_profile");
76
+ const resolved = await resolveA2uiResourceFromToolResult(runtime, toolResult);
77
+
78
+ console.log(resolved.uri);
79
+ console.log(resolved.surface.root);
80
+ ```
81
+
82
+ Resolution succeeds only when:
83
+
84
+ 1. the tool result is not marked as an error;
85
+ 2. it contains exactly one `resource_link` with MIME type `application/a2ui+json`;
86
+ 3. `resources/read` returns exactly one item with the same URI and MIME type;
87
+ 4. that item contains text, not a blob;
88
+ 5. the text passes `parseA2uiSurface`.
89
+
90
+ Other tool content and non-A2UI resource links may coexist with the surface link. MCP Native never guesses a MIME type or chooses between multiple matching surfaces.
91
+
92
+ The prototype's `application/a2ui+json` resource convention comes from earlier A2UI-over-MCP work. The [A2UI v1.0 Candidate protocol](https://github.com/a2ui-project/a2ui/blob/7541f953050cd58b80f0bf5d85fe2d63192af305/specification/v1_0/docs/a2ui_protocol.md) is transport-agnostic and uses a stream of `v1.0` envelopes. Recognizing this media type does not establish v1.0 conformance.
93
+
94
+ The next protocol milestone will parse official v1.0 envelopes and schemas into an internal trusted render plan. It will not evolve the custom `0.1` object into a competing wire protocol. See the [compatibility matrix and conformance roadmap](https://github.com/pablospaniard/mcp-native/blob/main/docs/standards-compatibility.md).
95
+
96
+ ## Supported surface
97
+
98
+ | Node | Required fields | Purpose |
99
+ | ------------ | ----------------------- | ------------------------------------------------------ |
100
+ | `container` | `id`, `children` | Groups nested surface nodes. |
101
+ | `text` | `id`, `text` | Declares trusted text content. |
102
+ | `button` | `id`, `label`, `action` | Declares a tool action for host-controlled dispatch. |
103
+ | `text-input` | `id`, `label` | Declares an input with optional `value` and `binding`. |
104
+
105
+ The only supported action is `{ type: "tool", name, arguments? }`. Arguments must contain JSON-safe values.
106
+
107
+ ## Public API
108
+
109
+ | Export | Purpose |
110
+ | -------------------------------------------------- | ---------------------------------------------------------------- |
111
+ | `resolveA2uiResourceFromToolResult` | Reads and parses the single explicit A2UI link in a tool result. |
112
+ | `parseA2uiSurface` | Validates input and returns a typed `A2uiSurface`. |
113
+ | `A2uiResourceError`, `A2uiParseError` | Specific resolution and parsing failures. |
114
+ | `A2UI_MIME_TYPE`, `A2UI_VERSION` | Exact media type and current proof-of-concept version. |
115
+ | `A2UI_MAX_DEPTH`, `A2UI_MAX_NODES` | Container-tree complexity limits. |
116
+ | `A2UI_MAX_SOURCE_LENGTH`, `A2UI_MAX_STRING_LENGTH` | Serialized-input and string-field limits. |
117
+ | `ResolvedA2uiResource` | URI, MIME type, and validated surface returned by the resolver. |
118
+ | `A2uiSurface`, `A2uiNode` | Validated surface and node unions. |
119
+ | Node interfaces | Typed container, text, button, and text-input nodes. |
120
+
121
+ ## Security behavior
122
+
123
+ - Input is treated as untrusted at the parser boundary.
124
+ - Resolution requires an exact MIME type, URI match, and unambiguous text content.
125
+ - Errored tool results and binary A2UI resources are rejected.
126
+ - Unknown surface versions, node types, action types, and undeclared fields are rejected.
127
+ - Serialized surfaces, string fields, and tool-argument JSON graphs have fixed complexity limits.
128
+ - Tool arguments are recursively constrained to finite, acyclic JSON values in plain objects.
129
+ - JSON keys such as `__proto__` are preserved as ordinary own data properties without changing object prototypes.
130
+ - Parsing never resolves components or executes server-provided code.
131
+ - Successful parsing does not grant device capabilities or permission to call a tool; the host still owns those decisions.
132
+
133
+ ## Next layer
134
+
135
+ Use [`@mcp-native/react-native`](https://www.npmjs.com/package/@mcp-native/react-native) to convert a validated surface into a trusted native render plan, or install [`mcp-native`](https://www.npmjs.com/package/mcp-native) for the combined runtime and UI APIs.
136
+
137
+ ## License
138
+
139
+ [MIT](https://github.com/pablospaniard/mcp-native/blob/main/LICENSE)
package/dist/index.d.ts CHANGED
@@ -1,5 +1,14 @@
1
- import type { ToolAction } from "@mcp-native/core";
1
+ import type { McpReadResourceResult, McpToolCallResult, ToolAction } from "@mcp-native/core";
2
2
  export declare const A2UI_VERSION: "0.1";
3
+ export declare const A2UI_MIME_TYPE: "application/a2ui+json";
4
+ /** Maximum nesting depth for container trees (root is depth 0). */
5
+ export declare const A2UI_MAX_DEPTH = 32;
6
+ /** Maximum number of nodes allowed in a single surface. */
7
+ export declare const A2UI_MAX_NODES = 256;
8
+ /** Maximum UTF-16 code units accepted in a serialized surface. */
9
+ export declare const A2UI_MAX_SOURCE_LENGTH = 1048576;
10
+ /** Maximum UTF-16 code units accepted in one surface string field. */
11
+ export declare const A2UI_MAX_STRING_LENGTH = 65536;
3
12
  interface A2uiNodeBase {
4
13
  readonly id: string;
5
14
  }
@@ -27,9 +36,25 @@ export interface A2uiSurface {
27
36
  readonly version: typeof A2UI_VERSION;
28
37
  readonly root: A2uiNode;
29
38
  }
39
+ export interface A2uiResourceReader {
40
+ readResource(uri: string): Promise<McpReadResourceResult>;
41
+ }
42
+ export interface ResolvedA2uiResource {
43
+ readonly uri: string;
44
+ readonly mimeType: typeof A2UI_MIME_TYPE;
45
+ readonly surface: A2uiSurface;
46
+ }
30
47
  export declare class A2uiParseError extends Error {
48
+ constructor(message: string, options?: ErrorOptions);
49
+ }
50
+ export declare class A2uiResourceError extends Error {
31
51
  constructor(message: string);
32
52
  }
53
+ /**
54
+ * Resolves the single explicitly typed A2UI resource link in a successful
55
+ * tool result, reads it through the host client, and validates its surface.
56
+ */
57
+ export declare function resolveA2uiResourceFromToolResult(reader: A2uiResourceReader, toolResult: McpToolCallResult): Promise<ResolvedA2uiResource>;
33
58
  export declare function parseA2uiSurface(input: string | unknown): A2uiSurface;
34
59
  export {};
35
60
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1E,eAAO,MAAM,YAAY,EAAG,KAAc,CAAC;AAE3C,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,YAAY,CAAC;AAE7F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,YAAY,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAsBrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACX,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,YAAY,EAAG,KAAc,CAAC;AAC3C,eAAO,MAAM,cAAc,EAAG,uBAAgC,CAAC;AAE/D,mEAAmE;AACnE,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,2DAA2D;AAC3D,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAChD,sEAAsE;AACtE,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,YAAY,CAAC;AAE7F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,YAAY,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,cAAc,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACF;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED;;;GAGG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,iBAAiB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CAuC/B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CA2BrE"}
package/dist/index.js CHANGED
@@ -1,13 +1,63 @@
1
+ import { parseMcpNativeAction } from "@mcp-native/core";
1
2
  export const A2UI_VERSION = "0.1";
3
+ export const A2UI_MIME_TYPE = "application/a2ui+json";
4
+ /** Maximum nesting depth for container trees (root is depth 0). */
5
+ export const A2UI_MAX_DEPTH = 32;
6
+ /** Maximum number of nodes allowed in a single surface. */
7
+ export const A2UI_MAX_NODES = 256;
8
+ /** Maximum UTF-16 code units accepted in a serialized surface. */
9
+ export const A2UI_MAX_SOURCE_LENGTH = 1_048_576;
10
+ /** Maximum UTF-16 code units accepted in one surface string field. */
11
+ export const A2UI_MAX_STRING_LENGTH = 65_536;
2
12
  export class A2uiParseError extends Error {
13
+ constructor(message, options) {
14
+ super(message, options);
15
+ this.name = "A2uiParseError";
16
+ }
17
+ }
18
+ export class A2uiResourceError extends Error {
3
19
  constructor(message) {
4
20
  super(message);
5
- this.name = "A2uiParseError";
21
+ this.name = "A2uiResourceError";
22
+ }
23
+ }
24
+ /**
25
+ * Resolves the single explicitly typed A2UI resource link in a successful
26
+ * tool result, reads it through the host client, and validates its surface.
27
+ */
28
+ export async function resolveA2uiResourceFromToolResult(reader, toolResult) {
29
+ if (toolResult.isError !== undefined && typeof toolResult.isError !== "boolean") {
30
+ throw new A2uiResourceError("Expected tool result.isError to be a boolean");
6
31
  }
32
+ if (toolResult.isError === true) {
33
+ throw new A2uiResourceError("Cannot resolve an A2UI resource from an errored tool result");
34
+ }
35
+ const links = expectContentArray(toolResult.content).flatMap((block, index) => parseA2uiResourceLink(block, `tool result.content[${index}]`));
36
+ if (links.length !== 1) {
37
+ throw new A2uiResourceError(`Expected exactly one ${A2UI_MIME_TYPE} resource link, received ${links.length}`);
38
+ }
39
+ const link = links[0];
40
+ const readResult = await reader.readResource(link.uri);
41
+ const resources = expectResourceContents(readResult).filter((resource) => resource.uri === link.uri && resource.mimeType === A2UI_MIME_TYPE);
42
+ if (resources.length !== 1) {
43
+ throw new A2uiResourceError(`Expected exactly one ${A2UI_MIME_TYPE} text resource for ${link.uri}, received ${resources.length}`);
44
+ }
45
+ const resource = resources[0];
46
+ if (typeof resource.text !== "string" || resource.blob !== undefined) {
47
+ throw new A2uiResourceError(`Expected a text-only A2UI resource for ${link.uri}`);
48
+ }
49
+ return {
50
+ uri: link.uri,
51
+ mimeType: A2UI_MIME_TYPE,
52
+ surface: parseA2uiSurface(resource.text),
53
+ };
7
54
  }
8
55
  export function parseA2uiSurface(input) {
9
56
  let value = input;
10
57
  if (typeof input === "string") {
58
+ if (input.length > A2UI_MAX_SOURCE_LENGTH) {
59
+ throw new A2uiParseError(`A2UI source exceeds maximum length of ${A2UI_MAX_SOURCE_LENGTH}`);
60
+ }
11
61
  try {
12
62
  value = JSON.parse(input);
13
63
  }
@@ -17,29 +67,44 @@ export function parseA2uiSurface(input) {
17
67
  }
18
68
  }
19
69
  const surface = expectObject(value, "surface");
70
+ expectOnlyKeys(surface, ["root", "version"], "surface");
20
71
  const version = expectString(surface.version, "surface.version");
21
72
  if (version !== A2UI_VERSION) {
22
73
  throw new A2uiParseError(`Unsupported A2UI version: ${version}`);
23
74
  }
75
+ const seenIds = new Set();
24
76
  return {
25
77
  version: A2UI_VERSION,
26
- root: parseNode(surface.root, "surface.root"),
78
+ root: parseNode(surface.root, "surface.root", seenIds, 0),
27
79
  };
28
80
  }
29
- function parseNode(value, path) {
81
+ function parseNode(value, path, seenIds, depth) {
82
+ if (depth > A2UI_MAX_DEPTH) {
83
+ throw new A2uiParseError(`A2UI surface exceeds maximum depth of ${A2UI_MAX_DEPTH} at ${path}`);
84
+ }
85
+ if (seenIds.size >= A2UI_MAX_NODES) {
86
+ throw new A2uiParseError(`A2UI surface exceeds maximum of ${A2UI_MAX_NODES} nodes`);
87
+ }
30
88
  const node = expectObject(value, path);
31
89
  const id = expectString(node.id, `${path}.id`);
90
+ if (seenIds.has(id)) {
91
+ throw new A2uiParseError(`Duplicate node id at ${path}: ${id}`);
92
+ }
93
+ seenIds.add(id);
32
94
  const type = expectString(node.type, `${path}.type`);
33
95
  switch (type) {
34
96
  case "container":
97
+ expectOnlyKeys(node, ["children", "id", "type"], path);
35
98
  return {
36
99
  id,
37
100
  type,
38
- children: expectArray(node.children, `${path}.children`).map((child, index) => parseNode(child, `${path}.children[${index}]`)),
101
+ children: expectArray(node.children, `${path}.children`).map((child, index) => parseNode(child, `${path}.children[${index}]`, seenIds, depth + 1)),
39
102
  };
40
103
  case "text":
104
+ expectOnlyKeys(node, ["id", "text", "type"], path);
41
105
  return { id, type, text: expectString(node.text, `${path}.text`) };
42
106
  case "button":
107
+ expectOnlyKeys(node, ["action", "id", "label", "type"], path);
43
108
  return {
44
109
  id,
45
110
  type,
@@ -47,6 +112,7 @@ function parseNode(value, path) {
47
112
  action: parseToolAction(node.action, `${path}.action`),
48
113
  };
49
114
  case "text-input": {
115
+ expectOnlyKeys(node, ["binding", "id", "label", "type", "value"], path);
50
116
  const label = expectString(node.label, `${path}.label`);
51
117
  const valueField = optionalString(node.value, `${path}.value`);
52
118
  const binding = optionalString(node.binding, `${path}.binding`);
@@ -63,26 +129,95 @@ function parseNode(value, path) {
63
129
  }
64
130
  }
65
131
  function parseToolAction(value, path) {
66
- const action = expectObject(value, path);
67
- const type = expectString(action.type, `${path}.type`);
68
- if (type !== "tool") {
69
- throw new A2uiParseError(`Unsupported action type at ${path}: ${type}`);
132
+ try {
133
+ return parseMcpNativeAction(value, path);
134
+ }
135
+ catch (error) {
136
+ const message = error instanceof Error ? error.message : `Invalid tool action at ${path}`;
137
+ throw new A2uiParseError(message, { cause: error });
70
138
  }
71
- const arguments_ = action.arguments;
72
- return {
73
- type,
74
- name: expectString(action.name, `${path}.name`),
75
- ...(arguments_ === undefined
76
- ? {}
77
- : { arguments: expectJsonObject(arguments_, `${path}.arguments`) }),
78
- };
79
139
  }
80
140
  function expectObject(value, path) {
81
141
  if (value === null || typeof value !== "object" || Array.isArray(value)) {
82
142
  throw new A2uiParseError(`Expected an object at ${path}`);
83
143
  }
144
+ const prototype = Object.getPrototypeOf(value);
145
+ if (prototype !== Object.prototype && prototype !== null) {
146
+ throw new A2uiParseError(`Expected a plain object at ${path}`);
147
+ }
148
+ const ownProperties = Object.create(null);
149
+ for (const key of Object.keys(value)) {
150
+ ownProperties[key] = value[key];
151
+ }
152
+ return ownProperties;
153
+ }
154
+ function expectContentArray(value) {
155
+ if (!Array.isArray(value)) {
156
+ throw new A2uiResourceError("Expected an array at tool result.content");
157
+ }
84
158
  return value;
85
159
  }
160
+ function parseA2uiResourceLink(value, path) {
161
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
162
+ throw new A2uiResourceError(`Expected a content object at ${path}`);
163
+ }
164
+ const block = value;
165
+ if (typeof block.type !== "string") {
166
+ throw new A2uiResourceError(`Expected a content type at ${path}.type`);
167
+ }
168
+ if (block.type !== "resource_link") {
169
+ return [];
170
+ }
171
+ if (typeof block.name !== "string") {
172
+ throw new A2uiResourceError(`Expected a string at ${path}.name`);
173
+ }
174
+ if (typeof block.uri !== "string") {
175
+ throw new A2uiResourceError(`Expected a string at ${path}.uri`);
176
+ }
177
+ if (block.mimeType !== undefined && typeof block.mimeType !== "string") {
178
+ throw new A2uiResourceError(`Expected a string at ${path}.mimeType`);
179
+ }
180
+ return block.mimeType === A2UI_MIME_TYPE ? [{ uri: block.uri }] : [];
181
+ }
182
+ function expectResourceContents(value) {
183
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
184
+ throw new A2uiResourceError("Expected an object from resources/read");
185
+ }
186
+ const contents = value.contents;
187
+ if (!Array.isArray(contents)) {
188
+ throw new A2uiResourceError("Expected an array at resource result.contents");
189
+ }
190
+ return contents.map((content, index) => {
191
+ if (content === null || typeof content !== "object" || Array.isArray(content)) {
192
+ throw new A2uiResourceError(`Expected an object at resource result.contents[${index}]`);
193
+ }
194
+ const resource = content;
195
+ const uri = resource.uri;
196
+ if (typeof uri !== "string") {
197
+ throw new A2uiResourceError(`Expected a string at resource result.contents[${index}].uri`);
198
+ }
199
+ const mimeType = resource.mimeType;
200
+ if (mimeType !== undefined && typeof mimeType !== "string") {
201
+ throw new A2uiResourceError(`Expected a string at resource result.contents[${index}].mimeType`);
202
+ }
203
+ const text = resource.text;
204
+ if (text !== undefined && typeof text !== "string") {
205
+ throw new A2uiResourceError(`Expected a string at resource result.contents[${index}].text`);
206
+ }
207
+ const blob = resource.blob;
208
+ if (blob !== undefined && typeof blob !== "string") {
209
+ throw new A2uiResourceError(`Expected a string at resource result.contents[${index}].blob`);
210
+ }
211
+ const common = {
212
+ uri,
213
+ ...(mimeType === undefined ? {} : { mimeType }),
214
+ };
215
+ if ((text === undefined) === (blob === undefined)) {
216
+ throw new A2uiResourceError(`Expected exactly one of text or blob at resource result.contents[${index}]`);
217
+ }
218
+ return text === undefined ? { ...common, blob: blob } : { ...common, text };
219
+ });
220
+ }
86
221
  function expectArray(value, path) {
87
222
  if (!Array.isArray(value)) {
88
223
  throw new A2uiParseError(`Expected an array at ${path}`);
@@ -93,29 +228,20 @@ function expectString(value, path) {
93
228
  if (typeof value !== "string") {
94
229
  throw new A2uiParseError(`Expected a string at ${path}`);
95
230
  }
231
+ if (value.length > A2UI_MAX_STRING_LENGTH) {
232
+ throw new A2uiParseError(`String at ${path} exceeds maximum length of ${A2UI_MAX_STRING_LENGTH}`);
233
+ }
96
234
  return value;
97
235
  }
98
236
  function optionalString(value, path) {
99
237
  return value === undefined ? undefined : expectString(value, path);
100
238
  }
101
- function expectJsonObject(value, path) {
102
- const object = expectObject(value, path);
103
- const result = {};
104
- for (const [key, child] of Object.entries(object)) {
105
- result[key] = expectJsonValue(child, `${path}.${key}`);
106
- }
107
- return result;
108
- }
109
- function expectJsonValue(value, path) {
110
- if (value === null ||
111
- typeof value === "boolean" ||
112
- typeof value === "number" ||
113
- typeof value === "string") {
114
- return value;
115
- }
116
- if (Array.isArray(value)) {
117
- return value.map((child, index) => expectJsonValue(child, `${path}[${index}]`));
239
+ function expectOnlyKeys(object, allowedKeys, path) {
240
+ const allowed = new Set(allowedKeys);
241
+ for (const key of Object.keys(object)) {
242
+ if (!allowed.has(key)) {
243
+ throw new A2uiParseError(`Unsupported field ${JSON.stringify(key)} at ${path}`);
244
+ }
118
245
  }
119
- return expectJsonObject(value, path);
120
246
  }
121
247
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,22 @@
1
1
  {
2
2
  "name": "@mcp-native/a2ui",
3
- "version": "0.0.2",
3
+ "version": "0.1.0",
4
4
  "description": "A2UI parsing and bindings for MCP Native.",
5
+ "keywords": [
6
+ "a2ui",
7
+ "declarative-ui",
8
+ "mcp",
9
+ "model-context-protocol",
10
+ "typescript"
11
+ ],
12
+ "homepage": "https://github.com/pablospaniard/mcp-native#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/pablospaniard/mcp-native/issues"
15
+ },
5
16
  "license": "MIT",
6
17
  "repository": {
7
18
  "type": "git",
8
- "url": "https://github.com/pablospaniard/mcp-native.git",
19
+ "url": "git+https://github.com/pablospaniard/mcp-native.git",
9
20
  "directory": "packages/a2ui"
10
21
  },
11
22
  "files": [
@@ -26,6 +37,6 @@
26
37
  "access": "public"
27
38
  },
28
39
  "dependencies": {
29
- "@mcp-native/core": "^0.0.2"
40
+ "@mcp-native/core": "^0.1.0"
30
41
  }
31
42
  }