kitepod

Home / MCP guides

The ChatGPT Apps SDK, as of October 2026

Updated October 31, 2026

The ChatGPT Apps SDK is OpenAI's framework for building apps that work inside ChatGPT: an MCP server that gives ChatGPT tools, plus optional UI that renders right in the chat. Since July 9, 2026, those apps are packaged and listed as plugins, and the old developers.openai.com/apps-sdk address now redirects to /plugins.

The building blocks didn't change with the name. An MCP server is still the backend, and the UI still runs in an iframe in the conversation.

What changed is the order OpenAI puts them in. Its docs tell you to "start with the smallest shape that supports your use cases", and to keep tools useful without the component "so the model can complete headless workflows and decide when UI adds value". UI is the last thing you add, and only for the steps where a person has to look at something.

How we got here

Three dates explain most of the confusion online.

These plugins have nothing to do with the ChatGPT plugins OpenAI shut down years ago. Same word, different product.

What a plugin is made of

A plugin can hold skills, an MCP server, or both. Skills are folders with a SKILL.md file that tell the model how to run a repeatable workflow. The MCP server is the part that reaches your systems and does things.

OpenAI's docs list four shapes:

ShapePick it when
Skills onlyInstructions plus tools the model already has are enough
MCP server onlyYou need tools but no extra workflow guidance
Skills and MCP serverSkills should steer the model through your tools
MCP server with UISeeing or editing something visually helps part of the job

The "Apps SDK" part people search for is mostly the last row: the UI layer. And that layer now sits on an open standard.

ChatGPT implements MCP Apps, the shared UI extension from the MCP project. Your server links a tool to a UI resource with _meta.ui.resourceUri, and the component talks to the host over a ui/* bridge using postMessage. Build the UI against MCP Apps and the same component can run in other hosts that support the standard. OpenAI's own extras, under window.openai, are for things the standard doesn't cover yet, like checkout, file uploads, modals and saved widget state.

Building one, step by step

1. Decide what people should be able to do

OpenAI's planning guide starts with use cases, then turns each into a focused tool. Prefer list_projects, get_project and update_project over one tool with a mode switch. Each tool should map to something a person would actually ask for.

2. Build the MCP server

The docs use the official MCP SDKs. For TypeScript with UI, the quickstart installs three packages:

npm install @modelcontextprotocol/sdk @modelcontextprotocol/ext-apps zod

For Python it's pip install mcp. Give every tool an action-oriented name, a description that says when to use it, an input schema, an output schema if it returns structured data, and honest annotations. Mark a tool readOnlyHint: true only if it truly can't change anything, because ChatGPT treats every other tool as a write and asks the user to confirm.

Return structuredContent the model can use in later calls, plus some readable text. Keep secrets out of both.

3. Test it without ChatGPT

Serve it over Streamable HTTP, usually at /mcp, and open it in the MCP Inspector:

npx @modelcontextprotocol/inspector

Call every tool with good input, bad input and missing IDs. Check that authorization holds for private data and write actions.

4. Connect it in ChatGPT

Expose the local server with a tunnel (the quickstart uses ngrok) or deploy it, then add the HTTPS URL with /mcp as a custom MCP server. The clicks, for the web and the desktop app, are in how to add MCP to ChatGPT. Your account needs the option to add custom servers, which ChatGPT developer mode explains.

5. Add UI, if a use case needs it

Register an HTML resource (the docs use a ui://widget/... URI and the text/html;profile=mcp-app MIME type) and point a tool at it. Start with an inline card. Ask for more room only when the job needs it.

OpenAI's @openai/apps-sdk-ui component library gives you buttons, cards and inputs that match ChatGPT's styling if you don't want to build your own.

6. Package and submit

To list it publicly, you package the plugin as a ZIP and submit it through OpenAI's plugin portal. A few requirements catch people:

After approval, you choose when to publish. Later changes to your hosted tools go through OpenAI's MCP scans, but new metadata or skills need a new ZIP and a new review.

A worked example: UI used sparingly

Kitepod (we make it), a remote MCP server for self-hosted WordPress at https://kitepod.com/mcp, has 51 tools and two cards. That ratio is the point.

Most of its tools return text and structured data, because a post draft or a list of plugins reads fine in chat. The two cards cover the moments a person has to act:

There's no approve button inside the card. Review and approve opens Kitepod's approval page in the browser, where the person is signed in. The decision happens outside the conversation, so the AI can't approve its own work. And in apps that don't render MCP Apps, both cards arrive as the same information in text, with a link.

So a request like this one shows the upload card:

Ask your assistant

I've got 12 product photos on my laptop. Add them to the media library with short alt text for each.

The card holds an upload link that's valid for an hour and takes files up to 64 MiB each. Everything after the upload (alt text, titles) is plain tool calls. There's more on how this fits WordPress on ChatGPT for WordPress and the WordPress MCP hub.

What goes wrong

You followed a 2025 tutorial. Older guides use _meta["openai/outputTemplate"], window.openai.toolOutput and a text/html+skybridge MIME type. The first two still work as compatibility aliases, but new UI should use the MCP Apps fields. If a guide doesn't mention MCP Apps, check its date.

The tool only works with its widget. Some clients and surfaces don't render components. OpenAI's docs say to keep every tool useful without UI so the model can finish the job headless.

Your submission bounces on the endpoint. Review needs a stable public HTTPS URL. A laptop behind a tunnel is fine for testing and not for review.

ChatGPT keeps calling the wrong tool. Rewrite the descriptions with "Use this when" guidance, add parameter descriptions and enums, and put cross-tool rules in the server's instructions field. OpenAI says to keep the first 512 characters of that field self-contained.

You changed a tool and nothing happened. For a custom server, open it at chatgpt.com/plugins and click Refresh, then start a new conversation.

Finer points

Is the ChatGPT Apps SDK still a thing?

Yes, in substance. The docs now live under Plugins at developers.openai.com/plugins, and an app is one part of a plugin. You still build an MCP server with optional UI the way the Apps SDK described.

Does the Apps SDK cost anything?

The SDKs and docs are free to use. Your costs are hosting the MCP server and running whatever backend it talks to.

Can a ChatGPT app take payments?

Yes, within limits. The generally available route is external checkout: your component links to a checkout on your own domain, where you handle payment, tax, shipping and refunds. Approval for that is currently limited to plugins selling physical goods. The ChatGPT payment sheet, opened with window.openai.requestCheckout, is in private beta for select marketplaces and isn't available to all developers.

Do plugins built with the Apps SDK work in Codex too?

ChatGPT and Codex share one plugin directory, so a public plugin can be found from both. Individual parts can still be surface-specific. Optional UI renders in ChatGPT, and lifecycle hook scripts have to exist where they run, since installing a plugin on the web doesn't deploy them.

Do I need the Apps SDK to connect an MCP server to ChatGPT?

No. If you only want to use a server yourself, add it as a custom MCP server. The SDK matters when you're building one, adding UI, or listing it for other people.

If a card would only repeat what the model already said in text, it isn't a card yet.

Connect your assistant to WordPress, free

A plugin on your site and one URL in Claude, ChatGPT or Cursor. Unlimited sites and tool calls, staged changes, approvals and a 90-day undo.

Get started free