IA

MCP Apps vs A2UI

· 9 min de lectura

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

MCP Apps vs A2UI: dos protocolos para la interfaz de los agentes de IA

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 calling5. 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 postMessage

resources/read / tools/call de MCP

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

Arquitectura comparada: MCP Apps sirve HTML en iframe, A2UI manda JSON que el cliente renderiza nativo

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.

Patrón de doble iframe: proxy sandbox de mismo origen envolviendo el iframe interno del MCP App, sin allow-same-origin

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:

  1. No tocar nada. Si no necesitas añadir tu app en Gemini.

  2. Envolver el widget existente con el patrón 2. Reutilizas el server, las tools (get_pokemon, render_pokemon_widget) y el bundle widget.js casi 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.

  3. 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

  1. "MCP-UI y MCP Apps son dos cosas distintas." No: MCP-UI es el origen comunitario; MCP Apps es su versión oficial.

  2. "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.

  3. 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.

  4. Envolver un MCP App en A2UI sin quitar allow-same-origin del iframe interno. Es la fuga de seguridad que el patrón de doble iframe existe para evitar.

  5. 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

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.

Enlaces