Skip to main content
Glama
dannyg-sys

Odoo MCP Server

by dannyg-sys

Odoo MCP Server

License: MIT TypeScript MCP

An MCP (Model Context Protocol) server for managing Odoo development environments with AI assistants.

🎯 Overview

This MCP server provides 19 tools to manage Odoo development environments, allowing AI assistants to:

  • Control Odoo server (start, stop, restart, status)

  • Manage modules (update, install, test)

  • Switch between databases

  • Navigate project directories

  • View logs and configurations

Perfect for developers who want their AI assistants to remember and manage Odoo operations consistently across conversations.

Related MCP server: MCP Odoo Server

Architecture & the two surfaces

The management logic lives once, in src/core.ts, and is reached through two thin entry points plus a Claude Code skill:

src/core.ts    All Odoo logic + smart output filtering (single source of truth)
src/index.ts   MCP server  → for Claude Desktop        (build/index.js)
src/cli.ts     odoo-cli    → for Claude Code / terminal (build/cli.js)

Skills and MCP reach your machine through different doors, so each Claude surface uses the entry point that fits it:

Surface

How it reaches local Odoo

What it uses

Claude Desktop

a local MCP process it launches

the MCP server (build/index.js)

Claude Code

host shell access

the odoo-manage skill → odoo-cli

Why the split: a Claude Desktop skill runs sandboxed and cannot execute the local CLI, so Desktop needs the MCP (a real local process) to touch your Odoo install. Claude Code has host shell access, so a skill calling odoo-cli is the lighter option there — the 19 MCP tool schemas don't have to sit in context. Both paths run the same core.ts, including the identical output filtering.

The Claude Code skill lives at ~/.claude/skills/odoo-manage/SKILL.md (it calls build/cli.js, also installed as the odoo command). The orientation that Desktop needs is carried by the MCP itself — the odoo-help prompt and the tool descriptions — so no separate Desktop skill is required.

The stream capability — pull a remote nellika.sh / tcff Odoo database + filestore (over SSH, pg_dump | pg_restore and tar | tar, in parallel, no temp files) straight into the active local project — has a single implementation (the stream verb in manage_odoo.sh) exposed three ways: the odoo stream CLI command, the odoo_project action=stream MCP action, and a dedicated odoo-stream Claude Code skill. The skill is vendored under skill-stream/ (rendered to ~/.claude/skills/odoo-stream/ by the installer) and is just a thin wrapper that execs the engine verb. Local Postgres major must be ≥ the remote's (production is PG17).

The bash engine manage_odoo.sh is vendored at scripts/manage_odoo.sh and installed as the manage_odoo command; core.ts invokes it by absolute path and passes ODOO_BASE so it operates on the resolved base.

Environment layout this manages

  • Base (fixed): ~/odoo — holds the active odoo.conf and one odoo-<project>.conf per project. (Legacy location ~/git/odoo18 is used as a fallback until the base is moved.)

  • Sources live inside the base, _-prefixed so they stand out from the unprefixed project addon symlinks: _odoo18/ (CE 18), _enterprise18/ (EE 18), _odoo19/ (CE 19), _enterprise19/ (EE 19), plus _venv18/, _venv19/, and _data/.

  • 18 vs 19 is per-project, not a separate tree. The active odoo.conf selects it via its ; odoo_src / ; python_venv markers and addons_path. Switching project (odoo_switch_database / odoo switch) is what changes the running version — there is no version flag to set.

Features

  • Server Control: Start, stop, restart, and check status of Odoo server

  • Module Management: Update, install, and manage Odoo modules

  • Frontend Updates: Update frontend modules with automatic server restart

  • Testing: Run Odoo tests with optional filtering

  • Database Management: Switch between databases, list available databases

  • Backups & fresh DBs: Import a backup (.zip/.sql/.dump) or reset to a fresh DB

  • Production sync (stream): Stream a remote nellika.sh/tcff Odoo db+filestore (over SSH, in parallel, no temp files) into the active local project

  • Logging: Retrieve Odoo log entries

Installation

1. Install Dependencies

cd ~/git/odoo-mcp-server
npm install

2. Configure Claude Desktop

Add to your Claude Desktop config file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "odoo": {
      "command": "node",
      "args": ["/Users/dgoo2308/git/odoo-mcp-server/build/index.js"]
    }
  }
}

3. Restart Claude Desktop

The Odoo management tools will now be available in Claude.

Terminal commands (odoo / manage_odoo)

npm run setup (below) installs two commands into ~/.local/bin:

  • odoo — the smart front door (build/cli.js): same code as the skill/MCP, with output filtering and path helpers. Use this.

  • manage_odoo — the raw bash engine (scripts/manage_odoo.sh): same verbs, unfiltered output. Operates on $ODOO_BASE (default ~/odoo).

# examples
odoo status
odoo list
odoo switch verita
odoo update nell_thai_qr --error-only
odoo test purchase_dual_unit
odoo import ~/Downloads/backup.zip --neutralize   # drops+restores the active DB
odoo stream tcff_production_odoo --neutralize      # stream remote prod db+filestore into the active project
odoo logs --lines 200

Run odoo help for the full command list. Result text goes to stdout; [Executing]/[Success] diagnostics go to stderr. Options: --error-only, --tags <tags>, --lines <n>, --base <path> (default ~/odoo, fallback ~/git/odoo18).

Install everything (skill + commands)

install.sh installs all three pieces: the odoo-manage Claude Code skill, the odoo command, and the manage_odoo command.

cd ~/git/odoo-mcp-server
npm run setup        # or: ./install.sh

The installer builds build/cli.js if needed, renders the skill with the absolute path of this checkout (so it works no matter where the repo is cloned), and symlinks odoo / manage_odoo into ~/.local/bin. Re-run with --force to overwrite an existing skill file (./install.sh --force). Env: ODOO_BIN_DIR (default ~/.local/bin), CLAUDE_SKILLS_DIR (default ~/.claude/skills). Start a new Claude Code session to pick up the skill.

To set this up on another computer:

git clone https://github.com/dannyg-sys/odoo-mcp-server.git ~/git/odoo-mcp-server
cd ~/git/odoo-mcp-server
npm install && npm run build
npm run setup

Bootstrap a fresh Odoo base

npm run setup installs the tooling. To create the Odoo base itself on a new machine (the ~/odoo layout: clone CE 18/19 + Enterprise 18/19, build the per-version venvs, seed _data/_scripts/_concepts, the docs, and a sample config), run the environment bootstrap:

npm run setup-env        # or: ./scripts/setup_odoo_env.sh

Requires git, Python 3.10+, PostgreSQL, and GitHub access to the private odoo/enterprise repo (SSH key or HTTPS token). Env vars: ENTERPRISE_REMOTE=https, SKIP_ENTERPRISE=1, FULL_CLONE=1, PYTHON=python3.11, ODOO_BASE=/path. Idempotent — re-running skips what already exists.

Available Tools

The MCP exposes four tools, each taking an action (kept small so Claude Desktop reliably loads them all):

  • odoo_server — action: start | stop | restart | status | shell

  • odoo_modules — action: update | install | frontend | test (modules, testTags, errorOnly); output is filtered to errors/warnings

  • odoo_project — action: list | switch | new | import | fresh | stream (project, name, odooVersion, enterprise, modules, repo, httpPort, backupFile, remoteHost, remoteDb, remoteDataDir, dbOnly, filestoreOnly, neutralize, noStart). Destructive: import/fresh/stream drop the active DB; new creates the named DB.

  • odoo_info — action: logs | config-path | project-config | project-dir | addons-dir | enterprise-dir (project, lines)

The odoo-help prompt documents the same. (The CLI / odoo command keeps the full set of named subcommands — see "Terminal commands" above.)

Usage Examples

"Start Odoo"
"Update the purchase_dual_unit module"
"Install stock_account and hr modules"
"Run tests for the sale module"
"Switch to the nellika database"
"Stream tcff production into my local project and neutralize it"
"Show me the last 100 log lines"
"Where is the project directory for hhfbs?"
"What's the path to the Odoo core addons?"
"Show me the enterprise directory"

Configuration

Choosing the Odoo version

You normally don't. The Odoo version (18 vs 19) is selected per project by the active odoo.conf — switch project with odoo_switch_database (or odoo switch <project>) and the version follows. See Environment layout.

Using a different base directory

The base defaults to ~/odoo, falling back to ~/git/odoo18. To target a different base, pass an absolute path: the MCP tools accept a version argument and the CLI accepts --base <path>. The directory must look like an Odoo base (have an odoo.conf or at least one odoo-<project>.conf).

odoo status --base /path/to/some/base

After changing source, rebuild:

npm run build

Requirements

  • Node.js 16+

  • An Odoo base directory (~/odoo) with project configs; the manage_odoo.sh engine is installed by npm run setup

  • Claude Desktop (MCP) and/or Claude Code (skill + odoo command)

Development

# Build
npm run build

# Watch mode (auto-rebuild)
npm run watch

Troubleshooting

Server not found in Claude

  1. Check Claude Desktop config file path

  2. Ensure build directory exists: ls ~/git/odoo-mcp-server/build/

  3. Restart Claude Desktop completely

Commands failing

  1. Check the base path exists: ls ~/odoo (or the legacy ~/git/odoo18)

  2. Verify the engine is installed: command -v manage_odoo

  3. Check logs with odoo logs (or the odoo_get_logs MCP tool)

License

MIT

Available Tools

4 tools
odoo_infoB

Inspect the active project. action: logs (tail the full odoo.log) | config-path | project-config | project-dir | addons-dir (active core source: _odoo18 or _odoo19) | enterprise-dir.

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNoNumber of log lines (logs)
actionYesWhat to inspect
projectNoProject name (project-config / project-dir)

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden of behavioral disclosure. It does add useful context, such as 'logs (tail the full odoo.log)' and 'addons-dir (active core source: _odoo18 or _odoo19)', and the verb 'inspect' signals a read-only intent. However, it does not disclose return formats, output types, or any potential side effects, so transparency is only partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the core purpose and lists actions with useful parenthetical details. It is efficient and free of filler, though the pipe-separated style is somewhat dense and could be more readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a small inspection tool with no output schema and no annotations, the description covers the main actions but leaves some return semantics unclear (e.g., what exactly config-path or project-config returns). The schema fills parameter gaps, but the overall tool context is adequate rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 even though the description does not deeply explain parameters. The description adds minor clarifications (e.g., that addons-dir refers to _odoo18 or _odoo19 source), but it does not explain the 'lines' parameter or the 'project' parameter beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource ('Inspect the active project') and enumerates six concrete actions, so an agent knows exactly what the tool does. It does not explicitly differentiate from sibling tools like odoo_server or odoo_project, but the inspection-focused scope and action list make the purpose reasonably distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus its siblings (odoo_server, odoo_modules, odoo_project). The action list implies an inspection use case, but there are no exclusion criteria, no 'instead use X' statements, and no conditions for choosing this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

odoo_modulesA

Update/install/test Odoo modules in the active project. action: update | install | frontend | test. 'modules' is a comma-separated list (required for update/install/frontend; optional for test = all). Output is filtered to errors/warnings; use odoo_info action=logs for the full log.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do
modulesNoComma-separated modules (e.g. 'sale,account'); optional for test
testTagsNoTest tags filter (test only), e.g. 'at_install'
errorOnlyNoSuppress warnings, show only errors

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses that output is filtered to errors/warnings and points to an alternative for the full log. With no annotations present, the description carries the full burden, and it does not disclose potential side effects of update/install/frontend actions (e.g., project mutation, server restart), which is a notable gap for a mutating tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The main action is front-loaded, and each sentence contributes distinct information: the action set/modules requirement and the output filtering/fallback behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the action set, modules requirements, and output behavior including a fallback for full logs. It is largely sufficient for a 4-parameter tool with no output schema, though it leaves 'frontend' undefined and does not describe success/error return shapes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, providing a baseline of 3. The description adds value by specifying action-dependent requirements for modules (required for update/install/frontend; optional for test = all), which is not fully captured in the schema. testTags is left to the schema, but the added semantics justify a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the operation (Update/install/test) and the resource (Odoo modules in the active project), and enumerates the valid action values. It falls short of 5 because 'frontend' is not explained, leaving some ambiguity about what that action does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly directs the agent to use odoo_info action=logs when the full log is needed, and clarifies when modules is required vs optional by action. However, it does not provide guidance on when to use this tool versus odoo_server or odoo_project.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

odoo_projectA

Manage projects and their databases. action: list (projects + active one) | switch (activate odoo-.conf and restart; also changes the running Odoo 18/19) | new (scaffold a new project) | import (load a backup into the active DB) | fresh (reset the active DB to a fresh one initialized with base, + 'modules') | stream (stream a remote nellika.sh/tcff Odoo db+filestore over SSH into the active project). DESTRUCTIVE: import/fresh/stream drop the active DB; new creates/recreates the named DB.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew project name (new) — used for odoo-<name>.conf, the database, and the ./<name> addons symlink
repoNoPath to symlink ./<name> at (new; default ~/git/<name>)
actionYesWhat to do
dbOnlyNoRestore DB only, skip filestore (import/stream)
modulesNoComma-separated modules to install (new) or initialize (fresh), e.g. 'sale,account,stock'
noStartNoDo not start Odoo afterwards (new/import/fresh/stream)
projectNoProject name (switch)
httpPortNohttp_port for a new project (new; default 8069)
remoteDbNoOverride the auto-discovered remote db name (stream)
backupFileNoBackup file path (import): .zip / .sql / .sql.gz / .dump
enterpriseNoInclude enterprise addons (new)
neutralizeNoNeutralize the DB after import/stream (disable mail/crons/payments)
remoteHostNoRemote SSH host to stream from (stream), e.g. 'nellika_production_odoo'
odooVersionNoOdoo version for a new project (new)18
filestoreOnlyNoStream the filestore only, skip the database (stream)
remoteDataDirNoOverride the auto-discovered remote data_dir (stream)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly warns that import/fresh/stream drop the active DB and that new creates/recreates the named DB, and it notes that switch restarts Odoo and changes the running version. This is strong transparency, though it does not cover prerequisites like SSH access or auth expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficiently packed: it opens with the tool's purpose, enumerates all six actions in a scannable pipe-separated format, and closes with the critical destructive warning. A little more visual separation between actions would improve readability, but there is no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (16 parameters, 6 distinct actions, no output schema, no annotations), the description covers the essential behavioral outcomes for every action and flags destructive operations. It does not describe return values or error behavior, but the lack of an output schema and the action-focused nature of the tool make this a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the input schema already documents all parameters. The description adds contextual meaning by mapping actions to their effects and mentioning that fresh initializes with 'modules', but it does not go beyond the schema at the parameter level. A baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as managing Odoo projects and their databases, with each supported action explicitly defined. It differentiates itself from sibling tools by focusing on project/database lifecycle operations rather than server, module, or info queries, but does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action (list, switch, new, import, fresh, stream) has a concise one-line description that tells an agent what scenario it maps to. There is no explicit exclusion guidance or comparison against sibling tools, but the action-level context is sufficient for correct tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

odoo_serverA

Control the Odoo server for the active project. action: start | stop | restart | status | shell (shell prints the command to open an interactive shell).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It does disclose one non-obvious behavior: "shell prints the command to open an interactive shell" rather than executing it. However, it does not mention side effects of start/stop/restart, permissions required, or failure behavior, leaving some transparency gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the tool's purpose and then lists the action values inline. Every part contributes useful information, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (one required parameter with an enum) and no output schema, the description provides enough context to invoke the tool correctly. It explains the actions and the special shell behavior; the only minor gap is not specifying prerequisites like whether the Odoo server must already be installed or how the active project is determined.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only calls the parameter "action" and describes it as "What to do", with enum values provided. The description adds value by enumerating the allowed actions and clarifying the special behavior of the shell action, going beyond the schema's minimal documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (Odoo server) and the action set (start, stop, restart, status, shell), using a specific scope: "for the active project". It distinguishes itself from sibling tools like odoo_modules and odoo_info by focusing on server lifecycle control rather than module or info operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool by listing server-control actions and scoping to the active project, but it does not explicitly state when not to use it or name alternatives. An agent can infer server administration is the intended use, but there is no direct comparison to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 4 tool updatesv1.0.0
    • First observedodoo_info
    • First observedodoo_modules
    • First observedodoo_project
    • First observedodoo_server

TDQS

A3.9/5.0

Scored across 4 tools

Disambiguation4/5

The four tools are split into clearly distinct domains: server control, module operations, project inspection, and database/project management. Mild overlap remains because odoo_project=switch performs a restart and odoo_modules refers to odoo_info=logs for full output, but the descriptions prevent serious confusion.

Naming Consistency5/5

All tool names follow the same odoo_<noun> snake_case pattern, making the namespace easy to predict. The subactions are lowercase and consistent enough within each tool.

Tool Count5/5

Four tools is within the ideal range and each tool represents a meaningful high-level area of Odoo work. No tool feels redundant; the small count keeps the surface navigable while covering server, module, info, and project concerns.

Completeness4/5

Core workflows are covered: starting/stopping the server, updating/installing/testing modules, inspecting logs/config, and managing project databases. Obvious gaps include no module scaffolding, no project deletion, and no database export/backup, but these are workable edge cases rather than core dead ends.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables AI agents to interact with Magento 2 development environments through comprehensive tools for module management, database operations, cache control, configuration management, and system diagnostics. Supports complete development workflows from module creation to deployment and troubleshooting.
    28
    24 npm
    40
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Odoo databases via XML-RPC and JSON-RPC for performing CRUD operations and managing modules. It supports advanced features like domain-based searching, field metadata inspection, and administrative task execution.
    5 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    An Odoo module that embeds an MCP server, enabling AI agents to directly access Odoo capabilities such as terminal control, database operations, filesystem management, ORM execution, and service administration.
    4
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to fully control and manage Odoo 18 ERP instances through 79 tools, including configuration, data operations, reporting, and code generation, with built-in domain knowledge and specialist agents.
    5
    AGPL 3.0