expense-tracker-mcp
expense-tracker-mcp
Ein Remote-MCP-Server zur Erfassung persönlicher Ausgaben, basierend auf Postgres, entwickelt für zwei verschiedene Clients: Claude als Connector und einen benutzerdefinierten LangGraph-Agenten.
Erfasse eine Ausgabe mit „450 für Lebensmittel ausgegeben heute“ und frage dann „Was habe ich diesen Monat für Essen ausgegeben?“ – und erhalte von beiden Clients dieselbe Antwort, weil der Zustand in einer Datenbank und nicht in einer Chat-Sitzung liegt.
Claude (connector) ─┐
├─► expense-tracker-mcp ─► Neon Postgres
LangGraph agent ────┘ (FastMCP)Status
Phase | ||
1 | Server-Grundlage – typisierte Tools, Postgres, Kategorievalidierung | funktioniert lokal |
2 | LangGraph-Client – Terminal, | nicht gestartet |
3 | Streamlit-Frontend auf Basis des funktionierenden Agents | nicht gestartet |
4 | OAuth 2.1, Abfragen auf den authentifizierten Benutzer beschränkt | nicht gestartet |
Phase 1 ist Ende-zu-Ende gegen eine echte Neon-Datenbank verifiziert. Die Bereitstellung ist der nächste Schritt.
Related MCP server: expense-tracker-mcp-server
Tools
Tool | Zweck |
| Eine Ausgabe erfassen. Validiert die Kategorie vor dem Schreiben. |
| Einzelne Zeilen, neueste zuerst. Optionale Datumsbereichs- und Kategoriefilter. |
| Summen über einen Datumsbereich, gruppiert nach Kategorie – oder nach Unterkategorie, wenn du auf eine Kategorie filterst. |
Zusätzlich eine Ressource, expenses://categories, die die vollständige Taxonomie offenlegt, sodass ein Client die gültigen Werte im Voraus lesen kann, anstatt sie aus abgelehnten Schreibvorgängen zu entdecken.
Kategorien sind eine feste zweistufige Taxonomie, definiert in categories.json – 20 Kategorien, jeweils mit Unterkategorien. Alles außerhalb davon wird abgelehnt, wobei die gültigen Werte in der Fehlermeldung enthalten sind, sodass das Modell sich in einem einzigen Roundtrip korrigieren kann.
Lokal ausführen
Voraussetzungen: Python 3.10+, uv und ein Neon-Konto (der kostenlose Tarif reicht aus).
git clone https://github.com/<your-username>/expense-tracker-mcp
cd expense-tracker-mcp
uv syncDatenbank konfigurieren. Kopiere die Beispieldatei und fülle deine Neon-Verbindungszeichenfolge aus:
cp .env.example .env # PowerShell: Copy-Item .env.example .envZwei Dinge sind bei dieser Zeichenfolge wichtig:
Verwende die gepoolte Verbindung – der Host enthält
-pooler.Entferne die
?sslmode=require&channel_binding=require-Query-Zeichenfolge. asyncpg akzeptiert die Query-Parameter von libpq nicht und wirftinvalid dsn: invalid connection option "sslmode". TLS wird stattdessen explizit im Code angefordert. (Der Server entfernt diese ebenfalls defensiv, sodass eine roh eingefügte Zeichenfolge trotzdem funktioniert.)
Tabelle erstellen. Führe schema.sql einmal aus, im Neon SQL Editor oder einem beliebigen Postgres-Client. Jede Anweisung ist idempotent.
Server starten:
uv run python main.py # http://127.0.0.1:8000/mcpOder interaktiv erkunden mit dem MCP Inspector (benötigt Node):
uv run fastmcp dev inspector main.pyEin Browser-GET auf /mcp gibt 406 Not Acceptable zurück. Das ist korrekt, kein Fehler – MCP erfordert POST mit Accept: application/json, text/event-stream.
Bereitstellen
Entwickelt für Prefect Horizon (ehemals FastMCP Cloud). Verweise auf dieses Repository mit Entrypoint main.py:mcp und setze DATABASE_URL in den Umgebungsvariablen. Bereitgestellte Server erhalten eine *.fastmcp.app-URL, die direkt als Connector zu Claude hinzugefügt werden kann.
Beachte, dass es bewusst keine .python-version-Datei gibt. Horizon baut mit UV_PROJECT_ENVIRONMENT=/usr/local, einem System-Python-Präfix statt einer virtuellen Umgebung; eine Versions-Pin führt dazu, dass uv sie ablehnt, ein verwaltetes CPython herunterlädt und beim Versuch, ein Nicht-venv-Verzeichnis neu zu erstellen, fehlschlägt. Die requires-python = ">=3.10"-Untergrenze in pyproject.toml ist ausreichend.
Designentscheidungen
Geld ist NUMERIC(12,2), niemals ein Float. Binäre Gleitkommazahlen können 0.1 nicht exakt darstellen, daher summiert sich bei Float-Beträgen ein Fehler auf und Summen weichen um Cent ab. Beträge sind Decimal in Python, NUMERIC in Postgres und werden als Strings über die Leitung übertragen – JSON-Zahlen sind IEEE-754-Doubles, daher würde die Serialisierung als Float die Abweichung im letzten Schritt wieder einführen. 450.55 + 120.45 ergibt exakt 571.00.
Der Verbindungspool wird lazy erstellt, niemals beim Import. Eine Verbindung beim Import verwandelt ein vorübergehendes Datenbankproblem in einen fehlgeschlagenen Deploy; ein Lazy-Pool macht daraus einen einzelnen fehlgeschlagenen Tool-Aufruf, den der Aufrufer wiederholen kann. Die Schemaerstellung ist ebenfalls ein separates einmaliges Skript, nicht etwas, das der Server beim Start ausführt.
Jeder Parameter ist annotiert. FastMCP erstellt das JSON-Schema, das das Modell sieht, aus Typ-Hinweisen, sodass date: date das Modell als {"type": "string", "format": "date"} erreicht und amount exclusiveMinimum: 0 trägt. Unannotierte Parameter verschlechtern messbar die Genauigkeit des Tool-Aufrufs – und ungültige Eingaben werden durch Schema-Validierung abgelehnt, bevor der Tool-Body überhaupt ausgeführt wird.
Jedes Tool gibt ein Dict zurück, sowohl bei Erfolg als auch bei Fehler, mit einem ok-Schlüssel. Ein Tool, das bei Erfolg eine Liste und bei Fehler ein Dict zurückgibt, zwingt jeden Aufrufer, vor der Verwendung des Ergebnisses eine Typüberprüfung durchzuführen.
user_id existiert von Anfang an, standardmäßig gesetzt und derzeit ungenutzt; Phase 4 beschränkt jede Abfrage darauf. Das spätere Hinzufügen einer NOT NULL-Spalte zu einer befüllten Tabelle ist eine Migration – sie jetzt hinzuzufügen ist kostenlos. Sie ist bewusst kein Tool-Parameter: Wenn das Modell die user_id wählen könnte, könnte jeder Client die Ausgaben jedes Benutzers lesen, nur indem er danach fragt.
Logging geht nach stderr. Über den stdio-Transport ist stdout der JSON-RPC-Kanal, und ein versehentliches print() beschädigt den Protokollstrom.
Noch nicht implementiert
Ehrliche Einschränkungen statt Versehen:
Keine Bearbeitungs- oder Lösch-Tools. Das Korrigieren einer falsch erfassten Ausgabe bedeutet, direkt auf die Datenbank zuzugreifen. Aufgeschoben, bis es sich in der Praxis als störend erweist.
Keine Währungsspalte. Jeder Betrag wird als in einer Währung angenommen.
Keine Authentifizierung. Jede Ausgabe wird als
user_id = 'default'geschrieben, daher ist der bereitgestellte Server bis Phase 4 Single-Tenant.
Layout
main.py the server: three tools, one resource
schema.sql one-time table + index creation
categories.json the category taxonomy, single source of truth
.env.example documents DATABASE_URLErstellt mit
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenancePersonal expense tracker MCP server that enables tracking expenses, income, budgets, and savings goals through natural language.10MIT
- FlicenseBqualityDmaintenanceMCP server for tracking personal expenses using FastMCP and SQLite, enabling adding, listing, updating, deleting expenses and summarizing by category via natural language tools.51
- FlicenseNot gradedqualityDmaintenanceA local MCP server for tracking personal expenses using SQLite, enabling users to add, list, and summarize expenses via natural language.
- FlicenseNot gradedqualityCmaintenanceMCP server for tracking expenses with local SQLite storage. Provides tools to add, list, and summarize expenses by category.
Related MCP Connectors
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
MCP server for managing Prisma Postgres.
GibsonAI MCP server: manage your databases with natural language
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mhopareprathmesh5-creator/expense-tracker-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server