Portable fallback
Every tool should return useful text or structured JSON even when it also has an app. If the host cannot show the UI, users still get a usable result.
For MCP builders: compare which agent hosts like Claude and ChatGPT can show MCP App interactive widgets.
| Host | UI bundle UI delivered as a bundle The server sends bundled HTML, CSS, and JavaScript through MCP. The host embeds it inside chat. What this means Build with standard web code. React or Vue are fine after you bundle them. When you might use it
| Live HTTPS page UI as a live HTTPS page An MCP App embeds your live website in a nested iframe. The host must allow its domain. What this means Keep the app at an HTTPS URL. A tiny MCP wrapper embeds it, but many hosts block this. When you might use it
| External link UI as an external link The tool returns a link. It opens outside the conversation. What this means Return a hosted UI link with text or JSON. It opens outside chat and works almost everywhere. When you might use it
| App-only data App-only data Data sent to the embedded UI but hidden from the AI model. This is separate from the UI bundle and normal tool results. What this means Use it only for optional UI details. Never put required results here because some hosts can drop it. When you might use it
| Tool-result limit | Biggest catch |
|---|---|---|---|---|---|---|
| Recommended baseline Start here |
Use this
Primary in-chat UI |
Avoid by default
Host support varies |
Create fallback UI
Return a link to its hosted page | Optional only Never put required results here. | Target ≤10K result tokens This is for tool data, not the UI bundle. | Return useful text or JSON even when the app frame does not render. |
| Claude Web | Yes | Generally blocked Generally blocked Claude typically will not embed an arbitrary live HTTPS page inside the chat. What this means Ship a UI bundle (MCP HTML resource), not a nested live site. Keep an external link as the escape hatch. | Yes Opens outside chat | Yes The UI can receive data hidden from the AI model. | 25K tokens MCP App trouble has been observed around 150K characters. | Arbitrary external frames are restricted. Large results need paging or follow-up fetches. |
| Claude Desktop | Yes | Generally blocked Generally blocked Claude typically will not embed an arbitrary live HTTPS page inside the chat. What this means Ship a UI bundle (MCP HTML resource), not a nested live site. Keep an external link as the escape hatch. | Yes Opens outside chat | Yes The UI can receive data hidden from the AI model. | 25K tokens MCP App trouble has been observed around 150K characters. | App HTML is cached aggressively; a full restart may be needed after changes. |
| Claude Code CLI | No | No | Yes Opens outside chat | Not applicable This surface does not display an embedded UI. | ~25K tokens A per-tool override can preserve up to 500K characters. | Large output may become a file plus a short preview. |
| ChatGPT Web / desktop | Yes | Yes, restricted Yes, restricted ChatGPT can embed a live HTTPS page only when that domain is allowlisted for nested iframes. What this means Prefer a UI bundle when you can. If you need a live page, declare the exact domain and expect stricter app review. | Yes Opens outside chat | Yes The UI can receive data hidden from the AI model. | Not published OpenAI recommends keeping model-visible structured data concise. | Embedding a live website requires an allowlisted iframe domain and can trigger stricter app review. |
| OpenAI Codex CLI / IDE | Not documented | Not documented | Yes Opens outside chat | Not applicable This surface does not display an embedded UI. | Not published | MCP tools and resources work, but an inline app frame is not documented. |
| OpenAI Codex Desktop | Experimental Experimental Codex Desktop MCP Apps are under development and usually off by default. What this means Do not depend on an in-chat UI here yet. Return useful text or JSON, and treat any app render as a bonus. | Not established | Yes Opens outside chat | Unreliable App-only data delivery cannot be depended on. | Not published | MCP Apps are under development and disabled by default. |
| Cursor 2.6+ | Yes, gated Yes, gated Cursor documents MCP App support, but the in-chat iframe often does not appear even when the tool returns a valid UI render resource. What this means Treat the UI as optional. Always return useful text or JSON, plus an external link when needed. Do not depend on every Cursor user seeing the in-chat app. | Not documented | Yes Opens outside chat | No Normal tool results arrive, but app-only data is missing. | Not published | Support exists, but this Cursor surface often shows text/links only—no in-chat iframe. Private UI-only data can also be dropped. |
| VS Code GitHub Copilot | Yes | Yes, restricted Yes, restricted VS Code can embed a live HTTPS page only when that domain is declared for nested iframes. What this means Prefer a UI bundle when you can. If you need a live page, declare the exact domain and keep a text or JSON fallback. | Yes Opens outside chat | Yes The UI can receive data hidden from the AI model. | Not published | Only inline display is supported. MCP Apps can be disabled in settings. |
| Goose Desktop | Yes | Needs testing | Yes Opens outside chat | Needs testing App-only data delivery has not been verified. | Not published | Behavior depends on the Goose version and Apps client implementation. |
You build an MCP (Model Context Protocol) so customers can use AI tools like Claude and ChatGPT to access your product's data and actions. MCP Apps are the first official MCP extension. They let your MCP show an interactive widget, such as a map, form, chart, or table, directly inside a supported AI chat.
Every tool should return useful text or structured JSON even when it also has an app. If the host cannot show the UI, users still get a usable result.
“Not published” means the host has not stated a reliable numeric limit. Test large tool results before depending on them in production.
The server sends bundled HTML, CSS, and JavaScript through MCP. The host embeds it inside chat.
What this means
Build with standard web code. React or Vue are fine after you bundle them.
When you might use it
An MCP App embeds your live website in a nested iframe. The host must allow its domain.
What this means
Keep the app at an HTTPS URL. A tiny MCP wrapper embeds it, but many hosts block this.
When you might use it
The tool returns a link. It opens outside the conversation.
What this means
Return a hosted UI link with text or JSON. It opens outside chat and works almost everywhere.
When you might use it