LangChain-Agent bauen

LangChain-Agent für die Buchhaltung

LangChain ist Ihr Baukasten, um einen eigenen KI-Agenten zu schreiben — und Ihre Buchhaltung wird darin zu einer sauber gekapselten Werkzeugquelle. Statt dem Agenten Datenbankzugriff zu geben, definieren Sie eine feste Liste von Werkzeugen, die jeweils genau einen REST-Endpunkt aufrufen und einen Bearer-Schlüssel tragen. Der Agent plant, Ihr Python-Code führt aus, und jeder Aufruf trifft dieselbe geprüfte Endpunkt-Liste. Diese Seite zeigt den Aufbau für Entwickler — vom StructuredTool bis zu den GoBD-Regeln, die kein Prompt umgehen kann.

Der Agent gehört Ihnen — die Bücher liegen bei uns

Die Rollenverteilung entscheidet über Sicherheit und Wartbarkeit.

LangChain ist Ihr Werkzeug

Der Agent läuft in Ihrer Umgebung, mit Ihrem Sprachmodell und Ihrem Code. Er ist nicht Teil unserer Software — wir liefern die Buchhaltung samt offener REST-API, an die Sie andocken. Welches Framework und welches Modell Sie verwenden, bleibt allein Ihre Entscheidung.

Werkzeuge kapseln Endpunkte

Jedes LangChain-Werkzeug (StructuredTool) ist eine dünne Python-Funktion über genau einem REST-Aufruf. Der Agent sieht benannte Werkzeuge mit klaren Argumenten, nie die Datenbank und nie freies SQL. Die Angriffsfläche ist auf die Liste beschränkt, die Sie freigeben.

Ein Schlüssel, eine Firma

Der jab_live_-Schlüssel bestimmt die Gesellschaft. Die Firma wird aus dem Schlüssel abgeleitet, nicht als Parameter übergeben — ein Agent kann also nicht versehentlich in den Büchern einer anderen Firma landen.

Feste Werkzeugliste statt Datenbankzugriff

Der eigentliche Sicherheitsgewinn liegt darin, was Sie dem Agenten NICHT geben.

Ein LangChain-Agent ist nur so mächtig wie die Werkzeuge, die Sie ihm geben. Genau das ist hier der Vorteil: Sie registrieren eine überschaubare, feste Liste von Funktionen — Saldenliste lesen, offene Posten prüfen, Ausgangsrechnung buchen — und der Agent kann ausschließlich diese aufrufen. Es gibt keinen generischen Abfragezugang, den ein geschickt formulierter Prompt zweckentfremden könnte.

Die Rollen bleiben getrennt: Das Sprachmodell entscheidet, welches Werkzeug mit welchen Argumenten aufgerufen wird; Ihr Code setzt den Authorization-Header, prüft die Eingaben an der Systemgrenze und führt den REST-Aufruf aus. Der Bearer-Schlüssel bleibt in Ihrer Prozessumgebung — er gehört weder in den Prompt noch in den Modellkontext, sondern ausschließlich in Ihren Server-Code.

Ein Werkzeug in LangChain kapseln

Eine Funktion pro Endpunkt, als StructuredTool registriert — den Rest erledigt der Agent.

import os, requests
from langchain_core.tools import StructuredTool

BASE = "https://api.jahresabschluss.io/buchhaltung"
KEY  = os.environ["JAB_API_KEY"]        # beginnt mit jab_live_
HEADERS = {"Authorization": f"Bearer {KEY}"}

def saldenliste_holen(geschaeftsjahr: int) -> dict:
    """Liest die Saldenliste eines Geschaeftsjahres. Nur lesend."""
    r = requests.get(f"{BASE}/saldenliste",
                     params={"fiscal_year": geschaeftsjahr},
                     headers=HEADERS, timeout=30)
    r.raise_for_status()
    return r.json()

tools = [
    StructuredTool.from_function(
        func=saldenliste_holen,
        name="saldenliste_holen",
        description="Saldenliste eines Geschaeftsjahres lesen.",
    ),
    # ... weitere Endpunkte identisch als StructuredTool kapseln
]

# llm  = Ihr bevorzugtes Chat-Modell mit Tool-Calling
# agent = create_tool_calling_agent(llm, tools, prompt)
# Der Agent ruft nur diese Werkzeuge auf — kein DB-Zugriff, kein SQL.

Die 14 Werkzeuge, die Sie kapseln können

Dieselben vierzehn Funktionen, die auch der MCP-Server bereitstellt — zehn lesende, vier schreibende.

  • Lesend (10): Stammdaten, Saldenliste, Buchungsjournal, offene Posten der Debitoren und der Kreditoren, Ein- und Ausgangsrechnungen, Bankumsätze, Kontenrahmen sowie BWA und Auswertungen.
  • Schreibend (4, nur mit write-Scope): Buchungssatz anlegen, Storno buchen, Ausgangsrechnung erstellen und Belege erfassen.
  • Vergeben Sie einen read-Schlüssel für reine Auswerte-Agenten — dann existieren die vier Schreib-Werkzeuge schlicht nicht, egal was der Agent versucht.
  • Sie müssen nicht alle vierzehn anbieten: Kapseln Sie nur die Endpunkte, die Ihr Anwendungsfall wirklich braucht, und halten Sie die Werkzeugliste so klein wie möglich — jede nicht registrierte Funktion ist eine, die der Agent nicht aufrufen kann.

MCP als Abkürzung — die 14 Werkzeuge ohne eigenen Wrapper

Wenn Sie sich das Kapseln sparen möchten, gibt es einen zweiten Weg.

LangChain lässt sich über die MCP-Adapter direkt an den gehosteten MCP-Server andocken und bekommt so alle vierzehn Werkzeuge fertig benannt und typisiert geliefert. Gleicher Schlüssel, gleiche Scopes, gleiche GoBD-Regeln — nur ohne dass Sie jede Funktion selbst schreiben. Für einen Prototyp ist das oft der schnellste Einstieg; für feingranulare Kontrolle über Validierung und Fehlerbehandlung bleiben eigene StructuredTools die flexiblere Variante.

Ein lokales npm-Paket (@jahresabschluss/buchhaltung-mcp) ist geplant, aber noch nicht veröffentlicht. Nutzen Sie deshalb zunächst die gehostete URL-Variante als verlässlichen Weg — sie ist sofort einsatzbereit, und Sie hinterlegen lediglich Adresse und Bearer-Schlüssel.

GoBD bleibt erzwungen — auch für den Agenten

Der Buchungskern ist der Torwächter, nicht der Prompt.

Jeder schreibende Aufruf läuft durch denselben Buchungskern wie eine Eingabe in der Software: append-only, Festschreibung, Storno statt Löschen, Soll gleich Haben. Diese Regeln liegen serverseitig — ein LangChain-Agent kann sie nicht überreden, egal wie der Prompt formuliert ist, und ein read-Schlüssel verändert ohnehin nichts.

Behandeln Sie den Agenten dennoch wie einen Sachbearbeiter mit Vollmacht: Prüfen Sie Beträge, Konten und Steuersätze in Ihrem Code, bevor ein Schreib-Werkzeug feuert. Der Agent schlägt vor — Ihr Programm entscheidet, ob und wie gebucht wird. So bleibt die Verantwortung dort, wo sie hingehört.

Häufige Fragen

Brauche ich Python für den LangChain-Agenten?

LangChain ist am ausgereiftesten in Python, und die gezeigten StructuredTools sind in wenigen Zeilen geschrieben. Es gibt auch eine JavaScript/TypeScript-Variante von LangChain — das Prinzip bleibt identisch: eine Funktion pro Endpunkt, die den Bearer-Schlüssel setzt und den REST-Aufruf ausführt. Welche Sprache Sie wählen, ist Ihre Entscheidung; unsere API ist reines HTTP und an kein Framework gebunden.

Sieht das Modell meinen jab_live_-Schlüssel?

Nein, wenn Sie sauber bauen. Der Schlüssel liegt in Ihrer Prozessumgebung und wird ausschließlich beim REST-Aufruf in den Authorization-Header gesetzt. Das Modell nennt nur den Werkzeug-Namen und die Argumente; den Header setzt Ihr Python-Code. Der Schlüssel gehört nie in den Prompt oder in den Modellkontext.

Muss ich jedes der 14 Werkzeuge selbst schreiben?

Nein. Sie können jeden Endpunkt als eigenes StructuredTool kapseln — das gibt maximale Kontrolle über Validierung und Fehlermeldungen. Alternativ docken Sie LangChain über die MCP-Adapter an den gehosteten MCP-Server an und erhalten alle vierzehn Werkzeuge fertig. Beide Wege nutzen denselben Schlüssel, dieselben Scopes und dieselben GoBD-Regeln.

Kann der Agent versehentlich löschen oder in einer fremden Firma buchen?

Nein. Buchungen sind append-only und werden festgeschrieben; korrigiert wird nur per Storno, nie durch Löschen. Und die Gesellschaft wird aus dem Schlüssel abgeleitet, nicht als Parameter übergeben — ein Schlüssel bedient genau eine Firma. Mit einem read-Scope kann der Agent zudem gar nicht schreiben.

Kann der LangChain-Agent meinen Jahresabschluss oder die E-Bilanz erstellen?

Nein. Die API ist auf die Buchhaltung begrenzt: Sie liefert Buchhaltungsdaten und bucht Belege. Sie erstellt oder übermittelt keinen Jahresabschluss, keine E-Bilanz und keine Steuererklärung. Der Agent kann höchstens die Zahlen vorbereiten, die Sie anschließend in der App — mit ihren Prüfungen — zum Abschluss überführen.