odoo-mcp-server
Turns an Odoo database into an MCP server, giving AI assistants tools to explore allowed Odoo models and their fields, search and read records with Odoo domains, count matches, and compute grouped aggregates (e.g. revenue per customer per month) across contacts, products, sales, purchases, invoices, CRM, projects and inventory — all read-only and scoped to the signed-in user's own access rights, record rules and companies, with every call logged.
MCP Server for Odoo
An Odoo module that turns your Odoo database into a Model Context Protocol (MCP) server. Claude, ChatGPT, Cursor, VS Code and any other MCP client can then search, read, count and total your Odoo records, and answer questions about them in plain language. Every request runs with the signed-in user's own access rights, only on the models an administrator allows, and is logged.
Odoo 18, 19 and 20, Community and Enterprise, on Odoo.sh or your own server
Free and open source (LGPL-3), read-only
Streamable HTTP endpoint at
/mcpinside Odoo, with no extra server, no Docker and no outside service
This branch is for Odoo 20. Other versions: 20.0, 19.0, 18.0.
Product page: calderkit.com/odoo-mcp-server · Odoo Apps store: MCP Server
Example
On the Odoo demo database, you ask: "Which confirmed sales orders are the largest?" The assistant calls odoo_search on sale.order, filtered on confirmed orders and sorted by total, and answers: "S00020 for Joel Willis (3,389.63), then S00004 (2,240.00) and S00007 (1,706.00), both for Gemini Furniture."
Related MCP server: odoo19-mcp-server
Tools
Tool | What it does |
| Who is connected, the company, the language, the time zone and today's date, so "last quarter" means the right dates |
| The models the assistant may use, with a short hint for each |
| The fields of a model: type, label, relation, selection values |
| Search records with any Odoo domain, sorted and paged, with the total number of matches |
| Read records by ID |
| Count the records that match a domain |
| Totals by group, for example revenue per customer per month, without reading every record |
Out of the box the server offers common business models (contacts, products, sales, purchases, invoices, CRM, projects, inventory) when those apps are installed. An administrator adds or removes models in MCP Server → Configuration → Models.
Security
The user's own rights. The assistant authenticates as a person and sees exactly what that person sees in Odoo: access rights, record rules, companies and field groups all apply.
Only the models you allow. Users, settings and technical models cannot be exposed. Administrators can hide more fields per model.
No secrets. Password, token, key and signature fields and binary files are never returned, and they cannot be used in filters either.
A key only for AI (Odoo 20). The module adds an "MCP (AI assistants only)" scope to API keys; such a key cannot be used for any other API.
Everything logged. Each call is recorded with the user, tool, model, filters, number of records, duration and any error, in MCP Server → Calls.
No delete tool, no write tool. This free module is read-only.
Nothing goes through us. The module answers only the MCP client you connect and makes no outside connection of its own.
Install
From the Odoo Apps store: MCP Server (free).
From this repository:
git clone --branch 20.0 --depth 1 https://github.com/Calderkit/odoo-mcp-server.git
cp -r odoo-mcp-server/calderkit_mcp /path/to/your/addons/Restart Odoo, open Apps, click Update Apps List, search for "MCP Server" and install it. Administrators get access at once; give other users the MCP Server / User role.
Connect an AI assistant
In Odoo, open your user menu, then Preferences (or My Preferences), tab Security, and create an API key. On Odoo 20, choose the scope MCP (AI assistants only).
Add the server to your client. The module's MCP Server → Connect page shows these snippets with your own address.
Claude Code:
claude mcp add --transport http odoo https://your-odoo.example.com/mcp \
--header "Authorization: Bearer YOUR_API_KEY"Cursor, Claude Desktop, VS Code and other clients that accept a JSON configuration:
{
"mcpServers": {
"odoo": {
"type": "http",
"url": "https://your-odoo.example.com/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}Ask, for example: "Which customers bought the most last quarter?"
Protocol support
MCP 2026-07-28: stateless requests,
server/discover, per-request protocol version,Mcp-MethodandMcp-Nameheader checks.MCP 2025-11-25, 2025-06-18 and 2025-03-26 through the
initializehandshake.Streamable HTTP transport, JSON responses. Bearer authentication with Odoo API keys.
Tested with the official MCP Python SDK in both modes, on Odoo 18, 19 and 20.
Requirements and limits
Odoo 18.0, 19.0 or 20.0. Use the branch that matches your Odoo version.
Not available on Odoo Online, where Odoo does not allow modules with Python code. Odoo.sh and self-hosted servers work.
The address
/mcpmust reach the right database: the server hosts one database, or a database filter (dbfilter) maps the hostname to it. Odoo 19 and 20 also accept anX-Odoo-Databaseheader.Web connectors that only sign in with OAuth (Claude.ai, ChatGPT) cannot use API keys. They need MCP Server Pro.
MCP Server Pro
MCP Server Pro ($89 per Odoo version, on the Odoo Apps store) adds:
OAuth 2.1 sign-in for web connectors such as Claude.ai and ChatGPT, following the MCP authorization specification (protected resource metadata, client ID metadata documents, dynamic client registration, PKCE, refresh token rotation)
Create and update tools, per model: read only, approve first, or allowed
Approval of changes inside Odoo before anything is written
Daily limits per user, and a list of connected applications that can be disconnected
Questions
Odoo 20 Enterprise has its own MCP. Why this module? It works on Community and on Odoo 18, 19 and 20, does not use Odoo AI credits, lets you choose the exposed models, and logs every call.
Where does my data go? Only to the AI application a user connects, in answer to its requests, and from there to the AI provider behind it.
Can the assistant change or delete records? Not with this module. It has no write or delete tools.
Support
Questions and bug reports: odoo@calderkit.com. We answer in writing within two business days.
License
Available Tools
7 toolsodoo_aggregateTotals by groupARead-onlyIdempotent
Group the records of one model that match a domain and compute totals per group, e.g. sales per customer per month, and return {model, groupby, measures, count, rows} with one key per groupby item and measure in each row; many2one groups come as {id, name}. Without groupby it returns one row for all matching records. Use it for sums, averages or counts per group instead of reading many records; use odoo_count for a single number and odoo_search for the records themselves.
Inputs: model (required), limit, order, domain, +2 more.
odoo_contextCurrent user and dateARead-onlyIdempotent
Return the session context: who you are connected as (user id, name, login), the current company and its currency, the companies you can access, language, time zone, today's date in that time zone ('YYYY-MM-DD'), the current UTC date and time ('YYYY-MM-DD HH:MM:SS') and the Odoo version. Use it to resolve relative dates such as 'last quarter', the current user or company, or the current company's currency. It reads no business records. No arguments.
odoo_countCount recordsARead-onlyIdempotent
Count the records of one model that match a domain and return {model, count}. Use it when you need only the number: it reads no records, so it is cheaper than odoo_search. Without a domain it counts every record you can see, archived ones excluded. For counts per group use odoo_aggregate with '__count'; to get the records use odoo_search.
Inputs: model (required), domain.
odoo_describe_modelDescribe a modelARead-onlyIdempotent
Describe the fields of one model: for each field its type, label, related model (and whether that model is available too), selection values, help text, and required, readonly or not-stored flags. Also returns the model's hint, default_fields and max_records_per_call. Use it before filtering, sorting, grouping or choosing fields on a model you have not used yet; it returns no records (use odoo_search for data). Passwords, tokens, keys, files and fields hidden by the administrator are never listed and cannot be used.
Inputs: model (required).
odoo_list_modelsList available modelsARead-onlyIdempotent
List the Odoo models (tables) you may query, all in one response: technical name, label, the administrator's hint about what each one holds, and can_write (whether changes are allowed on it). Only models enabled by the administrator that you can read are included. Use it to find a model name you do not know yet; use odoo_describe_model for a model's fields and odoo_search for its records.
Inputs: search.
odoo_readRead recordsARead-onlyIdempotent
Read specific records of one model by id, at most 100 per call, and return their fields as {model, count, records}. Use it when you already have ids (from odoo_search, a relation field or the user); to find records by criteria use odoo_search, for a number only odoo_count. Ids that do not exist are listed in missing_ids instead of failing; if one of the records is outside your access rights, the call fails with an access error. Values are formatted as in odoo_search.
Inputs: ids (required), model (required), fields.
odoo_searchSearch recordsARead-onlyIdempotent
Find the records of one model that match a domain and return one page of them with the requested fields, plus total (all matches), offset and has_more; page with offset while has_more is true. Use it when you need the records themselves. For known ids use odoo_read, for a number only odoo_count, for totals per group odoo_aggregate. You only see records your access rights allow. Many2one values come as {id, name}, one2many and many2many as {count, ids} (first 50 ids), long texts are cut at 4,000 characters.
Inputs: model (required), limit, order, domain, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
Each tool targets a distinct operation: context, model discovery, field description, search, read-by-id, count, and aggregate. Descriptions explicitly cross-reference the alternatives (e.g. 'for a number only use odoo_count'), leaving no realistic room for misselection.
All names share a consistent odoo_ prefix and snake_case, with clear verb_noun patterns (list_models, describe_model, search, read, count, aggregate). Only odoo_context is a bare noun rather than a verb phrase, a minor deviation.
Seven tools is well-scoped for a generic, model-agnostic query layer over Odoo. Every tool earns its place, and the fact that Odoo has hundreds of models is handled through discovery rather than per-model tools.
Read coverage is complete: discovery, schema, search, read-by-id, count, aggregate, and session context, with no dead ends for querying. However, odoo_list_models exposes a can_write flag implying write access, yet no create/update/delete tool exists, so any mutation request is a guaranteed dead end.
Maintenance
Related MCP Connectors
Odoo MCP connector for ChatGPT and Claude: ask sales, invoices and stock in plain words. Read-only.
Odoo MCP Pack — ERP/CRM via Odoo's external JSON-RPC API.
Odoo virtual employee via MCP: query, create, modify records, workflows, PDFs, and activities.
Read, write and run Odoo actions from any AI app, as each user, with approval rules per colleague.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Odoo data using natural language to search, read, create, and update records. It acts as a secure bridge between MCP clients and Odoo instances version 17.0 through 19.0.11Apache 2.0
- AlicenseAqualityBmaintenanceMCP Server for Odoo 19 using JSON-2 API, built with FastMCP114Apache 2.0
- 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 gradedqualityDmaintenanceProduction-grade Odoo add-ons that expose Odoo business functionality to MCP-compliant clients over HTTP with OAuth 2.1, per-user permission enforcement, write-confirmation safety, and full audit logging.-