Skip to main content
MCP Apps SDK MCP Apps use two protocol connections: the Host connects to the MCP server, then the View connects to the Host over postMessage. Each connection has its own protocol version. The core MCP lifecycle depends on the negotiated revision, while the MCP Apps connection has its own initialization handshake. This distinction matters when an app works as a normal MCP tool but its UI does not render, or when the View renders but a host-mediated feature is missing.

The Four Versions

The date-based protocol versions are independent. A Host can support a given core MCP version without supporting MCP Apps, and an MCP Apps-capable Host may expose only some optional View APIs.
The current MCP Apps SDK exports LATEST_PROTOCOL_VERSION as "2026-01-26". Use the SDK handshake instead of copying this string into View code.

Two Independent Protocol Layers

1. Host ↔ Server in sunpeak 0.20.x

The core MCP initialize request negotiates the core protocol version. An MCP Apps Host also advertises the UI extension under capabilities.extensions:
Servers should check this extension before returning MCP Apps metadata. getUiCapability() reads the extension without tying your server to a specific Host name. Core MCP 2026-07-28 removes this handshake and carries the version, identity, and capabilities on each request. sunpeak 0.20.x uses the v1 MCP SDK and does not yet speak that modern wire protocol. See MCP 2026-07-28 for MCP Apps for the compatibility boundary and migration checklist.

2. View ↔ Host

The View performs a separate MCP Apps handshake over the iframe’s postMessage transport. The App class sends ui/initialize, reads the negotiated result, then sends ui/notifications/initialized.
appInfo.version identifies this View build. It does not select the MCP Apps protocol version. App.connect() handles that protocol detail.

Capability Checks Still Matter

Matching protocol versions do not mean every optional feature is available. Check the capabilities returned by the Host before showing controls that depend on them:
Use feature checks instead of Host-name checks. A Host can add capabilities without changing its name, and two versions of the same Host may support different features.

Compatibility Rules

  • Use App.connect() for Views and AppBridge for Hosts so the SDK handles MCP Apps version negotiation.
  • Use getUiCapability() before registering UI-enabled server tools.
  • Keep meaningful text in tool result content so clients without MCP Apps support still work.
  • Treat Host capabilities as feature gates for server tools, resources, messages, sampling, downloads, and links.
  • Register one-shot View handlers, including ontoolinput and ontoolresult, before connect().
  • Use _meta.ui.resourceUri for tool-to-View linkage. The flat _meta["ui/resourceUri"] key exists only for compatibility with older Hosts.
  • Upgrade the core MCP SDK and MCP Apps SDK together when their peer dependency ranges require it.

Diagnose a Version or Capability Mismatch

Primary References

MCP Apps 2026-01-26 Specification

Stable extension specification for resources, metadata, lifecycle, and View messages.

Core MCP 2026-07-28 Versioning

Current per-request version negotiation and legacy compatibility.

MCP 2026-07-28 for MCP Apps

What the stateless core revision changes for servers and what stays the same for Views.

Protocol Reference

MCP Apps types, schemas, method constants, and current SDK protocol constant.

Capability Detection

Server-side detection and text fallback pattern.