Logo GCP con Eduardo

GCP con Eduardo

Arquitectura de un Agente de Operaciones Autónomo para SaaS con Google ADK y n8n
✦ Guía Técnica & Arquitectura

Construcción de un Agente de Operaciones Autónomo con Google ADK y n8n

Supera la monitorización pasiva y los dashboards estáticos. Aprende a diseñar una arquitectura reactiva y proactiva Human-in-the-Loop que audita el estado de tu base de datos, razona con Google Agent Development Kit (ADK) y orquesta acciones transaccionales seguras mediante n8n y Model Context Protocol (MCP).

Patrón Human-in-the-Loop: Aprobación de operaciones críticas con supervisión en tiempo real.
Arquitectura Multi-Agente: Enrutamiento especializado entre inventario (lectura) y ventas (escritura).
Protocolo MCP & Tools: Aislamiento de consultas y ejecución determinista contra MongoDB/Firestore.
Integración Transaccional n8n: Generación de payment links en Stripe y despacho automatizado por correo.
Google ADK (Agent Development Kit) n8n Self-Hosted Model Context Protocol (MCP) MongoDB / Firestore Python 3.11 Docker & GKE Stripe API

De la Monitorización Pasiva a la Ejecución Agéntica

En la mayoría de organizaciones SaaS y plataformas de comercio electrónico, los fundadores y equipos técnicos operan como esclavos de sus propias métricas. Revisan manualmente paneles en busca de roturas de stock, pedidos bloqueados o reembolsos anómalos. Este modelo pull es ineficiente y no escala.

Invertir la lógica operativa implica construir una arquitectura event-driven donde la base de datos y los agentes de inteligencia artificial interactúan bidireccionalmente. Cuando un documento muta o un usuario interactúa, el agente analiza el contexto, evalúa el impacto del cambio, valida la consistencia transaccional y solicita autorización humana solo cuando la criticidad lo requiere.

Matriz de Decisión: Enfoques de Automatización y Operaciones

Patrón de Operación Latencia de Decisión Riesgo Transaccional Coste de Cómputo / FinOps Caso de Uso Recomendado
Dashboards Tradicionales Alta (Depende de revisión manual) Bajo (El humano ejecuta) Bajo (Consultas agregadas programadas) Informes ejecutivos y reporting mensual.
Scripts & Cron Triggers Media (Intervalos fijos) Medio (Falta de contexto ante anomalías) Mínimo Tareas deterministas sin variabilidad.
LLM con Acceso Directo Total Baja (<2 segundos) Crítico (Riesgo de alucinaciones e inyecciones) Alto (Consumo descontrolado de tokens) Entornos sandbox y prototipado rápido.
Multi-Agente ADK + MCP + n8n Óptima (Reactivo en tiempo real) Controlado (Human-in-the-Loop + Least Privilege) Optimizado (Llamadas a tools especializadas) Operaciones SaaS, E-commerce, FinOps y B2B.
⚠️ Antipatrón Crítico de Producción: Agentes Monolíticos con Privilegios de Escritura Plenos

Otorgar a un único agente de LLM permisos directos de lectura y mutación sobre colecciones productivas es un fallo de seguridad y diseño. Si el modelo interpreta erróneamente un prompt del usuario, puede ejecutar mutaciones de stock masivas o disparar cobros indebidos.

Solución Técnica: Segregar responsabilidades mediante sub-agentes coordinados por un agente raíz (Operations Manager), aislando las herramientas de lectura (InventoryAgent bajo MCP de solo lectura) de las herramientas de mutación y cobro (SalesAgent conectado a endpoints de n8n validados).

Implementación de Producción: Arquitectura Multi-Agente con Google ADK

A continuación se presenta la definición modular en Python del ecosistema de agentes, conectores MCP y herramientas de webhook hacia n8n:

import os
import requests
from dotenv import load_dotenv
from google.adk.agents import Agent
from google.adk.tools import Tool, FunctionTool
from google.adk.mcp import MCPClientConnectionParams

load_dotenv()

# ==========================================
# 1. HERRAMIENTAS DETERMINISTAS (n8n Webhook)
# ==========================================
def generate_payment_link_tool(product_name: str, amount: float, customer_email: str) -> str:
    """Invoca el webhook transaccional de n8n para generar el enlace de pago y despachar el email."""
    webhook_url = os.getenv("N8N_PAYMENT_WEBHOOK_URL", "http://localhost:5678/webhook/payment-link")
    payload = {
        "product_name": product_name,
        "amount": amount,
        "customer_email": customer_email
    }
    
    try:
        response = requests.post(webhook_url, json=payload, timeout=10)
        response.raise_for_status()
        return f"Payment link dispatched successfully via n8n to {customer_email}."
    except requests.exceptions.RequestException as e:
        return f"Error triggering transactional workflow: {str(e)}"

# ==========================================
# 2. DEFINICIÓN DE SUB-AGENTES ESPECIALIZADOS
# ==========================================

# Agente de Inventario (Solo Lectura vía MCP)
inventory_agent = Agent(
    name="InventoryAgent",
    model="gemini-1.5-flash",
    description="Especialista en consulta de catálogo y verificación de stock.",
    instruction=(
        "Eres el agente de inventario. Tienes acceso de SOLO LECTURA a la base de datos "
        "a través del servidor MCP. Consulta precios exactos y existencias disponibles."
    ),
    mcp_servers=[
        MCPClientConnectionParams(
            command="docker",
            args=["run", "-i", "--rm", "mcp/mongodb-readonly"],
            env={"MONGO_URI": os.getenv("MONGO_READONLY_URI")}
        )
    ]
)

# Agente de Ventas y Mutaciones (Escritura controlada y Webhooks)
sales_agent = Agent(
    name="SalesAgent",
    model="gemini-1.5-flash",
    description="Responsable de emitir cobros y actualizar decrementos de stock.",
    instruction=(
        "Eres el agente de ventas. Valida el precio y el email del cliente antes de disparar el webhook "
        "de pago. Ejecuta la herramienta de actualización de stock una vez confirmada la intención de compra."
    ),
    tools=[
        FunctionTool(generate_payment_link_tool)
    ],
    mcp_servers=[
        MCPClientConnectionParams(
            command="docker",
            args=["run", "-i", "--rm", "mcp/mongodb-writable"],
            env={"MONGO_URI": os.getenv("MONGO_WRITABLE_URI")}
        )
    ]
)

# ==========================================
# 3. AGENTE RAÍZ (Operations Manager Router)
# ==========================================
root_operations_agent = Agent(
    name="OpManager",
    model="gemini-1.5-flash",
    description="Orquestador principal de operaciones de SaaS y E-commerce.",
    instruction=(
        "Eres el Operations Manager. Coordina el flujo de trabajo: "
        "1. Si el usuario consulta disponibilidad, delega a InventoryAgent. "
        "2. Cuando el usuario confirma una compra y provee su correo, delega a SalesAgent para emitir el enlace de pago y sincronizar stock."
    ),
    sub_agents=[inventory_agent, sales_agent]
)

if __name__ == "__main__":
    # Inicio del servidor agéntico ADK
    print("Iniciando servicio de operaciones autónomas con Google ADK...")

Patrones de Diseño y Robustez Arquitectónica

Para garantizar resiliencia en entornos de alta concurrencia empresarial, se deben contemplar tres pilares:

1. Idempotencia y Tolerancia a Fallos

El webhook en n8n debe implementar claves de idempotencia basadas en el identificador de sesión y el ID de producto. Si el usuario repite una orden o la red sufre microcortes, no se generarán cobros duplicados en Stripe.

2. Seguridad y Protocolo MCP

El estándar Model Context Protocol (MCP) permite estandarizar cómo los modelos de lenguaje consumen herramientas externas. Al encapsular MongoDB en contenedores independientes (uno con credenciales de solo lectura y otro con permisos restringidos de actualización), eliminamos el riesgo de inyección o borrado accidental de colecciones críticas.

3. Orquestación Desacoplada

Al transferir la responsabilidad del envío de correos y la comunicación con APIs de terceros a n8n, el LLM permanece ligero y centrado exclusivamente en el razonamiento y la extracción estructurada de entidades.

Guía de Implementación Paso a Paso

  1. Levantar la infraestructura con Docker Compose: Despliega las instancias de base de datos (MongoDB o Firestore Emulator) y el contenedor de n8n autoalojado con persistencia de volúmenes.
  2. Configurar el Workflow en n8n: Crea un flujo con un nodo Webhook (POST), seguido de la integración con Stripe API (Payment Link) y un nodo de correo Gmail / SMTP para responder con el status 200 OK.
  3. Definir los Servidores MCP: Configura los adaptadores MCP para interactuar con tus colecciones de base de datos exponiendo esquemas JSON estrictos.
  4. Instanciar el Agente con Google ADK: Ensambla la jerarquía de sub-agentes en Python conectando las credenciales de Vertex AI / Gemini.
  5. Validación y Pruebas Human-in-the-Loop: Verifica en la interfaz web de ADK que las consultas no muten registros y que las operaciones de cobro se ejecuten de manera determinista.

Preguntas Frecuentes (FAQ)

¿Por qué desacoplar el agente de inventario (lectura) del agente de ventas (escritura)?

Aplicar el principio de menor privilegio mediante servidores MCP dedicados impide alucinaciones destructivas en la base de datos y garantiza que las mutaciones de estado requieran validaciones estrictas o flujos Human-in-the-Loop.

¿Cuál es la ventaja de orquestar transacciones con n8n en lugar de llamadas directas a APIs desde el LLM?

n8n proporciona un bus de automatización desacoplado con reintentos automáticos, trazabilidad visual, manejo seguro de secretos y transacciones idempotentes ante pasarelas como Stripe o servicios SMTP.

¿Cómo escala esta arquitectura en Google Cloud Platform (GCP)?

El contenedor de Google ADK se despliega sobre Cloud Run o GKE, delegando la persistencia a Cloud Firestore/MongoDB Atlas y los webhooks asíncronos a Cloud Tasks y n8n autoalojado.

Sobre el Autor: Eduardo Martínez Agrelo

AI & Data Architect

Especialista en diseño de arquitecturas de datos en la nube, sistemas multi-agente para empresas y modernización de plataformas analíticas y transaccionales en Google Cloud Platform.