Arquitectura
avenir-mcp es un paquete Python construido sobre FastMCP. Su diseño separa tres cosas: lo que habla con YNAB, lo que calcula y lo que ve el agente.
Módulos
Sección titulada «Módulos»Directorioavenir_mcp/
- server.py — punto de entrada: transporte, nivel de registro, política de solo lectura
- app.py — la instancia FastMCP, la etiqueta
write, la validación de meses, el filtro de registro - tools_budget.py — herramientas de lectura cercanas a YNAB, y
approve_transactions - tools_classify.py —
suggest_categories,apply_categories - tools_accounts.py —
reconcile_account,forecast_balance,create_transactions - tools_categories.py —
create_category,update_category,set_category_budget - tools_undo.py —
undo_operation, para cada tipo de operación - context.py — recursos y prompts
- confirm.py — vista previa, confirmación, aplicación, diario
- client.py — el único código que habla con YNAB
- journal.py — el único código que escribe en disco
- triage.py — transacciones pendientes y propuestas, puro
- classifier.py — normalización y puntuación de beneficiarios, puro
- writes.py — planes, planes de deshacer, códigos de confirmación, puro
- reconcile.py — análisis de una cuenta, puro
- forecast.py — cargos recurrentes y proyección, puro
- analytics.py — resumen del mes, saldos, tendencias, puro
| Capa | Módulos | Regla |
|---|---|---|
| Herramientas | tools_*.py, context.py |
declaran lo que ve el agente; orquestan; nunca calculan |
| Confirmación | confirm.py |
el único paso de toda escritura confirmada |
| Lógica | triage, classifier, writes, reconcile, forecast, analytics |
funciones puras: ni red ni disco, totalmente probadas |
| Entrada/salida | client.py (HTTP), journal.py (disco) |
los únicos efectos secundarios |
Los importes cruzan la frontera de entrada/salida en miliunidades de YNAB y salen de la lógica en unidades monetarias: ninguna herramienta devuelve miliunidades.
Una llamada de lectura
Sección titulada «Una llamada de lectura»- El cliente llama a
get_monthly_summarycon{"plan_id": "last-used", "month": "2026-09-01"}. - FastMCP valida los argumentos contra el esquema de entrada de la herramienta.
- La herramienta comprueba
month(app.check_month) antes de cualquier petición: un mes mal formado se rechaza con un mensaje, sin coste. client.get_monthenvía unGET /plans/last-used/months/2026-09-01a YNAB.analytics.month_overviewconserva los totales y las categorías excedidas, en unidades monetarias.- FastMCP valida la respuesta contra el esquema de salida y la devuelve como
structuredContent, con su texto JSON para clientes más antiguos.
Una llamada de escritura
Sección titulada «Una llamada de escritura»- El cliente llama a
apply_categoriescon asignaciones. - La herramienta lee el estado actual (
client.get_transactions,client.get_categories) y pide awrites.plan_categorizationlo que cambiaría. Las asignaciones no válidas se rechazan aquí, antes de cualquier pregunta. confirm.write_planpregunta al usuario por el canal que admite el cliente — vea Confirmación. Mientras la respuesta no sea sí, devuelve la vista previa.- Con un sí, un único
PATCH /plans/{id}/transactionsagrupado aplica cada cambio. journal.Journal.recordañade la operación al diario; su id vuelve al agente para deshacer.
Registro y solo lectura
Sección titulada «Registro y solo lectura»Cada herramienta se registra al importar con sus anotaciones MCP (readOnlyHint,
destructiveHint, idempotentHint, openWorldHint); las de escritura llevan además la
etiqueta write. Al arrancar, server.main llama a app.configure(enable_writes=...),
que desactiva cada herramienta con la etiqueta write salvo si AVENIR_MCP_WRITE=1. Una
herramienta desactivada no se lista ni se puede llamar. Una prueba falla si una
herramienta no tiene anotaciones o si su etiqueta y su readOnlyHint se contradicen.
Dependencias
Sección titulada «Dependencias»| Paquete | Por qué |
|---|---|
fastmcp |
el servidor MCP: protocolo, esquemas, transportes |
httpx |
las peticiones HTTP a YNAB |
pydantic |
ya requerido por fastmcp; convierte los docstrings de los campos en descripciones del esquema |
Nada más en ejecución. Añadir una dependencia exige una justificación escrita (AGENTS.md).
Proyecto no oficial. «We are not affiliated, associated, or in any way officially connected with YNAB or any of its subsidiaries or affiliates.» No estamos afiliados, asociados ni conectados oficialmente con YNAB. YNAB y You Need A Budget son marcas registradas de YNAB. avenir-mcp se ofrece tal cual, sin garantía, y no es asesoramiento financiero. Aviso legal