cf-odoo-mcp-server
cf-odoo-mcp-server
MCP сервер для Odoo ERP, работающий на Cloudflare Workers.
Использует stateless HTTP transport — не нужны Durable Objects, не нужен контейнер, не нужен постоянно запущенный процесс. Спокойно живёт в free tier Workers.
Портирован из odoo-mcp-claude, который даёт те же 10 инструментов, но работает как Python-процесс через XML-RPC.
В Odoo 19 есть API key двух типов — проверьте, какой нужен
Odoo 19 выдаёт API key с двумя scope, и они не взаимозаменяемы.
Тип ключа | Взаимодействует с | Что даёт |
| собственным | Встроенный MCP-сервер, 5 инструментов только для чтения — включить scope на запись нельзя |
|
| Полный доступ к ORM — этот проект использует его |
Разделение scope строгое в обе стороны: ключ типа rpc при обращении к /mcp получит 401, а ключ типа mcp не сможет аутентифицироваться через JSON-RPC.
Поэтому вам вполне может не понадобиться этот проект. Если ваш агент работает только на чтение, встроенный MCP-сервер Odoo не требует деплоя, поиска хостинга или выноса учётных данных Odoo куда-либо — просто укажите клиенту https://<odoo-ของคุณ>/mcp с ключом типа mcp, и готово. Более того, он отклоняет технические модели — это ограждение, которого у данного проекта нет.
Задачи, требующие записи данных, должны использовать ключ типа rpc — именно ради этого проект существует. В том числе для подключения нескольких экземпляров Odoo через один endpoint и наличия лимита по умолчанию при чтении. Оба варианта могут работать параллельно.
NOTES.md содержит полное сравнение, включая то, где схема встроенного MCP-сервера заставляет агента спотыкаться.
Related MCP server: Odoo 18 MCP Server
Почему JSON-RPC, а не XML-RPC
xmlrpc.client в Python требует raw socket, которого нет в runtime Workers. Но Odoo предоставляет тот же execute_kw через JSON-RPC на /jsonrpc — это обычный HTTP, который напрямую работает с fetch, без каких-либо переделок.
Требования
Odoo должен быть доступен из интернета по HTTPS — Worker не может заходить в LAN. Если Odoo ещё не публичный, поставьте перед ним Cloudflare Tunnel.
Инструменты
Инструмент | Метод Odoo |
| — (показывает настроенные серверы) |
|
|
|
|
|
|
|
|
|
|
|
|
| любой метод |
|
|
|
|
Настройки
Переменная | Назначение |
| Обязательно. Bearer token, который должен присылать вызывающий. |
| JSON, поддерживает один или несколько серверов. Если задано, имеет приоритет над переменными ниже. |
| Резервный вариант для одного сервера. |
| Необязательно. Список hostname через запятую, которым разрешено браузеру с |
Лучше использовать API key Odoo вместо пароля учтётной записи и давать этой учётной записи ровно те права, которые нужны инструментам. odoo_delete и odoo_write имеют доступ ко всему, что доступно этой учётной записи.
ODOO_SERVERS выглядит так:
{
"default_server": "prod",
"servers": {
"prod": { "url": "https://odoo.example.com", "db": "mydb", "username": "bot@example.com", "password": "api-key" }
}
}Локальная разработка
npm install
cp .dev.vars.example .dev.vars # แล้วกรอกค่าให้ครบ
npm run dev.dev.vars уже в gitignore — никогда не коммитьте пароли.
Деплой
npx wrangler login
npx wrangler deploy
npx wrangler secret put MCP_AUTH_TOKEN # openssl rand -hex 32
npx wrangler secret put ODOO_URL
npx wrangler secret put ODOO_DB
npx wrangler secret put ODOO_USERNAME
npx wrangler secret put ODOO_PASSWORDСекреты хранятся в зашифрованном виде и не появляются в wrangler.jsonc.
Подключение клиента
.mcp.json в этой папке — это файл Claude Code, а не Worker. Он просто сообщает клиенту, с каким endpoint работать и с каким токеном. Файл ссылается на значения из environment, поэтому в нём нет секретов, и его можно коммитить в git.
{
"mcpServers": {
"odoo": {
"type": "streamable-http",
"url": "${ODOO_MCP_URL:-https://cf-odoo-mcp-server.<subdomain>.workers.dev/mcp}",
"headers": { "Authorization": "Bearer ${MCP_AUTH_TOKEN}" }
}
}
}Claude Code не загружает .env сам — нужно экспортировать переменные в окружение перед запуском.
cp .env.example .env # แล้วกรอก MCP_AUTH_TOKEN
set -a; . ./.env; set +a
claudeЕсли забыть экспортировать, переменные не подставятся, claude mcp list предупредит, что их не видно, а Worker ответит 401 — падение видимое, а не молчаливое.
ODOO_MCP_URL позволяет направлять на другой Worker, например staging или production, без изменения .mcp.json.
Другие клиенты, которые не читают .mcp.json, должны сами настроить endpoint и заголовок Authorization: Bearer <token> по той же схеме.
GET /health не требует авторизации и возвращает {"status":"ok"}.
Безопасность
Этот endpoint публичный, поэтому каждый запрос к /mcp должен содержать bearer token, и сравнение выполняется за константное время. Если MCP_AUTH_TOKEN не задан, Worker вернёт 500, а не откроет доступ.
Один общий токен подходит для личного или внутреннего сервера. Если нужно различать отдельных пользователей, ставьте перед ним Workers OAuth Provider.
Заметки из реальной эксплуатации
NOTES.md фиксирует, что реально проверено на живом Odoo и что важно учитывать, когда инструменты вызывает ИИ-агент — особенно то, как Odoo молча отбрасывает значения, записанные в readonly fields.
Лицензия
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Manage CloudPepper servers, Odoo instances, backups, and deployments over MCP.
Connect AI to Odoo ERP 14-20: search, create, update and manage records in natural language.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables interaction with Odoo ERP systems for product, customer, order, invoice, and payment management using MCP tools.7MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Odoo 18 (JSON-RPC API) via MCP, supporting model exploration, CRUD operations, and secure API key authentication.Apache 2.0
- FlicenseNot gradedqualityDmaintenanceFull-featured MCP connector for Odoo ERP via XML-RPC, enabling natural language interaction with CRM, sales, inventory, and other Odoo modules.-
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Odoo ERP systems, providing tools and resources to access models, records, and methods via stdio or HTTP streamable transport.MIT