Build a ChatGPT plugin extension: sidebar, panels and file viewers
A hands-on guide to OpenAI MCP Extensions: add a sidebar app, a conversation panel or a file viewer to your plugin, then test it in ChatGPT and Codex.

This research library uses AI-assisted source research and drafting. Linked sources support product claims; analysis and proposed exercises are our interpretation. Unless an article documents a test and its results, do not read it as a hands-on review or an independently verified benchmark.
ChatGPT plugin extensions let an MCP plugin open in the sidebar, run in a panel beside the conversation, or act as the viewer for a file type your product supports. OpenAI announced them at DevDay on 29 September 2026 for all plans, as the same platform it uses to build ChatGPT features. The plugin extensions docs describe them as OpenAI MCP Extensions, and declaring one takes a few lines of SDK code.
This guide covers how to build a ChatGPT plugin extension step by step, what works where at launch, and a workflow for building one with Codex.
What ChatGPT plugin extensions add
A plugin already bundles skills, an MCP server, or both. The MCP server can return an MCP App, which is UI rendered inside ChatGPT. Normally the model decides when to show that UI. Extensions add fixed places where the user can open it.
The docs list nine extensions:
| Extension | What users can do |
|---|---|
| Sidebar apps | Open your app from the sidebar and work in it fullscreen |
| Conversation panels | Open your app beside a conversation |
| Plugin settings | Configure product-specific settings from within ChatGPT |
| File viewers and editors | Open supported files in your interface, with reads, live updates and saves |
| Display modes | Choose where and how your app appears in conversations |
| Deep links | Jump to a specific page or item in your sidebar app |
| Model-App Context | Share context in both directions between ChatGPT and your app |
| Composer mentions | Find and select your plugin's content from the desktop composer |
| Rich forms | Ask for structured input or image choices, then return it to your tool |
OpenAI names three early users. Canva uses sidebar tabs, Figma uses composer mentions, and Adobe uses file handlers to edit files with Acrobat and Photoshop.
Where do extensions work at launch?
Check the platform table in the protocol specification before you design around a surface. At launch, global and thread entrypoints, structured settings and display modes work on desktop, web, iOS and Android. File entrypoints, file resources and composer mentions are desktop only. OpenAI rich forms work on desktop and web, not mobile. Deep links are not supported on Android.
Two more limits from the docs. Plugin extensions on the web are coming soon for ChatGPT Free and Go users. ChatGPT supports the inline and fullscreen display modes but not pip, and every entrypoint opens fullscreen.
How do I build a ChatGPT plugin extension?
Start with a working MCP server that registers an MCP App resource. Then follow these steps.
- Install the TypeScript SDK with
pnpm add @openai/mcp-extensions. A Python SDK exists for server-side extensions. - Wrap your server:
const openaiExtensions = new OpenAIExtensions(server);using the import from@openai/mcp-extensions/server. - Add an entrypoint to the tool metadata that opens your app.
- Connect the server in ChatGPT developer mode and test it.
- Package the plugin with its skills and test the installed version.
For a sidebar app, pass this _meta when you register the MCP App tool. Replace the resource URI with your own:
import type { OpenAIUiToolMetadata } from "@openai/mcp-extensions/server";
const toolMetadata = {
ui: { resourceUri: "ui://parts/library" },
"openai/ui": {
entrypoints: [{ type: "global" }],
} satisfies OpenAIUiToolMetadata,
};
Change { type: "global" } to { type: "thread" } to open the app in a conversation's side panel instead. For a file viewer, use a file entrypoint and list the extensions you handle:
const toolMetadata = {
ui: { resourceUri: "ui://parts/viewer" },
"openai/ui": {
entrypoints: [{ type: "file", extensions: ["stl"] }],
} satisfies OpenAIUiToolMetadata,
};
The app then receives a resource URI for the opened file and reads it through the app SDK. The file handler guide in the TypeScript README covers that input.
Rich forms have one server requirement worth knowing early. OpenAI-registered MCP servers require multi-round-trip requests (MRTR). The legacy elicitInput helper only applies to direct MCP connections.
Test it before you package it
Turn on developer mode under Settings, then Security and login. Go to ChatGPT Plugins, select the plus button, and enter your MCP server URL with its /mcp path. The server must be reachable over public HTTPS or through Secure MCP Tunnel.
Before connecting, list and call your tools with MCP Inspector:
npx @modelcontextprotocol/inspector@latest
Keep tools useful without the UI. OpenAI's architecture guide says the model should still complete headless workflows and decide when UI adds value. A sidebar app whose tools fail without the iframe is fragile.
After you change tool names, schemas or UI resources, redeploy, open the connection in ChatGPT Plugins, and select Refresh. Then start a new conversation and rerun your tests.
A Codex workflow for your first extension
Clone the mcp-extensions repository and open it in Codex. Its Bits & Bolts plugin is a CAD parts library that uses every core extension in Codex. It has a sidebar library, STL and STEP file handlers, structured settings, onboarding and composer mentions.
The example's README builds it with Node.js 22 or later and pnpm. From the repository root, run pnpm install --frozen-lockfile and pnpm build. From the example directory, run node scripts/build.mjs --plugin-dir /tmp/bits-and-bolts to produce an installable plugin.
Then ask Codex to trace one extension end to end. A good prompt: "Find where the file entrypoint for STL is declared, and show me the tool, the resource and the app code that reads the file." Once you understand the path, ask Codex to add the same entrypoint type to your own server. Review the diff before you run it.
When the extension works, package it. In Codex, $plugin-creator scaffolds the plugin manifest and a local marketplace entry for testing. We cover packaging and submission in a separate guide.
If you want your team to practise this on a real internal tool, see our Codex training.
Next step: install Bits & Bolts in ChatGPT and open one STL file in the desktop app to see a file viewer working.
Further reading
Related training topics
Review is one step in the methodology.
Related research

ChatGPT Plugin Creator: from idea to a submitted plugin
Use Plugin Creator in ChatGPT Work or Codex to scaffold a plugin, test it locally, then upload, pass review and publish it in the shared directory.

MCP Events: build an event-emitting MCP server for ChatGPT
A developer guide to the MCP Events methods ChatGPT supports, from events/list to signed webhook delivery, with a Codex workflow to build and test it.

Codex mobile CLI docs your team can read anywhere
The codex mobile cli question is a docs question: how a team keeps AGENTS.md rules, run notes, and verification transcripts readable away from the desk.
Continue through the research archive
Newer research
Bedrock Managed Agents OpenAI vs the Agents API
Compare Bedrock Managed Agents, powered by OpenAI, with the OpenAI Agents API: endpoints, auth, execution environments, and where Codex fits on AWS.
Earlier research
ChatGPT collaborative slides for sprint and incident reviews
What OpenAI announced for ChatGPT collaborative slides, what is still undocumented, and how Codex teams can prepare sprint and incident review material now.