MCP Apps vs A2UI
MCP Apps (Anthropic + OpenAI) y A2UI (Google) resuelven distinto cómo se ve una app dentro de un chat de IA. Diferencias, los 3 patrones de integración

Cuando construí la tarjeta de Pokémon en ChatGPT di por hecho que, si algún día quería lo mismo en Gemini, sería cuestión de apuntar el mismo MCP server a otro sitio. No es así. Ojalá todo fuera tan fácil pero las grandes empresas rara vez se ponen de acuerdo. ChatGPT y Gemini no hablan el mismo protocolo de interfaz.
Rápidamente:
MCP Apps es la extensión oficial de MCP (coescrita por Anthropic y OpenAI) para servir una app web real —HTML, CSS, JS— dentro de un iframe sandboxeado. Es lo que ya usa
mcp-ui-openai-pokemon. Este proyecto surgió de MCP-UI, fue el proyecto comunitario que sirvió de campo de pruebas y que en enero de 2026 se convirtió en la extensión oficial MCP Apps.A2UI es el protocolo de Google: el agente manda un JSON declarativo describiendo componentes, y es el cliente —Gemini, en este caso— quien los renderiza con su propio catálogo nativo. Cero HTML ni JS viajando por el protocolo.
Esto no es una curiosidad de spec. Si tu roadmap incluye "también en Gemini", cambia cuánto trabajo tienes por delante.
Serie MCP: 1. Qué es → 2. Cómo crear → 3. App en ChatGPT → 4. MCP vs API vs function calling → 5. Esta comparativa.
1. El problema real: mi widget funciona en ChatGPT, no en Gemini
Repaso rápido de lo que ya construí (detalle completo en la Parte 3):
MCP server (mcp-ui-openai-pokemon)
│
├── get_pokemon → structuredContent, sin UI
├── render_pokemon_widget → _meta.ui.resourceUri
└── ui://widget/pokemon-card.html → iframe en ChatGPT
ChatGPT pide el resource, recibe HTML con MIME text/html;profile=mcp-app, lo monta en un iframe y el widget habla con el host por postMessage. Eso es MCP Apps, y hoy es lo que hace posible que un mismo server sirva a ChatGPT y, en teoría, a cualquier host que implemente esa extensión.
El problema apareció al intentar registrar ese mismo server como agente en Gemini Enterprise. Gemini Enterprise no espera un recurso HTML para montar en iframe: espera un payload A2UI (JSON con componentes, application/a2ui+json), que renderiza con su propio motor nativo. Mi iframe, tal cual, no tiene sitio ahí.
2. MCP-UI → MCP Apps
Pieza | Qué es |
|---|---|
MCP-UI | Proyecto comunitario (open source), el primero en proponer que un server MCP devolviera también interfaz, no solo datos. |
Apps SDK (OpenAI) | El mismo problema resuelto por separado, del lado de OpenAI, antes de la estandarización. |
MCP Apps | La extensión oficial de MCP, publicada en enero de 2026, que junta ambos esfuerzos con Anthropic y OpenAI como coautores. Ya está en "producción lista" en ChatGPT; Claude.ai la va desplegando sobre la misma base. |
En resumen: MCP-UI fue el prototipo, MCP Apps es la versión con estándar y dos empresas grandes detrás. Técnicamente es lo que ya conoces: iframe sandboxeado + JSON-RPC sobre postMessage, resource HTML servido por tu MCP server.
3. Qué es A2UI
A2UI parte de una premisa distinta: no mandes código, manda una especificación.
Agente / servidor MCP
│
└── payload JSON (application/a2ui+json)
│
└── Cliente (Gemini, app móvil, ADK Web…)
└── valida contra su catálogo de componentes
└── renderiza con SU motor nativo (React, Flutter, Angular…)
Estructura simplificada de un payload A2UI (no es el schema completo, solo la idea):
{
"surface": "pokemon-card",
"component": "Card",
"id": "card-charmander",
"children": [
{ "component": "Image", "bind": "spriteUrl" },
{ "component": "Text", "bind": "name", "style": "title" },
{ "component": "StatList", "bind": "stats" }
],
"actions": [
{ "on": "search", "call": "get_pokemon", "bindTo": "nameOrId" }
]
}
No hay <script>, no hay HTML. El cliente decide cómo se ve Card, Image o StatList según su propio design system. Por eso el agente nunca envía código ejecutable: el riesgo ya no es "fuga de seguridad por iframe", es "el agente eligió una composición de UI pobre".
Y esto es lo que cierra el círculo con mi problema: Gemini Enterprise soporta A2UI v0.8 de forma nativa en su chat, y el Agent Development Kit (ADK) de Google trae renderizado A2UI incorporado en su UI de desarrollo.
4. La comparativa
MCP Apps | A2UI | |
|---|---|---|
Qué viaja | HTML/CSS/JS dentro de un resource | JSON validado contra un catálogo de componentes |
Renderizado | Iframe sandboxeado en el cliente | Componentes nativos del host |
Transporte | JSON-RPC sobre |
|
Quién lo impulsa | Anthropic + OpenAI (extensión oficial de MCP) | Google (proyecto abierto, v0.8 en preview) |
Libertad visual | Total: cualquier cosa que hagas en web | La que permita el catálogo del cliente |
Consistencia con el host | Puede chocar (scrollbar propia, tipografía distinta) | Hereda automáticamente el diseño del host |
Madurez (ago. 2026) | "Producción lista"; ChatGPT ya la soporta | Preview; nativa en Gemini Enterprise y ADK |
Dónde funciona hoy de fábrica | ChatGPT, Claude (progresivo) | Gemini Enterprise, Google ADK |

5. ¿Compiten o se complementan? Los 3 patrones de Google
El 17 de junio de 2026, el equipo de A2UI de Google publicó, junto a Ido Salomon y Liad Yosef (coautores de la extensión MCP Apps), un análisis con tres patrones de integración entre ambos mundos (developers.googleblog.com/a2ui-and-mcp-apps):
Patrón 1 — A2UI sobre servidores MCP
Tu server MCP devuelve directamente JSON A2UI (resources/read o tools/call).
Renderizado 100% nativo. Sin iframe.
Patrón 2 — MCP Apps dentro de componentes A2UI
Tu MCP App (iframe de siempre) se envuelve como UN componente más
dentro del árbol A2UI. Doble iframe: proxy sandbox (mismo origen)
+ iframe interno SIN allow-same-origin. Sincronización de estado
bidireccional con los componentes nativos hermanos.
Patrón 3 — A2UI dentro de MCP Apps
El bundle del MCP App incluye su propio mini-renderizador A2UI,
para hosts que aún no son A2UI-nativos.
El patrón 2 es exactamente el que describe la guía MCP Apps in A2UI: un iframe intermedio de mismo origen (sandbox.html) que mantiene un canal JSON-RPC estructurado, y dentro de ese, el iframe real del MCP App con permisos mínimos —allow-scripts allow-forms allow-popups allow-modals, sin allow-same-origin, para que no pueda tocar localStorage, sessionStorage, IndexedDB ni cookies del padre.

La conclusión de Google es explícita: no son competidores, son complementarios. Recomiendan renderizado nativo (A2UI) para elementos de interfaz estándar y reservar el iframe (MCP Apps) para experiencias muy específicas que no encajan en un catálogo de componentes.
6. Entonces, ¿mi MCP App vale para Gemini tal cual?
No. MCP mueve los datos, pero qué hace el cliente con esos datos es un protocolo aparte, y ahí es donde MCP Apps y A2UI se separan.
Las opciones reales, de menos a más esfuerzo:
No tocar nada. Si no necesitas añadir tu app en Gemini.
Envolver el widget existente con el patrón 2. Reutilizas el server, las tools (
get_pokemon,render_pokemon_widget) y el bundlewidget.jscasi tal cual. Añades la capa de doble iframe y el puente de sincronización de estado con los componentes A2UI hermanos. Es trabajo de integración, no una reescritura.Reescribir la tarjeta como componentes A2UI nativos.
Card,Image,StatList… definidos contra el catálogo de Gemini. Se ve 100% integrado, pero pierdes la libertad de diseño del HTML/CSS propio y no reutilizas el iframe.
Con lo que sé hoy y mi opinión personal: si vuestro desarrollo principal no es para Gemini, a día de hoy tiraría por MCP Apps y envolvería ese iframe en un componente de A2UI cuando tengas que incluirlo. Si se convierte en canal serio, evalúo directamente construir esa vista en A2UI nativo.
7. Cuándo usar cada uno
Situación | Qué coger |
|---|---|
El canal principal es ChatGPT y/o Claude | MCP Apps — soporte "producción lista" hoy |
El canal principal es Gemini Enterprise / Google Workspace | A2UI — es lo que el host renderiza de forma nativa |
Necesitas auth de usuario, formularios complejos, pantallas de aprobación | MCP Apps — control total del desarrollador |
El agente debe decidir en tiempo real qué mostrar (tabla, gráfico, tarjeta) según los datos | A2UI — el catálogo está pensado para esto |
Ya tienes un frontend web que quieres reutilizar | MCP Apps, o envuelto en A2UI con el patrón 2 |
Multi-canal desde el día uno (ChatGPT + Gemini + más) | A2UI como capa base + MCP Apps encapsulado solo donde de verdad haga falta libertad total de diseño |
8. Errores típicos al mezclar esto
"MCP-UI y MCP Apps son dos cosas distintas." No: MCP-UI es el origen comunitario; MCP Apps es su versión oficial.
"Como los dos usan MCP por debajo, son compatibles automáticamente." MCP es el transporte. El renderizado —iframe vs JSON nativo— es un protocolo aparte, y ahí no hay compatibilidad directa sin uno de los tres patrones.
Pensar que A2UI ejecuta código como MCP Apps. No: es JSON validado contra un catálogo. Si necesitas ejecutar lógica de cliente arbitraria, A2UI no es tu sitio.
Envolver un MCP App en A2UI sin quitar
allow-same-origindel iframe interno. Es la fuga de seguridad que el patrón de doble iframe existe para evitar.Diseñar el widget pensando solo en ChatGPT y descubrir el problema de Gemini en producción, en vez de decidir desde el principio si el canal multi-host importa.
FAQ
¿A2UI reemplaza a MCP?
No. A2UI puede viajar sobre MCP (resources/read, tools/call con MIME application/a2ui+json) o usarse con cualquier otro canal de agente. MCP sigue siendo el transporte; A2UI es una forma de estructurar lo que se manda.
¿Necesito reescribir todo mi MCP App para que funcione en Gemini?
No necesariamente. El patrón 2 (MCP Apps dentro de A2UI) está pensado justo para reutilizar lo que ya tienes, envuelto en un doble iframe.
¿MCP-UI sigue existiendo como proyecto aparte?
El proyecto sigue ahí, pero la extensión oficial y con soporte de Anthropic + OpenAI es MCP Apps. Si estás empezando de cero hoy, construye contra MCP Apps.
Siguiente paso
Conceptos base: Qué es un MCP
Server + tools: Cómo crear un MCP
UI en ChatGPT con MCP Apps: App visual en ChatGPT
Las tres capas del stack: MCP vs API vs function calling
Si os interesa, el próximo paso lógico es documentar en abierto la migración real de mcp-ui-openai-pokemon al patrón 2 (MCP Apps dentro de A2UI) contra Gemini Enterprise. Lo dejo anotado para un post futuro con repo y demo, como los anteriores.