openbanking-mcp
openbanking-mcp — Konten lesen und VORHER warnen
Das Repository heißt
openbanking-mcp, der Befehl heißtbankread. Das ist keine Unachtsamkeit: Der Name des Repositorys sagt, was es ist – ein MCP-Server über Open Banking –, weil man es so findet. Der Name des Befehls sagt, was man damit tut, undbankread doctorlässt sich leichter eintippen alsopenbanking-mcp doctor. Die Konfigurationspfade (~/.config/bankread, Schlüsselbundbankread-enablebanking) folgen dem Befehl, nicht dem Repository.
Nur-Lesezugriff auf Bankkonten per PSD2 (AIS-Zulassung), plus ein tägliches Briefing für Todoist. Python 3.11+, keine Drittanbieter-Abhängigkeiten: urllib für HTTP, handgeschriebenes JSON-RPC für den MCP-Server. Läuft auf dem Mac, nicht in einer Cloud.
⚠ Der Datenanbieter muss gewählt werden – vor dem Start lesen
Dieses Repository entstand mit einem GoCardless Bank Account Data-Client (ehemals Nordigen), der der offensichtliche kostenlose Weg war. Stand 2026-08-20: Dieser Dienst ist für Neuanmeldungen geschlossen und wird eingestellt.
bankreadlib/gocardless.pydient daher nur noch denen, die bereits ein Konto hatten.Der kostenlose Ersatz für den persönlichen Gebrauch ist Enable Banking, dessen Stufe Restricted Production echte Produktionsdaten nur für die Konten liefert, die man selbst anbindet – was genau der Verwendungszweck hier ist, und ohne zu zahlende Lizenz. Der Enable-Banking-Client ist geschrieben (
bankreadlib/enablebanking.py): Selbstbedienungs-Registrierung per E-Mail, Authentifizierung per signiertem JWT RS256 – ohne Abhängigkeiten, die Standardbibliothek reicht (bankreadlib/rs256.py). Der Überblick über die praktikablen Lösungen für BoursoBank und die drei Entdeckungen, die den Code verändert haben, finden sich indocs/fournisseurs.md.Es bleibt eine Sache, die niemand für dich tun kann: das Enable-Banking-Konto erstellen, dort deine Bankkonten angeben und die Einwilligung unterschreiben. Anwendungs-ID und privater Schlüssel sind persönlich – es gibt nichts zu teilen, und genau dort muss man anfangen.
Alles andere im Repository ist anbieterunabhängig.
Das Problem, das es löst – und das, das es nicht löst
BoursoBank sendet bereits „Ihr Kontostand ist niedrig“. Die Caisse d'Épargne sendet bereits „Geldeingang“. Amazon sendet „in Lieferung“, Leboncoin „der Verkäufer hat bestätigt“. Die Information kommt bereits – sie kommt nur zu spät und am falschen Ort.
zu spät: Ein Schwellenwert-Alarm wird NACH der Abbuchung ausgelöst. Am Morgen des 15. sind die Steuern abgebucht, das Konto ist niedrig, und der Alarm stellt es nur fest;
am falschen Ort: mitten unter zweihundert E-Mails, von denen die meisten nicht gelesen werden.
Dieses Projekt sucht also keine fehlende Information. Es tut das Einzige, was niemand tut: die Subtraktion. Den heutigen Kontostand minus das, was bis zum Monatsende anfällt. Weder die Bank noch die Steuerbehörde kann das tun – keiner von beiden sieht den anderen.
Was es nicht löst: Nichts hier ersetzt den Blick auf die eigenen Konten. Eine neue, nie gesehene Abbuchung bleibt für einen Wiederholungserkenner unsichtbar.
Related MCP server: bank.mcp
Nur-Lesezugriff, und nicht aus Höflichkeit
Die Verbindung läuft über die PSD2/AIS-Zulassung des Anbieters (Enable Banking, kostenlose Stufe Restricted Production). AIS ist das Zusammenführen von Kontoinformationen. Die Zahlungsauslösung ist eine separate Zulassung (PIS), die dieses Token nicht hat und die die Bank ihm nicht gewähren wird. Das schlimmste Szenario bei einem Datenleck ist das Lesen eines Verlaufs, niemals eine Geldbewegung. Das ist der einzige Grund, warum dieses Projekt existieren darf.
Drei praktische Konsequenzen:
Die Anbieter-Zugangsdaten liegen im macOS-Schlüsselbund, nicht in einer Datei – eine Datei landet in einem Backup-Tar, einem unglücklichen
cat, einem rsync zu einem NAS. Für Enable Banking gehört dazu der private RSA-Schlüssel:bankread secrets --setliest ihn, verstaut ihn und erinnert daran, die heruntergeladene.pem-Datei zu löschen;Die Bankeinwilligung läuft ab – drei bis sechs Monate, je nachdem, was die Bank gewährt, und gespeichert wird ihre Antwort, nicht unsere Anfrage. Nichts kann sie für dich erneuern: Du musst auf die Website deiner Bank zurückkehren.
doctorwarnt 14 Tage im Voraus (nicht 1 Tag im Voraus, wo ein Wochenende genügen würde, um alles verfallen zu lassen);Das alles läuft auf dem Mac. Nicht in einer Cloud-Sitzung, nicht in einem Container.
Erste Schritte
Sofort sehen, was es tut
./bankread demoEin erfundenes Konto, 400 Tage erfundener Verlauf, ein imaginärer Kontostand – und die echte Erkennung und die echte Prognose, die darauf laufen. Nichts wird außerhalb eines temporären Verzeichnisses geschrieben.
Was die Demonstration zeigt und worum es eigentlich geht:
2026-08-23 ±3j -890.00 → 394.55 Loyer … [loyer]
2026-08-25 ±3j -412.00 → -17.45 Dgfip Impot … [impots]
2026-08-29 ±3j 2450.00 → 2432.55 Salaire …
⚠ passe sous 300 € le 2026-08-25 (-17.45 €), poussé par « Dgfip Impot Revenu »
(1 motif(s) incertain(s) non comptés — la vraie trajectoire peut être plus basse)Die Miete lässt den Kontostand noch über der Untergrenze; es sind die Steuern, die ihn darunter fallen lassen, fünf Tage vor dem Gehalt. Deine Bank wird es am Morgen des 25. sagen. Und die letzte Zeile ist die wichtigste: Die Grundsteuer ist im Verlauf nur zweimal vorgekommen, also wird ihr nicht geglaubt, also zählt sie nicht – und die Prognose kündigt selbst an, dass sie optimistisch ist, statt so zu tun, als ob.
Installation – oder auch nicht
Drei Möglichkeiten, in der Reihenfolge der Verbindlichkeit, die sie verlangen:
git clone https://github.com/Beennnn/openbanking-mcp && cd openbanking-mcp && ./bankread doctor
uvx --from git+https://github.com/Beennnn/openbanking-mcp bankread doctor # sans rien installer
pipx install git+https://github.com/Beennnn/openbanking-mcp # à demeureDas Klonen zuerst, und nicht aus Gewohnheit: Ein Werkzeug, das Bankkonten liest, wird gelesen, bevor man es installiert. ./bankread funktioniert direkt aus dem Klon, ganz ohne etwas zu installieren.
Dann, der Reihe nach
# 0. créer l'application chez le fournisseur : https://enablebanking.com/sign-in/
# Control Panel → API applications → environnement « Production », clé générée.
# L'URL de retour à déclarer est http://127.0.0.1:8788/callback (à l'identique).
# 1. les deux identifiants (le second est le CHEMIN du .pem téléchargé)
bankread secrets --set # ils vont dans le trousseau, pas sur le disque
# 2. trouver sa banque, puis signer le consentement (ouvre le site de la banque)
bankread banks bourso # relève le NOM EXACT que renvoie l'API
bankread link "BoursoBank" # puis, séparément :
bankread link "Caisse d'Epargne"
# 3. vérifier
bankread doctor
bankread project --days 45 --floor 300
# 4. le brief de 7 h 30 → tâches Todoist
launchd/install.sh
launchctl kickstart -k "gui/$(id -u)/com.bankread.brief-quotidien" # essai immédiatDer Fall BoursoBank konkret
Das ist die Bank, für die dieses Repository geschrieben wurde, also erfährst du hier, was dich erwartet, statt einer Allgemeinheit. Eine andere Bank wird sich anders verhalten – und maßgeblich ist bankread banks, nicht diese Datei:
~90 Tage Verlauf, nicht mehr. Die MONATLICHEN Fälligkeiten – Miete, EDF, monatliche Steuerabbuchung – erscheinen schon bei der ersten Abfrage: Drei Durchgänge genügen. Die jährlichen warten, bis das Register angesammelt hat (siehe oben).
Die Freigabe erfolgt über die BoursoBank-App (starke PSD2-Authentifizierung). Der Ablauf
bankread linköffnet die Website, dann klingelt das Telefon. Man muss es also griffbereit haben und diese Aktion alle 90 Tage wiederholen.Nicht auf die Wicount-360-Aggregation zählen. BoursoBank aggregiert bereits das Konto der Caisse d'Épargne und sendet Warnungen dazu, aber PSD2 gewährt Zugriff auf die Konten, die bei der angefragten Bank geführt werden, nicht auf das, was sie von anderswo aggregiert. Das Konto der Caisse d'Épargne erfordert daher ein eigenes
bankread linkmit eigener 90-Tage-Einwilligung. (Beim ersten Anschluss zu bestätigen: Falls die externen Konten im Ablauf erscheinen, umso besser.)Gemeinschaftskonten werden im Einwilligungsbildschirm der Bank ausgewählt. Nur ankreuzen, was man wirklich lesen möchte: Was angekreuzt ist, wandert ins lokale Register, und das Register vergisst nichts.
bankread banks bourso liefert den genauen Namen – bei Enable Banking wird eine Bank über ihren NAMEN und ihr Land bezeichnet, nicht über eine technische Kennung – und die maximale Einwilligungsdauer, die diese Bank gewährt. Dieser Wert ist maßgeblich, nicht diese Datei.
link schließt automatisch den Abruf des goldenen Zeitfensters an: Der vollständige Verlauf wird nur innerhalb der Stunde nach der Unterzeichnung ausgeliefert, danach fällt die Bank wieder auf 90 rollierende Tage zurück. Diesen Schritt nicht unterbrechen – er wird erst bei der nächsten Verlängerung in drei bis sechs Monaten wieder ausgeführt.
Die Befehle
| was funktioniert, was wann kaputtgeht. Kein Netzwerkaufruf – eine Diagnose, die Kontingent verbraucht, ist eine Diagnose, die man nicht zu starten wagt. |
| die Kontostände mit ihrem Alter |
| die erkannten Fälligkeiten und ihr nächster Termin |
| die Kreuzung: Kontostand minus anstehende Fälligkeiten, Tag für Tag |
| die letzten Buchungen |
| alles auf einmal, für ein Skript |
| das Ergebnis auf einem FIKTIVEN Konto – ohne Bank, ohne Anmeldung |
| MCP-Server über stdio, sechs Lese-Werkzeuge – für Claude oder jeden anderen MCP-Client |
Exit-Codes: 0 alles in Ordnung, 1 es gibt etwas zu prüfen, 2 harter Fehler – damit launchd und die aufrufenden Skripte sich zurechtfinden.
Konten von einer KI lesen lassen
claude mcp add bankread -s user -- "$PWD/bankread" mcpOder ganz ohne Klon, wie jeder MCP-Server verteilt wird:
{
"mcpServers": {
"bankread": {
"command": "uvx",
"args": ["--from", "git+https://github.com/Beennnn/openbanking-mcp", "bankread", "mcp"]
}
}
}MCP ist ein offenes Protokoll, und bankreadlib/mcp.py ist handgeschriebenes JSON-RPC: keine Hersteller-Bibliothek, kein Token, kein ausgehender Aufruf. Derselbe Server wird in den anderen MCP-Clients auf dieselbe Weise deklariert, und bankread json bedient diejenigen, die es nicht sind. Das alles – einschließlich der Frage, wie man es komplett weglässt – steht in docs/integration.md.
Zwei Grenzen, die man nicht neu entdecken muss
Vier Aufrufe pro Tag und pro Konto. Die meisten Banken begrenzen den im Hintergrund durchgeführten Abruf auf vier Aufrufe pro Konto und Tag. Vier. Das ist keine Grenze, die man streift, sondern eine, die man an einem Vormittag beim Debugging erreicht. Daher ein Cache, der kein Komfort ist: Ohne ihn schlägt das morgendliche Briefing jeden zweiten Tag fehl. Daher auch --refresh, das explizit ist und nie die Standardeinstellung.
Die Obergrenze entfällt, wenn ein Nutzer tatsächlich vor dem Bildschirm sitzt, was ein PSU-Header der Bank mitteilt. bankread sendet ihn nur, wenn der Befehl ein Terminal hat: Das Briefing um 7:30 Uhr hat keins, bleibt also gedeckelt. Das ist eine Angabe gegenüber einer Bank, keine Leistungseinstellung – sie von einem launchd-Agenten auf „wahr“ zu setzen, wäre eine Lüge.
Ein kurzer Verlauf macht eine Prognose OPTIMISTISCH, nicht unvollständig. Nicht alle Banken geben dreizehn Monate heraus – BoursoBank gibt etwa 90 Tage heraus. Unterhalb von 380 Tagen konnte eine jährliche Fälligkeit (Grundsteuer, Versicherung, Abgabe) nicht zweimal gesehen werden, also existiert sie für den Erkerner nicht, also ist die angekündigte Entwicklung besser als die wahre. Das ist die einzige Stelle, an der ein Irrtum Geld kostet, deshalb sagen upcoming, project und doctor es unmissverständlich.
Und vor allem deshalb ledger.py sammelt, statt zu cachen. Der
erste Entwurf (2026-08-20, morgens) behielt eine Momentaufnahme: Jede Lesung ersetzte die
vorherige. Bei einer Bank mit 90 Tagen machte das eine jährliche Fälligkeit nicht
„noch nicht erkannt“, sondern lebenslang unerkennbar — alles, was das Quartal überstieg,
verschwand aus der API und dem Cache gleichzeitig. Das Register schmilzt jede Lesung in
eine dauerhafte Datei; nach einem Jahr voller Briefings kennt bankread 365 Tage, wo die
Bank nur 90 zeigt, und die Grundsteuer erscheint beim zweiten Durchgang.
bankread doctor zeigt den Countdown an.
Die Regel der Einzahlung, angewandt auf einen Kontostand
Keine grüne Zeile, die nicht beobachtet wurde.
Jede Antwort von read.py trägt ein Feld etat:
| was es bedeutet |
| gerade gelesen, oder neu genug, um noch wahr zu sein |
| aus dem Cache serviert, mit klarem Alter — zu lesen, nicht zu glauben |
| wir haben nichts Frisches genug, um irgendetwas zu behaupten |
Nie ein nackter Kontostand. Ein solde: null, etat: "inconnu" ist kein Nullkonto, und
es ist die schlechteste mögliche Lesart einer fehlenden Zahl — die Beschreibungen der MCP-Tools
wiederholen es dem Modell, bevor es aufruft, damit es es nicht falsch lernt.
Dieselbe Disziplin bei Vorhersagen: Eine Fälligkeit, die zweimal gesehen wurde, ist keine Fälligkeit,
es ist ein Zufall. Sie wird mit confidence: "faible" markiert und fließt nicht in die
Projektion ein. Drei regelmäßige Durchgänge, das ist eine Tatsache.
Und bei Einnahmen: Nur die Ausgaben zu projizieren ergibt eine Flugbahn, die immer
abstürzt, also einen Alarm jeden Tag, also nach einer Woche gar keinen Alarm mehr.
Das Gehalt und die Zuschüsse werden über denselben Pfad erkannt und gezählt, nur in die
andere Richtung. test_le_salaire_qui_arrive_avant_evite_la_fausse_alerte deckt diesen Fall ab.
Das Briefing um 7:30 Uhr
brief/brief.md ist der Text, den Claude jeden Morgen ausführt, gestartet von launchd über
brief/run-brief. Es liest Gmail und die Bank, und seine einzige sinnvolle Ausgabe ist eine kleine
Anzahl von Todoist-Aufgaben, markiert mit auto-brief.
Stille ist ein Erfolg. Ein Morgen ohne etwas zu melden erzeugt null Aufgaben — keine
tägliche Zusammenfassung, kein „nichts zu melden“. Nur fünf Muster erzeugen eine Aufgabe,
und die Datei ~/.config/bankread/brief-vu.json verhindert, dass dasselbe verspätete Paket
mehr als einmal pro Woche eine erzeugt.
run-brief übergibt eine GESCHLOSSENE Liste von Werkzeugen an claude --allowedTools. Kein Werkzeug
zum Schreiben in Gmail ist darin: Das Briefing liest die Post, es antwortet nie. Und nichts
ist einer Autorisierungsanfrage überlassen, da niemand vor dem Bildschirm sitzt, um um
7:30 Uhr zu antworten.
Das aufgerufene Modell ist ein austauschbarer Pilot (brief/agents/), kein fest verdrahteter Aufruf:
BANKREAD_AGENT=aucun brief/run-brief lässt das Briefing ohne jede KI laufen, und die
Projektion landet trotzdem im Journal. Das Lesen der Konten brauchte nie
ein Modell — siehe docs/integration.md.
launchd/install.sh installiert nur diesen Agenten. Ein Installationsskript, das mehr
tut als sein Name, endet damit, etwas Totes neu zu installieren, und man verbringt den Abend damit,
zu suchen, warum zwei Exemplare laufen.
Anbieter wechseln
Die Kopplung ist dünn, und das ist durch einen Test abgesichert (test_le_contrat_tient_en_deux_methodes) :
hängt vom Anbieter ab ? | |
| ja — Token, Kontingente, HTTP, Zustimmungspfade |
| er wählt aus, welchen er lädt, und schreibt den Vertrag in |
| ja, teilweise — der Verbindungspfad |
| nein, und kein einziger direkter Import mehr |
Um einen dritten Anbieter anzubinden, genügt ein Modul, das diese beiden
Methoden bereitstellt — das Protocol von provider.py deklariert sie, und provider.charger() übernimmt die
Auswahl:
balances(account_id) -> {"balances": [...]}
transactions(account_id, date_from, date_to) -> {"transactions": {"booked": [...]}}Das erwartete Format ist das der Berlin-Gruppe : balanceType / balanceAmount für
die Salden, bookingDate und transactionAmount signiert für die Buchungen. Wenn der
Anbieter etwas anderes spricht, zahlt der Client die Übersetzung und sonst niemand —
siehe enablebanking._operation(), die den Beträgen ihr Vorzeichen zurückgibt,
während Enable Banking sie immer positiv liefert.
Drei Fallstricke, die man beim Schreiben des Enable-Banking-Clients entdeckt und nicht wiederholen sollte:
das Vorzeichen der Beträge steht neben dem Betrag (
credit_debit_indicator), nicht darin. Es einfach zu übernehmen würde jede Lastschrift wie eine Gutschrift zählen;der vollständige Verlauf dauert nur eine Stunde nach der Unterzeichnung (siehe oben) ;
die Dauer der erteilten Zustimmung kann kürzer sein als die angefragte: Das ist die Antwort der Bank, die man speichert, sonst meldet
doctoreine gültige Zustimmung zwei Monate nach ihrem Ablauf.
Tests
python3 test_bankread.py51 Tests, nur Standardbibliothek, kein Netzwerk. Sie prüfen vor allem die Fälle, in denen der Code schweigen muss : Zwei Vorkommen ergeben keine Fälligkeit, ein Cache von dreißig Stunden ist kein Saldo, man projiziert nicht auf einen nie beobachteten Saldo. Eine Erkennung, die sich beim Datum irrt, stürzt nicht ab — sie meldet die Steuern am 12. statt am 15., mit derselben Gelassenheit.
Was nicht versioniert ist
~/.config/bankread/state.json (verbundene Konten, Token, Zustimmungsdaten) und
~/.cache/bankread/ — spezifisch für diese Maschine und diese Zustimmung. Die Identifikatoren
des Anbieters sind nirgends auf der Platte: Sie liegen im macOS-Schlüsselbund,
Dienst bankread-enablebanking (oder bankread-gocardless), privater RSA-Schlüssel inbegriffen.
⚠️ ~/.local/share/bankread/ledger/ ist etwas anderes: Es ist das Register, und es wird nicht
gelöscht. Was es enthält, kann die Bank nicht mehr zurückgeben — nach 90 Tagen hat sie
es vergessen. Es zusammen mit dem Cache zu löschen heißt, mit drei Monaten Gedächtnis neu zu starten. Es ist
unter den Daten und nicht im Cache abgelegt, genau um diese Verwechslung
schwierig zu machen. Akzeptierte Kehrseite: Es ist ein Jahr Banktransaktionen im Klartext auf der
Platte, mit Berechtigung 0600.
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
- FlicenseNot gradedqualityDmaintenanceAn MCP server that exposes Enable Banking API tools for interacting with bank accounts through Open Banking. It enables users to authenticate sessions, list accounts, and fetch transaction history or balances via a secure self-hosted server.2
- AlicenseNot gradedqualityBmaintenanceMCP server that turns bank transactions into a financial digest including cash-flow forecast, spending breakdown, fee detection, and receipt reconciliation, exposing deterministic engines as JSON-RPC tools.Apache 2.0
- FlicenseNot gradedqualityBmaintenanceMCP server for personal finance management. Enables natural language expense logging, budgeting, recurring charge detection, and statement import with deterministic local calculations.
- FlicenseNot gradedqualityBmaintenanceMCP server for personal finance via Open Finance, consolidating accounts and cards and answering spending questions with aggregated numbers. Provides tools for category spending, recurring subscriptions, budgets, card bills, and installment forecasts, with data stored locally in an encrypted SQLite database.1
Related MCP Connectors
Hosted remote MCP server for YNAB on Cloudflare Workers with OAuth
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
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/Beennnn/openbanking-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server