window.openai APIs for its own capabilities, on top of that same contract. Skybridge targets the MCP Apps baseline and reaches the Apps SDK only where you opt into a ChatGPT feature, so one server and one set of views run on both.
MCP Apps
MCP Apps extends the Model Context Protocol with a UI contract: a tool result can carry a view, and the view talks to the host over a JSON-RPCui/* bridge to read the tool’s data, call other tools, sync state, and request layout. It is the portable baseline, so a view built against it runs on any host that implements the spec. The full contract is in the MCP Apps specification.
Apps SDK
ChatGPT implements MCP Apps and layers the Apps SDK on top:window.openai, a set of APIs for ChatGPT-only capabilities such as file params and the open-in-app URL. OpenAI’s guidance is to use the MCP Apps ui/* bridge by default and reach for window.openai only for those extras. The Apps SDK reference documents the surface, and MCP Apps in ChatGPT covers how the two fit together.
In Skybridge
You write one MCP server and one set of views. Skybridge detects the runtime when the view loads and routes each call to the right layer: the MCP Apps bridge everywhere,window.openai only for ChatGPT features. Where a capability exists on one host and not the other, it surfaces as ChatGPT versus Claude in the compatibility overview. When you need a raw value the cross-host hooks don’t expose, useAppsSdkContext and useMcpAppContext are the escape hatches to each layer.
Feature Mapping
Each hook, and the host API it routes to on either runtime.| Skybridge | Apps SDK (window.openai) | MCP Apps (ext-apps) |
|---|---|---|
useToolInfo | toolInput, toolOutput, toolResponseMetadata | ui/notifications/tool-input, ui/notifications/tool-result |
useViewState | viewState, setViewState() | ui/update-model-context |
useCallTool | callTool() | tools/call |
useSendFollowUpMessage | sendFollowUpMessage() | ui/message |
useOpenExternal | openExternal() | ui/open-link |
useDisplayMode | displayMode, requestDisplayMode() | ui/request-display-mode |
useLayout | theme, maxHeight, safeArea | ui/notifications/host-context-changed |
useUser | locale, userAgent | ui/notifications/host-context-changed |
useRequestModal | requestModal() | Polyfilled in-iframe |
useRequestClose | requestClose() | ui/notifications/request-teardown |
useRequestSize | Not supported | ui/notifications/size-changed |
useFiles | uploadFile(), getFileDownloadUrl() | Not supported |
useSetOpenInAppUrl | setOpenInAppUrl() | Not supported |
Compatibility
Which hosts each API runs on
useAppsSdkContext
Read a raw ChatGPT (Apps SDK) value
useMcpAppContext
Read a raw MCP Apps value