
Odoo Mcp Gateway
io.github.parth-unjiya由 GitHub 帳號 parth-unjiya 發布v0.1.1更新於 Oct 24, 2026
Security-first MCP gateway for Odoo 17/18/19 — YAML-driven security, 27 tools
概覽
本機 MCP 閘道,讓助理登入 Odoo 17/18/19 ERP,並在多層安全規則下查詢、建立、更新或刪除記錄。
- 可以做什麼
- 使用 API 金鑰、密碼或現有工作階段登入 Odoo,列出可存取的模型及其欄位中繼資料並支援篩選。依網域條件、排序與時間分組搜尋、讀取、計數及彙總記錄。建立、更新與刪除記錄,支援 dry-run 驗證,並可預覽 Odoo 預設值與 onchange 副作用。呼叫允許的模型方法,並在寫入前查詢必填欄位或可用工作流程動作。使用內建的 HR、銷售、專案與客服外掛工具,例如出勤、請假、報價、任務與工單。
- 適用情境
- 適合讓助理直接操作 Odoo ERP 實例——探索模型、查詢業務資料或建立與更新記錄——同時透過 YAML 規則、RBAC、速率限制與稽核記錄限制存取。適用於標準或自訂 Odoo 模組,無需撰寫 Odoo 端外掛。
- 執行需求
- 以 pip 安裝的 Python 套件形式在本機執行,透過模組啟動。需要可連線的 Odoo 17、18 或 19 伺服器,以及 ODOO_URL 與 ODOO_DB 環境變數;Odoo 憑證透過 login 工具提供。可選的 YAML 設定檔用於限制、模型存取與 RBAC。需要能連線至 Odoo 實例的網路。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Odoo Mcp Gateway,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
odoo-mcp-gateway
Security-first, version-agnostic MCP gateway for Odoo 17/18/19. Works with stock and custom modules via YAML configuration. Zero Odoo-side code required.
[Python 3.10+] [License: MIT] [Odoo] [Tests] [Coverage]
30-Second Quick Start
Add to Claude Desktop config (claude_desktop_config.json):
Restart Claude Desktop. In any conversation:
You're connected. Ask Claude to query, create, or update Odoo records — every call is rate-limited, audit-logged, and runs through two layers of security checks before reaching Odoo.
No Odoo addon required. No Python code to write. Just YAML config for fine-grained access control (optional — secure defaults work out of the box).
What's New in v0.2.1
- Brute-force protection — per-username (5/5min) + per-source (30/15min) lockout
dry_runmode oncreate_record,update_record,delete_record,execute_method— validate without executing- 2 new tools:
get_defaults(preview Odoo defaults),get_onchange(preview field side effects) - Temporal grouping in
read_group:create_date:month,date:quarter, etc. - Hardened blocklists: 32 always-blocked models (was 17), 29 always-blocked methods (was 18), 10 always-blocked write fields, 8 always read-only models
- Server-side admin verification via
has_group('base.group_system')(was trusted from auth response) - Credential wrapper prevents password leakage via
repr()/traceback - JSON-RPC retry only fires on
OdooSessionExpiredError(was retrying on every auth error)
See CHANGELOG.md for the full list of 21 security fixes.
Why This Exists
Existing Odoo MCP servers share common problems: hardcoded model lists that miss custom modules, security as an afterthought, mandatory custom Odoo addons, and single-version targets. This gateway solves all of them:
- Two-layer security — MCP restrictions (YAML) + Odoo's built-in ACLs (ir.model.access + ir.rule)
- YAML-driven configuration — model restrictions, RBAC, field-level access, rate limiting, audit logging
- Custom module support — auto-discovers models via
ir.model, add YAML config and it works - Version-agnostic — Odoo 17, 18, 19 with version-specific adapters
- Zero Odoo-side code —
pip install+ YAML config = done. No custom addon required - Full MCP primitives — 31 Tools + 6 Resources + 12 Prompts (most servers only implement Tools)
- Plugin architecture — extend with pip-installable domain packs via entry_points
Architecture
Security Pipeline
Every tool and resource call passes through this pipeline:
Hardcoded safety guardrails that cannot be overridden by YAML:
- 32 always-blocked models — system internals, auth/TOTP, payment tokens, attachments, mail.mail, base.automation, and more
- 8 always read-only models — mail.message, mail.followers, mail.activity, discuss.channel, mail.notification, mail.compose.message, mail.alias, discuss.channel.member (reads OK, writes blocked for everyone)
- 10 always-blocked write fields — password, password_crypt, groups_id, totp_secret, signup_token/type/expiration, api_key, share, active
- 29 always-blocked methods — sudo, with_user/env/context, _sql, _write, _create, name_create, load, import_data, export_data, and more
- 28 ORM methods blocked in execute_method (prevents bypassing field-level checks)
- Per-username brute-force lockout — 5 failures → 5 minute lockout (fixed duration, cannot be extended)
- Per-source brute-force lockout — 30 failures / 15 min, prevents username-rotation attacks
- Credential wrapper class — passwords stored with leak-safe
__repr__/__str__, cleared on close - Server-side admin verification —
has_group('base.group_system')overrides auth-responseis_admin
Quick Start
Claude Desktop Configuration
Add to claude_desktop_config.json:
Claude Code Configuration
Environment Variables
Security
Two-Layer Security Model
- MCP gateway restrictions (YAML config + hardcoded guardrails) — blocks sensitive models, dangerous methods, privileged fields before any Odoo call is made
- Odoo's built-in ACLs — enforces per-user access on actual records via
ir.model.accessandir.rule
Model Restriction Tiers
Hardcoded Safety Guardrails
These cannot be overridden by YAML configuration:
Blocked models (32): ir.config_parameter, res.users, res.users.apikeys, res.users.log, ir.cron, ir.module.module, ir.model.access, ir.rule, ir.mail_server, ir.ui.view, ir.actions.server, ir.logging, ir.attachment, ir.exports, ir.exports.line, iap.account, auth.totp.wizard, auth.totp.device, payment.token, payment.provider, base.automation, digest.digest, res.config.settings, change.password.wizard, change.password.user, base.module.update, base.module.upgrade, base.module.uninstall, fetchmail.server, bus.bus, mail.mail, mail.template
Read-only models (8): mail.message, mail.followers, mail.activity, discuss.channel, mail.notification, mail.compose.message, mail.alias, discuss.channel.member (reads allowed, writes blocked for everyone)
Blocked write fields (10): password, password_crypt, groups_id, totp_secret, signup_token, signup_type, signup_expiration, api_key, share, active
Blocked methods (29): sudo, with_user, with_company, with_context, with_env, with_prefetch, _auto_init, _sql, _register_hook, _write, _create, _read, _setup_base, _setup_fields, _setup_complete, init, _table_query, _read_group_raw, name_create, load, import_data, export_data, flush_recordset, invalidate_recordset, _search_panel_select_range, _search_panel_select_multi_range, _search_panel_domain_image, _search, _read_progress_bar
Additional Security Features
- Brute-force protection — per-username lockout (5 fails → 5 min) AND per-source IP/connection lockout (30 fails → 15 min, blocks username-rotation attacks). Lockouts have fixed duration — cannot be extended by additional attempts (DoS-resistant).
- Credential wrapper — passwords/session IDs stored in a
Credentialclass with leak-safe__repr__/__str__, explicit.reveal()for use, and.clear()on close - Server-side admin verification —
is_adminis re-verified viahas_group('base.group_system')after authentication, defending against tampered auth responses - Private method guard — underscore-prefixed methods (
_compute_*,_inverse_*, etc.) blocked for everyone including admin unless explicitly whitelisted - Rate limiting — per-session token bucket with separate global and write budgets
- RBAC — tool-level access control by user group, field-level response filtering, transparent drop reporting via
return_dropped=True - Input validation — model names, method names, field names, domain filters, ORDER BY clauses, groupby with temporal operators, write values (size/depth/type)
- IDOR protection — plugin tools scope data access to the authenticated user
- Audit logging — structured JSON logs for all allowed and denied operations
- Error sanitization — strips internal URLs, SQL fragments, file paths, stack traces from error messages
- XXE protection — XML-RPC responses parsed with
defusedxml - Domain validation — Odoo domain filters validated for operators, field names, value types, nesting depth, and list sizes
- Session-expiry retry — JSON-RPC retries only on
OdooSessionExpiredError, not generic auth errors (no double round-trips on access denials)
Authentication
Three stock Odoo auth methods — no custom addon needed:
Core MCP Tools (13)
Workflow Tools (2)
MCP Resources (6)
MCP Prompts (12)
Built-in Domain Plugins
HR Plugin
Sales Plugin
Project Plugin
Helpdesk Plugin
Custom Module Support
Add custom Odoo modules without writing Python code. Edit model_access.yaml:
Then all CRUD tools (search_read, create_record, update_record, delete_record) and execute_method work on the custom models with full security enforcement.
Plugin System
Extend the gateway with pip-installable plugins:
Register via pyproject.toml entry points:
Configuration Files
All files have .example templates with extensive inline documentation. Copy and customize:
Example: Restrict a Model
Example: RBAC by Group
Docker
Services:
- MCP Gateway — port 8080 (streamable-http mode)
- Odoo 18 — internal only (no host port exposed by default)
- PostgreSQL — internal only
The gateway runs as a non-root user in a minimal Python image.
CLI Tools
Development
Source Layout
Testing
1,476 tests passing, 93% code coverage, mypy strict clean, ruff clean:
Error Handling
All Odoo errors are classified into 7 types:
All error messages are sanitized before reaching the MCP client — internal URLs, SQL fragments, file paths, and stack traces are automatically stripped.
Known Limitations
- XML-RPC credential handling: When using API key authentication (XML-RPC), the credential is sent with every RPC call as required by the protocol. Use HTTPS in production. (Note: passwords are stored in a
Credentialwrapper that preventsrepr()/traceback leakage.) - HTTP mode session isolation:
streamable-httptransport currently has known session isolation limitations — the_current_session_keyContextVar is set inside the login tool but subsequent tool calls from different request contexts may fall back to the first available session. Deploy HTTP mode as single-tenant only (one user per server process) until per-request middleware lands in v0.3.0. stdio mode is single-session by design and unaffected.
Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Make your changes with tests
- Ensure all checks pass:
pytest && ruff check src/ tests/ && mypy src/ - Submit a pull request
License
來源:README.md,提交 47c4c2b
工具
0版本歷史
1- v0.1.1最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分