Odoo 19 MCP Server (JSON-2 API)
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
**支援的 MCP Client**
* Youtube Tutorial - MCP Server 自己做!Odoo 19 + FastMCP 完整開發教學
Odoo 19 MCP Server,使用 JSON-2 API 連線。
**✨ 支援多 user**:設定 MCP_MULTIUSER=true 後,每個 client 以**自己的 Odoo API key** 認證,權限、操作歸屬、審計紀錄都對應真實 user,不再全部掛在同一個服務帳號上,詳見多 user 模式。
本專案基於 Odoo 19 JSON-2 API 完整使用指南 開發。
技術棧
- **Python**: 3.13
- **FastMCP**: >=4.1.0, odoo://models odoo://user odoo://company]
T[Tools search_records create_record update_record]
DI[Dependency Injection get_caller_client]
end
subgraph RPC["OdooJsonRpcClient"]
OL[odoolib json2/json2s protocol]
end
subgraph Odoo["Odoo Server"]
EP["/jsonrpc endpoint"]
end
Client -->|MCP Protocol stdio/http/sse| Server
R --> DI
T --> DI
DI --> RPC
RPC -->|HTTP/HTTPS| Odoo
odoo://user → "我是誰"
odoo://company → "我在哪間公司"
odoo://models → "有哪些模型可用"
search_records(model="res.partner", domain=[...]) → 搜尋
create_record(model="sale.order", values={...}) → 建立
python
❌ Default Prompt(寫死)
SYSTEM_PROMPT = "當前用戶: Admin" # 換人登入就錯了
✅ Resource(動態)
@mcp.resource("odoo://user")
def get_current_user():
return client.read("res.users", [uid]) # 即時查詢
bash
cp .env.example .env
bash
pip install -r requirements.txt
bash
fastmcp dev inspector odoo_mcp_server.py
┌─────────────────────────────────────┐
│ 你的電腦 💻 │
│ │
│ Claude Desktop ──> MCP Server │
│ (使用本機算力) │
└─────────────────────────────────────┘
┌──────────────┐ ┌──────────────────┐
│ 你的電腦 │ │ 雲端 ☁️ │
│ │ │ │
│Claude Desktop│ ──網路──>│ MCP Server │
│ (輕量) │ │ (使用雲端算力) │
└──────────────┘ └──────────────────┘
bash
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 8000
bash
cp .env.example .env # 填入 ODOO_URL / ODOO_DATABASE / ODOO_API_KEY
cp docker-compose.example.yml docker-compose.yml # 依需求調整
docker compose up -d
yaml
volumes:
shared-uploads:
services:
odoo-mcp:
build: .
command: ["python", "odoo_mcp_server.py", "--transport", "http", "--host", "0.0.0.0", "--port", "8000"]
# 對外暴露 port 8000(host 端 client 可直接連 http://localhost:8000/mcp)。
# ⚠️ "8000:8000" 會綁定 0.0.0.0:同網段的所有機器都連得到
# (主機若有公網 IP,就是整個網際網路),且 Docker 發佈的 port 會繞過 ufw 防火牆規則。
# 建議設定 MCP_AUTH_TOKEN(見 environment);只給本機 client 用可改 "127.0.0.1:8000:8000"。
# 若只需 Docker 內網存取(例如 client 也在同一個 compose 裡),可整段移除 ports。
ports:
- "8000:8000"
environment:
- ODOO_URL=${ODOO_URL}
- ODOO_DATABASE=${ODOO_DATABASE}
- ODOO_API_KEY=${ODOO_API_KEY}
- READONLY_MODE=${READONLY_MODE:-false}
# HTTP 模式的 Bearer Token 認證(未設定=無認證,見 README「安全機制」)
- MCP_AUTH_TOKEN=${MCP_AUTH_TOKEN:-}
# 多 user 模式:每個 client 拿自己的 Odoo API key 當 Bearer token,
# 權限/審計歸屬真實 user(見「多 user 模式」)
# - MCP_MULTIUSER=true
# HTTP 模式的 Host 標頭防護(DNS rebinding protection,來自底層 MCP SDK):
# 用非 localhost 的 IP/網域連進來時,預設會被擋下並回 "Invalid host header"。
# ⚠️ 快速測試可先全開(勿用於正式環境):
- FASTMCP_HTTP_ALLOWED_HOSTS=["*"]
volumes:
- shared-uploads:/shared # 圖片傳遞通道;對應 Dockerfile 預建的 /shared/uploads
restart: unless-stopped
bash
> # 快速測試(⚠️ 對任何 Host 開放,勿用於正式環境)
> FASTMCP_HTTP_ALLOWED_HOSTS=["*"]
>
> # ✅ 正規做法:只列出 client 實際連線的 host(含 port)
> FASTMCP_HTTP_ALLOWED_HOSTS=["your-server-ip:8000"] # 純 IP 部署
> FASTMCP_HTTP_ALLOWED_HOSTS=["mcp.example.com"] # 反向代理/網域(建議搭配 TLS)
> sh
server 有設 MCP_AUTH_TOKEN 時,需帶 Authorization header
claude mcp add --transport http odoo-mcp https://your-cloud-server.com:8000/mcp --header "Authorization: Bearer your_random_token_here"
多 user 模式(MCP_MULTIUSER=true):Bearer 改填「自己的 Odoo API key」
claude mcp add --transport http odoo-mcp https://your-cloud-server.com:8000/mcp --header "Authorization: Bearer "