OpenXE MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OpenXE MCP ServerZeig mir alle offenen Aufträge"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
OpenXE MCP Server
Verbinde dein OpenXE ERP mit jedem KI-Assistenten -- per MCP (Model Context Protocol).
69 Tools | 19 Resources | 5 Berichte | 11 Dashboard-KPIs | Verifiziert gegen OpenXE v1.12
Was ist das?
Dieser Server verbindet dein OpenXE ERP-System mit lokalen KI-Assistenten wie LM Studio, Ollama, OpenWebUI und anderen MCP-faehigen Clients. Du stellst Fragen auf Deutsch, und der Assistent liest und schreibt automatisch in deinem ERP -- alles lokal, keine Cloud noetig.
Beispiele:
"Zeig mir alle offenen Auftraege"
"Erstelle einen neuen Kunden: Firma Muster GmbH, Musterstr. 1, 12345 Berlin"
"Wie hoch ist der Umsatz diesen Monat?"
"Welche Rechnungen sind ueberfaellig?"
"Erstelle eine Bestellung bei Lieferant Mueller fuer 100 Schrauben"
Related MCP server: odoo-mcp
Voraussetzungen
Node.js Version 20 oder neuer (Download)
OpenXE mit aktiviertem API-Zugang
Ein KI-Assistent der MCP unterstuetzt (LM Studio, OpenWebUI, Ollama, etc.)
Einrichtung
Schritt 1: API-Benutzer in OpenXE anlegen
Melde dich als Admin in OpenXE an
Gehe zu Administration > Einstellungen > Benutzer
Erstelle einen neuen Benutzer (oder verwende einen bestehenden)
Setze unter API > REST-API ein Passwort
Merke dir Benutzername und Passwort
Schritt 2: MCP-Server in deinem KI-Assistenten einrichten
Der Server wird automatisch heruntergeladen und gestartet -- du musst nichts installieren. Du brauchst nur drei Angaben:
Angabe | Beispiel | Beschreibung |
|
| Die Adresse deines OpenXE-Servers |
|
| Der API-Benutzername aus Schritt 1 |
|
| Das API-Passwort aus Schritt 1 |
LM Studio
Ab Version 0.3+. Oeffne Settings > MCP und fuege folgendes ein:
Minimale Konfiguration (LAN-Betrieb, schneller Einstieg):
{
"openxe": {
"command": "npx",
"args": ["-y", "github:Avatarsia/openxe-mcp-server"],
"env": {
"OPENXE_URL": "http://192.168.0.100",
"OPENXE_USERNAME": "api-user",
"OPENXE_PASSWORD": "mein-passwort",
"OPENXE_ALLOW_HTTP": "1"
}
}
}Vollstaendige Konfiguration (mit allen Optionen):
{
"openxe": {
"command": "npx",
"args": ["-y", "github:Avatarsia/openxe-mcp-server"],
"env": {
"OPENXE_URL": "http://192.168.0.100",
"OPENXE_USERNAME": "api-user",
"OPENXE_PASSWORD": "mein-passwort",
"OPENXE_ALLOW_HTTP": "1",
"OPENXE_MODE": "router",
"OPENXE_TIMEOUT": "30000",
"OPENXE_AUDIT_LOG": "1"
}
}
}Was bedeuten die einzelnen Einstellungen?
Variable | Wert im Beispiel | Was macht das? |
|
| Die IP-Adresse oder URL deines OpenXE-Servers im Netzwerk. |
|
| Der Benutzername, den du in OpenXE unter API angelegt hast. |
|
| Das dazugehoerige Passwort. |
|
| Unterdrueckt die Sicherheitswarnung bei HTTP-Verbindungen. Im lokalen Netzwerk (LAN) ist HTTP in Ordnung -- die Warnung ist fuer Internetverbindungen gedacht, wo HTTPS Pflicht waere. |
|
| Steuert, wie viele Tools das LLM sieht. |
|
| Wie lange der Server maximal auf eine Antwort von OpenXE wartet (in Millisekunden). 30000 = 30 Sekunden. Bei langsamen Servern oder grossen Abfragen auf 60000 erhoehen. |
|
| Protokolliert jeden einzelnen Tool-Aufruf (welches Tool, welche Parameter, wann). Nuetzlich zum Nachvollziehen, was das LLM gemacht hat. Sensible Daten (IBAN, PayPal, Passwoerter) werden dabei automatisch maskiert. Das Protokoll erscheint in der Konsole (stderr). |
Tipp fuer lokale Modelle: Verwende den
router-Modus (Standard). Er reduziert den Token-Verbrauch von ~10.000 auf ~1.500 Tokens fuer die Tool-Definitionen -- das laesst mehr Platz fuer deine eigentliche Frage und die Antwort.
Alternative: Lokaler Build mit .env-Datei
Wenn du das Repo selbst geklont und lokal gebaut hast (npm install && npm run build), kannst du die Credentials in einer .env-Datei im Projektverzeichnis pflegen, statt sie inline in der MCP-Client-Konfiguration zu hinterlegen. Der Eintrag sieht dann so aus:
{
"openxe": {
"command": "node",
"args": [
"<ABSOLUTER-PFAD>/openxe-mcp-server/dist/index.js"
],
"cwd": "<ABSOLUTER-PFAD>/openxe-mcp-server"
}
}Wichtig:
Kein
env-Block in der MCP-Client-Konfiguration — sonst ueberschreiben die inline-Werte die Eintraege aus der.env.cwdzwingend setzen, und zwar auf das Projektverzeichnis (openxe-mcp-server).dotenvlaedt die.envaus dem aktuellen Arbeitsverzeichnis des Prozesses, nicht aus dem Verzeichnis, in demindex.jsliegt. Ohnecwdstartet der MCP-Client den Node-Prozess aus seinem eigenen Installationsordner, und die.envwird nicht gefunden.Kein
npx, sondernnode—npx -y github:...wuerde jedes Mal das GitHub-Package in einen Cache-Ordner ziehen und deinen lokalen Build ignorieren.Nach Code-Aenderungen
npm run buildnicht vergessen — gestartet wirddist/index.js, nicht die TypeScript-Quellen.
OpenWebUI + Ollama
Ab OpenWebUI 0.6+. Unter Admin > Tools > MCP Servers eintragen:
Command:
npxArgs:
-y github:Avatarsia/openxe-mcp-serverUmgebungsvariablen:
OPENXE_URL,OPENXE_USERNAME,OPENXE_PASSWORD
Andere MCP-Clients
Jeder Client mit stdio-Transport funktioniert:
OPENXE_URL=http://dein-openxe-server \
OPENXE_USERNAME=dein-api-user \
OPENXE_PASSWORD=dein-api-passwort \
npx -y github:Avatarsia/openxe-mcp-serverSchritt 3: Testen
Starte deinen KI-Assistenten und frage: "Zeig mir alle Artikel". Wenn Daten kommen, funktioniert alles.
Funktionen
Was kann der Server?
Bereich | Lesen | Schreiben | Berichte |
Kunden & Lieferanten | Auflisten, Suchen, Details | Anlegen, Bearbeiten (60+ Felder inkl. Bank, PayPal, SEPA, Dokumentversand) | -- |
Artikel | Auflisten, Details, Preise, Lagerbestand | -- | Lagerwert, Nachbestellbedarf |
Auftraege | Auflisten, Details, Positionen | Anlegen, Bearbeiten, Freigeben | Auftragseingang |
Rechnungen | Auflisten, Details, Positionen | Anlegen, Bearbeiten, Freigeben, Bezahlt markieren | Umsatz, Offene Posten, Altersstruktur |
Angebote | Auflisten, Details | Anlegen, Bearbeiten, In Auftrag wandeln | -- |
Lieferscheine | Auflisten, Details | Anlegen, Bearbeiten | -- |
Gutschriften | Auflisten, Details | Anlegen, Bearbeiten | -- |
Bestellungen (Einkauf) | Auflisten, Details, Positionen | Anlegen, Bearbeiten, Freigeben | Einkaufsvolumen je Lieferant |
Einkaufspreise | Staffelpreise je Lieferant | -- | -- |
Abonnements | Auflisten, Details | Anlegen, Bearbeiten, Loeschen | -- |
CRM | -- | Notizen, Telefonate, E-Mails erfassen | -- |
Zeiterfassung | Status, Wochenuebersicht, Eintraege | Ein-/Ausstempeln, Eintraege CRUD | -- |
Tracking | -- | Sendungsnummern anlegen | -- |
Dateien | Auflisten | Hochladen (base64) | -- |
Dashboard | 11 KPIs (Umsatz, Auftraege, Kunden, Lager, Einkauf) | -- | -- |
Berichte | 5 Reports (Umsatz, Offene Posten, Lager, Beschaffung, Periodenvergleich) | -- | -- |
Einzeln oder bis zu 20 auf einmal | -- | -- |
Smart Filters
Alle Listen-Abfragen unterstuetzen clientseitige Filter:
where:
{plz: {startsWith: "2"}},{gesamtsumme: {gt: 100}},{land: {equals: "DE"}},{"positionen.nummer": {containsAny: ["ART-001", "ART-002"]}}where-Operatoren (neu):
in(Feld matcht einen Wert aus Liste),containsAny(Array-Feld enthaelt mindestens einen Wert),containsAll(Array-Feld enthaelt alle Werte). Alle drei vergleichen case-insensitive.Dot-Notation: Feldnamen wie
positionen.nummeriterieren ueber verschachtelte Array-Felder eines Belegs. Eine einzelne Bedingung matcht "mindestens ein Element". Mehrere Bedingungen mit gleichem Array-Prefix (z.B.positionen.nummer+positionen.menge) werden automatisch elementweise gepaart — der Beleg matcht nur, wenn dasselbe Array-Element alle Bedingungen erfuellt.sort/limit: Ergebnisse sortieren und begrenzen
zeitraum:
dieser-monat,letzter-monat,letzte-30-tage,Q1-2026,2025status_preset — entity-spezifisch, unbekannte/nicht unterstützte Werte werden vom Handler als Fehler abgewiesen:
list-quotes:offen|angenommen|abgelehntlist-orders:offen|entwurflist-invoices:offen|unbezahlt|bezahlt|ueberfaellig|entwurf|mahnkandidatenlist-delivery-notes,list-credit-memos: wird nicht unterstütztlist-purchase-orders:offen|freigegeben|bestellt|angemahnt|empfangen|aktivFür business-query-Presets (
offene-rechnungen,nicht-versendet,ueberfaellige-rechnungen,ueberfaellige-lieferungenusw.) das separate Toolopenxe-business-querybzw. die actionbusiness-querynutzen.
aggregate:
count,sum_feld,avg_feld,groupBy_feldformat:
table,csv,ids,csv-positions(bei Belegen: eine CSV-Zeile pro Belegposition statt pro Beleg, mit Beleg-Header-Feldern als Prefix und Positions-Feldern dahinter; bei Filter aufpositionen.*werden nur die passenden Positionen exportiert).
Beispiel (router-Modus): Rechnungen finden, die Artikel ART-001 oder ART-002 enthalten, und nur die passenden Positionen als CSV exportieren:
{
"action": "list-invoices",
"params": {
"zeitraum": "2025",
"where": {
"positionen.nummer": {"containsAny": ["ART-001", "ART-002"]}
},
"format": "csv-positions"
}
}Im full-Modus wird derselbe Aufruf direkt als Tool openxe-list-invoices mit dem inneren params-Objekt als Argumenten verwendet.
Berichte
Bericht | Beschreibung |
Umsatzbericht | Nach Kunde, Artikel, Monat, Quartal, Jahr oder Projekt -- mit optionaler Margenberechnung |
Offene Posten | Liste, Altersstruktur (0-30/31-60/61-90/90+ Tage), Kreditlimit-Auslastung |
Lagerbestand | Uebersicht, Nachbestellbedarf, Lagerwert (VK) |
Beschaffung | Einkaufsvolumen je Lieferant, offene Bestellungen mit Ueberfaellig-Warnung |
Periodenvergleich | Aktuell vs. Vorperiode (Monat/Quartal/Jahr) fuer Umsatz, Auftraege, Neukunden, Rechnungen |
Konfiguration
Pflicht-Variablen
Variable | Beschreibung |
| Basis-URL deiner OpenXE-Instanz (z.B. |
| API-Benutzername |
| API-Passwort |
Optionale Variablen
Variable | Default | Beschreibung |
| auto | API-Pfad (Standard: automatische Erkennung, siehe unten) |
|
| Request-Timeout in Millisekunden |
|
|
|
| - | Auf |
| - | Auf |
Automatische API-Pfad-Erkennung
Wenn OPENXE_API_PATH nicht gesetzt ist, erkennt der Server den API-Pfad beim Start automatisch. Geprueft werden der Reihe nach: /api/index.php (DocumentRoot = www/), /www/api/index.php (DocumentRoot = OpenXE-Repo-Root gemaess offizieller INSTALL.md) und /api (Rewrite-Rule-Setups). Als Treffer gilt HTTP 401 mit Digest-Challenge oder HTTP 200 mit JSON-Antwort auf GET <kandidat>/v1/adressen?limit=1.
Eager + lazy: Erkennung laeuft beim Start (Fehler wird nur auf stderr geloggt, der Server startet trotzdem) und bei der ersten Anfrage erneut, wenn der Start-Probe fehlschlug.
Self-healing: Liefert ein Endpunkt spaeter einen Apache-HTML-Fehler (403/404), erkennt der Server den Pfad einmalig neu und wiederholt die Anfrage genau einmal.
Manuell ueberschreiben:
OPENXE_API_PATH=/api/index.phpdeaktiviert Erkennung und Self-healing vollstaendig. Leerer Wert gilt als nicht gesetzt.
Sicherheits-Variablen (nur fuer Netzwerk-Betrieb mit --http)
Variable | Default | Beschreibung |
| - | Bearer-Token fuer HTTP-Zugriff |
|
| Bind-Adresse ( |
| - | Erlaubte Origins (kommagetrennt, DNS-Rebinding-Schutz) |
Haeufige Probleme
Der KI-Assistent findet keine Daten
Pruefe die Server-Konsole (stderr): bei erfolgreichem Start erscheint
[openxe-mcp] OpenXE API path detected: .... Schlaegt die Erkennung fehl, listet die Meldung alle getesteten Pfade samt HTTP-Status aufPruefe ob die OpenXE-URL erreichbar ist:
curl http://dein-openxe-server/(sollte einen Redirect auf die Login-Seite liefern)Pruefe ob Benutzername und Passwort stimmen
Pruefe ob die Umgebungsvariablen korrekt gesetzt sind
HTTP 403 / HTML-Fehlerseite statt API-Antwort
Apache blockt den angefragten Pfad, bevor er OpenXE erreicht (z.B. nach Server-Umzug oder geaendertem DocumentRoot)
Wenn
OPENXE_API_PATHgesetzt ist: Eintrag entfernen, damit die automatische Erkennung den korrekten Pfad findetOhne
OPENXE_API_PATHheilt sich der Server bei Pfad-Aenderungen selbst (einmalige Neu-Erkennung + Wiederholung der Anfrage)
Authentifizierung schlaegt fehl
OpenXE nutzt HTTP Digest Auth -- der Benutzer braucht ein Passwort unter API > REST-API
Sonderzeichen im Passwort koennen Probleme mit Umgebungsvariablen verursachen
Timeout bei grossen Abfragen
Erhoehe
OPENXE_TIMEOUT(z.B. auf60000fuer 60 Sekunden)Verwende spezifischere Abfragen statt "zeig mir alles"
Leere Ergebnisse bei Bestellungen
Bestellungen (Einkauf) sind nicht ueber die REST v1 API verfuegbar -- der MCP-Server nutzt automatisch die Legacy API als Fallback
Wenn trotzdem leer: pruefe ob Bestellungen in OpenXE existieren
Sicherheit
Lokaler Betrieb (Standard)
Im Normalfall laeuft der Server als Subprocess deines KI-Assistenten (stdio-Transport). Dabei werden keine Netzwerkports geoeffnet -- die Kommunikation laeuft ueber Pipes. Fuer den Betrieb im lokalen Netzwerk sind keine zusaetzlichen Einstellungen noetig.
Read-Only Modus
Wenn du nur Daten lesen moechtest (kein Erstellen/Bearbeiten/Loeschen):
OPENXE_MODE=readonlyNetzwerk-Betrieb (--http)
Nur wenn du den Server als eigenstaendigen Netzwerkdienst betreiben willst:
MCP_AUTH_TOKEN=dein-token npx -y github:Avatarsia/openxe-mcp-server -- --httpBindet standardmaessig nur auf
127.0.0.1(nicht von aussen erreichbar)Mit
MCP_HTTP_HOST=0.0.0.0von aussen erreichbar -- nur hinter einem Reverse-Proxy mit HTTPS verwenden!
Tool Annotations
Alle Tools tragen MCP-Annotations (readOnlyHint, destructiveHint, idempotentHint). Dein KI-Client kann damit automatisch vor kritischen Aktionen warnen.
Fuer Entwickler
Konfiguration via .env-Datei
Der Server unterstuetzt eine .env-Datei im Projektverzeichnis. Kopiere .env.example und passe die Werte an:
cp .env.example .envDie .env-Datei wird nicht nach Git committed (steht in .gitignore). Umgebungsvariablen die direkt gesetzt werden (z.B. ueber die MCP-Client-Konfiguration) haben Vorrang vor .env.
Projektstruktur
src/
index.ts # MCP-Server Einstiegspunkt (laedt dotenv)
config.ts # Umgebungsvariablen (Zod-validiert)
client/ # HTTP Digest Auth Client fuer OpenXE
tools/ # Tool Handler (Schreiben via Legacy API)
report-tools.ts # 5 Berichts-Tools
procurement-tools.ts # Beschaffung (Bestellungen)
document-tools.ts # Belege CRUD + Konvertierung
address-tools.ts # Adressen mit Feld-Normalisierung
...
resources/ # Resource Handler (Lesen via REST v1)
schemas/ # Zod-Schemas fuer Eingabe-Validierung
utils/ # Smart Filters, Pagination, Aggregation
tests/ # 548 Unit-Tests (Vitest)
docs/
api-reference/ # Verifizierte OpenXE API-Dokumentation
llm/ # LLM-optimierte Kurzreferenz
superpowers/ # Design-Specs und ImplementierungsplaeneLokal entwickeln
git clone https://github.com/Avatarsia/openxe-mcp-server.git
cd openxe-mcp-server
npm install
cp .env.example .env # Dann Werte anpassen
npm run build
npm test
npm startDer Server laedt automatisch eine .env-Datei aus dem Projektverzeichnis (via dotenv). Alternativ koennen die Variablen weiterhin direkt als Umgebungsvariablen oder ueber die MCP-Client-Konfiguration gesetzt werden — .env hat die niedrigste Prioritaet.
API-Dokumentation
Verifizierte Dokumentation im Verzeichnis docs/api-reference/:
AUTH.md -- HTTP Digest Authentifizierung, 96 Permissions
LEGACY-API.md -- 120+ Legacy API Endpoints (Schreiben)
REST-V1-STAMMDATEN.md -- Artikel, Adressen, Kategorien, etc.
REST-V1-BELEGE.md -- Auftraege, Rechnungen, Lieferscheine, etc.
REST-V1-SONSTIGE.md -- Abos, CRM, Tracking, Dateien, etc.
SPEZIAL-APIS.md -- Shop-Import, OpenTRANS, Mobile API
Bekannte Einschraenkungen
Problem | Ursache | Workaround |
| Server-Bug in OpenXE v1.12 | Edit-Tools angelegt, funktionieren auf neueren Versionen |
Lieferadressen REST v1 komplett 500 | PHP 8.x Signatur-Bug (#249) | Legacy-API-Fallback fuer Create/Edit |
Bestellungen nicht via REST v1 | Kein Endpoint registriert | Automatischer Legacy-API-Fallback |
Einkaufspreise nicht via REST v1 | Include nicht registriert (#252) | Legacy ArtikelGet als Fallback |
Gruppen nicht via API nutzbar | REST v1 404, Legacy XML-Bug | Issue geplant |
Mobile Dashboard API (16 KPIs) | Permission fehlt in UI (#254) | Eigene Dashboard-KPIs als Ersatz |
Report-Templates nicht via API erstellbar | Kein POST /v1/reports Endpoint (#254) | JSON-Template lokal generieren, in UI importieren |
Protokoll fehlt bei API-Weiterfuehren | -- | |
Datei-Upload ignoriert stichwoerter | -- | |
Tracking in falscher Tabelle | -- |
Lizenz
MIT -- siehe LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Latest Blog Posts
- 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/Avatarsia/openxe-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server