Skip to main content

Which AI Apps Support MCP Apps and What Works in Each

Short answer

MCP Apps is an official MCP extension, so each AI app decides whether to show the interface. The vendor docs checked on 2026-10-20 say Claude (web, Desktop, iOS and Android), ChatGPT (on the web, for Business and Enterprise/Edu workspaces), VS Code (behind an experimental setting) and Cursor render MCP Apps. Claude Code doesn't render them, and the docs for Gemini CLI and Devin Desktop don't mention them. In an app without support, the same tool still returns its normal result.

Tested withMCP Apps spec 2026-01-26MCP spec 2026-07-28 (extension negotiation, as described in the client matrix)Checked 20 Oct 2026

Compatibility at a glance​

AppMCP AppsWhat its docs say
Claude (web, Desktop, iOS and Android)YesInteractive connectors show as inline cards or a fullscreen view. Team and Enterprise owners can turn off specific tool calls.
Claude CodeNoAnthropic's docs say Claude Code calls the tool and gets text back.
ChatGPT (web)YesCustom MCP servers on Business and Enterprise/Edu. Remote servers only. Not on mobile.
VS Code (GitHub Copilot)Yes, experimentalTurn on chat.mcp.apps.enabled. The interface shows inline only.
CursorYesTools can return interactive UI with their normal output.
Gemini CLINot in its docsIts MCP docs cover resources and tools, not app interfaces.
Devin Desktop (formerly Windsurf)Not in its docsCascade's MCP docs cover stdio, Streamable HTTP and SSE.
Goose, Postman, MCPJam, Archestra.AI, Microsoft 365 CopilotListed by the MCP projectNot checked app by app.

The MCP project's overview lists Claude, Claude Desktop, VS Code, Microsoft 365 Copilot, Goose, Postman, MCPJam and Archestra.AI. It doesn't list Cursor or ChatGPT, but both document their own support, so this page counts them. Check an app's own docs before you rely on a feature, because host support changes quickly.

How a host decides to render an app​

Support is opt-in on both sides. A host uses MCP Apps only when it declares the io.modelcontextprotocol/ui extension and the server declares support too. In the 2026-01-26 MCP Apps spec, the client declares it in the initialize request:

{
"extensions": {
"io.modelcontextprotocol/ui": {
"mimeTypes": ["text/html;profile=mcp-app"]
}
}
}

The newer core protocol (2026-07-28) moves extension declarations into each request's _meta, and clients read a server's extensions from its server/discover response. The MCP project's extension support matrix describes that negotiation.

When the host can render the interface, it reads the ui:// resource, shows it in a sandboxed iframe, and passes the tool result to the view. When it can't, the tool behaves as an ordinary tool. The spec asks servers to check client capabilities before they register UI-enabled tools, so this is a decision the server can make too.

What your server sends​

Every host reads the same tool metadata. This is the shape from the spec, with a made-up tool name:

{
"name": "get-time",
"description": "Returns the current server time.",
"inputSchema": {
"type": "object",
"properties": {}
},
"_meta": {
"ui": {
"resourceUri": "ui://get-time/mcp-app.html",
"visibility": ["model", "app"]
}
}
}

The points that matter across hosts:

  • _meta.ui.resourceUri points at a ui:// resource, and that resource must exist on the server.
  • visibility defaults to ["model", "app"]. Set it to ["app"] for a tool the model shouldn't see, which the view can still call.
  • The resource's MIME type must be text/html;profile=mcp-app.
  • Network access is blocked by default (connect-src 'none'). The resource's csp settings list the domains the view may call or load.
  • The flat _meta["ui/resourceUri"] key is deprecated, and the spec says it will be removed before the extension reaches general availability. In our testing, we still send it next to the nested form for Claude Desktop. Treat it as a temporary workaround.
  • Every UI-enabled tool must still return a meaningful content array, because hosts without MCP Apps show that.

Where hosts differ​

Claude​

Claude uses the same nested field and MIME type, but it needs one extra value on the resource. Each host defines its own ui.domain format. For Claude, it's the first 32 hex characters of the SHA-256 of your server URL, followed by .claudemcpcontent.com. If Claude reports Invalid ui.domain format or ui.domain mismatch, check this value first.

Claude connects to remote servers from Anthropic's cloud, so a localhost address won't work there. The Claude docs on MCP Apps list the steps for a remote server, and Claude Desktop covers local servers.

ChatGPT​

ChatGPT reads _meta.ui.resourceUri. OpenAI's docs describe _meta["openai/outputTemplate"] as a compatibility alias for existing integrations, and recommend the standard field for new UI. Apps built for the older Apps SDK used the text/html+skybridge MIME type, which the migration reference replaces with text/html;profile=mcp-app.

ChatGPT connects to remote servers only. Its help center says a private server can connect through Secure MCP Tunnel. After an admin approves a connection, ChatGPT uses a frozen copy of the tool list, so later changes wait for an admin to publish them. See ChatGPT for the connection steps.

VS Code​

VS Code's MCP Apps docs list these limits:

  • The interface shows inline only. Fullscreen and picture-in-picture aren't supported.
  • Sending a message fills the chat input box, and doesn't send it.
  • Context updates appear as attachments.
  • Camera, microphone and geolocation aren't supported.

The feature sits behind the experimental chat.mcp.apps.enabled setting, which is off by default. See VS Code for adding a server.

Cursor​

Cursor's MCP docs say it supports the Apps extension. Tools return interactive UI along with their normal output, and the same tool still works when the interface can't render. See Cursor for adding a server.

Claude Code, Gemini CLI and Devin Desktop​

Claude Code calls an MCP App tool and receives text, so you'll see the result but not the interface. Gemini CLI's docs cover MCP resources and tools without mentioning app interfaces. Devin Desktop (formerly Windsurf, renamed June 2026) added support for the 2026-07-28 MCP protocol revision in October 2026, and its docs don't mention MCP Apps. For these apps, build the tool so the text result is complete on its own. See Windsurf for Devin Desktop's configuration.

Test in a host that supports MCP Apps​

The ext-apps repository includes basic-host, a reference host for local development. Run it against your server, then open http://localhost:8080 and call the tool:

git clone https://github.com/modelcontextprotocol/ext-apps.git
cd ext-apps
npm install
cd examples/basic-host
SERVERS='["http://localhost:3001/mcp"]' npm start

To try a real host, expose your local HTTP server through a tunnel. The ext-apps testing guide uses cloudflared:

npx cloudflared tunnel --url http://localhost:3001

Add the tunnel's URL with /mcp at the end as a remote MCP server in your host. The URL changes each time you restart cloudflared. For VS Code, turn on chat.mcp.apps.enabled, add the server with an http entry, and check that the tool call shows the interface. If it doesn't, test and debug MCP Apps covers the usual causes.

Common misconceptions​

  • "An MCP App replaces the text result." It doesn't. Hosts without MCP Apps run the tool as a normal tool, so the text result has to make sense alone.
  • "If it works in ChatGPT, it works in Claude." Both read the same tool field and MIME type, but Claude needs its ui.domain value, and plan and admin settings differ between hosts.
  • "Claude Code will show the interface." It calls the tool and gets text back.
  • "Every app in the MCP project's list behaves the same." Display modes and what the interface can do differ. VS Code shows it inline only.

FAQ​

Which AI apps show MCP Apps interfaces?

Claude on the web and in Claude Desktop, ChatGPT on the web for Business and Enterprise/Edu workspaces, VS Code when its experimental MCP Apps setting is on, and Cursor. The MCP project also lists Microsoft 365 Copilot, Goose, Postman, MCPJam and Archestra.AI. Check each app's own docs before you rely on a feature.

What happens in an app that doesn't support MCP Apps?

The tool still runs and returns its normal result. The spec asks servers to return a useful text result for every UI-enabled tool, so the workflow still works without the interface.

Does Claude Code show MCP Apps interfaces?

No. Anthropic's docs say Claude Code calls the tool and gets text back. Use Claude on the web or in Claude Desktop to see the interface.

Do I need separate code for ChatGPT and Claude?

Usually not. Both read the standard _meta.ui.resourceUri field and the text/html;profile=mcp-app resource. Claude also needs a ui.domain value, so test in each host you plan to support.