Odoo Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Odoo Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP (Model Context Protocol) server that connects AI agents to Odoo ERP instances. Works with Claude Code, Cursor, Windsurf, and any MCP-compatible client.
Supports Odoo 17-18 (JSON-RPC) and Odoo 19+ (JSON-2 API) — auto-detects the best protocol.
Odoo MCP Server Overview
# Run directly (uv handles dependencies automatically)
ODOO_URL=https://my.odoo.com ODOO_DB=mydb ODOO_USER=admin ODOO_PASSWORD=secret \
uv run odoo_mcp_server.pyNo virtualenv or pip install needed — the script has inline metadata that uv resolves automatically.
Add to your project's .mcp.json:
{
"mcpServers": {
"odoo": {
"type": "stdio",
"command": "uv",
"args": ["run", "--python", "3.11", "--script", "/path/to/odoo_mcp_server.py"],
"env": {
"ODOO_URL": "https://your-instance.odoo.com",
"ODOO_DB": "your-database",
"ODOO_USER": "admin",
"ODOO_PASSWORD": "your-password"
}
}
}
}Or for Odoo 19+ with API key auth:
{
"mcpServers": {
"odoo": {
"type": "stdio",
"command": "uv",
"args": ["run", "--python", "3.11", "--script", "/path/to/odoo_mcp_server.py"],
"env": {
"ODOO_URL": "https://your-instance.odoo.com",
"ODOO_DB": "your-database",
"ODOO_USER": "admin",
"ODOO_API_KEY": "your-api-key"
}
}
}
}Add to ~/.cursor/mcp.json or equivalent:
{
"mcpServers": {
"odoo": {
"command": "uv",
"args": ["run", "--python", "3.11", "--script", "/path/to/odoo_mcp_server.py"],
"env": {
"ODOO_URL": "https://your-instance.odoo.com",
"ODOO_DB": "your-database",
"ODOO_USER": "admin",
"ODOO_PASSWORD": "your-password"
}
}
}
}| Variable | Required | Description |
|---|---|---|
ODOO_URL | Yes | Odoo instance URL |
ODOO_DB | Yes | Database name |
ODOO_USER | Yes | Login username |
ODOO_PASSWORD | One of these | Password (Odoo 17-18) |
ODOO_API_KEY | required | API key (Odoo 19+, preferred) |
ODOO_READONLY | No | Set to true to disable all write operations |
Set ODOO_READONLY=true to disable create, update, delete, and execute tools. Useful for safe browsing of production instances:
{
"mcpServers": {
"odoo": {
"type": "stdio",
"command": "uv",
"args": ["run", "--python", "3.11", "--script", "/path/to/odoo_mcp_server.py"],
"env": {
"ODOO_URL": "https://production.odoo.com",
"ODOO_DB": "prod",
"ODOO_USER": "readonly-user",
"ODOO_PASSWORD": "secret",
"ODOO_READONLY": "true"
}
}
}
}| Tool | Description |
|---|---|
odoo_search_read | Query records with domain filters, field selection, pagination |
odoo_search_count | Count matching records without fetching data |
odoo_export | Bulk export up to 2000 records per call for spreadsheets |
odoo_create | Create new records |
odoo_update | Update existing records by ID |
odoo_delete | Delete records by ID |
odoo_execute | Run any model method (action_confirm, action_post, etc.) |
| Tool | Description |
|---|---|
odoo_list_models | Discover available models with keyword filter |
odoo_get_fields | Inspect field definitions for any model |
odoo_doctor | Health diagnostics (version, modules, users, crons, errors) |
odoo_connection_info | Show current connection details |
| Tool | Description |
|---|---|
odoo_model_info | Get comprehensive model metadata in one call — fields, views, actions, defaults, sort order |
odoo_set_default | Set, update, or clear a field's default value (handles ir.default + JSON encoding) |
odoo_get_view | Get the fully rendered (merged) form/tree/search view XML |
odoo_modify_action | Change a window action's domain, context, sort order, limit, or view modes |
Once configured, ask your AI agent:
Returns everything about a model in one call, eliminating the need for multiple exploratory queries.
odoo_model_info(model="sale.order")Returns:
default_order — the model's _order attribute (e.g. "date_order desc, id desc")rec_name — the field used for display name in dropdownsfield_count — total number of fieldsfields_by_type — field count grouped by type (many2one: 12, char: 8, ...)custom_fields — user-created fields (x_ prefix or state=manual)relational_fields — all Many2one, One2many, Many2many with their targetsrequired_fields — fields that must be filledviews — base views (form, tree, search) with IDs and prioritiesactions — window actions with their domain, context, and view modesdefaults — current ir.default values set for this model's fieldsManages field defaults via ir.default with proper JSON encoding. The most common source of agent errors when done manually.
# Set global default
odoo_set_default(model="product.template", field_name="invoice_policy", value="delivery")
# Set user-specific default
odoo_set_default(model="sale.order", field_name="warehouse_id", value=2, user_id=5)
# Remove a default
odoo_set_default(model="product.template", field_name="invoice_policy", value=null)The tool:
Returns the fully rendered view XML after all inheritance is applied — what the user actually sees, not the raw fragments stored in ir.ui.view.
odoo_get_view(model="sale.order", view_type="form")
odoo_get_view(model="res.partner", view_type="tree")
odoo_get_view(model="account.move", view_type="search")Returns:
arch — the complete merged XMLview_id — the base view IDfields_in_view — list of field names present in the viewChanges how a model appears in the UI by modifying its window action (ir.actions.act_window).
# List actions for a model (read-only)
odoo_modify_action(model="sale.order")
# Change default sort order
odoo_modify_action(action_id=42, order="date_order desc")
# Change default filter and page size
odoo_modify_action(action_id=42, domain="[['state','=','sale']]", limit=200)
# Add default grouping via context
odoo_modify_action(action_id=42, context="{'group_by': 'partner_id'}")The tool returns before/after values so you can verify what changed.
AI Agent (Claude, Cursor, etc.)
↕ MCP Protocol (stdio)
Odoo MCP Server
↕ JSON-RPC / JSON-2 API
Odoo InstanceThe server authenticates once at startup and maintains a persistent connection. All tools use the same authenticated session.
pip install fastmcp httpxMIT
<!-- mcp-name: io.github.oconsole/odoo-simple-mcp -->
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.