Two universal tools. A growing cookbook. Full Odoo API access for AI assistants.
An advanced MCP (Model Context Protocol) server for Odoo ERP β STDIO, SSE, and Streamable HTTP transports β that gives Claude, Cursor, ChatGPT-via-MCP and other AI hosts direct access to your Odoo data and workflows.
AI assistants: read AGENTS.md for the tool-first quick reference.
Connect AI assistants to Odoo with two universal tools plus a self-improving knowledge base:
execute_methodβ call any Odoo method on any modelbatch_executeβ execute multiple operations atomically (with@Nresult references)add_cookbook_patternβ document hard-won recipes after β₯4 failed attempts
Plus 11 discovery resources, 3 prompts, and an odoo://cookbook/patterns resource that surfaces past lessons. No specialized tools, no validation layer, no artificial limits β full Odoo API.
Everything you need, just ask AI: automate, query, manage, customize, develop new modules, integrate with external systems, enhance your Odoo instance through AI.
Option 1: Traditional pip install
# From source
git clone https://github.com/AlanOgic/mcp-odoo-adv.git
cd mcp-odoo-adv
# Virtual Environment
python3 -m venv .venv
source .venv/bin/activate
# Installation
pip install -e .Option 2: Using uvx (No Installation)
# From source directory
uvx --from . odoo-mcp
Option 3: Using Docker
# build STDIO
docker build -t alanogic/mcp-odoo-adv:latest -f Dockerfile .
# build SSE
docker build -t alanogic/mcp-odoo-adv-sse:latest -f Dockerfile.sse .
# build HTTP
docker build -t alanogic/mcp-odoo-adv-http:latest -f Dockerfile.http .
# Run STDIO
docker run --env-file .env alanogic/mcp-odoo-adv:latest
# Run SSE
docker run --env-file .env alanogic/mcp-odoo-adv-sse:latest
# Run HTTP
docker run --env-file .env alanogic/mcp-odoo-adv-http:latestCreate a .env file (minimum):
cp .env.example .env
vim .envODOO_URL=https://your-odoo-instance.com
ODOO_DB=your-database-name
ODOO_USERNAME=your-username
ODOO_PASSWORD=your-password-or-api-keyOptional: Custom Configuration Directory
Organize multiple Odoo configurations by setting a custom directory:
# Create custom config directory
export ODOO_CONFIG_DIR=~/mcp-odoo-env
mkdir -p $ODOO_CONFIG_DIR
# Copy and configure
cp .env.example $ODOO_CONFIG_DIR/.env
vim $ODOO_CONFIG_DIR/.env
# Run server (automatically uses custom directory)
odoo-mcpThis is useful for:
- Managing multiple Odoo instances (dev, staging, production)
- Organizing configs outside project directory
- Docker/Compose deployments with volume mounts
After pip install -e ., four console scripts are wired up:
# STDIO (Claude Desktop, Claude Code, Cursor)
odoo-mcp # or: python -m odoo_mcp
# SSE (browsers, port 8009)
odoo-mcp-sse
# Streamable HTTP (API integrations, port 8008)
odoo-mcp-http
# HTTP with Bearer auth (production behind a reverse proxy)
odoo-mcp-http-secureEach runner streams logs to ./logs/mcp_server_<transport>_<timestamp>.log plus stderr.
Option 1: Using local installation
Add to claude_desktop_config.json:
{
"mcpServers": {
"odoo": {
"command": "python",
"args": ["-m", "odoo_mcp"],
"env": {
"ODOO_URL": "https://your-instance.odoo.com",
"ODOO_DB": "your-database",
"ODOO_USERNAME": "your-username",
"ODOO_PASSWORD": "your-password"
}
}
}
}Option 2: Using uvx (Recommended - No Installation)
First, create your credentials in ~/.config/odoo/.env:
mkdir -p ~/.config/odoo
cat > ~/.config/odoo/.env << 'EOF'
ODOO_URL=https://your-instance.odoo.com
ODOO_DB=your-database
ODOO_USERNAME=your-username
ODOO_PASSWORD=your-password
EOFThen add to claude_desktop_config.json:
{
"mcpServers": {
"odoo": {
"command": "uvx",
"args": ["--from", "odoo-mcp", "odoo-mcp"]
}
}
}Benefits:
- No installation required - uvx downloads and runs automatically
- Credentials stored securely in
.envfile (not in config) - Always uses the latest published version
- Works from anywhere on your system
Option 3: Using Docker
{
"mcpServers": {
"odoo": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "ODOO_URL=https://your-instance.odoo.com",
"-e", "ODOO_DB=your-database",
"-e", "ODOO_USERNAME=your-username",
"-e", "ODOO_PASSWORD=your-password",
"alanogic/mcp-odoo-adv:latest"
]
}
}
}Or with .env file:
{
"mcpServers": {
"odoo": {
"command": "docker",
"args": ["run", "-i", "--rm", "--env-file", "/absolute/path/to/.env", "alanogic/mcp-odoo-adv:latest"]
}
}
}Execute ANY Odoo method on ANY model. Full API access. No limitations.
execute_method(
model="<model_name>",
method="<method_name>",
args_json='[...]', # Positional arguments
kwargs_json='{...}' # Keyword arguments
)Examples:
# Search customers
execute_method(
model="res.partner",
method="search_read",
args_json='[[["customer_rank", ">", 0]]]',
kwargs_json='{"fields": ["name", "email"], "limit": 20}'
)
# Create sales order
execute_method(
model="sale.order",
method="create",
args_json='[{"partner_id": 8, "order_line": [[0, 0, {"product_id": 5, "product_uom_qty": 1}]]}]'
)
# Confirm order
execute_method(
model="sale.order",
method="action_confirm",
args_json='[[5]]'
)Execute multiple operations atomically. All succeed or all rollback. Use "@N" (1-indexed) inside args_json to reference a previous operation's result.
batch_execute(
operations=[
{"model": "res.partner", "method": "create",
"args_json": '[{"name": "Acme"}]'},
{"model": "sale.order", "method": "create",
"args_json": '[{"partner_id": "@1", "order_line": [[0, 0, {"product_id": 5, "product_uom_qty": 1}]]}]'},
{"model": "sale.order", "method": "action_confirm",
"args_json": '[[@2]]'}
],
atomic=True
)After β₯4 failed approaches to the same problem, document the working solution so future sessions skip the trial-and-error:
add_cookbook_pattern(
problem="Search products by attribute value",
failed_approaches=[
"Used = on many2many field",
"Tried dotted notation",
"Used wrong model",
"Passed scalar instead of list to in",
],
working_solution='execute_method(model="product.template", method="search_read", args_json=\'[[["product_template_attribute_value_ids", "in", [123]]]]\')',
why_it_works="Many2many fields require in with a list, not =",
key_lesson="For m2m: always 'in' with a list, never '=' with scalar"
)The β₯4 threshold is enforced β shallow trial-and-error stays out of the cookbook.
| Resource | Returns |
|---|---|
odoo://models |
All models in this instance |
odoo://model/{model}/schema |
Full schema β fields, types, requireds, relationships |
odoo://model/{model}/access |
Your CRUD permissions on this model |
odoo://methods/{model} |
Methods available on this model |
odoo://workflows |
Business workflows from installed modules |
odoo://server/info |
Odoo version + installed modules |
odoo://cookbook/patterns |
Learned Patterns from past sessions (read after first failure) |
Plus odoo://record/{model}/{id}, odoo://search/{model}/{domain}, odoo://fields/{model}, odoo://model/{model} for one-off reads.
π COOKBOOK.md β 45+ practical examples:
- Searching & filtering
- Creating records
- Updating & deleting
- Working with relationships
- Business workflows
- Batch operations
- Advanced patterns
Start here! The cookbook shows you how to accomplish anything with just 2 tools.
User-selectable templates in Claude's menu:
search-customersβ Find customers with filterscreate-sales-orderβ Create sales orders step-by-stepodoo-explorationβ Discover your Odoo instance capabilities
Eight skills ship in .claude/skills/ and auto-activate on relevant requests when this repo is opened in Claude Code. They wrap the cookbook into focused, trigger-aware guides:
odoo-mcp-searchingβ domains, operators, name_searchodoo-mcp-efficient-queriesβ pagination, fields,read_groupodoo-mcp-crudβ create/write/unlink, archive vs deleteodoo-mcp-relationshipsβ m2o/o2m/m2m command tuplesodoo-mcp-workflowsβaction_confirm,action_post,button_validateodoo-mcp-batchβ atomic transactions with@Nreferencesodoo-mcp-real-worldβ HR/CRM/inventory cross-model recipesodoo-mcp-learned-patternsβ cookbook read/write workflow
Other MCP clients (Claude Desktop, Cursor) get the same knowledge portably via COOKBOOK.md and the odoo://cookbook/patterns resource.
execute_method(
model="hr.employee",
method="search_read",
args_json='[[["name", "ilike", "john"]]]',
kwargs_json='{"fields": ["name", "job_id", "department_id"], "limit": 10}'
)execute_method(
model="hr.leave",
method="search_read",
args_json='[[
["employee_id", "=", 1],
["date_from", ">=", "2025-01-01"],
["state", "=", "validate"]
]]',
kwargs_json='{"fields": ["employee_id", "date_from", "date_to", "holiday_status_id"]}'
)batch_execute(
operations=[
{
"model": "res.partner",
"method": "create",
"args_json": '[{"name": "Acme Corp", "email": "contact@acme.com"}]'
},
{
"model": "sale.order",
"method": "create",
"args_json": '[{"partner_id": 123, "order_line": [[0, 0, {"product_id": 5}]]}]'
}
],
atomic=True
)1. Universal Access
- Full Odoo API at your fingertips
- No artificial limitations
- Do anything Odoo can do
2. Simple & Predictable
- Learn 2 tools, use everywhere
- Clear mental model
- Easy to debug and maintain
3. Reliable
- Odoo provides excellent native error messages
- Direct API access means fewer points of failure
- Stable, production-ready implementation
4. Flexible
- Works with several Odoo version (14+)
- Supports all Odoo models and methods
- Extensible through Odoo's native capabilities
- Claude Desktop / Claude Code / Cursor Ready: Works with any MCP host
- Universal Tools:
execute_method+batch_executereach the entire Odoo API - Self-improving cookbook:
odoo://cookbook/patternsresource +add_cookbook_patterntool grow the institutional knowledge automatically - Smart Limits: Automatic protection against oversized queries (DEFAULT=100, MAX=1000)
- MCP 2025-06-18 spec: Built on FastMCP 2.12+
- STDIO: Direct integration with Claude Desktop
- SSE: Server-Sent Events for web browsers (port 8009)
- HTTP: Streamable HTTP for API integrations (port 8008)
- Docker: Pre-built containers for all transports
- Odoo 18 primary target: Works out of the box with Odoo 14-18 via JSON-RPC
- Odoo 19+ opt-in: JSON-2 Bearer token API available via
ODOO_API_VERSION=json-2 - Flexible Auth: Environment variables or config files
- Enhanced Logging: Timestamped logs in
./logs/ - Proxy Support: HTTP proxy configuration
- SSL Control: Configurable SSL verification
- Python 3.10-3.13: Tested on all current Python versions
Odoo 18 (default): use the JSON-RPC path with an API key in the password slot.
export ODOO_API_VERSION=json-rpc # default, can be omitted
export ODOO_PASSWORD=your_api_key_hereGenerate the key in Odoo: Preferences β Account Security β New API Key.
Odoo 19+ (opt-in upgrade): JSON-2 Bearer token API.
export ODOO_API_VERSION=json-2
export ODOO_API_KEY=your_api_key_hereJSON-2 is future-proof β JSON-RPC is scheduled for removal in Odoo 20 (fall 2026).
# STDIO transport (Claude Desktop)
docker run -i --rm --env-file .env alanogic/mcp-odoo-adv:latest
# SSE transport (Web browsers)
docker run -p 8009:8009 --env-file .env alanogic/mcp-odoo-adv:sse
# HTTP transport (API integrations)
docker run -p 8008:8008 --env-file .env alanogic/mcp-odoo-adv:httpCommon search operators:
| Operator | Description | Example |
|---|---|---|
= |
Equal | ["country_id", "=", 75] |
!= |
Not equal | ["active", "!=", false] |
>, >=, <, <= |
Comparison | ["amount_total", ">=", 1000] |
like, ilike |
Pattern match | ["name", "ilike", "acme"] |
in, not in |
In list | ["state", "in", ["draft", "sent"]] |
New to Odoo MCP Server? Start here:
- USER_GUIDE.md - Complete setup guide with 5-minute quick-start
- COOKBOOK.md - 45+ practical examples for common tasks
- DOCKER.md - Docker deployment guide (containers, compose, production)
- TRANSPORTS.md - Connection options (STDIO, SSE, HTTP)
- CLAUDE.md - Technical reference and architecture
- CHANGELOG.md - Version history and updates
Contributions welcome! Please:
- Fork the repository
- Create feature branch (
git checkout -b feature/amazing) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing) - Open Pull Request
Development philosophy:
- Simplicity first
- Universal tools over specialized ones
- Documentation over complexity
- Reliability through directness
GNU General Public License v3.0 or later (GPL-3.0-or-later) - See LICENSE file
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- Original project by LΓͺ Anh TuαΊ₯n
- Built with FastMCP
- Follows Model Context Protocol specification
Ready to get started?
- Quick Setup: Follow the USER_GUIDE.md 5-minute quick-start
- Learn by Example: Browse COOKBOOK.md for 45+ recipes
- Explore Your Odoo: Use the
odoo-explorationprompt in Claude - Build & Automate: Create custom workflows with
execute_method
Need help?
- π Check the USER_GUIDE.md troubleshooting section
- π¬ Open an issue on GitHub
- π Star the repo if you find it useful!
Connect AI to Odoo. Build the future. π