odoo19-mcp-server
Odoo 19 MCP Server (JSON-2 API)
Odoo 19 MCP Server, Verbindung über JSON-2 API.
Dieses Projekt basiert auf dem Odoo 19 JSON-2 API vollständigen Leitfaden.

Tech-Stack
Python: 3.13
FastMCP: >=3.0.0,<4.0.0
odoo-client-lib: 2.0.1 (JSON-2 API)
Architektur
flowchart TB
subgraph Client["MCP Client"]
CC[Claude Code]
GC[Gemini CLI]
MI[MCP Inspector]
end
subgraph Server["MCP Server (FastMCP)"]
R[Resources<br/>odoo://models<br/>odoo://user<br/>odoo://company]
T[Tools<br/>search_records<br/>create_record<br/>update_record]
DI[Dependency Injection<br/>get_shared_client]
end
subgraph RPC["OdooJsonRpcClient"]
OL[odoolib<br/>json2/json2s protocol]
end
subgraph Odoo["Odoo Server"]
EP["/jsonrpc endpoint"]
end
Client -->|MCP Protocol<br/>stdio/http/sse| Server
R --> DI
T --> DI
DI --> RPC
RPC -->|HTTP/HTTPS| OdooMCP Kernkonzepte
Ressourcen vs. Tools
Eigenschaft | Ressourcen | Tools |
Zweck | Bereitstellung von Kontextinformationen | Ausführung von Operationen/Aktionen |
Auslösung | Client-gesteuert (z. B. Claude Code) | LLM entscheidet automatisch über den Aufruf |
Parameter | Keine (oder URI-Parameter) | Vorhanden (müssen vom LLM generiert werden) |
Analogie | Mitarbeiterhandbuch (Hintergrundwissen) | Werkzeugkasten (bei Bedarf verwenden) |
HTTP-Analogie | GET (Lesen) | POST/PUT/DELETE (Operation) |
Ressourcen - Dynamischer Kontext, Hintergrundinformationen, die das LLM von Anfang an kennt:
odoo://user → "我是誰"
odoo://company → "我在哪間公司"
odoo://models → "有哪些模型可用"Tools - Operationen, die nur bei Bedarf aufgerufen werden:
search_records(model="res.partner", domain=[...]) → 搜尋
create_record(model="sale.order", values={...}) → 建立Warum nicht Default Prompt verwenden?
Methode | Default Prompt | Ressource |
Datenquelle | Fest im Code hinterlegt | Echtzeit-Abfrage von Odoo |
Aktualisierungszeitpunkt | Bei der Bereitstellung | Bei jeder Verbindung |
Benutzerwechsel | Informationen falsch | Automatisch korrekt |
# ❌ Default Prompt(寫死)
SYSTEM_PROMPT = "當前用戶: Admin" # 換人登入就錯了
# ✅ Resource(動態)
@mcp.resource("odoo://user")
def get_current_user():
return client.read("res.users", [uid]) # 即時查詢Fazit: Ressourcen sind „dynamischer Kontext“, kein statischer Text.
Referenz: MCP Resources | MCP Tools
Umgebungsvariablen
Variable | Beschreibung | Standardwert |
| Odoo Server URL |
|
| Datenbankname | - |
| API-Key-Authentifizierung | - |
| Schreibgeschützter Modus (Schreibvorgänge deaktiviert) |
|
Erstellen Sie eine .env-Datei:
cp .env.example .envInstallation
pip install -r requirements.txtStartmethode
Entwicklungsmodus (MCP Inspector)
fastmcp dev inspector odoo_mcp_server.pyTransportmodus (Transport)
Dieses Projekt unterstützt drei MCP-Transportmodi:
Modus | Beschreibung | Anwendungsszenario |
| Standard-Ein-/Ausgabe (Standard) | Claude Desktop, Cursor IDE, lokale Entwicklung |
| HTTP-Protokoll | Remote-Dienste, n8n, Web-App-Integration |
| Server-Sent Events (veraltet) | Abwärtskompatibilität für ältere Clients |
stdio vs. HTTP/SSE: Wo liegt die Rechenleistung?
Der entscheidende Unterschied zwischen den beiden Modi liegt darin, „wer den MCP-Server startet“ und „wo die Rechenleistung ausgeführt wird“:
stdio-Modus (lokale Rechenleistung)
┌─────────────────────────────────────┐
│ 你的電腦 💻 │
│ │
│ Claude Desktop ──> MCP Server │
│ (使用本機算力) │
└─────────────────────────────────────┘Der Client (z. B. Claude Desktop) startet den MCP-Server als untergeordneten Prozess
Der MCP-Server nutzt die CPU/RAM Ihres Computers
Der Server startet/beendet sich zusammen mit dem Client
HTTP/SSE-Modus (Remote-Rechenleistung)
┌──────────────┐ ┌──────────────────┐
│ 你的電腦 │ │ 雲端 ☁️ │
│ │ │ │
│Claude Desktop│ ──網路──>│ MCP Server │
│ (輕量) │ │ (使用雲端算力) │
└──────────────┘ └──────────────────┘Der MCP-Server läuft unabhängig auf einem Cloud-/Remote-Host
Mehrere Clients können gleichzeitig mit demselben Server verbunden sein
Geeignet für Team-Sharing, n8n-Integration, Produktionsumgebungen
Starten der verschiedenen Modi
# stdio 模式(預設)
python odoo_mcp_server.py
# HTTP 模式
python odoo_mcp_server.py --transport http --host 0.0.0.0 --port 8000
# SSE 模式(已棄用,建議使用 HTTP)
python odoo_mcp_server.py --transport sse --host 0.0.0.0 --port 8000Cloud-Bereitstellung (HTTP-Modus)
Docker Compose Beispiel:
services:
odoo-mcp:
build: .
ports:
- "8000:8000"
environment:
- ODOO_URL=http://odoo:8069
- ODOO_DATABASE=odoo19
- ODOO_API_KEY=your_api_key_here
command: ["python", "odoo_mcp_server.py", "--transport", "http", "--host", "0.0.0.0", "--port", "8000"]
restart: unless-stoppedClient-Konfiguration (Claude) auf URL-Verbindung umstellen:
claude mcp add --transport http odoo-mcp https://your-cloud-server.com:8000/mcp{
"mcpServers": {
"odoo-mcp": {
"type": "http",
"url": "https://your-cloud-server.com:8000/mcp"
}
}
}MCP Ressourcen
URI | Beschreibung |
| Alle Modelle auflisten |
| Felddefinitionen des Modells abrufen |
| Einzelnen Datensatz abrufen |
| Informationen zum aktuell angemeldeten Benutzer |
| Informationen zum Unternehmen des aktuellen Benutzers |
MCP Tools
Tool | Beschreibung | Schreibgeschützt |
| Verfügbare Modelle auflisten/suchen | Ja |
| Felddefinitionen des Modells abrufen | Ja |
| Datensätze suchen | Ja |
| Datensätze zählen | Ja |
| Datensatz mit angegebener ID lesen | Ja |
| Datensatz erstellen | Nein |
| Datensatz aktualisieren | Nein |
| Datensatz löschen (erfordert Bestätigung) | Nein |
| Modellmethode ausführen | Abhängig |
Claude Code MCP Konfiguration
Die Konfigurationsdatei befindet sich unter ~/.claude.json:
Lokale Ausführung
claude mcp add odoo-mcp-server -- python odoo_mcp_server.py{
"mcpServers": {
"odoo-mcp-server": {
"command": "/bin/python",
"args": [
"odoo_mcp_server.py"
]
}
}
}Docker (host.docker.internal)
Geeignet, wenn Odoo lokal ausgeführt wird:
claude mcp add odoo-mcp-server -- docker run -i --rm --add-host=host.docker.internal:host-gateway -e ODOO_URL=http://host.docker.internal:8069 -e ODOO_DATABASE=odoo19 -e ODOO_API_KEY=your_api_key_here odoo-mcp-server{
"mcpServers": {
"odoo-mcp-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--add-host=host.docker.internal:host-gateway",
"-e",
"ODOO_URL=http://host.docker.internal:8069",
"-e",
"ODOO_DATABASE=odoo19",
"-e",
"ODOO_API_KEY=your_api_key_here",
"odoo-mcp-server"
]
}
}
}Docker (Host-Netzwerk)
Verwendung des Host-Netzwerkmodus:
claude mcp add odoo-mcp-server -- docker run -i --rm --network host -e ODOO_URL=http://localhost:8069 -e ODOO_DATABASE=odoo19 -e ODOO_API_KEY=your_api_key_here odoo-mcp-server{
"mcpServers": {
"odoo-mcp-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--network",
"host",
"-e",
"ODOO_URL=http://localhost:8069",
"-e",
"ODOO_DATABASE=odoo19",
"-e",
"ODOO_API_KEY=your_api_key_here",
"odoo-mcp-server"
]
}
}
}Docker (Remote Odoo)
claude mcp add odoo-mcp-server -- docker run -i --rm -e ODOO_URL=https://example.com/ -e ODOO_DATABASE=odoo19 -e ODOO_API_KEY=your_api_key_here odoo-mcp-server{
"mcpServers": {
"odoo-mcp-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"ODOO_URL=https://example.com/",
"-e",
"ODOO_DATABASE=odoo19",
"-e",
"ODOO_API_KEY=your_api_key_here",
"odoo-mcp-server"
]
}
}
}Docker Build
docker build -t odoo-mcp-server .Gemini MCP Konfiguration
gemini mcp add --scope user odoo-mcp docker -- run -i --rm --add-host=host.docker.internal:host-gateway -e ODOO_URL=http://host.docker.internal:8069 -e ODOO_DATABASE=odoo19 -e ODOO_API_KEY=your_api_key_here odoo-mcp-server{
"mcpServers": {
"odoo-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--add-host=host.docker.internal:host-gateway",
"-e",
"ODOO_URL=http://host.docker.internal:8069",
"-e",
"ODOO_DATABASE=odoo19",
"-e",
"ODOO_API_KEY=your_api_key_here",
"odoo-mcp-server"
]
}
}
}Sicherheitsmechanismen
Schreibgeschützter Modus
Setzen Sie READONLY_MODE=true, um den schreibgeschützten Modus zu aktivieren, geeignet für Abfragen in Produktionsumgebungen:
Schreib-Tools (
create_record,update_record,delete_record,execute_method) werden über FastMCP-Tags direkt ausgeblendet, das LLM sieht diese Tools nicht
Bestätigung beim Löschen
delete_record verfügt über einen integrierten Bestätigungsmechanismus. Das LLM muss zuerst mit confirm=False aufgerufen werden, um eine Bestätigungsaufforderung zu erhalten. Erst nach Zustimmung des Benutzers kann der Löschvorgang mit confirm=True ausgeführt werden.
Gesundheitsprüfung (Health Check)
Im HTTP/SSE-Transportmodus wird ein /health-Endpunkt bereitgestellt:
curl http://localhost:8000/health
# {"status": "healthy", "service": "odoo-mcp-server", "version": "1.0.0"}Geeignet für Docker-Healthchecks, Kubernetes-Probes und Load-Balancer-Prüfungen. Im stdio-Modus hat dies keine Auswirkungen.
Lizenz
Apache 2.0
Latest Blog Posts
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/twtrubiks/odoo19-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server