碘锈mcp🚗
   ](https://github.com/rachmataditiya/odoo-rust-mcp/releases)    ](https://github.com/rachmataditiya/odoo-rust-mcp/pkgs/container/odoo-rust-mcp)  
灵感来自标致3008 -优雅、创新、可靠。就像标致3008 SUV将风格与性能相结合一样,这款MCP服务器将优雅与强大的Odoo集成功能相结合。
Rust实现了一个 Odoo MCP服务器 (模型上下文协议),支持:
- 奥多19+:JSON-2外部API(
/json/2/...)使用API密钥验证 - **奥多\= 19` 使用API密钥。
- JSON中的额外字段将被忽略。
- 如果实例省略
apiKey,服务器将回退到全局ODOO_API_KEY(如果设置)。 - 如果实例省略
username/password,服务器将回退到ODOO_USERNAME/ODOO_PASSWORD.
单实例(回退)
Odoo 19+(API密钥):
export ODOO_URL="https://mycompany.example.com"
export ODOO_API_KEY="YOUR_API_KEY"
export ODOO_DB="mycompany" # optional**Odoo\"
**示例:终止会话**
curl -X DELETE http://127.0.0.1:8787/mcp \ -H "MCP-Session-Id: "
**安全配置:**
Enable Origin validation (comma-separated list of allowed origins)
export MCP_ALLOWED_ORIGINS="https://example.com,https://app.example.com"
Localhost-only mode (empty value)
export MCP_ALLOWED_ORIGINS=""
Disable Origin validation (default - not recommended for production)
Simply don't set MCP_ALLOWED_ORIGINS
启用Origin验证时:
- 收到具有无效Origin标头的请求 `403 Forbidden`
- 本地宿主来源(`localhost`, `127.0.0.1`, `[::1]`)总是被允许的
- 允许没有Origin标头的请求(同源或非浏览器客户端)
### HTTP API文档
使用OpenAPI 3.0规范对HTTP API进行了说明。你可以:
- 查看OpenAPI规范: `http://localhost:8787/openapi.json`
- 使用规范和Swagger UI、Postman或n8n等工具进行集成
- 规范记录了所有端点,包括请求/响应模式
有关与n8n或Dify等工具的集成,请参阅OpenAPI规范以获取完整的API详细信息。
### 身份验证(HTTP传输)
HTTP传输支持根据 [MCP规范](https://modelcontextprotocol.io/specification/draft/basic/authorization).
**通过环境变量启用身份验证:**
export MCP_AUTH_ENABLED=true export MCP_AUTH_TOKEN=your-secure-random-token-here
**或通过配置UI启用(推荐):**
1. 打开 `http://localhost:3008` 并登录
1. 首选 **安全** 标签
1. 切换 **启用MCP HTTP身份验证**
1. 点击 **生成新令牌** 或粘贴您现有的令牌
1. 更改立即生效(热重新加载,无需重新启动)
当 `MCP_AUTH_ENABLED=true` 和 `MCP_AUTH_TOKEN` 如果已设置,则所有HTTP请求都必须包含 `Authorization` 头球
Authorization: Bearer your-secure-random-token-here
**卷曲示例:**
curl -X POST http://127.0.0.1:8787/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your-secure-random-token-here" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05"}}'
**热重载支持:**
- 可以启用/禁用身份验证设置,并且可以从配置UI重新生成令牌
- 更改立即生效,无需重新启动服务
- 服务器使用 `Arc` 用于线程安全的动态配置更新
**笔记:**
- 如果 `MCP_AUTH_ENABLED=false` 或 `MCP_AUTH_TOKEN` 未设置,身份验证已禁用(不建议用于生产)
- STDIO传输不使用HTTP身份验证(凭据来自环境)
- 生成安全令牌: `openssl rand -hex 32`
- 对于生产部署,始终启用身份验证
### 运行(WebSocket/独立服务器)
cd rust-mcp ./target/release/rust-mcp --transport ws --listen 127.0.0.1:8787
### 使用Docker Compose运行
创建 `.env` 在repo根目录中(示例 `dotenv.example`)那么:
docker compose up --build
默认情况下,容器运行 **超文本传输协议** 运输和暴露 `http://localhost:8787/mcp`.
**特征:**
- 自定义网络 `mcp-network` 用于与其他容器(n8n、dify等)集成
- 容器编排的健康检查
- 配置文件的卷装载
- 支持 `ODOO_INSTANCES_JSON` 用于多实例设置
- 服务发现的资源限制和标签
**多实例配置:**
1. 创建 `instances.json` 对于您的Odoo实例:
{ "production": {"url": "https://odoo.example.com", "db": "prod", "apiKey": "xxx"}, "staging": {"url": "https://staging.example.com", "db": "staging", "apiKey": "yyy"} }
2. 在中安装和配置 `.env`:
ODOO_INSTANCES_JSON=/config/instances.json
3. 取消注释中的卷装载 `docker-compose.yml`:
volumes: - ./instances.json:/config/instances.json:ro
**与其他容器集成:**
MCP服务器在 `mcp-network` 网络。其他容器可以使用以下方式连接:
In your other service's docker-compose.yml
services: n8n: networks: - mcp-network environment: MCP_URL: "http://odoo-mcp:8787/mcp"
networks: mcp-network: external: true
看 `docker-compose.override.example.yml` 更多集成示例。
### 使用Kubernetes运行
该项目包括Kubernetes清单 `k8s/` 用于生产部署。
**快速开始使用原始清单:**
Apply all manifests
kubectl apply -k k8s/
Or apply individually
kubectl apply -f k8s/namespace.yaml kubectl apply -f k8s/configmap.yaml kubectl apply -f k8s/secret.yaml # Edit first with your credentials! kubectl apply -f k8s/deployment.yaml kubectl apply -f k8s/service.yaml kubectl apply -f k8s/ingress.yaml # Optional, for external access
**验证部署:**
kubectl -n odoo-mcp get pods kubectl -n odoo-mcp logs -f deployment/odoo-mcp
**用于本地测试的端口转发:**
kubectl -n odoo-mcp port-forward svc/odoo-mcp 8787:8787
Access: http://127.0.0.1:8787/mcp
**特征:**
- 命名空间隔离
- MCP配置文件的ConfigMap
- Odoo凭据的秘密
- 部署方式:
- 资源限制/请求
- 存活/准备/启动探针
- Pod抗亲和力,实现高可用性
- 非根安全上下文
- 用于内部访问的ClusterIP服务
- 通过TLS进行外部访问的入口
- 环境管理的Kustomization
### 使用Helm跑步
要获得更灵活的部署,请在中使用Helm chart `helm/odoo-rust-mcp/`.
**安装:**
Add your values (see helm/odoo-rust-mcp/values.yaml for all options)
cat > my-values.yaml ", 0]] }
解码结果(形状):
{ "count": 18 }
执行操作/按钮(工作流):
{ "instance": "default", "model": "sale.order", "ids": [42], "action": "action_confirm" }
解码结果(形状):
{ "result": null, "executed_on": [42] }
执行任意方法:
{ "instance": "default", "model": "res.partner", "method": "name_get", "args": [[1, 2, 3]] }
解码结果(形状):
{ "result": [] }
模型元数据(字段/类型):
{ "instance": "default", "model": "sale.order" }
解码结果(形状):
{ "model": { "name": "sale.order", "description": "Sales Order", "fields": {} } }
生成报告(PDF格式为base64):
{ "instance": "default", "reportName": "sale.report_saleorder", "ids": [42] }
解码结果(形状):
{ "pdf_base64": "JVBERi0xLjQKJ......", "report_name": "sale.report_saleorder", "record_ids": [42] }
列出型号(可选过滤):
{ "instance": "default", "domain": [["transient", "=", false]], "limit": 50, "offset": 0 }
解码结果(形状):
{ "models": [ {"id": 2, "model": "ir.actions", "name": "Actions"}, {"id": 3, "model": "ir.model", "name": "Models"} ] }
检查访问权限:
{ "instance": "default", "model": "res.partner", "operation": "write", "ids": [1, 2, 3] }
解码结果(形状):
{ "has_access": true, "model": "res.partner", "operation": "write", "model_level": true, "record_level": true }
批量创建记录(最多100条):
{ "instance": "default", "model": "res.partner", "values_list": [ {"name": "Partner 1", "email": "p1@example.com"}, {"name": "Partner 2", "email": "p2@example.com"} ] }
解码结果(形状):
{ "ids": [101, 102], "created_count": 2, "success": true }
### Claude桌面配置示例
将MCP服务器命令设置为内置二进制文件:
**Odoo 19+(API密钥):**
{ "mcpServers": { "odoo-rust": { "command": "/absolute/path/to/odoo-rust-mcp/rust-mcp/target/release/rust-mcp", "args": ["--transport", "stdio"], "env": { "ODOO_INSTANCES": "{\"production\":{\"url\":\"https://mycompany.example.com\",\"db\":\"mycompany\",\"apiKey\":\"YOUR_API_KEY\"}}" } } } }
**Odoo\<19(用户名/密码):**
{ "mcpServers": { "odoo-rust": { "command": "/absolute/path/to/odoo-rust-mcp/rust-mcp/target/release/rust-mcp", "args": ["--transport", "stdio"], "env": { "ODOO_INSTANCES": "{\"legacy\":{\"url\":\"https://mycompany.example.com\",\"db\":\"mycompany\",\"version\":\"18\",\"username\":\"admin\",\"password\":\"your_password\"}}" } } } }
### 游标配置示例
游标支持 `stdio`, `SSE`,以及 `Streamable HTTP` 运输。请参阅游标文档: [`cursor.com/docs/context/mcp`](https://cursor.com/docs/context/mcp).
#### 光标(推荐):stdio
把这个放进去 `~/.cursor/mcp.json` (或 `${workspaceFolder}/.cursor/mcp.json`):
**重要:** 对于stdio传输,您必须使用 **绝对路径** 因为Cursor从不同的工作目录运行二进制文件。
**Odoo 19+(完整示例):**
{ "mcpServers": { "odoo-rust-mcp": { "type": "stdio", "command": "/absolute/path/to/odoo-rust-mcp/rust-mcp/target/release/rust-mcp", "args": ["--transport", "stdio"], "env": { "ODOO_URL": "http://localhost:8069", "ODOO_DB": "mydb", "ODOO_API_KEY": "YOUR_API_KEY", "MCP_TOOLS_JSON": "/absolute/path/to/odoo-rust-mcp/config/tools.json", "MCP_PROMPTS_JSON": "/absolute/path/to/odoo-rust-mcp/config/prompts.json", "MCP_SERVER_JSON": "/absolute/path/to/odoo-rust-mcp/config/server.json" } } } }
**Odoo\<19(完整示例):**
{ "mcpServers": { "odoo-rust-mcp": { "type": "stdio", "command": "/absolute/path/to/odoo-rust-mcp/rust-mcp/target/release/rust-mcp", "args": ["--transport", "stdio"], "env": { "ODOO_URL": "http://localhost:8069", "ODOO_DB": "mydb", "ODOO_VERSION": "18", "ODOO_USERNAME": "admin", "ODOO_PASSWORD": "admin", "MCP_TOOLS_JSON": "/absolute/path/to/odoo-rust-mcp/config/tools.json", "MCP_PROMPTS_JSON": "/absolute/path/to/odoo-rust-mcp/config/prompts.json", "MCP_SERVER_JSON": "/absolute/path/to/odoo-rust-mcp/config/server.json" } } } }
**使用.env文件:**
{ "mcpServers": { "odoo-rust-mcp": { "type": "stdio", "command": "/absolute/path/to/odoo-rust-mcp/rust-mcp/target/release/rust-mcp", "args": ["--transport", "stdio"], "envFile": "/absolute/path/to/odoo-rust-mcp/.env" } } }
注意:使用时 `envFile`,确保您 `.env` 包含的绝对路径 `MCP_TOOLS_JSON`, `MCP_PROMPTS_JSON`,以及 `MCP_SERVER_JSON`.
#### 游标:可流式HTTP(远程/多用户)
使用以下命令运行服务器 `--transport http` 并设置:
{ "mcpServers": { "odoo-rust-mcp": { "url": "http://127.0.0.1:8787/mcp" } } }
**使用承载令牌身份验证:**
如果你有 `MCP_AUTH_TOKEN` 在服务器上设置,使用标头中的令牌配置Cursor:
{ "mcpServers": { "odoo-rust-mcp": { "url": "http://127.0.0.1:8787/mcp", "headers": { "Authorization": "Bearer your-secure-random-token-here" } } } }
注意:使用生成安全令牌 `openssl rand -hex 32` 并设置 `MCP_AUTH_TOKEN` 在服务器上。
### 测试/冒烟
运行单元测试(无警告):
cd rust-mcp RUSTFLAGS='-Dwarnings' cargo test
还有一个小型WS-smoke客户端,可以验证端到端的MCP调用(连接→ 初始化→ 列出工具→ 调用一些工具):
cd rust-mcp cargo run --release --bin ws_smoke_client -- \ --url ws://127.0.0.1:8787 \ --instance default \ --model res.partner
示例输出(本地运行 `res.partner`):
tools/list: 11 tools
- odoo_search
- odoo_search_read
- odoo_read
- odoo_create
- odoo_update
- odoo_delete
- odoo_execute
- odoo_count
- odoo_workflow_action
- odoo_generate_report
- odoo_get_model_metadata
odoo_count result: {"count":18} odoo_search_read count: 2 odoo_search_read sample records: [{"id":46,"name":"Kasir C"},{"id":45,"name":"Kasir B"}] prompts/list: odoo_common_models, odoo_domain_filters
### 安全
- 做 **不** 提交 `.env` 或包含API密钥/密码的任何文件。
- 更喜欢在Odoo中使用具有最小访问权限的专用机器人用户进行自动化。
## 发布过程
为了创建一个新版本,有 **2 需要更新版本的文件**:
1. `rust-mcp/Cargo.toml` -现场 `version`
1. `config-ui/package.json` -现场 `version`
### 快速发布(推荐)
使用已提供的帮助脚本:
Bump version, commit, push, dan create tag sekaligus
./scripts/release.sh 0.3.15
这个脚本将:
- 更新版本di `Cargo.toml` 丹 `package.json`
- 提交更改
- 一键遥控
- 创建并推送git标签(这将触发GitHub Actions发布工作流)
### 手动释放
如果需要手册:
1. Update version di 2 file
Edit rust-mcp/Cargo.toml: version = "0.3.15"
Edit config-ui/package.json: "version": "0.3.15"
2. Commit dan push
git add rust-mcp/Cargo.toml config-ui/package.json git commit -m "chore: bump version to 0.3.15" git push
3. Create dan push tag (akan trigger GitHub Actions)
git tag v0.3.15 git push origin v0.3.15
### GitHub 动作将自动:
- 为所有平台(Linux,macOS,Windows)构建二进制文件
- 构建Docker镜像
- 构建Debian软件包
- 使用 artifacts 创建 GitHub 版本
- 更新自制配方
- 更新APT存储库
监控进度:https://github.com/rachmataditiya/odoo-rust-mcp/actions