Architektur
avenir-mcp ist ein Python-Paket auf Basis von FastMCP. Sein Aufbau hält drei Dinge getrennt: was mit YNAB spricht, was rechnet und was der Agent sieht.
Ordneravenir_mcp/
- server.py — Einstiegspunkt: Transport, Log-Stufe, Nur-Lese-Richtlinie
- app.py — die FastMCP-Instanz, das Tag
write, Prüfung des Monats, Log-Filter - tools_budget.py — lesende Tools nahe an YNAB und
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, für jede Art von Operation - context.py — Ressourcen und Prompts
- confirm.py — Vorschau, Bestätigung, Anwendung, Journal
- client.py — der einzige Code, der mit YNAB spricht
- journal.py — der einzige Code, der auf die Festplatte schreibt
- triage.py — ausstehende Transaktionen und Vorschläge, rein
- classifier.py — Normalisierung der Empfänger und Bewertung, rein
- writes.py — Pläne, Rückgängig-Pläne, Bestätigungscodes, rein
- reconcile.py — Kontoanalyse, rein
- forecast.py — wiederkehrende Belastungen und Hochrechnung, rein
- analytics.py — Monatsübersicht, Salden, Trends, rein
| Schicht | Module | Regel |
|---|---|---|
| Tools | tools_*.py, context.py |
erklären, was der Agent sieht; orchestrieren; rechnen nie |
| Bestätigung | confirm.py |
der einzige Weg, den jede bestätigte Schreibaktion nimmt |
| Logik | triage, classifier, writes, reconcile, forecast, analytics |
reine Funktionen: kein Netzwerk, keine Festplatte, vollständig mit Unit-Tests abgedeckt |
| E/A | client.py (HTTP), journal.py (Festplatte) |
die einzigen Seiteneffekte |
Beträge überqueren die E/A-Grenze in den Milliunits von YNAB und verlassen die Logik in Währungseinheiten: Kein Tool gibt je Milliunits zurück.
Ein lesender Aufruf
Abschnitt betitelt „Ein lesender Aufruf“- Der Client ruft
get_monthly_summarymit{"plan_id": "last-used", "month": "2026-09-01"}auf. - FastMCP prüft die Argumente gegen das Eingabeschema des Tools.
- Das Tool prüft
month(app.check_month) vor jeder Anfrage: Ein fehlerhafter Monat wird mit einer Meldung abgelehnt, ohne Kosten. client.get_monthsendet einGET /plans/last-used/months/2026-09-01an YNAB.analytics.month_overviewbehält die Summen und die überzogenen Kategorien, in Währungseinheiten.- FastMCP prüft die Antwort gegen das Ausgabeschema und gibt sie als
structuredContentzurück, mit ihrem JSON-Text für ältere Clients.
Ein schreibender Aufruf
Abschnitt betitelt „Ein schreibender Aufruf“- Der Client ruft
apply_categoriesmit Zuordnungen auf. - Das Tool liest den aktuellen Zustand (
client.get_transactions,client.get_categories) und fragtwrites.plan_categorization, was sich ändern würde. Ungültige Zuordnungen werden hier abgelehnt, bevor irgendetwas gefragt wird. confirm.write_planfragt den Nutzer über den Kanal, den der Client unterstützt – siehe Bestätigung. Bis die Antwort Ja lautet, gibt es die Vorschau zurück.- Bei Ja wendet ein einziges gebündeltes
PATCH /plans/{id}/transactionsjede Änderung an. journal.Journal.recordhängt die Operation an das Journal an; ihre ID geht an den Agenten zurück, für das Rückgängigmachen.
Registrierung und Nur-Lese-Modus
Abschnitt betitelt „Registrierung und Nur-Lese-Modus“Jedes Tool wird beim Import mit MCP-Annotationen registriert (readOnlyHint,
destructiveHint, idempotentHint, openWorldHint); schreibende Tools tragen
zusätzlich das Tag write. Beim Start ruft server.main app.configure(enable_writes=...)
auf, das jedes mit write markierte Tool deaktiviert, außer bei
AVENIR_MCP_WRITE=1. Ein deaktiviertes Tool ist weder aufgelistet noch aufrufbar. Ein
Test schlägt fehl, wenn einem Tool Annotationen fehlen oder wenn sein Tag und sein
readOnlyHint sich widersprechen.
Abhängigkeiten
Abschnitt betitelt „Abhängigkeiten“| Paket | Wozu |
|---|---|
fastmcp |
der MCP-Server: Protokoll, Schemas, Transporte |
httpx |
HTTP-Anfragen an YNAB |
pydantic |
ohnehin von fastmcp verlangt; macht aus den Docstrings der Felder Beschreibungen im Schema |
Zur Laufzeit nichts weiter. Eine Abhängigkeit hinzuzufügen verlangt eine schriftliche Begründung (AGENTS.md).
Inoffizielles Projekt. „We are not affiliated, associated, or in any way officially connected with YNAB or any of its subsidiaries or affiliates. The official YNAB website can be found at https://www.ynab.com. The names YNAB and You Need A Budget, as well as related names, tradenames, marks, trademarks, emblems, and images are registered trademarks of YNAB.“ Wir sind mit YNAB oder einer seiner Tochtergesellschaften oder verbundenen Unternehmen weder verbunden noch assoziiert noch in irgendeiner Weise offiziell verknüpft. Die offizielle Website von YNAB finden Sie unter https://www.ynab.com. Die Namen YNAB und You Need A Budget sowie zugehörige Namen, Handelsnamen, Zeichen, Marken, Embleme und Bilder sind eingetragene Marken von YNAB. avenir-mcp wird ohne Gewähr bereitgestellt und ist keine Finanzberatung. Rechtliche Hinweise · Datenschutz