Comparativas

MCP Apps vs MCP-UI vs Apps SDK de OpenAI: sobre cuál construir

Tres nombres para la misma idea: una interfaz interactiva que una llamada a una tool pinta dentro del chat. En 2026 uno es el estándar y los otros dos son de donde salió.

6 min de lectura

La respuesta corta

MCP Apps es el estándar; MCP-UI y el Apps SDK de OpenAI son los dos proyectos de los que nace. Si estás comparando MCP Apps con MCP-UI, o MCP Apps con las apps de ChatGPT, en 2026 construye sobre MCP Apps: es una extensión oficial de MCP, ChatGPT la implementa, Claude, VS Code y Microsoft 365 Copilot la pintan, y MCP-UI ya la emite. Las extensiones propias de ChatGPT se añaden encima cuando hacen falta, nunca en su lugar.

Lo que sigue explica de dónde viene cada uno, en qué se diferencian campo a campo y qué hacer con el código que ya tengas escrito para cualquiera de los dos anteriores.

De dónde viene cada uno

MCP-UI llegó primero. Es un proyecto de código abierto de la comunidad, liderado por Ido Salomon y Liad Yosef, que demostró que una tool MCP podía devolver HTML interactivo en vez de texto plano. Tenía SDK de servidor para TypeScript, Python y Ruby, y lo adoptaron equipos como Postman, Hugging Face, Shopify, Goose y ElevenLabs (la especificación de MCP Apps los cita). Su web lo dice sin rodeos: "MCP-UI is now standardized into MCP Apps" (mcpui.dev).

El Apps SDK de OpenAI era la forma de meter interfaces en ChatGPT: un servidor MCP, una plantilla HTML servida como text/html+skybridge y un objeto window.openai en la página. A octubre de 2026, OpenAI llama "plugins" a las apps de ChatGPT y las documenta en developers.openai.com/plugins. Muchos tutoriales de finales de 2025 siguen enseñando el camino de skybridge.

MCP Apps es la fusión. La especificación, SEP-1865, se propuso el 21 de noviembre de 2025 con autores de MCP-UI, OpenAI y Anthropic, y el 26 de enero de 2026 pasó a ser la "first official MCP extension" (blog de MCP). Su identificador de extensión es io.modelcontextprotocol/ui. El 22 de febrero de 2026 OpenAI anunció que "ChatGPT is now fully compatible with the MCP Apps spec" (changelog).

Si prefieres empezar por los conceptos, lee antes qué son las MCP Apps.

MCP Apps vs MCP-UI vs Apps SDK, cara a cara

MCP AppsMCP-UIApps SDK de OpenAI
De quién esProyecto MCP (extensión oficial)Proyecto de la comunidad, ya integrado en MCP AppsOpenAI
Estado en 2026Estable desde el 26 de enero de 2026Estandarizado en MCP Apps; los tipos de contenido antiguos son legacySigue funcionando; ChatGPT implementa MCP Apps y mantiene sus campos como alias
Tipo MIMEtext/html;profile=mcp-appAhora text/html;profile=mcp-app. Legacy: rawHtml, externalUrl (text/uri-list), remoteDom (application/vnd.mcp-ui.remote-dom)text/html+skybridge
Cómo apunta la tool a la interfaz_meta.ui.resourceUri en la tool, un recurso ui://Legacy: la tool devolvía el recurso de interfaz en su resultado. Ahora: _meta.ui.resourceUri_meta["openai/outputTemplate"]
Campos de CSP_meta.ui.csp: connectDomains, resourceDomains, frameDomains, baseUriDomainsAhora los de MCP Appsopenai/widgetCSP: connect_domains, resource_domains, frame_domains
API del puenteJSON-RPC sobre postMessage (ui/initialize, ui/notifications/tool-result, tools/call, ui/message); clase App de @modelcontextprotocol/ext-appsAhora el puente de MCP Apps; AppRenderer de @mcp-ui/client para hostswindow.openai (callTool, widgetState, requestModal...)
Hosts que lo pintanClaude (web y escritorio), ChatGPT, GitHub Copilot en VS Code, Microsoft 365 Copilot, Goose, Postman, MCPJam, Cursor y más (matriz de clientes)Los hosts de MCP Apps, y los hosts MCP-UI antiguos para los tipos legacyChatGPT

Hay dos cosas que saltan a la vista. Los campos de MCP Apps son casi un cambio de nombre uno a uno de los de OpenAI, y por eso migrar es sobre todo mecánico. Y el único host que lee los campos de skybridge es ChatGPT, mientras que los de MCP Apps llegan a todos los hosts de la matriz, ChatGPT incluido.

Tengo código de MCP-UI: ¿qué hago?

Actualiza los paquetes y mira qué tipo de contenido usabas.

  • createUIResource de @mcp-ui/server ya produce un recurso con el tipo MIME text/html;profile=mcp-app. Si servías HTML, al actualizar pasas al estándar casi sin tocar nada más.
  • Haz que la tool apunte al recurso con _meta.ui.resourceUri y sirve el HTML desde un handler de recurso ui://, en vez de devolver la interfaz dentro del resultado de la tool. Ese es el patrón de MCP Apps: la definición de la tool nombra su interfaz y el host lee el recurso aparte.
  • externalUrl y remoteDom son legacy. Una URL externa pasa a ser una página HTML autocontenida (o un iframe declarado en frameDomains, que algunos hosts restringen). Una vista Remote DOM hay que rehacerla como vista HTML.
  • Si lo que construyes es un host y no un servidor, AppRenderer de @mcp-ui/client es el renderizador que recomienda MCP-UI, y @modelcontextprotocol/ext-apps/app-bridge, el oficial, es la otra opción.

Tengo código del Apps SDK de OpenAI: ¿qué hago?

Déjalo funcionando y muévelo campo a campo. La guía de migración oficial traduce cada pieza:

Apps SDKMCP Apps
openai/outputTemplateui.resourceUri
text/html+skybridgetext/html;profile=mcp-app
openai/widgetCSP (connect_domains, resource_domains, frame_domains)ui.csp (connectDomains, resourceDomains, frameDomains)
openai/widgetDomainui.domain
openai/widgetPrefersBorderui.prefersBorder
openai/widgetAccessible, openai/visibilityui.visibility
window.openai.callToolapp.callServerTool

ChatGPT sigue aceptando openai/outputTemplate como alias de compatibilidad, y openai/visibility quedó obsoleto el 21 de julio de 2026. El repo oficial trae además una skill de agente, migrate-oai-app, que hace la conversión contigo. El paso a paso, con el código de la vista, está en la interfaz de un plugin de ChatGPT con MCP Apps.

Qué sigue siendo propio de cada host

El estándar cubre lo común: el recurso, el saludo inicial, la entrada y el resultado de la tool, llamar a tools, abrir enlaces, mandar mensajes, los modos de visualización y el tema. Hay cosas que siguen dependiendo del host:

  • Las extensiones de ChatGPT. requestCheckout, requestModal, uploadFile, selectFiles, getFileDownloadUrl y widgetState / setWidgetState viven en window.openai. El consejo de la propia OpenAI es que primero funcione el flujo de MCP Apps y que window.openai se use "only for capabilities that the shared specification does not cover", detectando cada extensión y con alternativa (documentación de OpenAI).
  • El dominio del sandbox. ui.domain depende del host (por ejemplo, un hash bajo claudemcpcontent.com en Claude o un nombre bajo oaiusercontent.com en ChatGPT).
  • Los iframes anidados. Claude restringe frameDomains hasta que pase una revisión de seguridad, y ChatGPT bloquea los iframes anidados por defecto. Lo tienes en la CSP de MCP Apps explicada.
  • El aspecto. Cada host pasa sus variables CSS, sus fuentes y su tema en el contexto del host; tu vista debería leerlos en vez de fijar colores. Más en temas en MCP Apps.
  • Si se pinta o no. Los clientes solo de texto, como Claude Code en la terminal, llaman a la tool y enseñan su contenido de texto. Qué clientes pintan la interfaz está en clientes de MCP Apps.

¿Cuál uso?

  • Empiezas de cero: MCP Apps. Usa @modelcontextprotocol/ext-apps (registerAppTool, registerAppResource, la clase App) o un framework construido encima. Mira crear una MCP App en TypeScript.
  • Solo apuntas a ChatGPT y necesitas pagos, modales o ficheros: la base sigue siendo MCP Apps, con esas extensiones de window.openai encima y detectadas antes de usarlas.
  • Tienes una app del Apps SDK en producción: migra campo a campo; los alias te dan margen, pero la interfaz nueva debería usar los campos compartidos.
  • Tienes código de MCP-UI: actualiza @mcp-ui/server y pasa a _meta.ui.resourceUri; deja externalUrl y remoteDom.
  • Construyes un host: implementa MCP Apps con el app bridge oficial o con AppRenderer de MCP-UI.
  • Quieres la interfaz sin escribir la vista: los constructores y frameworks de constructores de MCP Apps comparados apuntan todos a MCP Apps.

Widgetry es uno de ellos: produce widgets MCP Apps estándar (el documento text/html;profile=mcp-app más un manifiesto con _meta.ui.resourceUri y _meta.ui.csp) a partir de una plantilla y un diseño, los previsualiza en un host MCP Apps de verdad y deja que tu servidor los enlace. No usa skybridge ni window.openai, así que el mismo widget se pinta en ChatGPT, en Claude y en el resto de hosts.

Tu primer widget, en el chat en unos minutos

Elige una plantilla, pon tus datos y míralo como lo enseñarán ChatGPT o Claude. Después enlázalo desde tu servidor MCP, o deja que tu agente haga el siguiente.