Steuererklärung mit Claude Code

Ich habe meine Einkommensteuererklärung dieses Jahr zusammen mit Claude Code im Terminal gemacht. Beratung, Browser-Automatisierung, Belegerzeugung, alles aus einer Sitzung. Ein Erfahrungsbericht.

05.07.2026

Warum überhaupt

Wer in Deutschland angestellt ist und nebenbei ein bisschen Krypto verkauft hat, dessen Haltedauer unter einem Jahr lag, ist zur Abgabe verpflichtet. In den Vorjahren habe ich eine Software von Buhl genutzt. Die war im Kern fast wie ELSTER, hatte aber den netten Vorteil, dass automatisch abgefragt wurde, zu wie viel Prozent ich eine Position absetzen möchte. Diesmal wollte ich für die Software nichts extra bezahlen und habe direkt zu ELSTER gegriffen. Und weil ich sowieso viel mit Claude Code im Terminal arbeite, lag es nahe, das Ganze gemeinsam mit ihm zu machen.

Setup

Linux, Claude Code im Terminal, dazu ein MCP-Server, der Firefox steuert. Den habe ich selbst zusammengevibecoded, weil ich es konnte und Lust drauf hatte. Wer das nicht will, ist nicht aufgeschmissen, es gibt fertige Browser-MCPs am Markt, für Chrome sogar eine offizielle Variante von Anthropic.

Drumherum die üblichen Verdächtigen auf der Konsole, die Claude über die Bash-Schnittstelle benutzt hat: pdftotext zum Auseinandernehmen von Rechnungen, pandoc mit xelatex für eigene Belege, ImageMagick und heif-convert für iPhone-Fotos.

So konnte Claude im laufenden Browser-Tab DOM-Snapshots ziehen, Felder ausfüllen und Klicks setzen, und parallel auf der Shell Belege erzeugen, PDFs umrechnen und Tabellen rendern.

Was Claude konkret gemacht hat

Beratung, was absetzbar ist

Bevor ich überhaupt ein Formular geöffnet habe, haben wir die Lage einmal komplett durchgesprochen. Welche Werbungskosten kommen in Frage, lohnt sich Anlage KAP für die Aktien, was bringt eigentlich die Zahnzusatzversicherung steuerlich?

Auf jede Frage kam eine Antwort mit echter Begründung, statt der üblichen "frag deinen Steuerberater"-Floskel. Bei der KAP-Frage zum Beispiel: mein persönlicher Grenzsteuersatz liegt höher als die Abgeltungssteuer, also lieber sein lassen. Bei der Zahnzusatzversicherung: der Höchstbetrag der sonstigen Vorsorgeaufwendungen ist als Angestellter durch Krankenkassen- und Pflegebeiträge sowieso schon ausgeschöpft, der Steuereffekt wäre also null. Brauche ich gar nicht erst eintragen.

Die schönste Erkenntnis kam ganz am Ende. Die Nebenkostenabrechnung des Vermieters mit ihren haushaltsnahen Dienstleistungen darf man nach Wahlrecht im Jahr des Zugangs ansetzen, nicht im Jahr der ursprünglichen Vorauszahlung. Bei Vermietern, die die Abrechnung erst irgendwann im Folgejahr verschicken, ist das praktisch. Und es ist ein Hebel, der direkt von der Steuerschuld abgezogen wird, nicht nur vom Einkommen.

Browser-Steuerung im Steuerportal

Das eigentliche Formular hat Claude über das Firefox-MCP-Projekt ausgefüllt. DOM-Snapshot, Element-Referenz, klicken, tippen, weiter. Zwischendurch immer mal wieder ein frischer Snapshot zur Orientierung.

Das Steuerportal ist nicht der freundlichste Spielplatz für sowas. Die Content-Security-Policy ist streng und blockiert eval(), womit jede Form von Skript-Injection rausfällt. Bleibt der Weg über DOM-Reads und Klicks per Extension-API. Ein paar <select>-Dropdowns ignorieren synthetische Click- und Keyboard-Events komplett, die habe ich kurz selbst angeklickt. Der Kalender der Zeiterfassung lag in einem <iframe>, an den man von der Hauptseite aus nicht direkt rankommt. Workaround: per browser_query_selector die Iframe-URL ziehen, in einem neuen Tab öffnen, fertig.

Den Auto-Logout nach einer halben Stunde hatte ich erwartet. Hat aber nicht gestört, der Zwischenstand wird zuverlässig gespeichert und der Re-Login bringt einen direkt zurück zur letzten Stelle.

Datenextraktion und Belege erzeugen

Ein paar Belege hat Claude von Grund auf selbst gebaut.

Die Aufstellung der Homeoffice-Tage kam aus dem Kalender der Zeiterfassung. Claude hat das Calendar-Grid Zelle für Zelle durchgesehen, die Tagescodes (Tel, moA, URL, DR, Kr) klassifiziert und daraus eine Markdown-Tabelle für das ganze Jahr gebaut. Monatssummen oben, einzelne Tage darunter. Über pandoc und xelatex wurde daraus ein PDF, das ich direkt hochladen konnte.

Die FIFO-Sammelposition für Krypto war der aufwendigste Beleg. Aus dem Kraken-Statement (PDF) hat Claude Käufe und Verkäufe extrahiert und dabei sauber zwischen Trading-Fees und SEPA-Bankgebühren unterschieden. Das ist nicht Kosmetik, die Bankgebühr gehört nicht in die Anschaffungsnebenkosten der Coins. Pro Coin eine Sammelposition, dazu eine Gewinn-Tabelle, das Ganze wieder als PDF. Im ELSTER-Eingabefeld war die Bezeichnung erst zu lang, eine Iteration später passte sie. Wichtig nebenbei: die Trading-Fees beim Veräußerungsgeschäft gehören in ein eigenes Feld, nicht in den Verkaufserlös.

Die GitHub-Copilot-Rechnungen kommen in US-Dollar. Claude hat alle Monats-PDFs mit pdftotext aufgemacht, die Beträge summiert und mit dem Jahresmittelkurs in Euro umgerechnet. Der Sammel-Upload war danach ein einziger Klick im Datei-Picker.

Bei der fotografierten Nebenkostenabrechnung, einer HEIC-Datei direkt vom iPhone, war es kurz heif-convert nach JPG, dann magick nach PDF, hochgeladen.

Plausibilität und eigene Fehler finden

An zwei Stellen hat Claude meine eigene Krypto-Tabelle gerade gerückt. In einer Verkaufsmenge war eine Ziffer zu viel gelandet, ein klassischer Tippfehler, beim Querlesen gegen das Original-Statement aufgefallen. Und eine SEPA-Einzahlungsgebühr hatte ich fälschlich in die Anschaffungsnebenkosten der Coins gepackt. Da gehört sie nicht hin.

Genau die Sachen, die einem ohne zweiten Blick durchrutschen. Dafür ist ein Gegenüber gold wert, das stur jede Zeile gegen die Quelle hält.

Was nicht ging

Ein paar Dropdowns wollten partout nicht reagieren, vermutlich eine Mischung aus CSP und der speziellen Implementierung im Portal. Da habe ich kurz selbst geklickt. Die OCR im Portal hat bei einer USD-Rechnung den falschen Betrag erkannt, was aber egal ist. Der maßgebliche Wert kommt aus der eigenen Werbungskosten-Aufstellung, der Beleg ist nur Nachweis.

Den finalen Versenden-Button habe ich bewusst auch selbst gedrückt. Dass eine KI eine Steuererklärung mit elektronischer Authentifizierung ans Finanzamt schickt, ist mir eine Stufe zu weit. Zumindest noch.

Fazit

Ich war schneller fertig als in den Jahren davor. Wichtiger: ich war fertig mit deutlich mehr Vertrauen ins Ergebnis. Die Belege sind sauber, die Aufteilungen dokumentiert, und für jeden Eintrag gibt es eine klare Begründung. Wenn das Finanzamt nachfragt, kann ich genau sagen, woher die Zahl kommt und warum sie da steht.

Würde ich es nochmal so machen? Ja, aber ohne abzuschalten. Claude hat mehrfach eigene Vorschläge revidiert, sobald ich nachgehakt habe. Das ist gut, heißt aber auch, dass man selbst wach bleiben muss. Eine Zwei-Personen-Operation, in der eine der beiden Personen halt eine LLM ist.

Nachtrag

Der Steuerbescheid ist da. Die Erklärung ist ohne Beanstandung durchgegangen, das Finanzamt hat keinen einzigen zusätzlichen Beleg nachgefordert. Alle Positionen wurden so anerkannt, wie sie eingereicht wurden. Die Sorgfalt bei den Belegen hat sich also ausgezahlt — oder zumindest nicht geschadet.


Disclaimer: Das ist kein Steuerrat. AI-Output muss kontrolliert werden, die Verantwortung bleibt beim Nutzer. Im Zweifel zum Steuerberater.