Skip to main content
Glama
Beennnn

openbanking-mcp

by Beennnn

openbanking-mcp — Konten lesen und VORHER warnen

tests MIT-Lizenz python 3.11+ null Abhängigkeiten

Das Repository heißt openbanking-mcp, der Befehl heißt bankread. 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, und bankread doctor lässt sich leichter eintippen als openbanking-mcp doctor. Die Konfigurationspfade (~/.config/bankread, Schlüsselbund bankread-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.py dient 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 in docs/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 --set liest 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. doctor warnt 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 demo

Ein 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                 # à demeure

Das 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édiat

Der 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 link mit 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

bankread doctor

was funktioniert, was wann kaputtgeht. Kein Netzwerkaufruf – eine Diagnose, die Kontingent verbraucht, ist eine Diagnose, die man nicht zu starten wagt.

bankread balances

die Kontostände mit ihrem Alter

bankread upcoming

die erkannten Fälligkeiten und ihr nächster Termin

bankread project

die Kreuzung: Kontostand minus anstehende Fälligkeiten, Tag für Tag

bankread tx

die letzten Buchungen

bankread json

alles auf einmal, für ein Skript

bankread demo

das Ergebnis auf einem FIKTIVEN Konto – ohne Bank, ohne Anmeldung

bankread mcp

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" mcp

Oder 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:

etat

was es bedeutet

observe

gerade gelesen, oder neu genug, um noch wahr zu sein

ancien

aus dem Cache serviert, mit klarem Alter — zu lesen, nicht zu glauben

inconnu

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 ?

bankreadlib/enablebanking.py, bankreadlib/gocardless.py

ja — Token, Kontingente, HTTP, Zustimmungspfade

bankreadlib/provider.py

er wählt aus, welchen er lädt, und schreibt den Vertrag in Protocol

bankread (Unterbefehle banks / link)

ja, teilweise — der Verbindungspfad

ledger.py, recurring.py, read.py, mcp.py, brief/, launchd/

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 doctor eine gültige Zustimmung zwei Monate nach ihrem Ablauf.

Tests

python3 test_bankread.py

51 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.

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • F
    license
    Not graded
    quality
    D
    maintenance
    An 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
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP 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
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for personal finance management. Enables natural language expense logging, budgeting, recurring charge detection, and statement import with deterministic local calculations.
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP 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

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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