diff --git a/apps/lit-host/package.json b/apps/lit-host/package.json index 7c1a7350..e4936c6f 100644 --- a/apps/lit-host/package.json +++ b/apps/lit-host/package.json @@ -22,7 +22,7 @@ "@modelcontextprotocol/client": "2.4.0", "@modelcontextprotocol/core": "2.4.0", "@modelcontextprotocol/express": "2.0.2", - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@modelcontextprotocol/fastify": "2.0.1", "@modelcontextprotocol/hono": "2.0.2", "@modelcontextprotocol/node": "2.1.1", diff --git a/docs/authorized-playback.md b/docs/authorized-playback.md index 74585212..9f4a0b87 100644 --- a/docs/authorized-playback.md +++ b/docs/authorized-playback.md @@ -25,7 +25,7 @@ apps/lit-host/src/mcp/listener.ts # HTTP server outside the iframe The reusable action runtime (`@saga-a2ui/core/actions`) supplies direct bindings, asynchronous local actions, resource scopes and server actions. The original [v0.1.0 snapshot](https://github.com/MachineWisdomAI/saga-a2ui/tree/v0.1.0) (`dda384de`, 2026-10-18) did not use it for Play; the current source does (CORE2, [PR #133](https://github.com/MachineWisdomAI/saga-a2ui/pull/133)). The control opens its own instance on an action host and the application binds `play`, `pause` and `resume` to it; Play is an `Action.server` and Pause and Resume are local actions. The sections below describe the migrated path. The request bounds, the session-label rule and the player's lease ownership are application decisions that stay in `apps/lit-host`, as they did before the migration. -The MCP integration uses `ext-apps` 2.0.3 and the split MCP SDK 2 packages (`client`, `core`, `server` 2.4.0; `node` 2.1.1). The listener uses `NodeStreamableHTTPServerTransport`; a handler reads verified identity from `ctx.http.authInfo` and request metadata from `ctx.mcpReq._meta`. Browser views use `App` and `PostMessageTransport`. These replace the old monolithic SDK imports without changing the capability/proof protocol below. +The MCP integration uses `ext-apps` 2.1.0 and the split MCP SDK 2 packages (`client`, `core`, `server` 2.4.0; `node` 2.1.1). The listener uses `NodeStreamableHTTPServerTransport`; a handler reads verified identity from `ctx.http.authInfo` and request metadata from `ctx.mcpReq._meta`. Browser views use `App` and `PostMessageTransport`. These replace the old monolithic SDK imports without changing the capability/proof protocol below. ## One Play press diff --git a/docs/candidate-update-and-rollback.md b/docs/candidate-update-and-rollback.md index 9c592c04..f3f72bf9 100644 --- a/docs/candidate-update-and-rollback.md +++ b/docs/candidate-update-and-rollback.md @@ -58,7 +58,7 @@ The tarball digests, the built views and servers, and the consumer installs are **Catalogs.** Protocol A2UI v0.9 on upstream `@a2ui/web_core` 0.13.0. The `own` combination lists the application's own catalog (`https://pack1.example/catalogs/notes/v1`: `Line`, `Column`, `Row`, `List`, `ActionButton`); `card` adds the optional `FaithfulCard` at content contract version 1. A version other than 1 is refused by the card without reading its Markdown (existing reader tests). -**Recipe.** Node: CI uses the version in `.nvmrc` (22.23.3, also the minimum in `package.json`); `candidate.json` records the version the run actually used, and local runs may use a newer one. npm: recorded per run. Upstream: `@a2ui/web_core`/`lit`/`react` 0.13.0; `@modelcontextprotocol/client`, `core`, `server` 2.4.0 and `ext-apps` 2.0.3; Zod 4.6.7 (3.25.76 only as core's `zod3` alias); React and React DOM 19.3.1 exactly, for the React renderer and stack. Optional peers: `@saga-a2ui/components` for `lit` and `react`. +**Recipe.** Node: CI uses the version in `.nvmrc` (22.23.3, also the minimum in `package.json`); `candidate.json` records the version the run actually used, and local runs may use a newer one. npm: recorded per run. Upstream: `@a2ui/web_core`/`lit`/`react` 0.13.0; `@modelcontextprotocol/client`, `core`, `server` 2.4.0 and `ext-apps` 2.1.0; Zod 4.6.7 (3.25.76 only as core's `zod3` alias); React and React DOM 19.3.1 exactly, for the React renderer and stack. Optional peers: `@saga-a2ui/components` for `lit` and `react`. **Application overrides.** An application must carry `"overrides": { "@a2ui/markdown-it": "0.2.1", "dompurify": "3.4.17", "@hono/node-server": "2.1.5" }` in its own `package.json`. Without it a fresh install resolves `@a2ui/markdown-it` 0.2.2, whose peer `@a2ui/web_core ^0.14.0` conflicts with the pinned 0.13.0, and npm stops with ERESOLVE. npm honors overrides of the root project only, so a package cannot carry this for its consumers. `candidate:pack` installs with the overrides taken from the workspace root, and `candidate.json` records them. For pnpm, place the equivalent override in the consumer workspace root `pnpm-workspace.yaml`. See [React consumer dependencies](react-consumers.md) for the supported imports and Zod ownership; merely declaring another direct Markdown dependency does not constrain every transitive resolution. diff --git a/docs/development-reference.md b/docs/development-reference.md index 3be498f5..7f18f82d 100644 --- a/docs/development-reference.md +++ b/docs/development-reference.md @@ -352,7 +352,7 @@ Invalid messages, unknown catalogs/components or wrongly typed properties produc `apps/lit-host` also hosts an ordinary MCP server and renders one of its tool results through the same A2UI session. It serves public synthetic data. -Pinned additions (exact; the MCP packages are the MCPV2 recipe below): `@modelcontextprotocol/ext-apps` 2.0.3 (MIT; its optional `react` peers are not installed) with `client`, `core` and `server` 2.4.0 and `node` 2.1.1 (Apache-2.0), dev-only `vite-plugin-singlefile` 2.3.3, `tsx` 4.23.15, `@types/node` 22.20.5. No MCP-UI, CopilotKit, AG-UI or Ora packages are used; the only overlap is shared standards (MCP, MCP Apps, A2UI). +Pinned additions (exact; the MCP packages are the MCPV2 recipe below): `@modelcontextprotocol/ext-apps` 2.1.0 (MIT; its optional `react` peers are not installed) with `client`, `core` and `server` 2.4.0 and `node` 2.1.1 (Apache-2.0), dev-only `vite-plugin-singlefile` 2.3.3, `tsx` 4.23.15, `@types/node` 22.20.5. No MCP-UI, CopilotKit, AG-UI or Ora packages are used; the only overlap is shared standards (MCP, MCP Apps, A2UI). npm run build # app, the single-file view (dist/view/view.html) and the test-only host fixture npm run serve:mcp # MCP server at http://127.0.0.1:3001/mcp (PORT overrides); needs the build first @@ -386,7 +386,7 @@ Both starts return a running view synchronously (`{ ready, dispose }`; the A2UI - Capabilities (`updateModelContext`, `message`) are read at call time. With `context`, `ui/update-model-context` is sent first (`text` as one text content block, `data` as `structuredContent`), then `ui/message` with role `user` and one text content block, never in parallel. A context that is unsupported, rejected or answered with `isError` stops the message at `stage: 'context'` unless `bestEffort` is set; then the message is still attempted and an accepted one reports `{outcome: 'appended', context: }`. - Payloads are admitted before anything is sent, against `CONVERSATION_LIMITS` in `packages/mcp/src/view/conversation.ts` (16 KiB of UTF-8 for the message, 16 KiB for the context text, 64 KiB of exact `JSON.stringify` size for the structured data). `snapshotData` copies the data while it measures it, with escapes, braces, colons and commas counted, and the request carries that copy, so the original object is never read again; the context object is read once. The data must be plain objects, arrays, strings, finite numbers, booleans and `null`, at most 32 levels deep without cycles: `undefined`, `bigint`, symbols, functions, non-finite numbers, array holes, accessor properties and non-plain objects (`Map`, `Date`, class instances) are refused, not converted. An over-budget message resolves `denied` at the message stage with nothing sent, context included; an over-budget context resolves `denied` at the context stage and follows the `bestEffort` rules. Nothing is truncated or rewritten, and the walk stops once it passes the budget (an array longer than the budget is refused unread). The limits are the SDK's own. - Once the lifetime signal has aborted, including while a request is outstanding, the call resolves `unavailable`, sends nothing further and ignores the late answer. Nothing is retried. -- The pinned bridge (`@modelcontextprotocol/ext-apps` 2.0.3) gives `ui/update-model-context` an empty result and rejects any other key, so a host cannot answer a context update with `isError`: its refusal can only be a rejected request, which reads `failed`. `denied` at the context stage is kept for a bridge that allows it. `ui/message` can answer `isError`, which reads `denied`. +- The pinned bridge (`@modelcontextprotocol/ext-apps` 2.1.0) gives `ui/update-model-context` an empty result and rejects any other key, so a host cannot answer a context update with `isError`: its refusal can only be a rejected request, which reads `failed`. `denied` at the context stage is kept for a bridge that allows it. `ui/message` can answer `isError`, which reads `denied`. Tests: `packages/core/src/conversation.test.ts` (the default instance), `packages/mcp/src/view/conversation.test.ts` (a real `App` and `AppBridge`: message only, the order, a held context, withheld, failed and best-effort contexts, refused, failing and unavailable messages, payloads at and over each budget, exact JSON sizing with escapes, non-JSON values, accessors and large objects, an ended view before and during each request), the `ViewHost.conversation` case in each stack's `start-a2ui-view.test.ts`, and `apps/lit-host/e2e/view-conversation.spec.ts`, which runs the same scenarios through both stacks in Chromium against the local host fixture (probes in `e2e/view-conversation/`, built by `vite.view-conversation.config.ts`; like the view-stack probes, not part of the installed-package set). The fixture (`host-fixture/host.ts`) takes `conversation: {context, message}` in `mountView`, each `accept`, `refuse`, `fail`, `withhold` (the capability is not advertised) or `hold` (recorded, unanswered until `releaseConversation`), and records every request in order (`conversationRequests`). @@ -512,7 +512,7 @@ Mechanisms chosen for the Blueprint's open decisions (the evidence is the tests - **Playing means the audio clock advanced.** The view reports `playing` only after that signal; `denied`, `expired`, `unsupported`, `unavailable`, `media-failed` and `gesture-needed` are distinct states, and pending work is retired so a late success cannot restore cleared media. PLAY1 did this with a generation number and an `attemptLimitMs` bound inside the controller; CORE2 replaced both with the shared action runtime: a changed `subject` and the action's work deadline (30,000 ms by default) retire the press, and one deadline covers every client stage until audio advances. See "Bounded requests and playback (STATE2)" below. - **Pause, Resume and a short episode tell the truth.** `pause()` and `resume()` return promises, so the view shows `paused` or `playing` only once the audio did that. A Resume the browser withholds (`NotAllowedError`, or a clock that does not advance) shows `resume-blocked`, keeps the position, and the next explicit press retries it without a new authorization. A Pause or Resume the player cannot perform is `media-failed`. Audio that ends before the start is confirmed shows `ended`: the end is remembered for the request that was waiting, and the late `started` result cannot replace it, while a retired request still cannot restore anything. -Wire mapping, verified against `@modelcontextprotocol/server` 2.4.0 and `ext-apps` 2.0.3 (see the MCPV2 recipe below): +Wire mapping, verified against `@modelcontextprotocol/server` 2.4.0 and `ext-apps` 2.1.0 (see the MCPV2 recipe below): | Condition | Result | | --- | --- | @@ -1275,7 +1275,7 @@ The complete example is `apps/lit-host/e2e/archive-fixture/archive.ts` (test-onl **The cumulative contract.** The shared runtime keeps the behavior recorded for ACT1 to ACT5, and the server action takes it unchanged: synchronous and asynchronous local work, ordered reusable prerequisites, both busy policies, per-callback `current()`, immutable outcomes, bounded hooks and finalization, retirement by disposal, replacement, subject change and instance loss, and the ACT5 lease acquisition, release and transfer. `server-actions.test.ts` checks the join for a server action (a lease taken in the event turn and transferred or released across success, a timeout and a cancellation; every hook, the release and `onFinally` bounded by `hookMs`). `authoring-qualification.test.ts` runs the Blueprint's positive and negative authoring cases that the earlier slices did not yet check (P1 to P8, L1, N4, N9 to N11, N17, N18, N23 to N25) against the package's real exports and its own tsconfig rather than the evidence companion's stand-in declarations, and names the suites that check the others (N1 to N3, N5 to N8, N12 to N16, N19 to N22). The renderer-facing cases are the Lit, React and Lynx fixtures themselves, compiled by `npm run typecheck` against the published renderer packages. -**The pinned transport types.** `archive-integration.test.ts` declares `(app: App) => ServerTransport` and builds `Action.server('archive-note', app)`. They compile against `@modelcontextprotocol/ext-apps` 2.0.3 and `@modelcontextprotocol/client` 2.4.0, the pinned `App.callServerTool(params: CallToolRequest['params'], options?: RequestOptions): Promise`, so the Blueprint's stand-ins are replaced by the real types. A transport whose reply has no `content` is a compile error. +**The pinned transport types.** `archive-integration.test.ts` declares `(app: App) => ServerTransport` and builds `Action.server('archive-note', app)`. They compile against `@modelcontextprotocol/ext-apps` 2.1.0 and `@modelcontextprotocol/client` 2.4.0, the pinned `App.callServerTool(params: CallToolRequest['params'], options?: RequestOptions): Promise`, so the Blueprint's stand-ins are replaced by the real types. A transport whose reply has no `content` is a compile error. **Dependency separation.** Core's own export test bundles `@saga-a2ui/core/actions` and finds `server.ts` in the graph and no MCP, renderer, DOM or other third-party module. The built Lit consumer holds the archive definition and its fixture, which import MCP types only; `view-bundle.spec.ts` (every file under `dist/`, including `dist/action-consumer`) finds no server transport, server registration or credential in it. @@ -1391,7 +1391,7 @@ Both pages and both servers come from the same application source. The two bundl | --- | --- | | Upstream A2UI | `@a2ui/web_core` 0.13.0 in `core`, `lit`, `components` and `react`; `@a2ui/lit` 0.13.0 in `lit`; `@a2ui/react` 0.13.0 in `react` | | Zod | Zod 3 only as core's `zod3` alias (`npm:zod@3.25.76`, for A2UI catalog schemas); Zod 4.6.7 in `components` and `mcp` | -| MCP set | `@modelcontextprotocol/client`, `core`, `server` 2.4.0 and `ext-apps` 2.0.3, all in `mcp` and nowhere else | +| MCP set | `@modelcontextprotocol/client`, `core`, `server` 2.4.0 and `ext-apps` 2.1.0, all in `mcp` and nowhere else | | Between SDK packages | range `*` in the repository, resolved by installing the packed copy; any other form (`workspace:`, `file:`, `link:`, a path, a URL) fails. Since PACK2 the packed copy pins the exact candidate version instead of `*` | | Optional components | `lit` and `react` name `@saga-a2ui/components` only as an optional peer (`*`); `core`, `mcp` and `components` name no renderer; `markdown-it` 15.0.3 belongs to `components` alone | | React | peers `react` and `react-dom` `^19.3.1`; `./faithful-card.css` is a named export, not a file path | @@ -1724,7 +1724,7 @@ The browse and Play paths run on one peer-complete MCP Apps 2 recipe. It replace | Package | Exact version | License | | --- | --- | --- | -| `@modelcontextprotocol/ext-apps` | 2.0.3 | MIT | +| `@modelcontextprotocol/ext-apps` | 2.1.0 | MIT | | `@modelcontextprotocol/client`, `core`, `server` | 2.4.0 | Apache-2.0 | | `@modelcontextprotocol/node` | 2.1.1 | Apache-2.0 | | `zod` (MCP seam, hoisted to the workspace root) | 4.6.7 | MIT | diff --git a/docs/release-packages.md b/docs/release-packages.md index 531ad3bc..945314b0 100644 --- a/docs/release-packages.md +++ b/docs/release-packages.md @@ -105,7 +105,7 @@ qualification directly, without a public RC. Verify the seven tarballs that would be published, not a candidate or an earlier build of different source. Evidence from another source revision or version identity is context, not qualification of these bytes. Use React and React DOM -**19.3.1**, MCP Apps **2.0.3**, and Zod **4.6.7** for MCP schemas. Keep the +**19.3.1**, MCP Apps **2.1.0**, and Zod **4.6.7** for MCP schemas. Keep the consumer-root overrides from [public installation](public-install.md#install-one-stack-plus-framework-peers). SAGA owns A2UI **0.13.0** and its Zod **3.25.76** context; do not add direct application A2UI dependencies or force a single Zod version. Follow [React consumer dependencies](react-consumers.md) diff --git a/examples/pack1-consumer/package.json b/examples/pack1-consumer/package.json index cf6bd09f..f61f8a27 100644 --- a/examples/pack1-consumer/package.json +++ b/examples/pack1-consumer/package.json @@ -6,7 +6,7 @@ "type": "module", "dependencies": { "@modelcontextprotocol/client": "2.4.0", - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@modelcontextprotocol/server": "2.4.0", "@saga-a2ui/components": "*", "@saga-a2ui/core": "*", diff --git a/package-lock.json b/package-lock.json index 465a0a00..fd93dfef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@modelcontextprotocol/client": "2.4.0", "@modelcontextprotocol/core": "2.4.0", "@modelcontextprotocol/express": "2.0.2", - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@modelcontextprotocol/fastify": "2.0.1", "@modelcontextprotocol/hono": "2.0.2", "@modelcontextprotocol/node": "2.1.1", @@ -2510,9 +2510,9 @@ } }, "node_modules/@modelcontextprotocol/ext-apps": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/ext-apps/-/ext-apps-2.0.3.tgz", - "integrity": "sha512-Tn+4+cyhO4f4cQSDxNyLiIfEE+qlTTuIbWBJB8JTinEXOhDYgCT4wDTQplxD9MBYZH5pCYGC59GaxiwIT4bu8w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/ext-apps/-/ext-apps-2.1.0.tgz", + "integrity": "sha512-clOFd1i/9GfSacMDrmLZDWcFnQpIgUutCqwOx14j5dWq/UpaeIPrctHfG3rDBpSsuB6+1X0oszMG1/0Sc0GccA==", "license": "MIT", "workspaces": [ "examples/*" @@ -7777,7 +7777,7 @@ "lit": "^3.3.3" }, "devDependencies": { - "@saga-a2ui/components": "0.11.11-rc.1", + "@saga-a2ui/components": "1.0.0", "typescript": "^5.9.0", "vitest": "^5.0.4" }, @@ -7795,16 +7795,16 @@ }, "packages/lit-mcp-stack": { "name": "@saga-a2ui/lit-mcp-stack", - "version": "1.0.1", + "version": "1.0.2", "license": "Apache-2.0", "dependencies": { "@a2ui/lit": "0.13.0", "@a2ui/web_core": "0.13.0", - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@saga-a2ui/components": "1.0.0", "@saga-a2ui/core": "1.0.0", "@saga-a2ui/lit": "1.0.0", - "@saga-a2ui/mcp": "1.0.2", + "@saga-a2ui/mcp": "1.0.3", "zod": "4.6.7" }, "devDependencies": { @@ -7823,13 +7823,13 @@ }, "packages/mcp": { "name": "@saga-a2ui/mcp", - "version": "1.0.2", + "version": "1.0.3", "license": "Apache-2.0", "dependencies": { "@hono/node-server": "2.1.5", "@modelcontextprotocol/client": "2.4.0", "@modelcontextprotocol/core": "2.4.0", - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@modelcontextprotocol/hono": "2.0.2", "@modelcontextprotocol/server": "2.4.0", "@saga-a2ui/core": "1.0.0", @@ -7872,8 +7872,8 @@ }, "peerDependencies": { "@saga-a2ui/components": "1.0.0", - "react": "19.3.1", - "react-dom": "19.3.1" + "react": "^19.3.1", + "react-dom": "^19.3.1" }, "peerDependenciesMeta": { "@saga-a2ui/components": { @@ -7883,13 +7883,13 @@ }, "packages/react-mcp-stack": { "name": "@saga-a2ui/react-mcp-stack", - "version": "1.0.1", + "version": "1.0.2", "license": "Apache-2.0", "dependencies": { - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@saga-a2ui/components": "1.0.0", "@saga-a2ui/core": "1.0.0", - "@saga-a2ui/mcp": "1.0.2", + "@saga-a2ui/mcp": "1.0.3", "@saga-a2ui/react": "1.0.0", "zod": "4.6.7" }, @@ -7908,8 +7908,8 @@ "node": ">=22.12.0" }, "peerDependencies": { - "react": "19.3.1", - "react-dom": "19.3.1" + "react": "^19.3.1", + "react-dom": "^19.3.1" } }, "packages/react/node_modules/zod": { diff --git a/packages/lit-mcp-stack/package.json b/packages/lit-mcp-stack/package.json index 03ef32d5..cb039eb3 100644 --- a/packages/lit-mcp-stack/package.json +++ b/packages/lit-mcp-stack/package.json @@ -24,11 +24,11 @@ "dependencies": { "@a2ui/lit": "0.13.0", "@a2ui/web_core": "0.13.0", - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@saga-a2ui/components": "1.0.0", "@saga-a2ui/core": "1.0.0", "@saga-a2ui/lit": "1.0.0", - "@saga-a2ui/mcp": "1.0.2", + "@saga-a2ui/mcp": "1.0.3", "zod": "4.6.7" }, "peerDependencies": { @@ -41,7 +41,7 @@ "typescript": "^5.9.0", "vitest": "^5.0.4" }, - "version": "1.0.1", + "version": "1.0.2", "engines": { "node": ">=22.12.0" }, diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 42a5f771..1457784a 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -22,7 +22,7 @@ "dependencies": { "@modelcontextprotocol/client": "2.4.0", "@modelcontextprotocol/core": "2.4.0", - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@modelcontextprotocol/server": "2.4.0", "@saga-a2ui/core": "1.0.0", "zod": "4.6.7", @@ -36,7 +36,7 @@ "typescript": "^5.9.0", "vitest": "^5.0.4" }, - "version": "1.0.2", + "version": "1.0.3", "engines": { "node": ">=22.12.0" }, diff --git a/packages/mcp/src/view/conversation.ts b/packages/mcp/src/view/conversation.ts index 7a3244d7..9e88ec4f 100644 --- a/packages/mcp/src/view/conversation.ts +++ b/packages/mcp/src/view/conversation.ts @@ -189,7 +189,7 @@ function snapshotData( * when it aborts while a request is outstanding, so a view that has ended hears of no late result * and nothing further is sent), `denied` when the host answers with `isError` or when the SDK * refuses the payload (above), `failed` when the request - * rejects. The pinned bridge (`@modelcontextprotocol/ext-apps` 2.0.3) gives a context update + * rejects. The pinned bridge (`@modelcontextprotocol/ext-apps` 2.1.0) gives a context update * no way to answer `isError`, so a host's refusal of one arrives as a rejection and reads `failed`. */ export function conversationFromApp( diff --git a/packages/react-mcp-stack/package.json b/packages/react-mcp-stack/package.json index 6b8ef993..27750a41 100644 --- a/packages/react-mcp-stack/package.json +++ b/packages/react-mcp-stack/package.json @@ -26,10 +26,10 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@modelcontextprotocol/ext-apps": "2.0.3", + "@modelcontextprotocol/ext-apps": "2.1.0", "@saga-a2ui/components": "1.0.0", "@saga-a2ui/core": "1.0.0", - "@saga-a2ui/mcp": "1.0.2", + "@saga-a2ui/mcp": "1.0.3", "@saga-a2ui/react": "1.0.0", "zod": "4.6.7" }, @@ -48,7 +48,7 @@ "typescript": "^5.9.0", "vitest": "^5.0.4" }, - "version": "1.0.1", + "version": "1.0.2", "engines": { "node": ">=22.12.0" }, diff --git a/scripts/candidate-identity.test.ts b/scripts/candidate-identity.test.ts index e868fe98..5e8ecbbf 100644 --- a/scripts/candidate-identity.test.ts +++ b/scripts/candidate-identity.test.ts @@ -80,7 +80,7 @@ describe('candidate identity', () => { }; const version = (role: string) => identity.packages.find((entry) => entry.role === role)?.version; - expect(version('MCP Apps')).toBe('2.0.3'); + expect(version('MCP Apps')).toBe('2.1.0'); expect(['MCP client', 'MCP core', 'MCP server'].map(version)).toEqual([ '2.4.0', '2.4.0', diff --git a/scripts/check-react-pnpm.ts b/scripts/check-react-pnpm.ts index 27254ac7..58ff830e 100644 --- a/scripts/check-react-pnpm.ts +++ b/scripts/check-react-pnpm.ts @@ -439,7 +439,7 @@ try { writeApp(lower, { dependencies: { ...tarballs, - '@modelcontextprotocol/ext-apps': '2.0.3', + '@modelcontextprotocol/ext-apps': '2.1.0', ...REACT_STACK.peers, zod: '4.6.7', }, diff --git a/scripts/pack1.test.ts b/scripts/pack1.test.ts index f9daded7..2eaad3ff 100644 --- a/scripts/pack1.test.ts +++ b/scripts/pack1.test.ts @@ -264,7 +264,7 @@ describe('the seven owned packages, packed', () => { '2.4.0', ); expect(range('mcp', 'dependencies', '@modelcontextprotocol/ext-apps')).toBe( - '2.0.3', + '2.1.0', ); expect(range('components', 'dependencies', 'markdown-it')).toBe('15.0.3'); // The optional component package is reachable from a renderer package only as an optional peer. diff --git a/scripts/release-candidate.ts b/scripts/release-candidate.ts index f64c7a3b..d6b90001 100644 --- a/scripts/release-candidate.ts +++ b/scripts/release-candidate.ts @@ -794,7 +794,7 @@ export function candidateRecord( }, upstream: { a2ui: '@a2ui/web_core 0.13.0, @a2ui/lit 0.13.0, @a2ui/react 0.13.0', - mcp: '@modelcontextprotocol/client, core, server 2.4.0; ext-apps 2.0.3', + mcp: '@modelcontextprotocol/client, core, server 2.4.0; ext-apps 2.1.0', zod: "zod 4.6.7 (MCP seam and components); zod 3.25.76 only as core's zod3 alias", react: 'react and react-dom 19.3.1 (exact peers of @saga-a2ui/react only)',