v1.7.0
Changed
dockyard-bridge'sui/wire layer is now pinned to the vendored official
@modelcontextprotocol/ext-appsschema. (D-182) The bridge previously
hand-transcribed the MCP Apps wire dialect, which drifted silently (the cause
of the 1.6.1 handshake bugs). The schema is vendored into the repo by upstream
SHA, and a wire-conformance test now.parse()s the bridge's outbound wire
against it — a drift is a failing build, not a blank App in a host. The shipped
App bundle stays Zod-free and consumers need no schema dependency (the schema
is referenced only by the bridge's test layer).HostContextgains schema-accurate fields (additive).containerDimensions
now models flexible sizing (maxWidth/maxHeight) alongside fixed
width/height;stylesgainscss.fonts;toolInfo,platform, and
deviceCapabilitiesmatch the schema.
Fixed
dockyard-bridgeadvertisesappCapabilities.availableDisplayModes, not
displayModes. (D-182, item A) The host's parse silently stripped the
non-schemadisplayModeskey, so it never learned which display modes an App
supported and fullscreen/pip degradation never worked. The publicdisplayModes
bridge option is unchanged.dockyard-bridgehandlesui/resource-teardownas a request, not a
notification. (D-182, item B) A spec host sends teardown as a request and
waits for the View's response before tearing the iframe down; the bridge now
responds, then closes. Adds the app-initiatedui/notifications/request-teardown
(BridgeShell.requestTeardown()).dockyard-bridgeapplies host fonts. (D-182, item D) Host-provided
styles.css.fontsCSS is injected into the View document so the host's fonts
load.ui/messageandui/update-model-contextnow send schema-conformant
content. (D-182 — checkpoint audit) Both sent a bare-stringcontent(and
ui/messageallowed a non-userrole); the schema requirescontent: ContentBlock[](androle: "user"), so a spec host would have rejected them.
sendMessagenow wraps a string into a text block;UpdateModelContextParams.content
isContentBlock[]. The conformance test now.parse()s every View→host
request (open-link, message, request-display-mode, update-model-context), not
just the handshake.- The local inspector consumes the View's
size-changedandrequest-teardown.
(D-182, item 4 — checkpoint audit) It sizes the preview iframe to the App's
reported content height (mirroring a real host) and remounts on a teardown
request, instead of silently dropping both. - Conformance coverage extended to the full wire (D-182 — second audit pass).
The conformance layer now also guards the bridge's inbound reads (a
schema-validtool-input/tool-result/tool-cancelled/host-context-changed
reaches the App subscriber with every field intact), the inspector's
outbound host→View wire (the reference host'sui/initializeresult,
request-display-moderesult, and notifications.parse()clean), and the
server-emitted_meta.ui+ capability shapes. Inbound notification types
(arguments,width/height) are now optional to match the schema.
Packaging
dockyard-bridge/specexposes the vendored ext-apps schema (used by the
inspector and the bridge's own conformance tests). Itszod+
@modelcontextprotocol/sdkimports are provided by the consumer (devDependencies
of bothdockyard-bridgeandweb/inspector); they are intentionally not
declared as peer dependencies — an optional peer makes a bundler stub it and
breaks the production build. The package's.entry imports no zod, so App
authors importing only.install nothing extra.- The local inspector is a faithful, validating spec host. (D-182, item 4) It
no longer sends a host→Viewui/notifications/initialized; it marks itself ready
when the View sendsinitialized, readsavailableDisplayModes, and now
validates the View'sui/initializeagainst the vendored schema, rejecting a
non-spec shape with a JSON-RPC error. This removes the leniency that let the
1.6.1 View bugs pass locally — the inspector now catches them. The schema is
shared via a new opt-indockyard-bridge/specsubpath (the package's.entry
stays Zod-free for App consumers).
Notes
- Dockyard's Tasks×Apps
ui/notifications (task-progress,
elicitation-response) are now explicitly fenced as Dockyard extensions
outside the MCP Apps schema; they function only against a Dockyard-aware host
(the inspector, or Harbor). (D-183)
Commits
Added
- inspector: validate inbound ui/initialize against the vendored schema (D-182, item 4)
- bridge: teardown-as-request, fence Dockyard exts, faithful inspector host (D-182/D-183)
- bridge: vendor ext-apps schema + wire-conformance test + items A/C/D (D-182)
Fixed
- inspector: resolve dockyard-bridge/spec zod from the inspector root (fixes make build in CI)
- bridge,inspector: checkpoint-audit fixes for v1.7 wave A (§17)