Builds interactive UIs inside ChatGPT or Claude using MCP Apps, OpenAI Apps SDK, or MCP-UI. Covers tool design, data bridge, state, security, visual design, and distribution.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pproenca-dot-skills-1:chat-apps-ui-sdkThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A reference for building beautiful, review-ready apps that render interactive UI inside the chat surface of ChatGPT and Claude. As of January 2026 these platforms share one foundation — the **MCP Apps** standard (`@modelcontextprotocol/ext-apps`), rendered by Claude, ChatGPT, VS Code, and Goose. The **OpenAI Apps SDK** is a superset adding the `window.openai` bridge, and **MCP-UI** (`@mcp-ui/se...
A reference for building beautiful, review-ready apps that render interactive UI inside the chat surface of ChatGPT and Claude. As of January 2026 these platforms share one foundation — the MCP Apps standard (@modelcontextprotocol/ext-apps), rendered by Claude, ChatGPT, VS Code, and Goose. The OpenAI Apps SDK is a superset adding the window.openai bridge, and MCP-UI (@mcp-ui/server / @mcp-ui/client) is the community implementation. This skill contains 46 rules across 8 categories, ordered by impact so the highest-leverage decisions come first.
The mental model: an app is an MCP tool first, UI second. The model invokes a tool; the tool returns data plus a link to a UI resource; the host renders that resource in a sandboxed iframe; the iframe talks back over a defined bridge. Mistakes early in that chain mean nothing renders; mistakes later mean it renders broken, unsafe, or unpolished.
Reference these guidelines when:
structuredContent / content / _meta contract for a chat app_meta.ui.resourceUri, the text/html;profile=mcp-app MIME type, the ui:// scheme)window.openai, ui/notifications/*, MCP-UI onUIAction)| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | MCP Tool & Discovery Design | CRITICAL | tool- |
| 2 | UI Resource Wiring & Templates | CRITICAL | wire- |
| 3 | Host–Component Data Bridge | HIGH | bridge- |
| 4 | Display Modes & Responsive Layout | HIGH | display- |
| 5 | State & Model Context | HIGH | state- |
| 6 | Security & Data Boundaries | HIGH | sec- |
| 7 | Visual Design & UX Polish | MEDIUM-HIGH | design- |
| 8 | Distribution & Cross-Host Portability | MEDIUM | dist- |
tool-structured-content-contract - Split output across structuredContent, content, and _metatool-specific-verb-names - Name tools as specific action verbstool-output-schema-validation - Declare an output schema for structuredContenttool-safety-annotations - Set readOnlyHint and destructiveHint accuratelytool-minimal-scoped-inputs - Request minimal, task-scoped tool inputstool-feed-widget-in-response - Return everything the widget needs in one responsetool-honest-descriptions - Write honest tool descriptions and status textwire-resource-uri-link - Link each tool to its UI with resourceUriwire-mcp-app-mimetype - Serve UI resources with the mcp-app MIME typewire-ui-scheme-and-handler - Match the ui:// URI to a registered resourcewire-version-uri-cache-key - Version the resource URI as a cache keywire-inline-self-contained-bundle - Inline the component bundle into the resourcewire-set-ui-domain - Set a unique ui.domain for the componentbridge-render-from-notifications - Render from tool output, not first paintbridge-call-tools-app-visibility - Expose tools to the app before calling thembridge-followup-vs-silent-call - Choose follow-up messages or silent tool callsbridge-validate-postmessage-origin - Validate postMessage source in the hostbridge-handle-all-mcpui-actions - Handle every MCP-UI onUIAction typebridge-use-host-apis - Use host bridge APIs instead of reimplementingdisplay-pick-the-right-mode - Pick the display mode that fits the taskdisplay-request-mode-with-fallback - Request fullscreen but render inline firstdisplay-report-intrinsic-height - Report intrinsic height and respect maxHeightdisplay-avoid-nested-scroll - Avoid nested scroll inside inline cardsdisplay-respect-theme - Respect the host theme and color schemedisplay-responsive-breakpoints - Collapse layout gracefully on small screensstate-separate-three-stores - Separate widget, server, and model statestate-persist-widget-state - Persist UI state through setWidgetStatestate-no-secrets-in-state - Keep secrets and PII out of widget statestate-update-model-context - Push user decisions to model contextstate-keep-state-small - Keep widget state small and serializablesec-declare-csp-allowlist - Declare a CSP allowlist for the widgetsec-avoid-frame-domains - Avoid nested frame domains in the widgetsec-no-secrets-in-payloads - Never embed secrets in bundles or payloadssec-enforce-server-side-auth - Enforce authorization on the serversec-signal-oauth-challenge - Signal auth with a www-authenticate challengesec-minimize-restricted-data - Minimize and avoid restricted data inputsdesign-inherit-native-typography - Inherit native fonts and limit type sizesdesign-restrain-brand-color - Restrain brand color to accentsdesign-render-loading-empty-error - Render loading, empty, and error statesdesign-meet-wcag-contrast - Meet WCAG AA contrast and provide alt textdesign-limit-actions-hierarchy - Limit actions and keep a clear hierarchydesign-respect-reduced-motion - Respect reduced-motion preferencesdist-build-on-mcp-apps-standard - Build on the shared MCP Apps standarddist-degrade-without-ui - Return a text fallback when UI is unsupporteddist-provide-submission-metadata - Provide accurate submission metadatadist-feature-detect-host-apis - Detect host capabilities before useRead the individual reference files for full explanations and incorrect-vs-correct code examples. Start at the top — category 1 (tool-) and category 2 (wire-) gate whether anything renders at all, so resolve those before touching display or design.
| File | Description |
|---|---|
| references/_sections.md | Category definitions and impact ordering |
| assets/templates/_template.md | Template for new rules |
| metadata.json | Version and reference URLs |
build-mcp-server — Entry point for designing the MCP server shape (deployment model, tool patterns) this skill's UI rules build on top of.npx claudepluginhub pproenca/dot-skillsScaffolds and troubleshoots ChatGPT Apps SDK projects combining an MCP server and widget UI. Use when designing tools, registering UI resources, wiring MCP Apps bridge or compatibility APIs, or setting CSP/domain metadata.
Guides building MCP Apps — interactive HTML UIs rendered in sandboxed iframes inside MCP hosts (Claude Desktop, ChatGPT, VS Code Copilot). Covers server, host, and view architecture using @modelcontextprotocol/ext-apps.
Adds interactive UI widgets (forms, pickers, dashboards, confirm dialogs) to MCP servers for inline rendering in chat surfaces like Claude and ChatGPT.