MCP Apps: cómo añadir interfaces interactivas a tools MCP sin abrir un agujero de seguridad
MCP Apps permite que una tool devuelva una interfaz interactiva dentro del chat. Es útil para aprobar, explorar y decidir; no para saltarse permisos ni convertir el agente en una web embebida sin controles.
MCP Apps permite que una tool devuelva una interfaz interactiva dentro del chat. Es útil para aprobar, explorar y decidir; no para saltarse permisos ni convertir el agente en una web embebida sin controles.
MCP Apps es una extensión de Model Context Protocol para que un servidor devuelva una interfaz interactiva —un dashboard, formulario, tabla o flujo de aprobación— dentro de un host de chat compatible. La UI vive en un iframe sandboxed y habla con el host mediante mensajes controlados; no obtiene acceso directo al DOM, cookies o almacenamiento del host.
Tampoco es una autorización implícita. Que la vista muestre un botón no significa que pueda ejecutar una operación. El servidor debe validar usuario, tenant, argumentos y política igual que lo haría si la llamada viniera de un cliente HTTP ordinario.
¿Te está sirviendo? Hay una dosis cada semana
Te resumo herramientas de IA para devs, agentes, MCP, seguridad y workflows en un email de 5 minutos. En español y sin ruido.
Suscribirme gratisChecklist
Cuándo una tool necesita UI
Usaría MCP Apps para explorar datos con filtros, comparar opciones, revisar un diff, rellenar un formulario de aprobación, visualizar un pipeline o confirmar una acción con consecuencias. En todos esos casos hay estado visual, selección humana o demasiada información para que el modelo la resuma sin perder control.
No la usaría para una búsqueda de documentación, una consulta determinista, una acción de una línea o un workflow que nadie necesita inspeccionar. Una respuesta textual o `structuredContent` basta y es más simple de probar. La UI también introduce lifecycle, accesibilidad, CSP, degradación y una matriz de hosts; no la añadas solo porque es nueva.
La pregunta de producto es concreta: ¿qué decisión humana mejora al ver y manipular este resultado? Si no puedes responderla, conserva la tool como texto. Si la respuesta es revisar, seleccionar o aprobar, una UI embebida puede reducir errores y turnos innecesarios.
La vista: trata el iframe como un cliente no confiable
La vista debe inicializarse con el bridge, esperar los eventos del host y renderizar solo datos validados. Su trabajo es presentar y recoger intención del usuario, no decidir permisos. Cuando el usuario pulsa aprobar, la vista llama a una tool estrecha con un ID; el servidor vuelve a comprobar que la persona puede aprobar ese recurso y que el estado sigue siendo válido.
Evita pasar secretos, tokens de larga vida o documentos completos en el HTML de la resource. El iframe aislado reduce privilegios, pero no convierte datos sensibles en inocuos. Envía el mínimo necesario, aplica redacción por tenant y considera que cualquier dato mostrado puede ser copiado por el usuario autorizado.
Para acciones de escritura, modela una transición explícita: `preview` → `confirm` → `execute`. La UI puede enseñar el impacto y pedir confirmación; el servidor debe usar un idempotency key y rechazar operaciones repetidas o estados caducados. Es el mismo patrón que usarías en una API de pagos, solo que aquí el disparador nació dentro de un chat.
Mide utilidad, no solo clicks: cuántos turnos evita la UI, cuántas aprobaciones se revierten, qué operaciones se cancelan, cuánto tarda en aparecer el resultado y cuántas veces se usa el fallback textual. Si no reduce error o tiempo de decisión, una respuesta bien diseñada probablemente era mejor.
Checklist de producción
- La tool devuelve una respuesta textual completa aunque el host no soporte UI.
- La resource usa un URI `ui://` registrado y MIME type específico para MCP Apps.
- La vista recibe `structuredContent` mínimo y no secretos ni datos de otros tenants.
- Cada tool de lectura o escritura revalida usuario, tenant, scopes y estado en servidor.
- Las acciones mutantes tienen preview, confirmación, idempotencia y auditoría.
- La CSP declara solo dominios imprescindibles; sin comodines ni scripts remotos no revisados.
- La UI trata todo contenido externo como datos y lo sanitiza antes de mostrarlo.
- Se prueba el fallback textual y la degradación en cada host objetivo.
- Logs guardan IDs, acción, resultado y denegaciones; no el contenido sensible por defecto.
Preguntas frecuentes
¿Qué es MCP Apps?
Es una extensión de Model Context Protocol que permite a un servidor MCP entregar una interfaz interactiva dentro de un host compatible, además del contenido textual y estructurado normal de una tool.
¿Una MCP App funciona en todos los clientes?
No. El soporte depende del host. Por eso una tool debe seguir ofreciendo un fallback textual útil cuando la interfaz no se pueda renderizar.
¿La UI de MCP Apps puede acceder al DOM o las cookies del host?
No debería. La arquitectura usa un iframe sandboxed y comunicación mediante un bridge de mensajes; el host conserva el control de capacidades.
¿Cuándo usar MCP Apps en lugar de una respuesta de texto?
Cuando el usuario necesita explorar datos, seleccionar opciones, revisar un artefacto o aprobar una acción. Para consultas simples, texto o structuredContent suele ser más robusto.
¿Cómo protejo una MCP App?
Valida autorización en el servidor para cada tool, limita structuredContent, aplica CSP restrictiva, sanitiza datos externos, exige confirmación para escrituras y registra acciones sin guardar secretos por defecto.
¿Puedo reutilizar una web existente como MCP App?
Sí, si adaptas la vista al lifecycle y al bridge del host, declaras recursos y CSP, y conservas una salida textual. No presupongas que una SPA existente funciona segura dentro de un iframe MCP sin cambios.
Cómo crear una primera MCP App segura para una tool existente
- Elegir una decisión visual. Selecciona una tool de lectura donde filtrar, comparar o aprobar aporte más que texto.
- Definir fallback. Escribe primero el content textual completo que recibirá un host sin soporte de UI.
- Registrar resource. Publica una resource ui:// con HTML empaquetado y MIME type de MCP App.
- Devolver datos mínimos. Añade structuredContent con un view model seguro, sin secretos ni campos de otros tenants.
- Construir la vista. Inicializa el bridge, renderiza estados de carga y trata respuestas denegadas o parciales como normales.
- Añadir llamada estrecha. Si hay interacción, llama a una tool con IDs y valida usuario, tenant, scopes y estado en servidor.
- Cerrar CSP. Declara solo redes y capacidades imprescindibles; usa herramientas MCP antes que conexiones libres desde el iframe.
- Probar degradación. Ejecuta los tests de contrato y comprueba la salida textual en hosts sin UI antes de anunciar soporte.
Fuentes y referencias
También te puede interesar
MCP en producción: seguridad, permisos y supply chainMCP outputSchema y structuredContent para agentesPlaywright MCP para testing de UIPrompt injection en agentes de IAOpenAI Agents SDK: MCP, guardrails y tracingRecibe una lectura semanal de herramientas IA para devs
Cada semana te resumo herramientas de IA para devs, agentes, MCP, seguridad y workflows en un email de 5 minutos. En español y sin ruido.
Suscribirme gratis