GUIDES / CHATGPT PLUGINS

ChatGPT Plugin Extensions: add native UI to an MCP-backed plugin

Keep your MCP tools, register an MCP Apps UI resource, then declare the extension entrypoint that fits the task. A sidebar app suits a persistent workspace; a conversation panel keeps a view beside a chat. Settings and file handlers have separate contracts. UI is optional: keep the tools usable without it. Start with the support table below before choosing a target client.

Check support before building ↓

1. Keep tools, UI and the package separate

An MCP-backed plugin exposes operations through its server. The UI gives a person a useful place to inspect or change the result; it does not replace the tool implementation or its authorization. For example, a document tool can return a readable record while a panel shows the same record as an editor. That example is an AgentSkillsHub design suggestion, not a tested integration.

OpenAI’s UI guide makes custom UI optional. It uses an iframe and the MCP Apps JSON-RPC bridge over postMessage. Link selected tools to resources with _meta.ui.resourceUri; implement the shared UI bridge first, then feature-detect OpenAI-specific additions. Keep a model-readable result for clients without component rendering.

Skills supply workflow instructions, MCP tools access data or actions, and the plugin package groups those pieces. See our MCP and agent skills guide for that conceptual separation. A package shared with Codex does not imply that every ChatGPT UI extension renders in Codex.

2. Choose a surface and check availability

Read the two sources together. The Extensions page says web extensions for Free and Go are coming soon and composer content mentions are desktop-only. The protocol platform table describes expected support at DevDay launch, not a verified rollout for your account. Its Web means Work browser, excluding classic ChatGPT.

The table records those documented targets as of 2026-09-30. “Expected” is not an account-level availability claim. OpenAI shows Canva sidebar, Figma composer mentions and Adobe file-handler examples; these examples do not establish universal access. For rows without a separate rollout statement, actual availability in your account remains UNKNOWN until tested.

Extension surfaces: documented targets and rollout limits
FeatureSupported surface (spec target)Current availabilitySource date
Sidebar appsDesktop, Work web, iOS, AndroidExpected launch support; Free/Go web coming soon2026-09-30
Conversation panelsDesktop, Work web, iOS, AndroidExpected launch support; verify account rollout2026-09-30
Plugin settingsDesktop, Work web, iOS, AndroidExpected launch support; verify account rollout2026-09-30
File viewers/editorsDesktop onlyWeb, iOS, Android not supported in matrix2026-09-30
Display modesDesktop, Work web, iOS, AndroidExpected; inline/fullscreen extension values2026-09-30
Deep linksDesktop, Work web, iOSExpected; Android not supported2026-09-30
Model-App ContextDesktop, Work web, iOS, AndroidExpected; iOS thumbnail limitations in spec2026-09-30
Composer content mentionsDesktop onlyExplicit desktop-only notice; other platforms unsupported2026-09-30
Rich formsDesktop, Work webExpected; iOS/Android not supported2026-09-30
Messages / onboardingDesktop, Work web, iOS, AndroidExpected; mobile message limitations apply2026-09-30
File opening / resourcesDesktop onlyOther platforms not supported in matrix2026-09-30

4. Product settings belong in native controls

Structured settings render product preferences on the plugin detail page. A units preference or default project is a better fit than an entire embedded account-management screen. The settings contract advertises readTool and updateTool under openai/settings; the read tool supplies schema, values and layout, and the update tool applies changes. The SDK exposes a settings registration helper.

For protocol 2026-07-28 or newer, advertise the settings extension through server/discover. Older protocol variants have their own initialize path in the spec. Enforce account ownership on reads and updates; a native setting control does not create permission.

5. File viewers and editors use resource access

A file entrypoint opens a custom view for matching extensions and receives a file resource URI. Use MCP resource reads, subscriptions for updates, and the extension’s openai/resources/write contract when implementing editing. The UI is not given a raw filesystem path. The host can attach the opened path to server tool-call metadata; that is a separate boundary, not unrestricted browser filesystem access.

There is a source discrepancy worth checking before implementation: the overview’s example uses stl, while the normative file-entrypoint section requires a leading dot, such as .stl. Follow the spec and verify with the current SDK/client. This guide avoids offering an untested file registration snippet.

The platform table lists file entrypoints and file resources as desktop-only. Test read, change notification, save and rejected writes on an authorized disposable file. Do not infer web or mobile support from the existence of the SDK.

7. Minimal build path from tools to UI

  1. Establish a useful tool-only result and authorize each request using the MCP server guide.
  2. Build one MCP Apps component and serve its resource; associate the tool using _meta.ui.resourceUri. Keep the tool’s non-UI result intact.
  3. Use the TypeScript SDK: @openai/mcp-extensions/server for server registration and @openai/mcp-extensions/app for the component. It extends the MCP and MCP Apps SDKs; it does not replace either protocol.
  4. Register result handlers before connecting the app. Wait for initialization, then check whether the needed extension is exposed. Unsupported extension helpers may remain undefined.
  5. Add one entrypoint or setting contract, declare the required CSP origins, and adapt to host theme and size. Check loading, empty and error states, keyboard operation, focus and contrast against the UI guidelines.
  6. Test the capability in the intended client before packaging it. An SDK example compiling is not evidence of account rollout.

This sequence is an AgentSkillsHub implementation checklist synthesized from the linked documents. We did not build or connect the review-board example.

8. Test the MCP connection, then the installed plugin

The current connection guide starts with a public HTTPS endpoint or Secure MCP Tunnel for development. Enable Settings → Security and login → Developer mode, subject to account/workspace policy. In ChatGPT Plugins, choose the plus button, configure the connection, then inspect the discovered tools and authentication.

Start a new chat and test tool selection, readable results, the intended entrypoint and the optional component. Check authorized and unauthorized operations, state restoration and console errors. After changing UI resources or metadata, restart/deploy your development server, Refresh the developer connection and retest in a new conversation. Test the complete packaged plugin separately.

If the panel is missing, check the client’s support, metadata refresh, registered resource URI and whether the tool accepts entrypoint arguments. If a frame is blank, inspect resource responses, bridge initialization and CSP errors. These are diagnostic checks, not evidence that we reproduced those failures.

9. Authentication, CSP and UI safety

Private data and writes need server-side authentication and authorization. Follow OAuth and MCP discovery; validate the account, token scope and resource access for every operation. Never place credentials in the component’s props or model-visible data. Tool annotations describe behavior; they are not permission grants.

The UI security guide describes isolated iframes and strict CSP. Declare specific network/resource origins and frameDomains only when needed. An embedded page uses its own CSP: the parent widget’s connect/resource allowlists do not constrain that page’s network requests. Review the embedded experience too. Do not depend on privileged browser APIs such as native clipboard or window.confirm being available.

Treat document text and model context as untrusted content. UI actions must not silently broaden permissions or hide irreversible effects. Use our MCP server security checklist for a broader authorization review.

10. Events and packaging are separate next steps

Our editorial distinction: UI extensions provide surfaces for a person to inspect and act; MCP Events carry external changes into an existing, user-directed ChatGPT workflow. They can be combined; this is not an official either/or taxonomy. Events do not require UI.

Once tested, package the plugin. The portable format uses root plugin.json, skills/ and mcp.json as applicable; @plugin-creator currently scaffolds a supported Codex compatibility layout. UI/auth remain in the MCP integration. The submission guide accepts skills-only, MCP-only or combined plugins for the directory shared by ChatGPT and Codex. If a previously skills-only public plugin now needs an MCP server, the current submission guide says adding one to that existing plugin is not supported; check that constraint before planning the upgrade. Submitted does not mean Published: after approval, the developer chooses when to publish. No submission was made for this guide.

FAQ

Does every ChatGPT plugin need UI?

No. Custom UI is optional. Keep MCP tools useful through readable results even when the client cannot render the component.

Are Plugin Extensions available to all ChatGPT plans on the web?

No universal availability claim is supported. The Extensions page still labels Free and Go web access coming soon. The specification describes expected DevDay support in the Work browser, not classic ChatGPT.

Can a file viewer run on ChatGPT web or mobile?

The current extension platform matrix lists file entrypoints and file resources as desktop-only. SDK publication does not prove rollout to other clients.

Is a conversation panel the same as MCP Events?

No. A panel is an interactive UI surface. MCP Events delivers external updates to a subscribed chat; an event-driven plugin can also have UI.

Has AgentSkillsHub tested a live extension?

No. This is a source-checked editorial guide. We did not build an extension, render a sidebar or panel, connect its MCP server, or submit a plugin during this review.

Primary sources

Source-checked 2026-09-30. SDK/spec publication, account availability, and a hands-on test are separate evidence. Examples and checklists here are editorial material.