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
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that enables AI assistants to interact with Odoo ERP apps like Inventory, CRM, Sales, and Manufacturing. It allows users to read, create, and manage Odoo records and workflows using natural language commands.Last updated25291ISC
- Alicense-qualityCmaintenanceAn MCP server that connects AI assistants to Odoo ERP instances via the built-in XML-RPC API without requiring any additional addons. It enables users to search, create, update, and manage Odoo records and models through natural language.Last updated30MIT
- Alicense-qualityCmaintenanceAn MCP server that enables AI assistants to interact with Odoo ERP, allowing natural language queries, record creation, updates, and deletions.Last updatedLGPL 3.0
- Alicense-qualityAmaintenanceAn MCP server that enables AI assistants to interact with Odoo ERP systems, allowing natural language access to business data, CRUD operations, and instance management without requiring Odoo module installation.Last updated1MIT
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Connect e-commerce and marketing data to AI assistants via MCP.
Hosted MCP server exposing US hospital procedure cost data to AI assistants
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/Avatarsia/openxe-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server