Unofficial Lexware Office MCP Server
Inoffizieller Lexware Office MCP Server
Haftungsausschluss
Dieses Projekt ist nicht mit Lexware oder Haufe-Lexware GmbH & Co. KG verbunden, wird von diesen nicht unterstützt und nicht gesponsert. „Lexware" und „Lexware Office" sind Marken der jeweiligen Inhaber.
Es nutzt die dokumentierte öffentliche API mit einem API-Schlüssel, den Sie selbst erzeugen und widerrufen können. Die Nutzung dieser API unterliegt den eigenen Bedingungen von Lexware, die Sie unabhängig von diesem Projekt akzeptieren. Die API kann sich jederzeit ändern, und Anfragen können gedrosselt oder blockiert werden.
Es greift auf echte Buchhaltungsdaten zu. Schreibzugriff ist standardmäßig deaktiviert. Wenn Sie ihn aktivieren, ist alles, was über die API erstellt wird, ein echter und rechtlich relevanter Datensatz – ein finalisiertes Dokument kann über die API nicht zurückgezogen werden.
Daten können unvollständig oder veraltet sein. Nichts hier ist Steuer-, Buchhaltungs- oder Rechtsberatung. Verlassen Sie sich nicht darauf für Meldungen, Prüfungen oder Ihre Buchführungspflichten.
Bereitgestellt „wie besehen", ohne Gewährleistung. Für den persönlichen und beruflichen Gebrauch auf eigenes Risiko bestimmt. Siehe LICENSE.
Für die kommerzielle Nutzung prüfen Sie die API-Bedingungen von Lexware sowie Ihre eigenen Aufbewahrungs- und Dokumentationspflichten.
Ein MCP-Server, der einen MCP-Client wie Claude Desktop mit einem Lexware Office-Konto über die offizielle öffentliche REST-API verbindet. Stellen Sie Fragen zu Rechnungen, Kontakten, Artikeln und Belegen in natürlicher Sprache, und lassen Sie den Client sie für Sie abrufen.
Status: 0.2.0. Der Server verarbeitet Kontakte, Belege und Dokumente: finden, lesen, erstellen, ändern, sehen, was noch offen ist, ein PDF herunterladen und einen Beleg hochladen.
get_profilebeantwortet, welches Konto verbunden ist. Jedes Werkzeug in der folgenden Tabelle ist gebaut und wurde gegen ein Live-Konto getestet. Er spricht stdio mit einem Client, der ihn startet, und streamable HTTP hinter einem Bearer-Token, wenn etwas anderes ihn erreichen muss – als veröffentlichtes Container-Image, mit einer Compose-Datei für beide. Siehe SPECS.md für die vollständige technische Spezifikation und die Roadmap.
Warum es das gibt
Lexware Office hält die laufende Buchhaltung eines kleinen Unternehmens. Die meisten Fragen dazu sind Lesefragen – was ist noch offen, was hat dieser Kunde bestellt, welcher Beleg gehört zu dieser Ausgabe – und genau solche Fragen beantwortet ein Assistent gut, sobald er die Daten sehen kann. Dieser Server macht das möglich, ohne etwas zu exportieren, mit einem API-Schlüssel, den der Kontoinhaber erzeugt und widerrufen kann.
Related MCP server: lexware-mcp-server
Sicherheit zuerst
Der Server zeigt auf ein echtes Buchhaltungssystem, daher sind die Standardeinstellungen vorsichtig.
Führen Sie ihn schreibgeschützt aus, wenn Sie keinen Grund dagegen haben.
Dieser Server kann echte Buchhaltungsdaten ändern – einen Kontakt anlegen,
einen Beleg erfassen, eine Rechnung ausstellen, einen Beleg anhängen – und es
ist der Assistent, der entscheidet, wann er ein solches Werkzeug aufruft,
nicht Sie. --tools read-only gibt ihm alles, was er braucht, um Fragen zu
den Büchern zu beantworten, was die meisten damit wollen: suchen, lesen und
herunterladen. Nichts in dieser Menge schreibt.
Schalten Sie ein Schreibwerkzeug ein, wenn Sie eine Aufgabe dafür haben, und
wissen Sie, was es hinterlässt. Diese API kann einen Buchungsbeleg überhaupt
nicht löschen, daher wird ein falscher in der Web-App korrigiert und nicht
hier zurückgezogen, und eine finalisierte Rechnung ist ein echtes Dokument
mit einer Nummer, die verwendet wurde. Wenn Sie nicht sicher sind, welche
Werkzeuge Sie brauchen, ist read-only der ehrliche Ausgangspunkt – die
Berechtigungsseite fügt später mit einem Klick eines hinzu, und ein Client,
der notifications/tools/list_changed beachtet, wie Claude Desktop es tut,
übernimmt es ohne Neustart.
Nichts ist aktiviert, bis Sie es sagen. Eine frische Installation hat keine Policy-Datei, und ein Server ohne eine solche bietet überhaupt keine Werkzeuge an. Was dieser Server darf, ist eine Entscheidung, die jemand getroffen hat, niemals ein Standard, der sich so ergeben hat.
Ein Flag pro Werkzeug, in einer JSON-Datei, die Sie mit
--toolsschreiben, insetupdurchklicken oder von Hand bearbeiten. Keine Stufe, keine Gruppe:create_contactan undupload_fileaus ist ein ganz normaler Wunsch, und es gibt keine Kombination, die die Datei nicht ausdrücken kann.Was ein Werkzeug Sie kostet, ist sichtbar, während Sie entscheiden. Jedes aktivierte Werkzeug wird dem Assistenten bei jeder Anfrage gesendet, und die Berechtigungsseite setzt diese Zahl in jede Zeile.
Die Datei wird zweimal geprüft, einmal beim Erstellen der Werkzeugliste und noch einmal, wenn ein Aufruf eintrifft, sodass eine veraltete Werkzeugliste auf dem Client nicht durchrutschen kann.
Der API-Schlüssel wird nie protokolliert, nie in einem Werkzeugergebnis zurückgegeben und in Fehlermeldungen geschwärzt. Er gehört in die
.envund sonst nirgendwo hin – nicht in die Konfigurationsdatei Ihres Clients, die ein anderes Programm besitzt und neu schreibt und die diejenige ist, die Leute screenshotten, wenn sie um Hilfe bitten. Auch kein Pfad von Ihrem Rechner erreicht den Assistenten.
Werkzeuge
Gebaut bedeutet, es funktioniert heute. Der Rest ist in SPECS.md spezifiziert und noch nicht implementiert.
Lesewerkzeuge:
Werkzeug | Was es tut | Status |
| Firmenprofil und Verbindungsprüfung | gebaut |
| Kunden und Lieferanten nach Name, E-Mail, Nummer oder Rolle finden | gebaut |
| Ein Kontakt mit Adressen, Rollen und Version | gebaut |
| Artikel auflisten, gefiltert nach Nummer, Barcode oder Art. Die API bietet keine Suche nach Titel | gebaut |
| Ein Artikel mit seinem Preisblock und seiner Version | gebaut |
| Die zentrale Abfrage – die Belegliste nach Typ, Status, Kontakt, Datumsbereich und was noch offen ist filtern | gebaut |
| Eine Rechnung, ein Angebot, eine Gutschrift, eine Auftragsbestätigung, einen Lieferschein, eine Mahnung oder eine Anzahlungsrechnung vollständig lesen | gebaut |
| Einen Buchungsbeleg lesen, per ID oder per Belegnummer | gebaut |
| Zahlungsstatus und offener Betrag eines Belegs | gebaut |
| Vorlagen, die Rechnungen nach Zeitplan ausstellen, eine oder eine Seite davon | gebaut |
| Länder, Zahlungsbedingungen, Buchungskategorien und Drucklayouts, mit einer Suche zum Eingrenzen | gebaut |
| Das gerenderte PDF oder XML eines Verkaufsdokuments speichern | gebaut |
| Eine gespeicherte Datei speichern, z. B. einen hochgeladenen Beleg | gebaut |
| Eine heruntergeladene Datei in die Antwort einfügen, für Clients, die einem Ressourcenlink nicht folgen können | gebaut |
| Einen Permalink zu einem Verkaufsdokument, Kontakt oder Beleg in der Web-App erstellen, ohne API-Aufruf | gebaut |
Schreibwerkzeuge. Diese ändern echte Buchhaltungsdaten, also aktivieren Sie sie einzeln und gegen ein Konto, das Sie bereit sind, ändern zu lassen:
Werkzeug | Was es tut | Status |
| Einen Kunden oder Lieferanten anlegen | gebaut |
| Einen ändern, ohne das anzufassen, was Sie nicht genannt haben | gebaut |
| Einen Artikel zum Katalog hinzufügen | gebaut |
| Einen ändern, ohne das anzufassen, was Sie nicht genannt haben | gebaut |
| Einen Buchungsbeleg erfassen | gebaut |
| Einen bereits erfassten ändern | gebaut |
| Eine Rechnung, ein Angebot, eine Gutschrift, eine Auftragsbestätigung, einen Lieferschein oder eine Mahnung erstellen – ein Entwurf, es sei denn, Sie bitten darum, dass er ausgestellt wird, was der Assistent nur auf Ihre ausdrückliche Anweisung tun darf | gebaut |
| Einen Beleg hochladen, der auch seinen Buchungsbeleg erstellt | gebaut |
| Eine Datei an einen bereits vorhandenen Beleg hängen | gebaut |
update_contact und update_voucher kosten zwei API-Aufrufe statt einem.
Die API ersetzt einen Datensatz, statt ihn zu patchen, daher wird der aktuelle
zuerst gelesen und die Änderung daraufgelegt. Ohne das würde das Ändern nur
einer E-Mail-Adresse die Adressen, die Notiz und alles andere leeren. Beide
benötigen auch die version, die Sie zuletzt gelesen haben: Wenn sich der
Datensatz in der Zwischenzeit geändert hat, wird das Update verweigert und
nichts geschrieben.
Ein Werkzeug löscht, und es ist das einzige:
Tool | Was es tut | Status |
| Einen Artikel löschen. Die API kann ihn nicht zurückholen. Erfordert | gebaut |
Es ist das einzige Mitglied des --tools-Schritts „irreversibel“ bisher, also ist dieser Schritt
der einzige Weg, es einzuschalten. Ein Artikel ist auch das einzige, was diese API
löschen lässt, was die andere Hälfte des Punktes ist:
--tools write ist nicht dasselbe wie „unwiderruflich“. Nichts, was diese Voreinstellung aktiviert,
löscht einen Datensatz, aber zwei ihrer Werkzeuge erstellen einen, der nicht mehr entfernt werden kann
hinterher.
Ein Buchhaltungsbeleg kann nicht über die API gelöscht werden. Es gibt keinen
Endpunkt dafür, also muss ein falscher create_voucher in der
Lexware-Office-Web-App korrigiert werden. Übergeben Sie unchecked, um einen Beleg zur Prüfung zu erfassen,
anstatt ihn direkt zu buchen. Dasselbe gilt für upload_file:
Das Hochladen einer Belegdatei erstellt ebenfalls den Beleg, der dazugehört, also
hinterlässt es einen Datensatz, auch wenn sein Name nur die Datei erwähnt.
Downloads werden in das Download-Verzeichnis auf dem Rechner geschrieben, auf dem der Server läuft, und auf zwei Arten gemeldet: einen Pfad, den Sie verwenden, wenn Client und Server dasselbe System teilen, und eine Ressourcen-URI, die der Client lesen kann, um die Bytes zu bekommen, wo auch immer der Server ist. Die Datei selbst reist nie im Werkzeug-Ergebnis mit, weil Base64 ungefähr 1,37-mal so viel Kontext kostet wie die Dateigröße und kein Modell ein PDF ohnehin lesen kann. Eine vorhandene Datei wird nie überschrieben: Ein zweiter Download wird neben dem ersten gespeichert, mit einer Zählernummer im Namen.
Die Ressourcenliste wird beim Serverstart aus dem Download-Verzeichnis befüllt, damit eine URI nach einem Neustart lesbar bleibt. Was der Server nicht kann, ist, einen neuen Download anzukündigen: Das MCP-SDK gibt ihm keine Möglichkeit, eine Listenänderungs-Benachrichtigung zu senden, also sieht ein Client, der einmal beim Start auflistet, nichts, was später in der Sitzung hinzukommt.
Zwischen dem und der Tatsache, dass Claude Desktop Ressourcenlinks gar nicht verfolgt,
ist read_download der Weg, der immer funktioniert. Er nimmt dieselbe URI und legt
den Inhalt in die Antwort. Was ankommt, hängt von der Datei ab:
Datei | Kommt an als |
XML | Text, also kann ein XRechnung tatsächlich gelesen werden |
Bilder, also die ersten 10 standardmäßig | |
Bild | das Bild |
alles andere | ein eingebettetes Binärformat, das der Client handhaben kann |
Ein PDF wird gerendert statt durchgereicht, weil Claude Desktop
ein eingebettetes Binärformat in einen Bildblock verwandelt, wenn es die API aufruft, und
application/pdf dort kein erlaubter Bildtyp ist, also wird die gesamte
Anfrage abgelehnt. Rendern kostet keinen zusätzlichen API-Aufruf, da die Datei
bereits auf dem Server liegt.
Ein Link in die Web-App ist ein separates Werkzeug. get_deeplink verwandelt eine ID in
eine URL für den Browser, kostet keinen API-Aufruf und ist der Weg, der trotzdem funktioniert, wenn
der Client weder die Datei noch einen Ressourcenlink anzeigen kann: Jemand öffnet sie
selbst. Ein Download trägt keinen Link — er beantwortet, wo die Bytes liegen,
was eine andere Frage ist, und die beiden wurden lange genug zusammengeführt, damit ein
kaputter Link mit einem funktionierenden Download mitreist.
upload_file akzeptiert PDF, JPEG, PNG und XML, höchstens 5 MiB pro Datei, was
das ist, was die API annimmt. Eine XML-Datei wird als XRechnung behandelt und
abgelehnt, wenn sie keine ist.
Anforderungen
uv, das sein eigenes Python mitbringt, und der
uvx-Befehl, den jedes Beispiel unten verwendetPython 3.11 oder neuer, falls Sie Ihr eigenes mitbringen möchten. Die Installation zieht das MCP-SDK, httpx, platformdirs und pypdfium2 nach sich, letzteres, um PDF-Seiten zu rendern
Ein Lexware-Office-Konto mit aktiviertem öffentlichem API-Add-on
Ein API-Schlüssel von https://app.lexware.de/addons/public-api
Einen API-Schlüssel erhalten
Melden Sie sich als Kontoinhaber bei Lexware Office an.
Öffnen Sie das öffentliche API-Add-on unter https://app.lexware.de/addons/public-api.
Erstellen Sie einen Schlüssel und kopieren Sie ihn genau einmal — er wird nur ein einziges Mal angezeigt.
Bewahren Sie ihn außerhalb jeder Datei auf, die in die Versionskontrolle geht. Legen Sie ihn in
config/.envab, das von Git ignoriert wird, oder übergeben Sie ihn als Umgebungsvariable. Ein Schlüssel inconfig/.envwird gefunden, egal aus welchem Verzeichnis der Server gestartet wird, damit ein Client wie Claude Desktop keinen eigenen Schlüssel in seiner Konfigurationsdatei benötigt.
Ein Schlüssel kann auf derselben Seite jederzeit widerrufen werden, was der schnellste Weg ist, den Zugriff zu beenden, wenn etwas verdächtig erscheint.
Installation
1. Installieren Sie uv, falls Sie es noch nicht haben — die
uv-Installationsseite
behandelt jede Plattform. Es bringt uvx mit, und das ist das Einzige, was hier
gebraucht wird.
2. Konfigurieren Sie den Server. Es muss nichts installiert werden: uvx
holt das Paket und führt es aus.
uvx benethos-lexware-office-mcp setupDas öffnet die Oberfläche, die unter
Konfiguration im Browser beschrieben ist: Schlüssel, Einstellungen und
ein Kontrollkästchen pro Werkzeug. Alles, was sie tut, kann auch von Hand erledigt werden — legen Sie eine
Einstellungsdatei mit uvx benethos-lexware-office-mcp --settings-sample > config/.env an, tragen Sie den Schlüssel ein und verwenden Sie --tools wie unten beschrieben.
Prüfen Sie, ob es funktioniert:
uvx benethos-lexware-office-mcp --help3. Weisen Sie Claude Desktop darauf hin in claude_desktop_config.json:
{
"mcpServers": {
"benethos-lexware-office-mcp": {
"command": "uvx",
"args": ["benethos-lexware-office-mcp"]
}
}
}Kein Pfad von Ihrem Rechner erscheint dort, was der Punkt ist: uvx sucht
das Paket anhand des Namens. Zwei Dinge, die Sie über diesen Eintrag wissen sollten:
Pinnen Sie eine Version für Stabilität:
"args": ["benethos-lexware-office-mcp==0.2.0"]. Ohne Pin nimmtuvxdie neueste Version, die es auflösen kann, und ein Neustart des Clients reicht aus, um zu ändern, was ausgeführt wird.uvxmuss imPATHdes Clients liegen, was nicht immer derPATHIhres Terminals ist — einige GUI-Clients verwenden eine reduzierte Umgebung. Wenn der Server nicht startet, tragen Sie den absoluten Pfad zuuvxincommandein und starten Sie den Client vollständig neu, statt ihn nur neu zu laden.
Lieber einen eigenen Befehl?
uv tool install benethos-lexware-office-mcp gibt Ihnen
benethos-lexware-office-mcp ohne das uvx davor, was sich lohnt, wenn Sie
die Berechtigungen häufig über die Befehlszeile ändern. Es bringt sonst nichts: Die
gleiche Version kann auf beide Arten gepinnt werden, und ein warmer Start unterscheidet sich um Bruchteile einer
Sekunde. Ein Hinweis — uv installiert es in ein eigenes Werkzeugverzeichnis,
das nicht im PATH einer frischen Installation liegt. Das sagt es Ihnen, wenn es
fertig ist. Führen Sie uv tool update-shell aus und öffnen Sie ein neues Terminal.
Stattdessen aus den Quellen, um zu entwickeln oder etwas Unveröffentlichtes auszuführen:
git clone https://github.com/benethos-hub/lexware-office-mcp
cd lexware-office-mcp
uv sync
uv run benethos-lexware-office-mcp setupEin Client benötigt dann den Interpreter der virtuellen Umgebung dieses Checkouts,
command zeigt auf .venv/Scripts/python.exe unter Windows oder
.venv/bin/python anderswo, mit args von ["-m", "benethos_lexware_office_mcp"].
Kein Schlüssel dort, absichtlich. Der Server findet ihn in der .env. Die Konfigurationsdatei
eines Clients ist der falsche Ort für eine Anmeldedaten: Sie gehört nicht Ihnen —
ein anderes Programm besitzt sie, entscheidet, wo sie lebt und wann es sie neu schreibt. Sie ist
die Datei, die Leute screenshotten, wenn sie bei einem MCP-Setup um Hilfe bitten, sie ist
in der eigenen Einstellungsansicht des Clients lesbar und reist mit dem Rest der Client-Konfiguration
auf die nächste Maschine. Die .env ist wenigstens eine Datei,
die dieses Projekt dokumentiert, die nichts in Ihrem Namen synchronisiert und die die
Konfigurationsoberfläche schreibt, ohne Ihnen den Schlüssel jemals wieder anzuzeigen.
Diese .env ist bereits der Teil, bei dem Vorsicht lohnt. Sie enthält eine
Anmeldedaten für ein echtes Buchhaltungssystem, also halten Sie sie aus der Versionskontrolle heraus,
aus gemeinsamen Ordnern und aus Backups, die andere lesen können. Wenn Sie die
Nutzung des Servers beenden, löschen Sie sie und widerrufen Sie den Schlüssel unter Erweiterungen, Öffentliche
API — das Widerrufen ist der einzige Schritt, der den Zugriff tatsächlich beendet.
4. Starten Sie Claude Desktop vollständig neu — beenden Sie es über das Tray-Symbol statt
das Fenster zu schließen. Das gilt für die Konfigurationsdatei, die Sie gerade bearbeitet haben, die
ein Client beim Start einmal liest, und es ist das, was eine geänderte Einstellung in der .env
ebenfalls braucht — der Server liest diese ebenfalls beim Start. Es ist nicht
für Berechtigungen nötig: Ändern Sie diese später, wird dem laufenden Client mitgeteilt, siehe
Einzelne Werkzeuge abschalten.
Konfiguration im Browser
uvx benethos-lexware-office-mcp setupDrei Seiten auf 127.0.0.1, geschlossen mit Strg+C. Sie schreiben dieselben Dateien, die auch die
Befehlszeile schreibt, Sie können also entweder oder beide verwenden. Die Oberflächen sind auf Deutsch,
weil Lexware Office nur für deutsche Unternehmen verkauft wird, und jede ist unten
danach benannt, was sie mit ihrer Beschriftung in Klammern tut.
Übersicht — welche .env und welche tools.json tatsächlich
in Kraft sind, worauf sich jede Einstellung auflöst und woher dieser Wert kam,
ob jede Datei bereits existiert, wie viele Werkzeuge aktiv sind und was sie kosten. Ein
Verbindungstest über den Button, niemals beim Laden der Seite.
Zugangsdaten — der API-Schlüssel, der gegen die API geprüft wird, bevor er gespeichert wird, sofern Sie nichts anderes angeben, und die Einstellungen, die nicht geheim sind. Der Schlüssel wird Ihnen nie wieder angezeigt, nie protokolliert und nie exportiert. Wenn eine Umgebungsvariable ihn setzt, sagt die Seite das, weil das überschreiben würde, was Sie speichern.
Rechte — ein Kontrollkästchen pro Werkzeug, gruppiert, mit den Voreinstellungen
als Schaltflächen. Bei einer frischen Installation ohne vorhandene Richtliniendatei sind die lesenden Werkzeuge
als Ausgangspunkt vorab aktiviert — ein Vorschlag in einem Formular, keine Berechtigung:
Es gibt noch keine Datei und daher noch kein Werkzeug, bis Sie Speichern drücken, und
die Seite sagt das. Jede Zeile trägt, was dieses Werkzeug dem Assistenten an Kontext kostet,
und die Summe folgt Ihren Häkchen: Jedes aktivierte Werkzeug wird dem Modell bei
jeder Anfrage gesendet, also ist das Einschalten eines Werkzeugs sowohl eine Budget- als auch eine
Berechtigungsentscheidung. Schreibende Werkzeuge sind markiert, und diejenigen, deren Ergebnis die API
nicht zurücknehmen kann, sind separat markiert: nur App für einen Kontakt, den Lexware
Office kommentarlos löscht, und nur App · Buchhaltung für einen Beleg, der in die Bücher eingeht. Beides bedeutet nicht, dass er feststeckt — nichts ist festgeschrieben, wenn
es erstellt wird, und eine Legende auf der Seite nennt die vier Dinge, die einen
Beleg später binden.
Profile leben ebenfalls hier. Speichern Sie die aktuelle Auswahl unter einem Namen, laden Sie sie
später. Laden füllt nur die Felder: Nichts erreicht tools.json, bis Sie
Speichern drücken. Ein Name, der bereits vergeben ist, wird abgelehnt, statt das Vorhandene
leise zu ersetzen — Groß-/Kleinschreibung und Abstände ergeben kein zweites Profil — und
das Ersetzen ist eine eigene Schaltfläche neben der Liste. Sie werden in
tool_profiles.json neben der Richtliniendatei gespeichert.
Die Richtliniendatei selbst kann von derselben Seite heruntergeladen und wieder eingelesen werden —
die Datei, wie sie ist, damit sie auf einer anderen Installation mit oder
ohne diese Oberfläche funktioniert, und eine tools.json, die von --tools geschrieben wurde, liest hier.
Das Einlesen aktiviert nur die Kontrollkästchen, und das Speichern ist weiterhin ein separater Druck. Ein Werkzeug,
das die Datei nicht erwähnt, bleibt aus, und die Seite sagt, wie viele das
sind, was --tools sync in der Befehlszeile tut.
Zwei Dinge, die Sie wissen sollten. Es bindet 127.0.0.1 und nichts anderes — die
Seiten haben kein Passwort, was nur vertretbar ist, solange sie von keiner anderen Maschine
erreichbar sind, also gibt es keine Option, das zu ändern. Und es ist ein
separater Befehl: Der MCP-Server bedient niemals HTTP, und ein Client wie
Claude Desktop startet diesen, nicht jenes.
--port N verschiebt es, --no-browser gibt nur die Adresse aus, und --env-file
und --tools-file legen fest, welche Dateien es bearbeitet. Anders als überall sonst müssen diese
Dateien noch nicht existieren.
Wenn Ihr Client den Server mit --tools-file startet, geben Sie setup dasselbe Argument — sonst bearbeitet es eine andere Datei und meldet Erfolg. Beide Prozesse legen ihre Dateien beim Start fest und ändern sie danach nie mehr, und keiner kann sehen, wie der andere gestartet wurde. Die Übersicht druckt die "args"-Zeile, mit der Ihr Client auf die Dateien abgestimmt wird, die die Oberfläche hält — das ist die einfachere Richtung.
Einzelne Tools ausschalten
Eine einzige JSON-Datei entscheidet, was dieser Server anbietet, und sonst nichts. Entweder klicken Sie die Kästchen unter setup oben an, oder Sie starten die Datei mit
uvx benethos-lexware-office-mcp --tools read-onlydas jedes Tool in tools.json schreibt, die Lese-Tools einschaltet und den Rest ausschaltet, und ausgibt, was es getan hat. Drei Voreinstellungen, von denen jede die vorherige enthält:
aktiviert | |
| nur Abfragen |
| zusätzlich Anlegen und Aktualisieren |
| zusätzlich einen Artikel löschen |
| ändert keine Flag, ergänzt nur Tools, die die Datei noch nicht kennt |
--tools show berichtet nur. --tools-file PATH bestimmt, wohin geschrieben wird und funktioniert mit allen — --tools write --tools-file ./tools.json erzeugt die Datei dort.
Eine Voreinstellung überschreibt die gesamte Datei, handschriftliche Änderungen gehen also verloren. Verwenden Sie eine, um eine Datei anzulegen, nicht um eine zu aktualisieren. Wenn ein Upgrade neue Tools bringt, führen Sie --tools sync aus: Es trägt sie als ausgeschaltet ein, lässt jede von Ihnen gesetzte Flag in Ruhe und schaltet nie etwas ein. Der letzte Teil ist der Grund, warum das die einzige Option ist, die sicher aus einem Skript heraus ausgeführt werden kann.
Der dritte Schritt ist ein eigener, weil es eine eigene Entscheidung ist: Was gelöscht ist, ist fort, also sollte es benannt werden, statt die größte Option zu wählen. Genau ein Tool hat eine solche Wirkung, delete_article, und das ist kein vorübergehender Zustand — ein Artikel ist das Einzige, das diese API löschen kann, und es gibt auch nachträglich keine Möglichkeit, etwas zu buchen, abzuschließen oder zu stornieren.
Ohne --tools-file wird die Datei genauso gesucht wie die .env, mit der niedrigsten Priorität zuerst:
das benutzerspezifische Konfigurationsverzeichnis
config/eines Checkouts, wenn Sie aus den Quellen heraus laufenconfig/und dann des Wurzelverzeichnis des Arbeitsverzeichnisses
Die zuletzt gefundene Datei gewinnt, und wenn noch niemand eine Datei angelegt hat, löst sie die erste auf. Danach bearbeiten Sie sie:
{
"create_contact": false,
"search_contacts": true,
"upload_file": false
}Ein Werkzeug, das auf false gesetzt ist, wird nicht aufgeführt und kann nicht aufgerufen werden. Ein Werkzeug, das die Datei nicht erwähnt, ist ebenfalls aus — Schweigen ist eine Ablehnung; ein Tool, das mit einem Upgrade kommt, wartet also auf Sie, statt von selbst zu erscheinen. Gar keine Datei bedeutet gar keine Tools, weshalb --tools Teil des Serveraufbaus ist.
Die Datei wird beim Aufbau der Werkzeugliste und dann bei jedem Zugriff erneut gelesen, sodass eine Änderung sofort in beide Richtungen wirkt — ohne Neustart. Der Server teilt dem Client auch mit, wenn sich die Menge der aktivierten Tools ändert, sodass der Client die Liste von selbst abholt: Claude Desktop übernimmt eine Änderung, während es läuft. Da hängt nichts davon ab, denn ein ausgeschaltetes Tool kann nicht aufgerufen werden, ganz egal, welche Liste der Client gerade noch zeigt. Wenn Ihrer das nicht bemerkt, starten Sie es neu — Claude Desktop, indem Sie es aus dem Infobereich beenden.
Jedes Tool gibt auch an, was es ist — lesend oder schreibend, in welche Gruppe es gehört und ob das Geschriebene wieder entfernt werden kann. Diese Klassifikation ist es, die --tools read-only anhand auswählt und die die Browseroberfläche gruppiert und markiert. Er entscheidet nie über einen Aufruf: nur die Datei tut das.
Konfiguration
Wo ein Wert herkommt und welcher gewinnt
Sechs Quellen, die niedrigste zuerst — eine spätere überschreibt eine frühere:
die integrierte Standardeinstellung
.envim benutzerspezifischen Konfigurationsverzeichnisconfig/.envdes Checkouts, aus dem der Server läuft, falls er aus einem läuftconfig/.envund dann.envim Arbeitsverzeichnisdie Datei, die
--env-filebenennt, wird nach allen diesen gelesen, nicht statt ihrer: Sie wurde benannt, nicht gefunden, hat also die Nase vorn.eine echte Umgebungsvariable, die vor jeder Datei Gewicht hat
Die letzte ist diejenige, die erstaunt. eine in Ihrer Shell exportierte, also in einem env-Block eines Clients stehende oder in einer Compose-Datei festgenagelte Einstellung kann nicht durch Ändern einer Datei .env gewandelt werden — weder von Hand noch über setup. Der Wert wird eingetragen, die Datei ist richtig, und nichts passiert.
Die Konfigurationsoberfläche sagt Ihnen das, statt es lernen mal zu lassen: Sie zeigt ein Badge mit der Herkunft, und eine Einstellung, die eine Umgebungsvariable in den Händen hält, wird als solche markiert. Wenn etwas, das Sie gespeichert haben, ignoriert zu sein scheint, ist das Badge die Antwort.
In einem Container ist das kein Kantrn nicht.: compose.yaml nagelt den Transport, die Bind-Adresse, den Port und die erlaubten Hosts als echte Umgebungsvariablen fest, weil diese zum Container gehören, nicht zur Installation darin. Alles andere — der API-Schlüssel, das HTTP-Token, die Grenzen — bleibt dem Konfig-Volume überlassen, und das ist es, was die Konfigurationsoberfläche überhaupt macht.
Für die Richtlinien-Datei gilt dieselbe Reihenfolge, und wer ein umgebendes LXO_MCP_TOOL_POLICY und --tools-file benennen direkt eine. Die Oberfläche pinnend die Datei an, die sie beim Start gefunden hat, sodass die Seite Seiten – so lässt sich das Thema nicht unterzuschieben.
Dateien benennen
--env-file PATH benennt eine Einstellungsdatei statt sie zu suchen, und hat auch --tools-file zur Seite, sodass ein Eintrag eigener Kunde und eigene Berechtigungen:
"args": ["--env-file", "/path/to/test.env",
"--tools-file", "/path/to/test-tools.json"]Ein Pfad, der nicht existiert, wird abgewiesen, nicht einfach zurückgesen Stillschweigen fällt — außer unter setup, das unter anderem dazu da ist, einen Pfad zu schaffen.
setup legt diese Datei für Sie an.
Die Einstellungen
Variable | Bedeutung | Standard |
| Ihr Lexware-Office-API-Schlüssel. Erforderlich. | — |
| Datei für An/Aus pro Tool, siehe unten |
|
| Basis-URL der API |
|
| Basis der Web-App für Deeplinks |
|
| Wohin heruntergeladene Belege landen | Cache-Verzeichnis des Benutzers |
| HTTP-Timeout in Sekunden |
|
| Anfragen pro Sekunde, global über alle Endpunkte |
|
| Füllstand des Token-Eimers. Der Eimer des Kontos fasst 4 |
|
| Zeilen pro Seitenaufruf, die eine Suche anfordert und zurückgibt |
|
| Seiten einer PDF, die |
|
| Log-Level auf stderr |
|
|
|
|
| Gemeinsames Geheimnis, das jede HTTP-Anfrage tragen muss. Erforderlich für HTTP-Transport. | – |
| Adresse, an die ein HTTP-Transport binden vorgechen |
|
| Bindungslage |
|
| URL-Pfad, auf dem der Transport läuft |
|
| Zu akzeptierende | – |
| Beim Start ein Token erzeugen, falls keins gesetzt ist, und in die Einstellungsdatei schreiben | aus |
| Prozess beenden, wenn sich die Einstellungsdatei ändert, für etwas, das ihn neu startet | aus |
Jede Einstellung oben ist wirklich in Gebrauch. LXO_MCP_PAGE_SIZE ist bei 250 gedeckelt, der niedrigsten Seitengröße, die ein Endpunkt annimmt, und ein größerer Wert wird beim Start abgewiesen, statt später einen API-Fehler zu erzeugen.
Transport
stdio ist die Voreinstellung und das, was Claude Desktop und vergleichbare lokale Clients verwenden: Der Client startet den Server als sein eigener Subprozess, und nichts anderes kann mit ihm sprechen.
streamable-http und SSE bringen dieselben Tools auf einem Port, das für einen Container oder eine eigene Maschine:
uvx benethos-lexware-office-mcp --transport streamable-http --port 8770Zwei Dinge stehen vor diesem Port, und keins davon ist Optional ist. Ein Bearer-Token, das jeder Anfrage als Authorization: Bearer <token> tragen muss — ohne LXO_MCP_BEARER_TOKEN weigert der Server sich, ein HTTP-Transport zu starten, weil andernfalls jeder, der den Port erreichen könnte, Ihre-Lexware-Zugangsdaten verbrauchen. Und der Schutz des DNS-Rebind-Schutzes des SDK, der Host und Origin gegen eine Weißliste der Loopback-Namen führt und zusätzlich --allowed-hosts erweitert, wo Container oder Proxy einen anderen Namen davor schaltet.
Kein des beiden macht den Port nicht dürfen in ein Netzwerk veröffentlicht werden. Sie machen ihn überlebbar auf einer Maschine, die sie mit anderen Prozessen teilt. --host bindet an eine andere Adresse als der Loopback, was ein Container sein muss — siehe In einem Container, warum das nicht der lockere ist, für den es hält.
In einem Container
Das Abbild wird für linux/amd64 und linux/arm64 veröffentlicht, sodass man nichts von dieser Depot zu benötigen, um eines zu betreiben:
docker pull ghcr.io/benethos-hub/lexware-office-mcp:latestNehmen Sie es :0.2.0 statt :latest, was Sie eine Version fest.
Mit Compose
docker compose up -d # the server, on 127.0.0.1:8770
docker compose --profile setup up -d # add the configuration interfaceGeliefert, baut compose.yaml aus diesem Checkout. Zwei Kommentarzeilen in jedem der beiden Dienste stellen auf das veröffentlichte Image um, und dann ist diese Datei das Einzige, was Sie hierzuland brauchen.
Als einzelne Container
docker run -d --name lexware-office-mcp \
--restart unless-stopped \
-p 127.0.0.1:8770:8770 \
-v lxo-config:/config -v lxo-downloads:/downloads \
ghcr.io/benethos-hub/lexware-office-mcp:latestDas Token, das er sich erzeugt hat, liegt im Konfigrationsvolume, und daraus lesen Sie:
docker exec lexware-office-mcp cat /config/.envDie Konfigurationsoberfläche ist dasselbe Image mit dem anderen Befehl, gerichtet auf das die dasselbe Volume an:
docker run --rm -d --name lexware-office-mcp-setup \
-p 127.0.0.1:8771:8771 \
-v lxo-config:/config -v lxo-downloads:/downloads \
ghcr.io/benethos-hub/lexware-office-mcp:latest \
setup --no-browser --host 0.0.0.0 --port 8771 \
--env-file /config/.env --tools-file /config/tools.json--restart unless-stopped ist hier keine Dekoration. Der Container beendet seinen Prozess, wenn sich die Einstellungsdatei ändert, und genau das bringt eine gespeicherte Einstellung in einen laufenden Server. Ohne eine Neustart-Richtlinie endet er, und bleibt beendet.
In jedem Fall
Öffnen Sie http://127.0.0.1:8771/, geben den Schlüssel ein, haken die Tools an und stoppen die Oberfläche wieder — docker compose --profile setup down statt die docker stop lexware-office-mcp-setup. Es ist gedacht, nur für die Minuten zu laufen, die für nichts es bedeutet, denn es hat kein Login und einen API-Schlüssel.
Nichts muss vorbereitet werden. Beim ersten Start macht der Server ein Bearer-Token, schreibt es in das Konfig-Volume und gibt kund — die Oberfläche zeigt es, das ist der Wert, den ein Client braucht. Es ist nicht im Image eingebaut, wo jedes Exemplar es teilen würde.
Der Container bindet an 0.0.0.0, und das ist keine Lockerung. Ein Prozess im eigenen Loopback des Containers kann über einen veröffentlichten Port überhaupt nicht erreicht werden. Die Isolation ist der Network Namespace, und wer den Port erreichen darf, entscheidet die Veröffentlichung, die nur 127.0.0.1 zuordnet.
Eine im Browser gespeicherte Einstellung erreicht den laufenden Server. Einstellungen werden beim Start nur einmal gelesen; daher wird der Container angewiesen zu enden, wenn sich seine Einstellungsdatei ändert, und Compose startet ihn eine Sekunde später erneut. Was Compose als echte Umgebungsvariablen festlegt — den Transport, die Bind-Adresse, den Port, die erlaubten Hosts — gehört zum Container und kann nicht über das Volume geändert werden, siehe Konfiguration.
Beispiel-Prompts
Sobald der Server verbunden ist, sind Prompts wie diese die vorgesehene Verwendung:
"Welche Rechnungen sind noch offen, und welche davon sind überfällig?"
"Zeig mir alles, was wir dem Kunden Muster GmbH in diesem Quartal in Rechnung gestellt haben."
"Was enthält Rechnung RE-2024-0142, und wurde sie bezahlt?"
"Finde den Artikel mit der Nummer A-1007 und nenne mir seinen aktuellen Preis."
"Lade das PDF der letzten Gutschrift herunter, die wir ausgestellt haben."
"Gib mir einen Link, um Beleg X in Lexware Office zu öffnen."
Rate-Limits
Die Lexware-API erlaubt zwei Anfragen pro Sekunde, durchgesetzt mit einem Token-Bucket. Dieses Budget ist global — es deckt alle Endpunkte der API gleichzeitig ab, sodass das Lesen eines Kontakts und das Lesen einer Rechnung aus demselben Kontingent schöpfen.
Der Server spiegelt dies mit einem einzigen Token-Bucket, der von jeder Anfrage im Prozess gemeinsam genutzt wird und sich standardmäßig knapp unterhalb der dokumentierten Rate wieder auffüllt. Lexware weist darauf hin, dass eine exakte Durchsetzung des Limits ohne Puffer ohnehin tendenziell 429s erzeugt, sobald Netzwerk-Jitter die Ankunftszeiten verschiebt; daher lässt die Standardeinstellung Spielraum. Anfragen werden durch diesen Bucket serialisiert, statt parallel abgefeuert zu werden, was bedeutet, dass eine breite Frage, die viele Dokumente berührt, langsamer wird, anstatt blockiert zu werden.
Zwei Dinge, die Sie wissen sollten:
Das Budget gehört zu Ihrem Konto, nicht zu diesem Prozess. Eine zweite Instanz des Servers, eine andere Integration oder ein Skript, das Sie selbst ausführen, zehren alle von denselben zwei pro Sekunde.
Lexware warnt, dass ein Client, der nach einer 429 weiter draufloshämmert, dauerhaft blockiert bleiben kann. Der Server reduziert die Frequenz daher exponentiell und gibt nach einigen Versuchen auf, statt härter nachzulegen.
Der Bucket des Kontos wurde am 21.08.2026 gemessen und fasst vier: fünf gleichzeitig abgesetzte Anfragen kamen zu viert durch, eine wurde abgelehnt. Der Standardwert von 2 lässt die Hälfte davon für alles andere übrig, das auf dasselbe Konto zugreift — die Web-App, eine andere Integration, eine zweite Instanz dieses Servers. Erhöhen Sie ihn auf 4 nur, wenn Sie wissen, dass dieser Server der einzige Verbraucher ist.
Beide Limiter-Werte sind über LXO_MCP_RATE und LXO_MCP_BURST konfigurierbar, falls sich Ihr Konto anders verhält.
Entwicklung
uv sync --extra dev
uv run pytest -q
uv run ruff check .
uv run ruff format --check .
uv run mypyDie Testsuite ist vollständig offline. Sie mockt die HTTP-Schicht und benötigt keinen API-Schlüssel, läuft also überall. Zwei Arten von Tests verlassen den Prozess, ohne die Maschine zu verlassen: Drei starten den Server als echten Subprozess und sprechen über stdio MCP mit ihm, was zugleich beweist, dass auf dem Startpfad nichts nach stdout geschrieben wird; und die Konfigurationsschnittstelle wird über einen echten Loopback-HTTP-Server mit einem echten Cookie-Jar angesteuert, weil sich ihre CSRF-Schutzmechanismen nur so sinnvoll testen lassen, wie ein Browser ihnen begegnet.
Mit diesem Repository wird kein API-Schlüssel ausgeliefert, und in CI gehört keiner hin, sodass ein Checkout niemals von sich aus mit Lexware sprechen kann. Die Prüfung des Servers gegen die echte API ist daher immer ein bewusster lokaler Lauf mit einem von Ihnen bereitgestellten Schlüssel, getrennt von der obigen Suite und niemals Teil davon:
uv run python tests/smoke.py
uv run python tests/smoke.py --env-file path/to/.envEr liest Ihr Konto und schreibt nichts hinein. Der Server, den er baut, erhält das read-only-Preset, sodass die Schreibwerkzeuge überhaupt nicht aufgerufen werden können. Er gibt aus, was er geprüft hat, wofür das Konto nichts hergab und was fehlschlug, und er maskiert Datensatz-IDs, sodass der Bericht irgendwo eingefügt werden kann. pytest führt ihn nie aus. Siehe SPECS.md, Abschnitt 14.1, warum ein Live-Check kein Gate ist.
Beiträge und Issues sind willkommen, sobald das erste Release erschienen ist. Bis dahin ist SPECS.md der Ort, an dem Designentscheidungen festgehalten werden, einschließlich der offenen Fragen, die noch gegen die Live-API geklärt werden müssen.
Lizenz
MIT. Siehe LICENSE.
Marken und Zugehörigkeit
Dieses Projekt ist nicht mit Lexware, Haufe-Lexware GmbH & Co. KG oder einer ihrer Tochtergesellschaften verbunden, von ihnen unterstützt oder gesponsert. "Lexware" und "Lexware Office" sind Marken ihrer jeweiligen Inhaber und werden hier nur dazu verwendet, die API zu benennen, in die diese Software integriert wird, und zwar in beschreibendem Sinne.
Die Software kommuniziert ausschließlich mit der dokumentierten öffentlichen API und verwendet Anmeldedaten, die der Kontoinhaber bereitstellt und widerrufen kann. Die Nutzung dieser API unterliegt den eigenen Bedingungen von Lexware, die Sie unabhängig von diesem Projekt akzeptieren.
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
- FlicenseBqualityCmaintenanceMCP server for DACH accounting automation. Connect AI assistants to sevDesk and Lexoffice — create invoices, manage contacts, handle bookings and vouchers for German-speaking businesses.1537
- AlicenseBqualityAmaintenanceMCP server for the Lexware Office API that enables management of invoices, contacts, articles, vouchers, and more through the Model Context Protocol.661616Functional Source , Version 1.1, MIT Future
- AlicenseCqualityCmaintenanceEnables natural language interaction with the WeFact invoicing platform, allowing users to manage debtors, invoices, products, subscriptions, and perform various administrative tasks via MCP-compatible clients.181AGPL 3.0
- AlicenseBqualityCmaintenanceAn MCP server for Danish accounting via Billy.dk API, enabling natural-language control over invoices, bank lines, reports, and more, with a write-guard for safety.65MIT
Related MCP Connectors
Log, query, and edit expenses, budgets, and accounts in Ledgy from any MCP-compatible AI assistant.
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
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/benethos-hub/lexware-office-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server