chat-apps-ui-sdk
Interactive UI rendered inside ChatGPT or Claude — OpenAI Apps SDK apps, MCP Apps (the @modelcontextprotocol/ext-apps standard), or MCP-UI components, with a Next.js/React server. Covers the MCP tool and resource architecture, the window.openai / ui-bridge data flow, widget state, sandbox/CSP security, display modes, visual design, and directory submission. Trigger when building, reviewing, or designing such apps — even when the user only says "chat app", "ChatGPT widget", "Claude app", "render UI in chat", "window.openai", "createUIResource", "outputTemplate", or "MCP app UI" without naming a specific SDK.
How do I install this agent skill?
npx skills add https://github.com/pproenca/dot-skills --skill chat-apps-ui-sdkIs this agent skill safe to install?
- Gen Agent Trust Hubpass
The skill is a comprehensive best-practices guide for building interactive UIs for ChatGPT, Claude, and MCP Apps. It emphasizes security through rules on server-side authorization, secrets management, and CSP declarations. A surface for indirect prompt injection was noted as is standard for instructional agents, but no malicious intent or code was detected.
- Socketpass
No alerts
- Snykpass
Risk: LOW · No issues
What does this agent skill do?
Chat Apps UI SDK Best Practices
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.
When to Apply
Reference these guidelines when:
- Designing the MCP tool and
structuredContent/content/_metacontract for a chat app - Wiring a tool to a component (
_meta.ui.resourceUri, thetext/html;profile=mcp-appMIME type, theui://scheme) - Writing the iframe component and its bridge (
window.openai,ui/notifications/*, MCP-UIonUIAction) - Choosing display modes, widget state, theming, and responsive layout
- Hardening a chat app (CSP, sandbox, secrets, OAuth) or preparing it for directory submission
- Reviewing or refactoring existing ChatGPT-app / Claude-app / MCP-UI code
Rule Categories by Priority
| 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- |
Quick Reference
1. MCP Tool & Discovery Design (CRITICAL)
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 text
2. UI Resource Wiring & Templates (CRITICAL)
wire-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 component
3. Host–Component Data Bridge (HIGH)
bridge-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 reimplementing
4. Display Modes & Responsive Layout (HIGH)
display-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 screens
5. State & Model Context (HIGH)
state-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 serializable
6. Security & Data Boundaries (HIGH)
sec-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 inputs
7. Visual Design & UX Polish (MEDIUM-HIGH)
design-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 preferences
8. Distribution & Cross-Host Portability (MEDIUM)
dist-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 use
How to Use
Read 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.
- Section definitions - Category structure and impact levels
- Rule template - Template for adding new rules
- AGENTS.md - Compiled table of contents across all rules
Reference Files
| File | Description |
|---|---|
| references/_sections.md | Category definitions and impact ordering |
| assets/templates/_template.md | Template for new rules |
| metadata.json | Version and reference URLs |
Related Skills
build-mcp-server— Entry point for designing the MCP server shape (deployment model, tool patterns) this skill's UI rules build on top of.
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/pproenca/dot-skills/chat-apps-ui-sdk">View chat-apps-ui-sdk on skillZs</a>