Skip to content

build(deps): bump @modelcontextprotocol/ext-apps from 1.7.5 to 2.0.0 - #815

Merged
ScriptedAlchemy merged 9 commits into
mainfrom
dependabot/npm_and_yarn/modelcontextprotocol/ext-apps-2.0.0
Sep 25, 2026
Merged

ScriptedAlchemy merged 9 commits into
mainfrom
dependabot/npm_and_yarn/modelcontextprotocol/ext-apps-2.0.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

Bumps @modelcontextprotocol/ext-apps from 1.7.5 to 2.0.0.

Release notes

Sourced from @​modelcontextprotocol/ext-apps's releases.

v2.0.0

What's Changed

ext-apps 2.0 moves to the MCP TypeScript SDK 2.0 split packages. The MCP Apps wire protocol is unchanged: 2.x Views run in 1.x hosts and 2.x hosts render 1.x Views (covered by a test that runs the published 1.7.5 against this release in both directions). What breaks is dependencies and the TypeScript API; see the migration guide.

Breaking changes

  • Peer dependencies. @modelcontextprotocol/sdk@^1 is replaced by @modelcontextprotocol/client@^2.0.0 (required: App and AppBridge extend its Protocol), @modelcontextprotocol/server@^2.0.0 (optional, only for the ./server helpers), and zod@^4.2.0. Node.js 20+.
  • zod 3 is no longer supported. SDK 2.0 requires zod 4.2+ (the release that added Standard JSON Schema output); the 1.x fallback for zod 3.25 is gone. Raw zod shapes in registerAppTool still work as a deprecated overload; wrap them in z.object({...}) to move off it.
  • Handler context. Custom handlers receive the SDK 2.x BaseContext: extra.signal is now extra.mcpReq.signal, extra.requestId is extra.mcpReq.id.
  • setRequestHandler / setNotificationHandler are keyed by method name. The 2.x form is setRequestHandler("method", { params }, (params, ctx) => …). The 1.x (Schema, handler) form still works as a deprecated overload with a one-time warning (#769) and goes away in 3.0.
  • The double-registration guard now covers the SDK's own handlers. Registering a handler for notifications/progress or notifications/cancelled throws already registered, as ping and the on*-owned methods did in 1.x.
  • ProtocolWithEvents is removed. AppRequest, AppNotification and AppResult remain as deprecated type aliases.
  • Errors. Remote JSON-RPC errors are ProtocolError (numeric code); local failures are SdkError (string code). Host-side wire deltas: a handler-thrown -32002 reaches the View as -32602, invalid params on ui/* methods go from -32603 to -32602, and the MCP error N: message prefix is gone.
  • schema.json follows the 2.0 core schemas: structuredContent is any JSON value, result _meta documents io.modelcontextprotocol/serverInfo, toolInfo.tool.outputSchema is a loose object, and a recursive JSON-value definition is added.

SDK

  • Migrate to SDK v2 with the official Protocol and isolated role peers by @​tonxxd, building on @​khandrew1's #710 and @​felixweinberger's #712, in #720
  • SDK 2.0 fixups: regenerated lockfile, ^2.0.0 peers, restored double-registration guard, deprecated raw-shape registerAppTool overload, migration guide, wire-compat tests, MCPB build in #768
  • Fix: explicit .js extensions on relative imports so published declarations resolve under NodeNext / Node16 (#704) by @​ken-jo in #705
  • Keep the 1.x handler registration forms as deprecated overloads in #769
  • Cross-version interop test against the published ext-apps 1.7.5 in #770

Examples

  • All examples migrated to the split SDK packages (NodeStreamableHTTPServerTransport, z.object schemas, extra.mcpReq.*) in #720
  • server-pdf now advertises JSON Schema 2020-12 on every tool's inputSchema / outputSchema, which fixes #765 for clients with a strict 2020-12 validator

Docs

Security

npm audit reports 10 findings (2 critical, 4 high, 4 moderate), all in example workspaces or build tooling, none reachable from the published package, whose only runtime dependency is @standard-schema/spec:

  • seroval / solid-js (GHSA-mv8w-475r-vwqw): the Solid example's vite plugin, pinned by a root overrides
  • undici 7.28.0: cheerio in wiki-explorer-server
  • nanoid, postcss: vite
  • brace-expansion: nodemon (dev)
  • hono / @hono/node-server (GHSA-frvp-7c67-39w9): @modelcontextprotocol/node in the examples' servers; same advisory as the 1.7.5 residual, still unreachable (only getRequestListener / serve are imported)
  • qs: express 5 in examples; fflate: @types/three (dev)

All have non-major fixes available and will be picked up in a follow-up, kept off this release to keep the version diff clean.

Full Changelog: modelcontextprotocol/ext-apps@v1.7.5...v2.0.0

Commits
  • 352f6ce CI: build the WSL job on ext4, skip the unused Chromium download, list tsconf...
  • ae4f7e0 Sync the quickstart tsconfig snippets
  • a0dcf16 CI: build the WSL job on ext4, skip the unused Chromium download, list tsconf...
  • ae0fe55 Migration guide fixes and editor-visible deprecation for the 1.x handler form...
  • 853c9f7 Migration guide fixes and editor-visible deprecation for the 1.x handler form
  • 12aa50b Add cross-version interop test against the published ext-apps 1.7.5 (#770)
  • 218aef1 Keep the 1.x handler registration forms as deprecated overloads (#769)
  • 5f6346e Add cross-version interop test against published ext-apps 1.7.5
  • 4eab52e Export the legacy handler types from the root entry
  • 728b0bf Keep the 1.x handler registration forms as deprecated overloads
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Maintainer notes

ext-apps 2.0 moves to the MCP SDK 2 split packages (@modelcontextprotocol/client and core are required peers, server is optional) with an unchanged wire protocol. Breakages in this repo, and the fixes:

  • Workbench runtime App bridge (packages/workbench/src/mcp/runtime-app-bridge.ts). Handlers now receive the SDK 2 BaseContext, so the bridge reads extra.mcpReq.signal (it was extra.signal). Without this, consent prompts and the open-link, download, and display-mode abort checks silently lose cancellation. tools/list is now registered in the method-keyed form and forwarded as request(req, { signal }). The last SDK v1 import is gone, and @modelcontextprotocol/sdk is removed from the Workbench. The sandbox.csp readonly type is cast to McpUiResourceCsp. Tests now pass the real context shape, and a new test drives ui/open-link and tools/list through the real AppBridge to prove the signal reaches consent and the forwarded request.
  • Pre-existing finding: createRuntimeAppBridgeFactory has had no production caller since it landed (40d04ba). main.tsx never supplies the runtime preview's createBridgeFactory, so the built Workbench contains no ext-apps code. This PR therefore ships nothing in the agent-bundle tarball and carries skip-changeset; the only publishable-file edit is a source comment.
  • examples/rsc-agent-runtime. The server moved from SDK v1 to @modelcontextprotocol/server and node 2.0.0: McpServer, ServerContext, ctx.mcpReq.send({ method: 'roots/list' }), and @modelcontextprotocol/server/stdio. HTTP now uses createMcpHandler(..., { legacy: 'stateless' }) with toNodeHandler and hostHeaderValidation, keeping the example's exact-origin check. The old express behavior is preserved: a 100 kB body cap (413) and JSON parse errors (400); non-identity Content-Encoding now returns 415. express and SDK v1 are removed, tests use the v2 Client, and the ambient ext-apps/react type shim is deleted because 2.0's declarations resolve. The materializer no longer requires async chunks for mcp/http: the only async chunk there came from ext-apps 1.7.5 lazily importing zod/v4.
  • Behavior differences: GET/DELETE /mcp return 405 JSON instead of express's 404 page. Clients that negotiate the 2026-07-28 protocol refuse server-to-client requests, so for them the roots lookup falls back to the working directory.
  • Docs: I re-measured the AB4772 size guidance with agent-bundle's App compiler. A minimal ext-apps 2.0 view is 249,236 bytes (64,844 gzip); the same view on 1.7.5 is 444,505 bytes (105,773 gzip). Updated docs/diagnostics.md, en/zh mcp.mdx, and the source comment.

Local gate (branch contains origin/main 64492dd)

Command Result
pnpm build / pnpm typecheck / pnpm lint pass (re-run after merging #817)
pnpm test:unit pass: 4489 passed, 6 skipped
rstest --config rstest.integration.config.ts for discovery, lifecycles, mcp-app-real, mcp-app-preview-browser, mcp-app-frame, mcp-page-app-browser, examples-real, rsc-runtime-topology-script, mcp-apps-compile pass: 9 files, 64 tests
node scripts/run-packed-tests.mjs for workbench packed-release, dev-workbench-packaging, rsc-runtime-optional-packaging pass: 3 files, 7 tests
node scripts/run-examples-check.mjs pass: all 7 examples
pnpm --filter @agent-bundle/rsc-agent-runtime-demo check (after the review fixes) pass: 170 passed, 6 skipped; route-unit 3/3
pnpm docs:site:build pass

The independent review (change-risk-reviewer, GPT-5.6 Sol Max) found three issues: the dormant bridge made the changeset inaccurate (changeset removed), compressed bodies were misreported as parse errors (now 415, with a test), and the 1.x size figures didn't match the probe (aligned). Its follow-up review found no remaining blockers.

Root verification verdict: PASS+NOTES on the merged commit dd322cb647

This PR merged at 01:01Z before a root verdict, with CI still pending and no local gate or independent review recorded in the body. The root verified the merged commit on main against its parent b9fbc2e06d.

Lane Model Result
Gates on dd322cb647 Grok 4.7 (commands only) typecheck, lint, test:unit (4487 passed), examples:check, the mcp-app browser test (14 passed), eval:spot, and the rsc-agent-runtime suite (170 passed, including mcp-transports.integration.test.ts) all pass. The first integration pool run had 3 failures that each passed solo. That run overlapped a root e2e run on the same machine.
Integration pool rerun alone root PASS. 1183 passed, 0 failed.
Workbench in real Chrome, examples-real.e2e.test.ts, which rebuilds the Workbench Grok 4.7 and root PASS 7/7 on dd322cb647 and 7/7 on the parent b9fbc2e06d. That covers every populated MCP App workflow surface and the flagship Application tree.
MCP over stdio and HTTP on the example GPT-5.6 Sol PASS. Protocol 2025-11-25, 3 tools with UI metadata, and an App resource served as text/html;profile=mcp-app. The HTTP probes return 403 for a foreign host, 403 for a foreign origin, 413 for an oversized body, 400 for invalid JSON, and 405 for GET and DELETE.
Merged-diff audit Claude Fable 5.1 PASS+NOTES. Every ext-apps 2.0 breaking change has an adapted caller. http.ts keeps its host and origin checks and tightens two others. The 100 KB body limit now covers non-JSON posts, and a non-identity Content-Encoding returns 415. The Workbench bridge's origin and source checks and its teardown are untouched. The only publishable change is a JSDoc comment, so no changeset is needed.

Notes:

  • The docs quote 445 kB for a 1.x view where they said 437 kB before, for the same 1.7.5. No measurement is recorded for either figure.
  • writeJson and readRequestBody in the example's http.ts mirror dev/http.ts. That module is not a public export, and examples may only use public exports, so the copy is forced.
  • @modelcontextprotocol/sdk@1.30.0 and express remain in the lockfile only through the root @modelcontextprotocol/conformance devDependency.

No regression attributable to this merge was found, so no fix or revert PR is needed.

Bumps [@modelcontextprotocol/ext-apps](https://github.com/modelcontextprotocol/ext-apps) from 1.7.5 to 2.0.0.
- [Release notes](https://github.com/modelcontextprotocol/ext-apps/releases)
- [Changelog](https://github.com/modelcontextprotocol/ext-apps/blob/main/RELEASES.md)
- [Commits](modelcontextprotocol/ext-apps@v1.7.5...v2.0.0)

---
updated-dependencies:
- dependency-name: "@modelcontextprotocol/ext-apps"
  dependency-version: 2.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Sep 16, 2026
@changeset-bot

changeset-bot Bot commented Sep 16, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 487e2be

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

pkg-pr-new Bot commented Sep 16, 2026

Copy link
Copy Markdown
npm i https://pkg.pr.new/ScriptedAlchemy/agent-bundle@815
npm i https://pkg.pr.new/ScriptedAlchemy/agent-bundle/create-agent-bundle@815
npm i https://pkg.pr.new/ScriptedAlchemy/agent-bundle/rsc-markdown-stream@815
npm i https://pkg.pr.new/ScriptedAlchemy/agent-bundle/@agent-bundle/runtime@815

commit: 3623553

@ScriptedAlchemy ScriptedAlchemy added the skip-changeset PR changes a publishable package but ships no observable change; changeset not required label Sep 25, 2026
@ScriptedAlchemy
ScriptedAlchemy merged commit dd322cb into main Sep 25, 2026
2 checks passed
@dependabot
dependabot Bot deleted the dependabot/npm_and_yarn/modelcontextprotocol/ext-apps-2.0.0 branch September 25, 2026 01:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code skip-changeset PR changes a publishable package but ships no observable change; changeset not required

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant