Live apps por MCP
live_apps es el área más grande de la conexión: dieciséis acciones que llevan una app desde
"¿qué datos tengo siquiera?" hasta un tablero publicado que se actualiza solo. Esta página es el
contrato — las fases, las acciones de cada una, y los controles que hay entre ellas.
Para saber qué es una live app y cómo se usa en el día a día, empieza por Live Apps.
Tu asistente la construye. Nirvai la inspecciona.
Hay dos formas de tener una live app. Dentro de Nirvai, el constructor integrado hace el trabajo por ti. A través de la conexión, tu asistente es el constructor — escribe la interfaz, los componentes, los scripts de datos y el manifiesto que los une, y sube el resultado terminado.
Piénsalo como un contratista y un inspector de obra. El contratista hace el trabajo real; el inspector nunca toma una herramienta, pero somete ese trabajo exactamente a la misma norma que a la cuadrilla de la casa, y nada se aprueba si no pasa. Aquí no hay una acción de "construir", porque no hay nada que delegar.
Datos antes que estilo, estilo antes que construcción, validación antes que puesta en escena — así el
look se elige para datos que ya se vieron, y tú apruebas una app que ya se renderizó. El orden se
exige, no se sugiere: test_app se niega con una app cuyas secciones no tienen datos, y stage se
niega con una cuya última validación falló.
Las dieciséis acciones, en orden de construcción
| Fase | Acción | Alcance | Qué hace |
|---|---|---|---|
| Descubrir | live_apps.list_custom_tools(search) | read | Tus herramientas conectadas, cada una con el id que un script usa para alcanzarla. Siempre con búsqueda — una cuenta real tiene cientos. |
live_apps.list_nirvai_tools() | read | Todo lo que ya vive dentro de Nirvai: tus bases de datos, tus memorias y los propios datos de la plataforma. | |
live_apps.get_database_info(database_uuids) | read | Las columnas y tipos reales de las bases de datos que leerá la app, y cómo filtrarlas. | |
live_apps.get_memory_info(memory_uuids) | read | Qué contiene una memoria, y las formas de solo lectura en que un script puede consultarla. | |
live_apps.propose(name, sources, …) | run | Abre una página de revisión con exactamente qué fuentes leerá la app. Tú aceptas, o devuelves cambios. | |
| Datos | live_apps.test_script(code, sources, app, name) | run | Corre el script de una sección contra tus fuentes reales y guarda el resultado como su primera foto. Una llamada por sección. |
live_apps.get_snapshot(app, script?) | read | Lee esas fotos de vuelta como formas — cuántas filas, qué campos, cuándo se corrió. | |
| Estilo | live_apps.list_brand_logos(query?) | read | Logos reales de los servicios que cubre la app, para que quede con marca y no dibujada a mano. |
live_apps.theme_propose(directions, …) | run | Abre un tablero de looks con una a tres propuestas completas. Tú eliges una. | |
| Validar | live_apps.test_app(app) | run | La batería de controles: estructura, y luego un render real con datos, sin datos y con error, en escritorio y móvil. Se repite hasta que pasa. |
| Preparar | live_apps.stage(app) | run | Convierte la app validada en una vista previa funcional con un botón Guardar. Se niega si el último test_app no salió bien. |
| Guardar | live_apps.publish(title, app, …) | write | La deja como app permanente. Con el id de una app existente, la edita en su lugar. |
| Cuando sea | live_apps.list(filter?) | read | Tus apps, como tarjetas breves. |
live_apps.get(app) | read | El contrato completo de una app — estado, tema, sus secciones y las fuentes que declara cada una. | |
live_apps.load(uuid, app?) | read | Copia una app publicada de vuelta a la sesión de trabajo para editarla y volver a publicarla. | |
live_apps.list_data_sources(query?) | read | Obsoleta. Reemplazada por las cuatro acciones de descubrimiento de arriba; sigue solo para que el trabajo antiguo no se rompa. |
Todo desde propose en adelante pertenece a una sola sesión, hilada de punta a
punta, para que la app se acumule en un solo lugar.
Dónde lo terminas tú
Dos de esas acciones te devuelven una página, y no son el mismo tipo de página. Las dos viven dentro de Nirvai, necesitan que estés conectado, y nadie más puede verlas.
Elegir el look. live_apps.theme_propose abre /external/live-app-theme/… — un tablero con una
a tres direcciones de diseño completas. Es de solo lectura: elegir no crea nada, solo le dice a tu
asistente hacia dónde construir.
Guardar la app. Cuando live_apps.test_app pasa, live_apps.stage abre /external/live-app/…
— la funcional. Es la app real y funcionando, con un botón Guardar siempre a la vista, más un
modo Tweak para dejar comentarios fijados en elementos concretos. Guardar es publicar.
- Nada te llega antes de renderizar.
stagese niega con una app cuyo últimotest_appfalló. - Para cambiar algo, copia el bloque que te da la página y pégalo en tu chat — ninguna de las dos puede escribirle a tu asistente. Mira la referencia MCP.
live_apps.publishes la alternativa directa, para cuando ya le dijiste a tu asistente que la termine — sin página de por medio.
Los cuatro tipos de datos
Una app puede construirse sobre cualquier mezcla de estos, cada uno declarado por sección:
| Fuente | Se declara como | Qué le da a la app |
|---|---|---|
| Tus herramientas conectadas | tool_ids | Todo lo que hayas conectado — una tienda, una cuenta de anuncios, un CRM. |
| Tus bases de datos de Nirvai | database_uuids | Tus propias tablas, direccionadas por id. |
| Tus memorias | memory_uuids | Los hechos de largo plazo que guardan tus agentes — solo lectura. |
| Los datos propios de Nirvai | nirvai_tools | Tus agentes, automatizaciones, consumo de créditos y actividad. Nada que conectar. |
Esa declaración es la lista exacta que la sección puede tocar al ejecutarse; intentar cualquier otra cosa falla de forma ruidosa, nombrando lo que sí tenía permitido.
A través de la conexión, los scripts de live apps son forzados a solo lectura: una sección puede leer tus registros, nunca cambiarlos. Una live app es una lente, no un panel de control — mira qué pueden leer tus apps para ver dónde está esa línea.
Ejemplos
Descubrir qué existe y proponer el conjunto de fuentes.
nirvai_execute(
alias = "live_apps.list_nirvai_tools",
args = { },
description = "Ver qué bases de datos y memorias podría leer esta app"
)
nirvai_execute(
alias = "live_apps.propose",
args = { name: "Sales cockpit", app_code: "sales",
description: "Pipeline totals plus the follow-up list.",
tool_ids: [1697], database_uuids: ["8e0438a3-…"],
nirvai_tools: ["track_agents"], session: "sales-app" },
description = "Proponer los datos que leerá esta app de ventas"
)
Probar una sección con datos reales. Nada es simulado — el script corre contra tus fuentes en vivo, y lo que vuelve queda como la foto de esa sección.
nirvai_execute(
alias = "live_apps.test_script",
args = { app: "sales", name: "open_deals",
code: "def main(params):\n from tools import database_ai_execute_select\n …",
database_uuids: ["8e0438a3-…"], session: "sales-app" },
description = "Comprobar que la sección de negocios abiertos devuelve filas reales"
)
Validar y devolvértela.
nirvai_execute(alias = "live_apps.test_app",
args = { app: "sales", session: "sales-app" },
description = "Correr la batería de controles sobre la app terminada")
nirvai_execute(alias = "live_apps.stage",
args = { app: "sales", session: "sales-app" },
description = "Abrir la vista previa funcional para que la guarde")
stage devuelve un enlace a la app real y funcionando, con un botón Guardar. Nada existe en tu
cuenta hasta que lo aprietas.
Límites y garantías
- Solo lectura, siempre. Ninguna sección de una live app puede modificar un registro, en ninguna fuente, por ninguna vía.
- Las secciones están aisladas. Un script de datos no tiene acceso a archivos, ni a red, ni importaciones — solo las fuentes que declaró y los datos que devuelve. (El entorno sin restricciones es otra área: mira Automatizaciones y skills.)
- Los secretos nunca viajan. Las propuestas llevan ids, nombres y formas de las fuentes. Las credenciales detrás de ellas se resuelven del lado de Nirvai, en el momento en que corre el script.
- Tú la guardas.
stageabre una vista previa. La app existe cuando aprietas Guardar — o cuando ya la aprobaste y tu asistente llama apublish. - Editar es en el mismo lugar.
load→ cambiar →publishconserva la misma app, el mismo id y el mismo historial. - Solo las tuyas, por id. Las apps se direccionan por id y solo se resuelven las tuyas; cualquier otra vuelve como no encontrada. Borrar una app por la conexión es imposible.
- Los resultados van acotados. Cada acción devuelve una vista previa más un enlace. El resultado completo de un script vuelve como un archivo descargable, nunca pegado en un chat.
- Instantáneo y después en vivo. Una app publicada se pinta al toque con su última foto guardada, y después vuelve a correr contra las fuentes en vivo cuando se lo pides.