refactor: drop the ext-apps SDK-v1 shims now that 2.0.0 peers on SDK v2

Every site tagged `ext-apps#702` carried a workaround for ext-apps
peering on the v1 SDK while the Inspector runs v2. With 2.0.0 the
package's `AppBridge` extends the v2 `Protocol`, takes the v2 `Client`
and `Implementation` directly, and registers its list-changed forwarding
on that client with `setNotificationHandler("notifications/…", handler)`,
so:

- core/mcp/apps.ts: `getToolUiResourceUri(tool)` takes the v2 `Tool`
  without a cast; `UiMetaShape` is replaced by ext-apps' own
  `McpUiToolMeta` / `McpUiResourceMeta`, which resolve under NodeNext
  since ext-apps#705. `AppInfo.csp` / `.permissions` / `.visibility`
  take the named types too.
- core/mcp/inspectorClient.ts: `getAppRendererClient()` returns the SDK
  client itself; the Proxy that translated the 1.x schema-first
  `setNotificationHandler(Schema, handler)` into the method-string form,
  its `notificationMethodFromSchema` helper and its cached field are
  gone. `AppRendererClient` is now `Client` rather than `unknown`.
- createAppBridgeFactory.ts: `new AppBridge(client, HOST_INFO, …)` with
  no `as unknown as`; `resolveSourceUri` passes the tool straight through.
- AppRenderer.tsx: `sendToolResult(result)` — its params ARE the v2
  `CallToolResult` now.
- requestAppElicitation.ts: the double cast on the `elicitation/create`
  send goes too — v2 `Protocol.request` takes the standard `Request`
  shape, which `ElicitRequest` is. The helper itself stays: ext-apps#733
  is not in 2.0.0.
- core/mcp/extensions.ts: `MCP_APP_MIME_TYPE` re-exports ext-apps'
  `RESOURCE_MIME_TYPE` from `/app-bridge`; `UI_EXTENSION_KEY` stays
  hardcoded because `EXTENSION_ID` is still `/server`-only in 2.0.0.

Tests: the Proxy-translation test is removed with the Proxy; the
`getAppRendererClient` tests assert the real `Client` instance and that
disconnect withdraws it; the `useInspectorClient` sentinel is a real
(unconnected) `Client`. Comments that cited ext-apps 1.7.5 now cite 2.0.0
where the fact still holds (#733 still unreleased).

Closes #1745
Refs #2309

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PsmUAZ6aLUAFqenjJKSSRp
Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
cliffhall 2026-09-13 19:21:06 -04:00
commit a42d7fd99e

View file

@ -1,4 +1,5 @@
import type { ClientCapabilities } from "@modelcontextprotocol/client";
import { RESOURCE_MIME_TYPE } from "@modelcontextprotocol/ext-apps/app-bridge";
import { TASKS_EXTENSION_KEY } from "./modernTaskSchemas.js";
/**
@ -13,21 +14,24 @@ export const EMA_EXTENSION_KEY =
/**
* Extension identifier for the MCP Apps UI extension (SEP-ext-apps). Mirrors
* `EXTENSION_ID` from `@modelcontextprotocol/ext-apps`. Hardcoded rather than
* imported: that constant lives on the package's `/server` subpath, which would
* pull server-only code into the browser bundle. The Inspector always renders
* MCP Apps, so this is advertised by default (#1740).
* imported: as of ext-apps 2.0.0 that constant is still exported only from the
* package's `/server` subpath, which would pull server-only code (and the
* optional `@modelcontextprotocol/server` peer) into the browser bundle. The
* node integration test `extensions-mimetype.test.ts` pins the two together.
* The Inspector always renders MCP Apps, so this is advertised by default
* (#1740).
*/
export const UI_EXTENSION_KEY = "io.modelcontextprotocol/ui";
/**
* The MCP Apps UI resource MIME type the Inspector renders. Mirrors
* `RESOURCE_MIME_TYPE` from `@modelcontextprotocol/ext-apps`; a server checks
* for it in the client's advertised `io.modelcontextprotocol/ui` `mimeTypes` to
* decide whether to serve an App. Hardcoded (stable spec string) because
* ext-apps re-exports it through an extensionless path that doesn't resolve
* cleanly under NodeNext — see the same note in `core/mcp/apps.ts`.
* The MCP Apps UI resource MIME type the Inspector renders. A server checks for
* it in the client's advertised `io.modelcontextprotocol/ui` `mimeTypes` to
* decide whether to serve an App. Re-exported from ext-apps' `/app-bridge`
* subpath — the one the Inspector already imports everywhere — rather than
* restated: the extensionless re-export that once kept this a hardcoded copy
* was fixed upstream (ext-apps#705) and shipped in 2.0.0 (#1745).
*/
export const MCP_APP_MIME_TYPE = "text/html;profile=mcp-app";
export const MCP_APP_MIME_TYPE = RESOURCE_MIME_TYPE;
/**
* The value the client stamps for each advertised extension. The wire shape is