Cómo conectar Claude con Odoo: un agente que saca tus estados financieros cada mes
Sacar los estados financieros del mes —estado de resultados, balance, flujo— suele ser una tarea manual: entrar a Odoo, correr reportes, exportar, formatear y resumir para la gerencia. Es repetitivo y propenso a errores. En esta guía verás cómo construir un agente con Claude que lo haga solo, cada mes, leyendo los datos directamente de Odoo.
Qué vas a construir
La arquitectura tiene tres piezas:
- Odoo — la fuente de datos contables, accesible por su API.
- Claude — el “cerebro” del agente: consulta los datos, los ordena en un estado financiero y redacta un resumen ejecutivo.
- Un disparador mensual — un cron que el día 1 de cada mes ejecuta el agente para el mes anterior y entrega el reporte por correo (o a donde quieras).
Paso 1 — Acceso a la API de Odoo
Odoo expone sus datos vía XML-RPC / JSON-RPC. Primero generá una API key para un usuario (idealmente uno de solo lectura dedicado al agente): en Odoo, Ajustes → Usuarios → tu usuario → pestaña “Seguridad de la cuenta” → “Nueva API Key”.
Con eso te autenticás y consultás los modelos contables. Para un estado de resultados, lo más directo es agrupar los apuntes contables (account.move.line) del periodo por tipo de cuenta:
import xmlrpc.client
URL = "https://tuempresa.odoo.com"
DB = "tuempresa"
USER = "agente@tuempresa.com"
API_KEY = "tu_api_key"
common = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/common")
uid = common.authenticate(DB, USER, API_KEY, {})
models = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/object")
def saldos_por_tipo(desde, hasta):
# Suma debe/haber de los apuntes contabilizados del periodo, agrupados por tipo de cuenta
return models.execute_kw(DB, uid, API_KEY,
"account.move.line", "read_group",
[[["date", ">=", desde], ["date", "<=", hasta], ["parent_state", "=", "posted"]]],
{"fields": ["balance:sum"], "groupby": ["account_type"]})
print(saldos_por_tipo("2026-05-01", "2026-05-31"))
De ahí salen los grandes bloques: ingresos y gastos (estado de resultados) y activo, pasivo y patrimonio (balance). Si usás los reportes nativos de Odoo (motor account.report), también podés invocarlos por API; empezar con read_group es lo más simple.
Paso 2 — Exponer Odoo a Claude
Hay dos caminos para que Claude pueda “usar” Odoo:
Opción A — Un servidor MCP (recomendado)
Envolvés la API de Odoo en un servidor MCP que exponga herramientas como obtener_estado_resultados, obtener_balance o saldo_cuenta. La ventaja: es un estándar reutilizable —el mismo servidor sirve para este agente, para tu asistente de escritorio o para cualquier modelo—. (Si no conocés MCP, mirá nuestra guía: ¿Qué es MCP?)
Opción B — Herramientas (tools) en la API de Claude
Para un agente puntual, podés definir las funciones directamente como tools en la API de Claude. Es lo que mostramos abajo por simplicidad.
Paso 3 — El agente con Claude
Le damos a Claude una herramienta para consultar Odoo y le pedimos el estado financiero del mes. Claude decide qué consultar, arma los números y redacta el resumen:
import anthropic
client = anthropic.Anthropic() # usa ANTHROPIC_API_KEY del entorno
tools = [{
"name": "saldos_por_tipo",
"description": "Devuelve los saldos contables de Odoo agrupados por tipo de cuenta para un rango de fechas.",
"input_schema": {
"type": "object",
"properties": {
"desde": {"type": "string", "description": "Fecha inicial AAAA-MM-DD"},
"hasta": {"type": "string", "description": "Fecha final AAAA-MM-DD"}
},
"required": ["desde", "hasta"]
}
}]
mensajes = [{"role": "user", "content":
"Genera el estado de resultados y el balance de mayo 2026 a partir de Odoo. "
"Incluye un resumen ejecutivo de 5 puntos con las variaciones más relevantes."}]
while True:
resp = client.messages.create(
model="claude-opus-4-8",
max_tokens=8000,
thinking={"type": "adaptive"},
tools=tools,
messages=mensajes,
)
if resp.stop_reason != "tool_use":
break
mensajes.append({"role": "assistant", "content": resp.content})
resultados = []
for bloque in resp.content:
if bloque.type == "tool_use" and bloque.name == "saldos_por_tipo":
datos = saldos_por_tipo(bloque.input["desde"], bloque.input["hasta"])
resultados.append({"type": "tool_result", "tool_use_id": bloque.id,
"content": str(datos)})
mensajes.append({"role": "user", "content": resultados})
# El texto final de Claude: el estado financiero + el resumen ejecutivo
reporte = next(b.text for b in resp.content if b.type == "text")
print(reporte)
Claude llama la herramienta las veces que necesite (ingresos, gastos, activos…), ensambla el estado financiero y lo acompaña de un análisis en lenguaje natural — justo lo que un gerente quiere leer.
Paso 4 — Que corra solo cada mes
Guardá el script y programalo con un cron para el día 1 de cada mes (procesando el mes anterior). En un servidor Linux:
# Día 1 de cada mes, 6:00 AM — genera y envía el reporte del mes anterior
0 6 1 * * /usr/bin/python3 /opt/agente/estados_financieros.py
En la nube podés usar una Azure Function o una tarea programada equivalente. El script calcula el rango del mes anterior automáticamente, así no tocás nada cada mes.
Paso 5 — Entregar el resultado
El reporte que produce Claude puede entregarse como mejor le sirva a tu equipo: un correo a la gerencia, un PDF adjunto, un mensaje a Slack/Teams, o incluso de vuelta a Odoo como nota. Lo más común: un email con el resumen ejecutivo en el cuerpo y el detalle adjunto.
Buenas prácticas (no opcionales)
- Acceso de solo lectura: el agente nunca debería poder modificar la contabilidad. Usá un usuario Odoo restringido a lectura.
- Protegé las credenciales: la API key de Odoo y la de Claude van en variables de entorno o un gestor de secretos, nunca en el código.
- Revisión humana: un agente acelera el trabajo, no reemplaza al contador. Los números deben cuadrar contra Odoo antes de tomar decisiones — la IA puede equivocarse y siempre requiere supervisión.
- Gobernanza: definí quién puede usar el agente y cómo se manejan los datos financieros. (Ver: Gobernanza de IA.)
Conclusión
Con tres piezas —Odoo, Claude y un cron— conviertes una tarea mensual tediosa en un proceso automático que además entrega un análisis listo para leer. El mismo patrón sirve para muchos otros reportes recurrentes de tu ERP.
En Grupo TANDEM diseñamos e implementamos agentes de IA conectados a tus sistemas —Odoo, Microsoft 365, lo que uses— de forma segura. Si querés automatizar tu reporting, conversemos.
¿Necesitas ayuda con esto?
En Grupo TANDEM lo implementamos por ti. Conversemos sobre tu caso.
Contactar a un asesor