Skip to main content
Glama
odoo-mcp-server

odoo-mcp-server

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 /mcp inside 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

odoo_context

Who is connected, the company, the language, the time zone and today's date, so "last quarter" means the right dates

odoo_list_models

The models the assistant may use, with a short hint for each

odoo_describe_model

The fields of a model: type, label, relation, selection values

odoo_search

Search records with any Odoo domain, sorted and paged, with the total number of matches

odoo_read

Read records by ID

odoo_count

Count the records that match a domain

odoo_aggregate

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

  1. 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).

  2. 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" }
    }
  }
}
  1. 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-Method and Mcp-Name header checks.

  • MCP 2025-11-25, 2025-06-18 and 2025-03-26 through the initialize handshake.

  • 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 /mcp must 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 an X-Odoo-Database header.

  • 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

LGPL-3.0. See LICENSE. Made by Calderkit.

Available Tools

7 tools
odoo_aggregateTotals by groupA
Read-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 dateA
Read-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 recordsA
Read-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 modelA
Read-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 modelsA
Read-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 recordsA
Read-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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 7 tools

    Disambiguation5/5

    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.

    Naming Consistency4/5

    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.

    Tool Count5/5

    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.

    Completeness3/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables 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.
      11
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables interaction with Odoo 18 (JSON-RPC API) via MCP, supporting model exploration, CRUD operations, and secure API key authentication.
      Apache 2.0
    • F
      license
      Not graded
      quality
      D
      maintenance
      Production-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.
      -