sofatools / fints-cli

Ihr Bankkonto im Terminal. Nur lesend.

Ein Kommandozeilenwerkzeug und MCP-Server für deutsche Bankkonten über FinTS/HBCI: Konten, Salden und Umsätze, direkt von der Bank ins Terminal, in die Tabelle, ins Hauptbuch oder zum KI-Agenten. Geld bewegen kann es nicht; dafür gibt es keinen Code.

  • FinTS 3.0 PIN/TAN
  • Decoupled TAN
  • CSV · JSON · Ledger · Beancount
  • MCP-Server (stdio)
fintsaufgenommen · erfundene Daten
fints balanceWaiting for approval in your banking app: Please confirm the request in your banking app.DE00123456780004711000  1873.55 EUR  (2026-10-22)DE00123456780004711001  6200.00 EUR  (2026-10-22)

Das Problem

FinTS ist da. Die Arbeit ist alles drumherum.

Deutsche Banken sprechen FinTS, und python-fints ist eine solide Bibliothek dafür. Zwischen der Bibliothek und „gib mir die Umsätze vom letzten Monat als Beancount“ liegen TAN-Verfahren, Freigaben in der Banking-App, auf die man warten muss, die regelmäßige Neu-Authentifizierung nach PSD2, eine Session, damit nicht jeder Aufruf eine Freigabe braucht, und die Exporte. Aggregator-Dienste lösen das, indem sie einen Dritten zwischen Sie und Ihre Bank setzen.

Was fints-cli macht

fints-cli ist dieses Drumherum, einmal ordentlich gemacht. Es spricht direkt mit dem FinTS-Server Ihrer Bank, wartet auf Ihre Freigabe in der App (Decoupled TAN, z. B. SecureGo plus) oder fragt nach einer getippten TAN, merkt sich die Session, sodass spätere Aufrufe meist ohne Freigabe auskommen, und gibt aus, was Sie wollen. Der MCP-Server blockiert nie wegen einer Freigabe: Er antwortet „in der App bestätigen, dann erneut aufrufen“, während die Bankabfrage im Hintergrund wartet.

Demo

Einmal in der App freigeben, dann exportieren

Der erste Aufruf wartet auf Ihre Freigabe in der Banking-App; danach trägt der Session-Cache die nächsten Aufrufe. Rechts der MCP-Server, der nie blockiert: Er meldet „freigeben und erneut aufrufen“, während die Bankabfrage im Hintergrund wartet. Die Ausgaben des Werkzeugs sind englisch.

fintsaufgenommen · erfundene Daten
fints balanceWaiting for approval in your banking app: Please confirm the request in your banking app.DE00123456780004711000  1873.55 EUR  (2026-10-22)DE00123456780004711001  6200.00 EUR  (2026-10-22)fints transactions DE00123456780004711000 --since 2026-09-01 --until 2026-09-30booking_date,value_date,amount,currency,counterparty,counterparty_iban,purpose,reference,iban,posting_text2026-09-01,2026-09-01,-890.00,EUR,Hausverwaltung Beispiel,DE00123456780000000011,Miete September Whg 3,MIETE-2026-09,DE00123456780004711000,DAUERAUFTRAG2026-09-02,2026-09-02,-12.40,EUR,Example Hosting,DE00123456780000000022,INV-2026-0142,EH-0142,DE00123456780004711000,LASTSCHRIFT2026-09-05,2026-09-05,-54.90,EUR,Stadtwerke Musterstadt,DE00123456780000000033,Abschlag Strom 09/2026,SWM-77812,DE00123456780004711000,LASTSCHRIFT2026-09-15,2026-09-15,-4.20,EUR,Bäckerei Krume,,Kartenzahlung,POS-30311,DE00123456780004711000,KARTENZAHLUNG2026-09-29,2026-09-29,2450.00,EUR,Beispiel GmbH,DE00123456780000000044,Gehalt September 2026,LOHN-2026-09,DE00123456780004711000,LOHN/GEHALTfints transactions --since 2026-09-01 --until 2026-09-30 --format beancount --account "Assets:Bank:{bank}" | head -92026-09-01 * "Hausverwaltung Beispiel" "Miete September Whg 3"  reference: "MIETE-2026-09"  Assets:Bank:MYBANK  -890.00 EUR  Expenses:Unknown  890.00 EUR 2026-09-02 * "Example Hosting" "INV-2026-0142"  reference: "EH-0142"  Assets:Bank:MYBANK  -12.40 EUR  Expenses:Unknown  12.40 EUR
Aufgenommen mit der ausgelieferten CLI und den Exportern gegen eine Ersatz-Bank (wie in den Tests von fints-cli). IBANs, Namen und Beträge sind erfunden.
MCPwas der Agent von fints mcp bekommt
  1. get_transactions(since: "2026-09-28", until: "2026-09-30")vor der Freigabe

    {
      "status": "approval_needed",
      "message": "Approval needed: confirm the request in your banking app, then call this tool again."
    }
  2. get_transactions(since: "2026-09-28", until: "2026-09-30")nach der Bestätigung in der App

    {
      "transactions": [
        {
          "iban": "DE00123456780004711000",
          "booking_date": "2026-09-29",
          "value_date": "2026-09-29",
          "amount": "2450.00",
          "currency": "EUR",
          "counterparty": "Beispiel GmbH",
          "counterparty_iban": "DE00123456780000000044",
          "purpose": "Gehalt September 2026",
          "reference": "LOHN-2026-09",
          "posting_text": "LOHN/GEHALT"
        }
      ],
      "count": 1
    }
Der echte MCP-Server mit derselben Ersatz-Bank: Der erste Aufruf kommt sofort zurück, der zweite nach der Freigabe.

Was drin ist

  • fints accounts, balance, transactions (--since, --until, --format csv|json|ledger|beancount), login
  • Decoupled TAN: fragt bis zu fünf Minuten bei der Bank nach, bis Sie in der App bestätigt haben; getippte TAN als Rückfallebene; tan = auto | decoupled | manual pro Bank
  • Session-Cache (Dateirechte 0600), damit nicht jeder Aufruf eine Freigabe braucht
  • Buchungstext aus den CAMT-Daten der Bank als eigenes Feld, dazu Ledger- und Beancount-Ausgabe mit Vorlagen für Kontonamen
  • MCP-Server (stdio) mit list_accounts, get_balance, get_transactions, alle nur lesend, ohne Blockieren bei Freigaben
  • PIN nur aus einer Umgebungsvariable oder einem Kommando wie pass show; nie gespeichert, geloggt oder ausgegeben
  • README auf Deutsch und Englisch, mit Schritt-für-Schritt-Anleitung zur Produktregistrierung

Was es nicht kann

  • Überweisungen, Daueraufträge oder sonst etwas, das Geld bewegt. Auch nicht als Option, und kein Code dafür.
  • Depots, Kreditkarten über FinTS, Kontoauszüge als PDF, eine grafische Oberfläche.
  • Eine FinTS-Produkt-ID: Die registrieren Sie selbst (kostenlos, siehe unten).

Sie brauchen

  • Python 3.12+ und uv
  • Ein Konto bei einer Bank mit FinTS 3.0 und PIN/TAN, Online-Banking freigeschaltet
  • Eine eigene FinTS-Produkt-ID der Deutschen Kreditwirtschaft (kostenlose Registrierung)

Stand

Was getestet ist

Aktuelles Release: 0.1.0.

Getestet mit der GLS Bank (Atruvia-Plattform, Freigabe in der App SecureGo plus): Salden und Umsätze, einschließlich des Buchungstexts aus den CAMT-Daten der Bank. Andere Banken sind noch nicht getestet; siehe Bankliste.

TAN-Schleife, Session-Cache und Exporte sind außerdem durch automatische Tests abgedeckt.

Bevor Sie kaufen

Sie brauchen eine eigene FinTS-Produkt-ID

Seit August 2019 lassen Banken über FinTS nur noch registrierte Kundenprogramme zu. Die Registrierungsnummer ist an die Person oder Firma gebunden, die registriert hat, deshalb kann fints-cli keine mitliefern. Ohne eigene Nummer verbindet sich fints-cli nicht.

  1. Formular auf fints.org (Deutsche Kreditwirtschaft) ausfüllen: Produktname, Name und Anschrift, kurze Beschreibung wie „privater, nur lesender Kontozugriff“.
  2. An die dort genannte Adresse schicken. Die Registrierung ist kostenlos.
  3. Nach in der Regel 10–15 Werktagen kommt die Nummer.
  4. export FINTS_PRODUCT_ID=… – fertig.

Alternativen

Im Vergleich mit anderen Wegen an Ihre Kontodaten

Wer gern Python schreibt, kommt mit python-fints allein ans Ziel; fints-cli baut darauf auf und spart Ihnen TAN-Behandlung, Session und Exporte. Wer eine vollständige Banking-Anwendung will, nimmt Hibiscus.

Im Vergleich mit anderen Wegen an Ihre Kontodaten
OptionArtBewegt GeldAgent / SkripteDritter sieht Daten
fints-cliCLI + MCP-ServerNein, absichtlichCLI, JSON, MCPNein, direkt zur Bank
python-fintsPython-BibliothekKann (Sie schreiben den Code)Selbst bauenNein
Hibiscus (Jameica)Banking-Programm mit OberflächeJaPlugins, vor allem GUINein
AqBankingC-Bibliothek + CLIJaCLINein
Aggregator-APIs (PSD2)Gehostete REST-APIJe nach DienstRESTJa, der Anbieter

Nach der Dokumentation der Projekte, Stand Oktober 2026. Keine Verbindung zu einer Bank oder zur Deutschen Kreditwirtschaft.

Preis

Einmal zahlen. Updates behalten.

Kein Abo, keine Plätze. Sie kaufen fints-cli einmal und behalten den Lesezugriff auf das Repository; jede spätere Version ist ein git pull entfernt.

Der Lizenzschlüssel von Polar ist Ihr Kaufnachweis; fints-cli prüft ihn nicht und funkt nirgendwohin.

39 €einmalig
  • Lesezugriff auf das private GitHub-Repository
  • Alle künftigen Updates per git pull
  • Lizenzschlüssel als Kaufnachweis
  • Beliebig viele eigene Geräte
Bald erhältlich · 39 €

Bezahlung über Polar (Polar Software, Inc.) als Merchant of Record: Polar ist Verkäufer, stellt die Rechnung aus und kümmert sich um die Umsatzsteuer. Sie brauchen ein GitHub-Konto. Bedingungen

Fragen

Kann es Überweisungen machen?

Nein. Umgesetzt sind nur lesende FinTS-Geschäftsvorfälle: Kontenliste, Saldo, Umsätze. Es gibt keinen Codepfad, der eine Zahlung einreichen könnte, und es wird keinen geben.

Warum brauche ich eine eigene Produkt-ID?

Seit 2019 lassen Banken über FinTS nur registrierte Kundenprogramme zu. Die Registrierungsnummer ist an den gebunden, der registriert hat, und kann deshalb nicht an Käufer weitergegeben werden. Die eigene Registrierung ist kostenlos: Formular auf fints.org (Deutsche Kreditwirtschaft) ausfüllen und wie dort beschrieben einreichen; die Nummer kommt in der Regel nach 10–15 Werktagen. Ohne sie verbindet sich fints-cli nicht, also rechtzeitig registrieren.

Welche Banken funktionieren?

Die meisten deutschen Banken bieten FinTS 3.0 mit PIN/TAN an, und die Volks- und Raiffeisenbanken auf der Atruvia-Plattform nutzen dieselben Server wie die GLS Bank. Ob eine bestimmte Bank funktioniert, weiß man erst, wenn es jemand ausprobiert hat; die Bankseiten sagen je Bank, ob sie getestet ist.

Wie oft muss ich in der App freigeben?

Beim ersten Aufruf und danach nur, wenn die Bank wieder fragt: Die Session wird zwischengespeichert. Nach PSD2 verlangen Banken mindestens alle 90 Tage eine neue starke Authentifizierung, deshalb fragt hin und wieder ein Aufruf trotz Cache nach einer Freigabe. fints login erzwingt eine absichtlich.

Ist es eine gute Idee, einem KI-Agenten meine Bankdaten zu geben?

Das entscheiden Sie. Die MCP-Tools können kein Geld bewegen, legen aber Salden und Umsätze gegenüber allem offen, was ihre Ausgabe liest. Die PIN bleibt aus der MCP-Konfiguration heraus: pin_command nehmen, dann liefert der Passwortmanager sie zur Laufzeit.

Was bekomme ich genau?

Eine Zahlung, kein Abo. Sie bekommen Lesezugriff auf das private GitHub-Repository sofatools/fints-cli – Quelltext, Doku und alle künftigen Updates per git pull. Polar schickt außerdem einen Lizenzschlüssel als Kaufnachweis; fints-cli prüft ihn nicht und funkt nirgendwohin.

Wie komme ich an das Repository?

Sie brauchen ein GitHub-Konto. Nach dem Kauf bittet Polar Sie, es zu verbinden, und lädt es mit Lesezugriff zum Repository ein. Installiert wird direkt aus dem privaten Repository (etwa mit uv tool install git+https://github.com/sofatools/fints-cli), sobald git Ihre GitHub-Anmeldung nutzen kann; wie, steht in der Doku. Ein öffentliches Paket gibt es nicht.

Was erlaubt die Lizenz?

Ein Käufer, beliebig viele eigene Geräte und Bankkonten. Nicht erlaubt: Weitergabe, Weiterverkauf oder Veröffentlichung des Quelltexts. Die Software kommt ohne Gewährleistung, soweit gesetzlich zulässig. Lizenztext (englisch).

Wer verkauft, und wie ist das mit Rechnung, Umsatzsteuer und Erstattung?

Den Bezahlvorgang führt Polar als Merchant of Record durch: Polar ist Verkäufer auf Ihrer Rechnung, berechnet und führt die Umsatzsteuer ab und bearbeitet Erstattungen nach seinen Käuferbedingungen. Siehe Terms.

Wohin mit Fehlermeldungen?

In den Issue-Tracker des privaten Repositorys, zu dem Sie Zugang bekommen. Es gibt keinen Supportvertrag und keine zugesagte Antwortzeit; das ist ein kleines Produkt von einer Person.