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-сервера заставляет агента спотыкаться.
Почему 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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
ERP français avec serveur MCP natif : plus de 1 800 actions métier auto-générées via OpenAPI.
A paid remote MCP for hosted MCP server, built to return verdicts, receipts, usage logs, and audit-r
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/monthop-gmail/cf-odoo-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server