Odoo MCP 安全接口

为Odoo提供生产环境安全写入接口,支持多实例管理、敏感数据自动脱敏和审计日志功能。

  • by deltix-consulting
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 deltix-consulting/odoo-mcp

使用说明

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的简短版本:

  1. 创建Odoo API密钥。 右上侧面→ 我的资料→ 账户安全→ 新API密钥。命名它 odoo-mcp复制它——奥多只显示一次。任何内部用户都可以创建自己的;不需要管理员权限。不要在生产中使用管理员用户的密钥(默认情况下MCP拒绝)。

  2. 运行安装程序。

    brew install gh && gh auth login
    curl -fsSL https://raw.githubusercontent.com/deltix-consulting/odoo-mcp/main/scripts/install.sh | bash
    

    它验证发布证明,请求Odoo URL/数据库/登录/API密钥,并将凭据存储在操作系统凭据存储中。

  3. 重新启动克劳德桌面/克劳德代码/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 针对安装目录

兼容性

未进行外部安全审计。 对待 社区测试的兼容性表如下。用于生产 部署、审查 安全.md 和那个 安全生产设置检查表.

表面 版本 状态
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 通过三个独立的、服务器强制的门。

  1. 解锁。 odoo_enable_prod_writes(instance="prod") 翻转一个15分钟的基于活动的标志。每次写入都会刷新到期时间;15分钟的沉默再次响起。
  2. 模拟运行预览。 首次写入默认值为 dry_run=true服务器验证有效载荷,返回预览,并发出单次使用 confirmation_token 必定 (instance, operation, model).
  3. 承诺。 再次致电 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 只是——从不记录值。禁用L2 fields_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.

许可证

麻省理工学院——见 许可证.