Publicado 22 sept 202620 min de lectura
Los agentes de IA son los nuevos consumidores: por qué Vinkius es el runtime seguro para flujos de trabajo de agentes
Cómo los agentes de IA se convirtierion en los primeros consumidores estocásticos de una plataforma cloud, y por qué Vinkius construyó un runtime con isolates V8, un plano de control de gobernanza con doce superficies y la arquitectura MVA de MCP Fusion como el sistema operativo seguro que los agentes no pueden ignorar.

Por Renato Marinho
Founder · Vinkius
He estado trabajando con agentes de IA durante seis meses. No observando demos en diapositivas. Vivirlolos. Ver agentes que toman reuniones, escriben código, consultan bases de datos, envían dinero, abren tickets y olvidan el número del ticket en la llamada siguiente. Y lo que he aprendido es simple: los agentes no son modelos más capaces. Son actores que ejecutan instrucciones en el mundo a través de herramientas, y la pregunta ya no es si un agente puede planificar una tarea. La pregunta es si la infraestructura que alberga esas herramientas puede sobrevivir al momento en que el agente decide actuar.
Este es el artículo en el que explico cómo Vinkius se convirtió en el sistema operativo para agentes de IA, y por qué la brecha entre un agente de demostración y un agente al que le darías credenciales de producción no es un problema de modelo. Es un problema de infraestructura. Y la respuesta está en la arquitectura que construimos para MCP Fusion.
El agente no es un usuario. Es una nueva categoría de consumidor.
Toda plataforma SaaS de las últimas veintes años fue diseñada para un tipo de llamador: un humano detrás de un navegador, o una cuenta de servicio detrás de un script conocido. Ambos comportan como si estuvieran dentro de un sistema. Hacen lo que se les dice. Fallan rápidamente cuando el patrón se rompe. No reintentan una llamada que devolvió un error cuatro veces, porque no han olvidado ese error durante tres turnos. No pierden de vista qué herramientas existen después de una transferencia a un especialista. No tienen 200.000 tokens de contexto para luego resumir una línea que no existe, porque la truncamiento les es invisible.
Un agente de IA no es ninguna de esas cosas. Un agente es estocástico por construcción. Enviará "FACT-999" como ID de factura incluso cuando acabo de listarla y solo ha visto tres. Reintentará una llamada que devolvió 404 con la misma entrada, porque no recuerda ese 404 de hace tres turnos. Perderá de vista qué herramientas existen después de una transferencia a un especialista. Se atascará en una herramienta rota hasta que el presupuesto de tokens colapse.
Y luego llamará a su base de datos de producción. A su API de pagos. A su pipeline de CI.
Los agentes ya están actuando. Actúan sobre registros CRM, facturas, estado de la infraestructura. La pregunta ya no es si van a actuar. La pregunta es: ¿la superficie sobre la que actúan está diseñada para un principal no determinista que no puede leer un esquema y no puede recordar una conversación?
Por qué MCP Fusion no es solo otro servidor MCP
MCP resolvió el problema de descubrimiento que mantenía toda integración LLM atrapada en cadenas de prompts frágiles. Pero los servidores MCP tradicionales heredan todos los problemas del modelo de servidor crudo, y esos problemas se vuelven catastróficos cuando el consumidor es un agente en lugar de un humano. Un servidor crudo filtra lo que devuelve, porque su salida es una línea serializada. Un servidor crudo no aplica nada, porque su middleware es una convención, no una garantía. Un servidor crudo no puede ver su propio desvío, porque no tiene mecanismo para detectar que la superficie que expone hoy difiere de la que exponeía ayer. Un servidor crudo responde a los errores con cadenas, y el agente reintenta con la misma cadena.
MCP Fusion corrige esto con una arquitectura llamada MVA, y el nombre es el punto central. La separación no es arbitraria. Es la separación que el código de aplicación ya conoce, pero girada hacia un nuevo consumidor.
El Model define qué es los datos y qué puede salir del proceso. Declara campos, tipos y descripciones. Esas descripciones no son documentación para un humano. Se compilan, justo a tiempo, en reglas de interpretación que el agente recibe con cada respuesta. El model declara campos ocultos, hashes de contraseñas, indicadores internos, marcadores de inquilino, y nunca cruzan la frontera. Una nueva columna de base de datos no filtra hacia un agente hasta que alguien no la declare en el model. Un servidor crudo no tiene esa propiedad.
El Presenter define qué es lo que el agente percibe de los datos. Antes de cualquier serialización, el Presenter ejecuta su esquema sobre el resultado crudo en modo strip: lo que la base haya devuelto, el agente solo ve la superficie declarada. Ese es el control de egress a nivel de memoria, no una capa de vista, no una plantilla, no una convención. Un campo que el esquema no conoce no puede cruzar. El Presenter también adjunta reglas del sistema, límites de trabajo y affordances. suggestActions le indica al agente qué puede hacer a continuación con lo que acabo de ver. Es el HATEOAS para agentes. La respuesta no es una carga útil. Es una posición en un flujo de trabajo. Los bloques de gráficos renderizados por el servidor son deterministas: el framework los renderiza, el agente los lee, y ningún modelo intermedio genera los píxeles.
Las herramientas poseen los verbos. f.query es de solo lectura por defecto. f.mutation es destructivo por defecto. f.action es neutral. No son etiquetas de metadatos. Determinan lo que la plataforma considera seguro reintentar, lo que marca el pipeline de observación, y qué señaliza una herramienta de gobierno cuando una lectura se convierte en escritura.
Una regla mantiene la separación honesta, y es una propiedad de seguridad, no de estilo. Dirección. Las herramientas importan presentadores, los presentadores importan modelos, los modelos importan core, y nada importa hacia atrás. La capa que toca tus datos nunca puede ser la capa que un agente puede manipular.
Es la arquitectura sobre la cual cada conector desplegado en Vinkius Cloud se construye, y por eso el runtime no necesita confiar en el código que ejecuta.
El aislamiento V8: donde el código cliente encuentra el control de la plataforma
Cada servidor MCP que un cliente despliega en Vinkius Cloud es, tarde o temprano, código de terceros ejecutándose en nuestra infraestructura. No es el nuestro. No es una biblioteca que controlamos. Es el suyo. Un cloud para agentes de IA no es útil si los clientes no pueden traer su propia lógica, sus propios conectores, su propio puente entre un LLM y sus sistemas. Una vez que esa capacidad existe, la pregunta se vuelve: ¿cómo ejecutar JavaScript no confiable para miles de inquilinos en un pequeño número de servidores sin darle a uno la posibilidad de dañar a otros, a la máquina, o a sus vecinos?
La respuesta es un isolate V8 por inquilino, construido sobre Node.js con isolated-vm, el binding C++ que permite que un proceso Node posea un isolate V8 nativo. No un contenedor por inquilino. No un proceso por inquilino. Un isolate. Un montículo con su propio recolector de basura, su propio espacio global, y un límite de memoria duro de 128 MB que el motor impone, no la aplicación. Cuando el montículo de un inquilino lo alcanza, el isolate de ese inquilino deja de ser servido. Los otros inquilinos continúan. El globalThis de un inquilino no es alcanzable desde el isolate de otro, porque no hay frontera JavaScript compartida.
El arranque se divide en dos fases, y solo la primera aparece en las métricas de cold start. Fase uno: el binario V8 y la capa de polyfills se inicializan, lo que toma 50 a 100 milisegundos en primer contacto con un despliegue. Fase dos: el bundle del inquilino se carga, envuelve y ejecuta dentro del isolate, lo que ocurre en cada solicitud ya que la instantánea no puede capturar estado asíncrono. La plataforma instantanea el entorno, no el programa. La capa de polyfills es estática para un despliegue dado. Lo que cambia en cada solicitud es el código del inquilino. El host ejecuta el constructor de instantáneas sobre el entorno provisionado y almacena en caché el blob resultante en disco, indexado por el ID de despliegue y sellado con la versión de V8. En la restauración, un nuevo isolate se crea a partir de ese blob en 15 a 25 milisegundos en total. El bundle se reejecuta, porque la creación de isolate desde una instantánea no puede manejar await en el nivel asíncrono superior, pero el trabajo de polyfill ocurre exactamente una vez por despliegue.
La versión de V8 importa. Los isolates de V8 no son compatibles entre versiones mayores del motor. Una instantánea construida sobre V8 versión N no puede cargarse en V8 versión N+1. El host sella el blob de instantánea con la versión del motor y rechaza cargar un blob cuyo sello no coincida con la versión en ejecución. Una no coincidencia es un fallo de caché, no un crash.
La aislamiento no es solo memoria. El entorno vacío que V8 da al isolate no tiene fetch, no tiene crypto, no tiene timers, no tiene process. Nada que toque el mundo exterior existe dentro del isolate. Fetch en un bundle de inquilino es un polyfill del lado cliente, pero la solicitud en sí ocurre del lado del host, a través de la puerta de enlace del host, como una copia ArrayBuffer binaria segura entre fronteras. crypto.subtle.digest e HMAC, lo que necesita la verificación de JWT, también están del lado del host, y el host verifica las firmas con una comparación de tiempo constante. Los timers son setTimeout del lado del host que llaman al invitado a través de un invoker registrado, limitados a cinco segundos a nivel de framework y treinta segundos a nivel de dispatch. La regla es simple. El polyfill hace parecer el llamado nativo. El host posee el efecto. Un inquilino puede expresar la intención. No puede alcanzar el sistema operativo.
Este diseño se describe en detalle en el post sobre isolates V8. El límite de cinco segundos es el límite de ejecución por isolate. El límite de treinta segundos es el límite de dispatch. El límite de diez megabytes de respuesta es el límite de egress. Las tres son políticas nombradas en la configuración del runtime, no números mágicos, y las tres están documentadas junto a la constante que las define.
El guardia SSRF: el tráfico de salida como política, no como opción por defecto
Lo más peligroso que puede hacer un bundle de inquilino es una solicitud HTTP. Fetch es una fuente universal de SSRF. Un bundle negligente o malicioso que apunte una herramienta al servicio de metadatos de AWS, en la dirección 169.254.169.254, ofrece a un agente de un cliente un camino de lectura hacia las credenciales de la instancia.
Todo el tráfico de salida pasa por el guardia SSRF. El guardia funciona por un principio. Una dirección es válida tanto como la política que la aprobó lo es. El guardia resuelve el DNS antes de la solicitud y bloquea las redes privadas: loopback, 10 slash 8, 172.16 slash 12, 192.168 slash 16, link-local 169.254 slash 16, zero slash 8 y sus gemelos IPv6. Luego fija la IP aprobada en la conexión, de modo que un ataque de reasignación no pueda cambiar la dirección después de la inspección. Y mantiene SNI y TLS alineados con la dirección fijada, porque fijar el socket sin fijar el nombre causaría errores de certificado en cada solicitud.
Las respuestas se instalan en el isolate con un contador de bytes activo, limitado a diez megabytes, con un AbortController conectado a toda la vía de destrucción. Cuando un isolate es retirado, sus solicitudes en curso se interrumpen en la misma llamada. Cuando un dispatch expira en el límite de treinta segundos, un clasificador pregunta qué estaba haciendo el isolate en el momento del corte. E/S de salida en curso, el invitado calculando, o presión de memoria. El error de la herramienta que vuelve al agente lleva la respuesta, más una sugerencia de recuperación.
La vida útil de la caché DNS está acoplada a la vida útil de la conexión. Una dirección resuelta se almacena en caché exactamente el mismo tiempo que el pool mantiene un agente keep-alive para ella, hasta 65 segundos por defecto. Una dirección no puede superar la política de conexión que justificó su fijación. No existe un TTL independiente por diseño, y esa propiedad cierra completamente la ventana de reasignación.
El camino de auditoría criptográfica: una cadena que no puedes forjar
Toda la circulación de agentes, todos los llamados a herramientas, todos los datos circulando entre y fuera de cada conector, fluyen hacia un demon de streaming de un solo hilo. Este demon forja una cadena SHA-256 y la firma con una clave Ed25519 de sesión. La clave de sesión permanece en RAM durante veinticuatro horas y es certificada por la clave maestra al arranque. Cada hash de solicitud se precava en la ingestión. Cada registro lleva el hash anterior y su posición en la secuencia. La cadena se firma. Una alteración no es un problema de confidencialidad. Es un evento detectable.
La entrada de la cadena es la carga útil en base64 concatenada con el hash anterior y el número de secuencia. El hash actual es SHA-256 de esa entrada. La firma es Ed25519 sobre la misma entrada, usando la clave privada de sesión. La clave de sesión rota cada veinticuatro horas, y la cadena continúa sin interrupciones. El estado de la cadena se apunta en Redis Streams, de modo que un crash reanude desde el último evento confirmado en lugar de revalidar toda la cadena. Los adaptadores SIEM drenan esta misma fuente tras sus propios disyuntores. Un punto de exportación fallido se aísla en lugar de permitir que la vía de auditoría se congele.
La auditoría se estructura alrededor del Artículo 73 del RGPD, el derecho de acceso de las personas. Cuando un regulador o cliente solicita el historial completo de un conector, la respuesta es una sola cadena exportable y verificable, no un proyecto.
Y aquí está la frontera que tengo más orgullo. V8 nunca toca la criptografía. El código del inquilino puede calcular un hash a través de puentes del host, pero no puede firmar, certificar o falsificar nada. El camino de auditoría es algo que la plataforma hace al runtime, no algo que los inquilinos del runtime pueden alcanzar.
El modelo completo de las doce superficies, la capa de auditoría, la capa de trampa y el vault están descritos en el post sobre gobernanza IA.
Las doce superficies: la gobernanza como sistema operativo
Si has leído el post sobre gobernanza IA, conoces el plan de control. Doce superficies, ocho que informan y cuatro que deciden, basadas en tokens con alcance, un vault sellado para credenciales, un ledger encadenado por hash y una capa de trampa que contiene los daños antes de que te des cuenta. Lo que aún no he dicho es cómo esas doce superficies se mapean al nuevo consumidor, el agente de IA.
El agente no ve las doce superficies directamente. Las ve como restricciones sobre el entorno en el que opera. Y esas restricciones son lo que permite entregar el agente a medianoche, la solicitud de producción, la conciliación de pagos.
Atribución. Cada llamada a herramienta lleva la identidad del token que la hizo, el cliente detrás de él, el humano o la cuenta de servicio detrás de eso. No existen acciones anónimas en producción. Un agente que debería girar cada hora y llama cada noventa segundos aparece en Mission Control, y es allí donde se detecta primero un bucle incontrolado, antes de que se convierta en una factura.
Protección de datos. Los campos sensibles se enmascaran en memoria, en la vía de salida entre el upstream y el modelo. La protección se hace antes de que la respuesta alcance al agente. La diferencia entre datos enmascarados y datos que nunca estuvieron en el contexto del modelo.
Control de costos. El disyuntor aplica un presupuesto de solicitudes en ventana deslizante por conector, con un valor por defecto de cinco mil solicitudes cada cinco minutos y un enfriamiento de quince minutos. Cuando se supera el presupuesto, el disyuntor salta e informa al agente, mediante una negativa redactada en lenguaje de modelo, que el recurso está disponible y debe replegarse. Un buen agente lo respeta. Un bucle que no puede leer la negativa se detiene con el mismo salto, ese es el objetivo. El estado del disyuntor se comparte entre la flota de pasarelas, de modo que un presupuesto es un presupuesto, no un límite por proceso que se reinicia cuando el tráfico pasa de una instancia a otra.
Recuperación de errores. Un servidor crudo responde a una llamada errónea con una cadena plana. El agente reintenta con la misma cadena. MCP Fusion responde con un sobre autorreparable. Un código preciso, un mensaje, una sugerencia y una lista de acciones que el agente puede tomar. InvoiceNotFound dice algo al agente que BAD_REQUEST no puede decir, y la línea de recuperación elimina la interpretación que hace costosos los bucles. Es el tema del post sobre arquitectura de conectores, donde se explica el modelo MVA completo.
El lockfile de capacidad: la detección de desvío como un paso de compilación
Una de las fallas silenciosas en sistemas agnóticos es el desvío. El servidor que desplegaste el mes pasado exponía doce herramientas. Hoy expone diecisiete, porque alguien añadió cinco. El agente llama a las nuevas. Nadie las revisó. La salida es la misma línea, pero va a otro lugar, y la vía de auditoría registra la llamada, pero la superficie revisada en CI no es la superficie que el agente puede alcanzar.
El CLI de MCP Fusion ejecuta una segunda compilación introspectiva de cada bundle. Extrae los contratos de las herramientas, los prompts y el esquema de credenciales y los escribe en un lockfile de capacidad. Es una instantánea determinista de la superficie conductual del conector. El lockfile es diferenciable en git. Un fusion lock --check en CI es la puerta. La superficie que tu código expone realmente se compara con la superficie que has commiteado, y el diff se clasifica como breaking, risky, safe o cosmetic.
El runtime que finalmente ejecuta este programa, sellado y restaurado por instantánea, es el mismo programa que produjo este lockfile. El código fuente, el bundle compilado y el lockfile commiteado son un solo artefacto. El desvío es imposible porque un desvío significaría que el lockfile y el código en ejecución estaban en desacuerdo, y esa divergencia falla en la puerta de CI.
El conector viaja como un solo artefacto. El comando mcpfusion deploy agrupa el servidor en un archivo auto-contenible: todas las dependencias interpoladas, los built-in de Node reemplazados por stubs que existen solo para satisfacer al empaquetador y nunca se llaman, y el transporte mismo stubeado, porque es la plataforma quien lo provee. El bundle cruza un umbral de 1,5 megabytes, que es un presupuesto, no una especificación. Luego se comprime, hashea y envía al edge. Si el hash coincide con el hash desplegado, la plataforma indica una restauración instantánea: los mismos bytes, sin recarga.
Orquestación multiagente: el SwarmGateway
No toda tarea puede resolverse con un solo agente. Algunos problemas necesitan especialistas. Un especialista financiero, un especialista de devops, un especialista de operaciones de cliente. Cada uno es su propio servidor MCP, su propio modelo, sus propias herramientas.
El SwarmGateway implementa el modelo B2BUA. Se presenta al agente llamante como un solo servidor MCP con una lista de herramientas con prefijo. Cuando el agente llama a una herramienta con prefijo, el gateway retira el prefijo y reenvía la llamada al servidor especialista aguas arriba. Cuando el agente termina con el especialista, una sola herramienta de retorno cierra el túnel y restaura la lista de herramientas del gateway. Cada transferencia genera un token de delegación de corta duración, con alcance solo para ese dominio, válido por sesenta segundos. El túnel inactivo expira después de cinco minutos.
Dos propiedades de seguridad son importantes aquí. En primer lugar, el token de delegación no puede escapar de su prisión, porque el gateway valida el dominio contra su registro en cada llamada. En segundo lugar, la herramienta de retorno es inyectada por el gateway, no por el upstream, lo que significa que un especialista comprometido o defectuoso no puede engañar al agente para que llame a un gateway diferente. El reescritor de espacios de nombres aplica esto a nivel del nombre de la herramienta.
Y porque el gateway habla el mismo contexto de trazas que el agente entrante, cada span de herramienta a través de la transferencia del especialista se conecta a la misma traza. Puedes seguir al agente de la capa de triage al especialista financiero al especialista de devops y de vuelta, todo en una traza distribuida. Este trabajo, la propagación del contexto W3C Trace a través del gateway, se entregó en MCP Fusion 5.1.0, y los detalles están en el post sobre correlación de trazas. Cuando el enjambre golpea el gateway a gran escala, la capa de sesiones necesita coalescer cada agente sin deadlock. Los mecanismos detrás del pooling de sesiones, la invalidación causal y el circuit breaker que mantiene un enjambre descontrolado bajo control están en la publicación sobre sesiones de SwarmGateway.
El agente como principal gobernado
La mayoría de las conversaciones sobre gobernanza de agentes tratan al agente como un riesgo a contener, y no voy a negarlo. El agente es un riesgo. Un principal no determinista llamando herramientas contra sistemas de terceros bajo un presupuesto. Ese es el riesgo.
Pero la otra mitad del argumento es la que pondría en un deck comercial: la gobernanza es lo que convierte a un agente de demostración en empleado.
La confianza se otorga en proporción a la prueba. Un operador entregará el agente a medianoche, la solicitud de producción, la conciliación de pagos, en la proporción exacta en que cada acción que realizó pueda ser atribuida, presupuestada, protegida y verificada después. El recibo no es una carga para el agente. Es la credencial que le da la llave más grande.
El sobre de un agente gobernado es conocible. Una política determinista alrededor de un modelo no determinista es la única forma sana para producción: el modelo planea en una caja, y la caja es estable. El rechazo del disyuntor está escrito en lenguaje de modelo, de modo que el agente aprenda el presupuesto y lo respete, en lugar de descubrirlo como una factura. La truncación en la capa FinOps significa que el modelo recibe una respuesta dimensionada en lugar de un blob de 200.000 tokens, y eso es un problema de inteligencia, no solo de costo.
Y el agente gana por sí mismo la capacidad que ningún sistema autónomo ha tenido jamás en la práctica. Puede mostrar su trabajo. Para un agente que opera en flujos regulados, la vía de auditoría no es un overhead. Es el producto. El agente gobernado es el único tipo de agente al que se le puede dar una verdadera autoridad, y el agente no gobernado es, para siempre, una demostración.
Dirección
Lo que acabo de describir es la pila que funciona hoy. No el plan. No la hoja de ruta. La pila sobre la cual el servidor MCP de un cliente, construido con MCP Fusion, navega al edge y se ejecuta dentro.
La dirección abierta es el estado. Un estado de inquilino más largo viendo los corchetes de hibernación del isolate. Un empaquetado más denso de isolates vivos por host. Los equipos traen sus propios catálogos de conectores al marketplace sin esperar a nuestro CI. La capa de instantánea ya tiene la interfaz de hibernación. La capa de sincronización de estado ya incluye la invalidación causal. Lo que queda es la densidad y la experiencia de desarrollo.
La dirección profunda es la pasarela de protocolo A2A. MCP Fusion ya expone cualquier servidor como un agente compatible A2A, con el endpoint de descubrimiento estándar en el camino well-known agent-card.json. El SwarmGateway ya habla el modelo B2BUA. Cuando A2A madure y los agentes comiencen a descubrirse mutuamente de forma autónoma, el gateway no cambia. Ya gestiona una flota de especialistas detrás de una sola superficie, con tokens de delegación con alcance y continuidad de trazas a través de cada transferencia.
La frontera
No creo que los isolates V8 sean la respuesta final al código edge multiinquilino. Son la respuesta para la forma que tiene esta plataforma, y la forma es donde quiero que se mantenga. Inquilinos económicos. Límites duros. Un arranque a escala de milisegundos. Porque la paciencia de un agente se mide en segundos, y también la confianza.
Los agentes ya actúan sobre sus sistemas. La pregunta ya no es si te puedes permitir la gobernanza. Es si te puedes permitir el día en que descubras que no la tenías. Vinkius Cloud es el runtime que entrega esta gobernanza, y MCP Fusion es el framework que lo hace composable. Ambos son el resultado de construir alrededor de un invariante: el consumidor no es un humano que lee una pantalla. El consumidor es un modelo que no puede leer un esquema y no puede recordar una conversación. Todo lo demás deriva de eso.
Si estás construyendo agentes que actúan sobre sistemas de producción, el sistema operativo sobre el cual corren debe estar diseñado para ese consumidor, no adaptado después. Eso es lo que hemos construido. Eso es lo que el código aplica. Y por eso la vía de auditoría es algo que la plataforma hace al runtime, no algo que los inquilinos del runtime pueden alcanzar.
El runtime detrás de los servidores MCP en cloud.vinkius.com es lo que acabo de describir. El framework es código abierto en github.com/vinkius-labs/mcpfusion. Ambos están escritos según el mismo invariante.
