使用说明
odoo mcp
让Claude、Codex、Cursor或任何MCP客户直接针对您的 奥多 --没有令人产生幻觉的循环擦拭生产。
建造于 德尔蒂斯 适用于内部Odoo团队和个人操作员,他们希望在日常工作中使用人工智能——阅读发票、起草合作伙伴、审查管道、审计自定义模块——但拒绝将数据库暴露给行为不端的代理。本地,开源,麻省理工学院。
一个MCP安装=一个Odoo部署。 在一个配置中并排连接同一Odoo的dev、staging和prod——这就是多实例支持的目的。不要将单个MCP安装指向多个无关组织的Odoo;每个进程共享凭据、审核日志和操作系统密钥链条目。看 安全.md.
你得到了什么
- 安全生产写作。 生产实例上的每个提交都要经过三个独立的门:显式解锁、模拟运行预览、一次性确认令牌。一个幻觉般的200呼叫循环不能无声地改变数据。
- 每次通话PII编辑。 默认情况下,增值税、国际银行账户号码、工资、RSZ、员工出生日期和60多个其他模式都会被删除。密码和API密钥永远无法读取,完全停止。
- 开发+生产并行。 给…布线
[instances.dev]和[instances.prod]在一个配置中部署相同的Odoo。每个实例都有自己的API密钥、自己的速率限制预算和自己的prod-guard状态。 - 与每个主要的MCP客户合作。 Claude Desktop、Claude Code、OpenAI Codex、Cursor、Windsurf、Continue.dev、Zed。一台服务器,通过粘贴准备好的配置片段
odoo-mcp client-config. - 没有遥测,没有回家的电话,没有数据泄露路径。 唯一的出站流量是到您的Odoo。我们永远不会看到您的URL、查询、数据或审计日志。
- 66型号安全denylist硬编码。 身份验证表、ACL规则、邮件凭据、支付令牌、存储的可执行内容、附件——无法访问,不可覆盖配置。
- 对每次通话进行审核日志记录。 每个工具调用一行JSONL,带有时间和形状,从不带值。如果日志变得无法写入,则失败关闭。
适合的地方
- 部署了一个Odoo的内部运营商 --阅读报告、起草合作伙伴、在不编写SQL或构建Studio仪表板的情况下审查管道。
- Dev → prod工作流程 --试着写一篇文章
[instances.dev]首先,然后重新进行比赛[instances.prod]具有显式解锁+令牌流。 - 架构审核和迁移准备 —
odoo-mcp scan-custom将您的实时Odoo与嵌入式引用模式(目前为Odoo 18社区)进行比较,以便在自定义模型、Studio字段和可能的敏感列出现在事件中之前将其显示出来。在其他Odoo版本上,diff仍然运行——Odoo中存在但引用中没有的字段被标记为自定义(在较新版本上有一个小的超量计算,无害)。 - 只读演示和培训 --set
ODOO_MCP_READ_ONLY=1并将会议安全地交给任何人。
软件也是,麻省理工学院授权的。 未进行外部安全审计。 审查 安全.md 在投入生产之前。MCP运行 macOS、Windows 10+和Linux(带libsecret)。
快速开始
第一次安装? 阅读 GETTING_STARTED.md -它遍历了先决条件、选择正确的Odoo用户、逐步创建API密钥(以及您需要什么权限)、install命令和前十个gotcha。阅读大约需要5分钟;安装需要10分钟。
生产: 验证.md 描述了经过验证的发布安装流程(下载发布工件,验证Sigstore证明,自己验证sha256,然后安装)。
curl | bash是便利路径,而不是生产推荐路径。 未执行外部安全审计——请参阅 安全.md 在部署之前。
已经熟悉了?macOS/Linux的简短版本:
-
创建Odoo API密钥。 右上侧面→ 我的资料→ 账户安全→ 新API密钥。命名它
odoo-mcp复制它——奥多只显示一次。任何内部用户都可以创建自己的;不需要管理员权限。不要在生产中使用管理员用户的密钥(默认情况下MCP拒绝)。 -
运行安装程序。
brew install gh && gh auth login curl -fsSL https://raw.githubusercontent.com/deltix-consulting/odoo-mcp/main/scripts/install.sh | bash它验证发布证明,请求Odoo URL/数据库/登录/API密钥,并将凭据存储在操作系统凭据存储中。
-
重新启动克劳德桌面/克劳德代码/Codex 因此它们加载MCP。问: “使用odoo_help显示您可以用我的odoo做什么”.
Windows:PowerShell iwr -useb https://raw.githubusercontent.com/deltix-consulting/odoo-mcp/main/scripts/install.ps1 | iex.
有关deltix内部入职培训(管理员为同事做准备),请参阅 ONBOARDING.md.
其他MCP客户端
安装程序会自动注册Claude Desktop和Codex。对于Cursor、Windsurf、Continue、Zed或任何其他符合MCP的客户端,运行:
odoo-mcp client-config --client cursor # or windsurf / continue / zed / claude-code / generic-stdio
odoo-mcp client-config --detect # print snippets for every client whose config dir is found locally
odoo-mcp client-config --list # see the full supported list
该命令解析绝对值 odoo-mcp 然后打印一个可粘贴的代码段以及它所进入的文件。
隐私姿态详解
- 没有遥测。 唯一的出站HTTP是到你的Odoo,加上GitHub
odoo-mcp update. - 家里没有电话。 deltix咨询公司没有收到任何东西——没有URL、数据库名称、查询、结果或审计日志。
- 没有源代码上传。 在运行时通过以下方式发现自定义模块
ir.model/ir.model.fields.Source保留在您的仓库中。 - 凭据从不在磁盘上。 用户名和API密钥存在于您的操作系统凭据存储(macOS钥匙串/Windows凭据管理器/libsecret)中,从错误中删除,并从
os.environ认证后。 - 审核日志保留在本地。
~/.odoo-mcp/audit.jsonl只记录元数据——没有字段值,没有查询,没有结果。 - 共同责任。 看 安全.md 对于运营商必须拥有的东西。
看 安全.md 对于完整的威胁模型。
工具
| 工具 | 目的 |
|---|---|
odoo_help |
能力概述,无Odoo往返 |
odoo_list_instances |
已配置的实例及其状态 |
odoo_describe_model |
一个模型的字段元数据 |
odoo_lookup |
快速 name ilike 查找,返回id+display_name |
odoo_search_read |
使用显式字段和沙盒域查询记录 |
odoo_search_count |
统计与域匹配的记录 |
odoo_read_group |
按分组汇总(总和/平均值/计数/最小值/最大值) |
odoo_read |
按ID读取特定记录 |
odoo_create |
创建记录(prodded) |
odoo_write |
更新记录(已完成) |
odoo_archive_or_delete |
存档或 unlink 记录(已打印) |
odoo_enable_prod_writes |
解锁prod写入15分钟 |
odoo_diagnose_access |
报告用户对模型的读/写/创建/取消链接权限 |
不 execute_kw。没有工作流按钮。不 copy, name_search, fields_view_get. unlink 只能通过以下方式访问 odoo_archive_or_delete.
命令行界面
| 命令 | 目的 |
|---|---|
odoo-mcp onboarding |
引导首次运行:设置向导+医生+扫描,写入 ~/.odoo-mcp/suggestions.toml |
odoo-mcp setup |
首次向导(配置、凭据、Claude Desktop+Codex注册) |
odoo-mcp setup --add |
添加另一个实例 |
odoo-mcp setup --remove |
删除实例及其Keychain条目 |
odoo-mcp setup --list |
列出已配置的实例 |
odoo-mcp setup --rotate-key NAME |
旋转一个实例的API键(粘贴新键) |
odoo-mcp renew-key NAME |
通过密码生成并存储新的API密钥(适用于Odoo Online的1天到期政策) |
odoo-mcp setup --regenerate-launcher |
重写 launch.sh |
odoo-mcp uninstall |
删除配置、钥匙链条目、启动器、Claude Desktop+Codex注册以及 uv tool 安装 |
odoo-mcp doctor |
飞行前:配置权限、审计日志、TLS、身份验证、烟雾呼叫 |
odoo-mcp status |
实时状态:身份验证、解锁状态、速率限制预算 |
odoo-mcp audit |
审核日志检查器 |
odoo-mcp cache --info / --clear |
持久字段缓存统计信息/删除条目 |
odoo-mcp scan-custom INSTANCE |
发现自定义模型和可能的敏感字段,建议TOML覆盖 |
odoo-mcp client-config |
打印Claude Desktop、Cursor、Windsurf、Continue、Zed、Codex的MCP客户端配置片段。.. |
odoo-mcp update |
git pull + uv sync 针对安装目录 |
兼容性
| 表面 | 版本 | 状态 |
|---|---|---|
| Odoo社区 | 17.0,18.0 | 已测试 |
| Odoo Enterprise | 17.0,18.0 | 已测试 |
| Odoo Online(SaaS) | 当前 | 已测试-注意:非管理员API密钥将在1天内过期;使用 odoo-mcp renew-key |
| Odoo社区/企业版 | 16.0 | 应该可以工作,轻度测试 |
| Odoo 19+/JSON-2 | -- | 计划中,请参阅 ROADMAP.md |
| Python | 3.11、3.12、3.13 | 已测试 |
| 操作系统 | macOS 12+、Windows 10/11、Linux(libsecret) | 已测试 |
| MCP客户端 | Claude Desktop、Claude Code、OpenAI Codex CLI、Cursor、Windsurf、Continue.dev、Zed | 已交付的代码片段——请参阅 odoo-mcp client-config --list |
如果组合丢失或损坏,请提交 Odoo兼容性错误.
输出示例
一些示例交互,以便您在安装之前知道会发生什么。
odoo-mcp doctor
✓ Load config — from /Users/you/.odoo-mcp/config.toml
✓ Audit log writable — /Users/you/.odoo-mcp/audit.jsonl
✓ [prod] credentials — user you@yourcompany.com
✓ [prod] authenticate — uid=42
✓ [prod] fields_get(res.partner) — 137 fields
OK
odoo_help (简洁模式)
{
"ok": true,
"version": "0.16.2",
"summary": "Security-gated Odoo over XML-RPC: per-instance allowlists, domain sandbox, field redaction, prod-write guard with dry-run + confirmation tokens. Call odoo_help(verbose=true) for the full cookbook.",
"tools": [
{"name": "odoo_search_read", "purpose": "Search + read with explicit fields list."},
{"name": "odoo_diagnose_access", "purpose": "Read/write/create/unlink rights on a model."},
...
],
"instances": [
{"name": "prod", "url": "https://yourco.odoo.com", "production": true,
"writes_unlocked": false, "allowlist_mode": "strict"}
]
}
试运行生产写入
呼叫 odoo_write 解锁prod后第一次:
{
"ok": true,
"preview": true,
"instance": "prod",
"model": "crm.lead",
"id_count": 1,
"would_update_fields": ["stage_id"],
"confirmation_token": "conf_XXXXXXXXXXXXXXXXXXXX",
"note": "This was a dry run. To commit, call odoo_write again with dry_run=false and confirmation_token set to the token above."
}
同一个电话 dry_run: false, confirmation_token: "conf_...":
{
"ok": true,
"instance": "prod",
"model": "crm.lead",
"ids": [42],
"committed": true,
"commits_remaining": 9
}
odoo-mcp audit --stats
TOOL CALLS OK ERR P50ms P95ms MAXms
odoo_search_read 312 310 2 87 254 611
odoo_describe_model 48 48 0 34 91 187
odoo_read_group 18 18 0 102 188 220
odoo_diagnose_access 4 4 0 71 108 113
odoo_enable_prod_writes 2 2 0 8 12 14
odoo_write 2 2 0 96 102 102
生产写入工作流程
对任何实例进行写入 production = true 通过三个独立的、服务器强制的门。
- 解锁。
odoo_enable_prod_writes(instance="prod")翻转一个15分钟的基于活动的标志。每次写入都会刷新到期时间;15分钟的沉默再次响起。 - 模拟运行预览。 首次写入默认值为
dry_run=true服务器验证有效载荷,返回预览,并发出单次使用confirmation_token必定(instance, operation, model). - 承诺。 再次致电
dry_run=false和令牌。单次使用——第二次提交需要第二次模拟运行。
# 1. Unlock
odoo_enable_prod_writes(instance="prod")
# 2. Dry run — returns { preview: true, confirmation_token: "abc123", ... }
odoo_write(instance="prod", model="crm.lead", ids=[42], values={"stage_id": 3})
# 3. Commit
odoo_write(instance="prod", model="crm.lead", ids=[42],
values={"stage_id": 3},
dry_run=false, confirmation_token="abc123")
爆裂极限(max_commits_per_unlock,默认10)限制每次解锁的实际提交次数;干跑不算数。生产实例也拒绝以Odoo管理员身份进行身份验证(uid=1 或 base.group_system)--创建一个专用的非管理员用户。覆盖 refuse_admin_on_production = false 只有你知道自己在做什么。
在非生产实例上,直接写入commit。
更新
跑 odoo-mcp update.这个跑 git pull 在安装目录中,然后 uv sync.它不碰 ~/.odoo-mcp/config.toml 或钥匙链条目。现有安装会自动将Claude Desktop迁移到直接安装 odoo-mcp launch 注册,并在安装Codex时将相同的注册添加到Codex中。
发布通过Sigstore使用GitHub Actions Build来源证明进行签名。安装程序在提取之前验证证明;使用以下命令手动验证下载的tarball gh attestation verify请参阅中的“验证版本” 安全.md.
配置
配置存在于 ~/.odoo-mcp/config.toml (chmod 600——否则服务器将拒绝启动)。入职向导生成它;高级操作员可以手动编辑它。架构在中定义 src/odoo_mcp/config.py.按键旋钮: timeout_seconds, max_records_default, max_records_hard_cap, allowed_models (打开 ["*"] 或严格列表),以及每个实例 [instances.NAME] 块与 url, database, credentials_env_prefix, production.
参考
-
允许的模型。 默认为打开模式(
allowed_models = ["*"]):除了硬编码的denylist(auth/users/groups、ACL、存储的可执行内容、系统配置、调度程序、原始附件、模型元数据)之外,每个模型都是可访问的。通过明确列出模型切换到严格模式。丹尼主义者总是高高在上。看src/odoo_mcp/config.py对于丹尼主义者来说。 -
敏感领域。 两层:正则表达式匹配的字段(密码、令牌、api_keys、工资/工资/奖金、机密、凭据)总是被编辑和不可写的。每个模型默认隐藏字段(例如。
res.partner.vat,hr.employee.ssnid)每次通话都需要allow_sensitive_fields=[...].扩展custom_sensitive_field_patterns每个实例。 -
审核日志。 每次调用一个JSONL行
~/.odoo-mcp/audit.jsonl每日轮换,保留30天。没有值,没有域,没有记录内容。如果日志无法写入,服务器将无法关闭。检查odoo-mcp audit. -
缓存。 L1内存+L2持久SQLite(
~/.odoo-mcp/fields-cache.db24小时TTL)fields_get只是——从不记录值。禁用L2fields_cache_path = "".使用以下命令删除过时的条目odoo-mcp cache --clear. -
调试日志记录。 出口
ODOO_MCP_LOG_LEVEL=DEBUG|INFO|WARNING|ERROR以流式传输到stderr。凭据已被擦除。 -
运行时环境变量作用域 (全部可选,全部在通话时阅读):
变量 效果 ODOO_MCP_READ_ONLY=1拒绝所有写入路径工具( odoo_create,odoo_write,odoo_archive_or_delete,odoo_enable_prod_writes)无论每个实例production旗帜。阅读不受影响。真理价值观:1/true/yes/on.ODOO_MCP_DISABLE_TOOLS=odoo_write,odoo_create从MCP中过滤工具 tools/list广告。一个表现良好的客户永远不会看到他们。逗号分隔;容忍空白;记录并忽略未知名称。ODOO_MCP_TOOL_LATENCY_BUDGET_MS=2000纯粹的可观察性。调度员记录a WARNING标记的slow_tool_call每当成功的通话超出预算时。设置为非正整数或未设置为禁用。所有三个表面
odoo-mcp doctor所以它们在飞行前是可见的。 -
行业模板。
templates/船舶每行业起点为高级运营商。大多数用户应该运行odoo-mcp onboarding,这会生成一个每个实例suggestions.toml来自实时模式。看 工业_审计.md.
发展
git clone https://github.com/deltix-consulting/odoo-mcp.git
cd odoo-mcp
uv sync --extra dev
uv run pytest -q
集成测试需要 ODOO_MCP_TEST_* 环境变量和 pytest -m integration.CI在每次推送时都会运行ruff、ruff格式、mypy-strict和pytest。
安全报告
电子邮件 hello@deltix.pro (主题: [odoo-mcp security])并期望在五个工作日内收到回复。看 安全.md.
许可证
麻省理工学院——见 许可证.
