Skip to main content
Same server, different hosts. The rows below are generic facts confirmed by probing the hosts; anything not confirmed says so. Registration snippets are in Connect a host.

Facts that hold across Apps hosts

  • All four Apps hosts we probed for actions — basic-host, claude.ai, VS Code Copilot Chat and ChatGPT — honour ui/message, but only claude.ai advertises it. Three prefill the composer; ChatGPT SENDS the message, behind a send-or-cancel dialog on desktop and automatically on the web when the connector is set to “allow all”. Author prompt actions accordingly: on ChatGPT the text is the message, not a suggestion. The frame therefore never gates prompt actions on the advertised flag; a host that answers with a JSON-RPC error gets an inline alert inside the frame while the widget stays intact.
  • hostCapabilities.serverTools in the initialize result is the reliable gate for http actions. Without it the frame renders http descriptors disabled with an explanatory title, and prompt actions stay enabled. All three probed hosts advertise it and proxy the frame’s tools/call to the server.
  • App-side tools/list is unsupported everywhere (-32601), so the frame never enumerates tools; it calls execute_action and preview_widget by name.
  • Agents sometimes pick an explicit format. VS Code Copilot Chat’s agent chose app and then told the user it could not confirm the widget displays; the default renders inline in every Apps host here, and the format description now says to leave it out in chat.
  • Streaming previews depend on what the host sends while the model writes the call. Claude Desktop streams partial input (tool-input-partial) and passes the frame’s preview_widget call through before the tool result, so built-in and stored widgets fill in progressively — provided the agent writes widget before data, which render_widget’s description asks for. VS Code Copilot Chat and ChatGPT send no partial input, only the complete input immediately before the result, so the widget appears all at once there. Claude on the web and the MCP Apps basic-host were not re-probed for this.
  • Hosts cache ui:// resources per conversation. After a server change, retest the template in a fresh chat.
  • Where partial input is sent, it can be size-gated by the host, so do not count on a streaming preview for every payload; the tool result is always authoritative.
  • The sandbox CSP blocks external images. The server inlines them as data: URIs on iframe surfaces; see Inline rendering.
  • Declared resource domains are honoured. claude.ai on the web, ChatGPT desktop and VS Code Copilot Chat load images directly from origins declared in the app resource’s _meta.ui.csp.resourceDomains, exact (https://api.dicebear.com) and wildcard (https://*.pravatar.cc) alike, and all three block undeclared ones. So a render with more images than the inliner carries shows every image on a declared domain and leaves the rest as alt text. claude.ai copies the entries verbatim into its frame’s img-src, script-src, style-src, font-src, media-src and worker-src. Claude Desktop was not probed separately.
  • claude.ai keeps the app resource’s declaration for the page session. A new conversation in the same tab still enforces the old policy, and a page reload picks up a changed one. That includes a person’s own domains changed in Settings.
  • claude.ai mounts a fresh iframe per render, so each render is a new widget instance; a load binding fires once per instance.

Browser agents on the authoring page (WebMCP)

A different axis from the table above: not a host rendering widgets, but a browser whose agent can use the designers on the authoring page as tools, through @widgentic/webmcp (beta). See Co-author with a browser agent.

Connecting to the hosted server

The hosted server answers at https://mcp.widgentic.dev/mcp. Hosts that send headers (VS Code Copilot Chat) pass the key as x-api-key; hosts that accept only a URL (claude.ai and Claude Desktop connectors) take it as ?key=. A request without a resolvable key still works over the built-in catalog, as described in Per-principal catalogs.
Registration is never an MCP tool. Whatever host you connect, saving a widget happens in the authenticated app; the key only reads. See the Trust model.

Hosts without Apps support

Any client that does not advertise the Apps capability receives the default result — the HTML fragment text block plus the widgentic payload block — with the template unmounted. Hosts that understand the application/vnd.widgentic+json block can mount it natively with @widgentic/core; see Render in your host. Everyone else reads the HTML, or asks for format: "page".