Odoo MCP Server
Provides tools for controlling Odoo server (start, stop, restart, status), managing modules (update, install, test), switching databases, navigating project directories, viewing logs and configurations, importing backups, and streaming remote databases.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Odoo MCP ServerStart the Odoo server"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Odoo MCP Server
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 ( |
Claude Code | host shell access | the |
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 activeodoo.confand oneodoo-<project>.confper project. (Legacy location~/git/odoo18is 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.confselects it via its; odoo_src/; python_venvmarkers andaddons_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 projectLogging: Retrieve Odoo log entries
Installation
1. Install Dependencies
cd ~/git/odoo-mcp-server
npm install2. 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 200Run 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.shThe 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 setupBootstrap 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.shRequires 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|shellodoo_modules—action:update|install|frontend|test(modules,testTags,errorOnly); output is filtered to errors/warningsodoo_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/streamdrop the active DB;newcreates 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/baseAfter changing source, rebuild:
npm run buildRequirements
Node.js 16+
An Odoo base directory (
~/odoo) with project configs; themanage_odoo.shengine is installed bynpm run setupClaude Desktop (MCP) and/or Claude Code (skill +
odoocommand)
Development
# Build
npm run build
# Watch mode (auto-rebuild)
npm run watchTroubleshooting
Server not found in Claude
Check Claude Desktop config file path
Ensure build directory exists:
ls ~/git/odoo-mcp-server/build/Restart Claude Desktop completely
Commands failing
Check the base path exists:
ls ~/odoo(or the legacy~/git/odoo18)Verify the engine is installed:
command -v manage_odooCheck logs with
odoo logs(or theodoo_get_logsMCP tool)
License
MIT
Available Tools
4 toolsodoo_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.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Number of log lines (logs) | |
| action | Yes | What to inspect | |
| project | No | Project name (project-config / project-dir) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What to do | |
| modules | No | Comma-separated modules (e.g. 'sale,account'); optional for test | |
| testTags | No | Test tags filter (test only), e.g. 'at_install' | |
| errorOnly | No | Suppress warnings, show only errors |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New project name (new) — used for odoo-<name>.conf, the database, and the ./<name> addons symlink | |
| repo | No | Path to symlink ./<name> at (new; default ~/git/<name>) | |
| action | Yes | What to do | |
| dbOnly | No | Restore DB only, skip filestore (import/stream) | |
| modules | No | Comma-separated modules to install (new) or initialize (fresh), e.g. 'sale,account,stock' | |
| noStart | No | Do not start Odoo afterwards (new/import/fresh/stream) | |
| project | No | Project name (switch) | |
| httpPort | No | http_port for a new project (new; default 8069) | |
| remoteDb | No | Override the auto-discovered remote db name (stream) | |
| backupFile | No | Backup file path (import): .zip / .sql / .sql.gz / .dump | |
| enterprise | No | Include enterprise addons (new) | |
| neutralize | No | Neutralize the DB after import/stream (disable mail/crons/payments) | |
| remoteHost | No | Remote SSH host to stream from (stream), e.g. 'nellika_production_odoo' | |
| odooVersion | No | Odoo version for a new project (new) | 18 |
| filestoreOnly | No | Stream the filestore only, skip the database (stream) | |
| remoteDataDir | No | Override the auto-discovered remote data_dir (stream) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What to do |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v1.0.0- First observed
odoo_info - First observed
odoo_modules - First observed
odoo_project - First observed
odoo_server
TDQS
Scored across 4 tools
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.
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.
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.
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
Related MCP Connectors
- Zoxron MCPOAuthcom.zoxron
Your AI agent deploys, migrates & upgrades self-hosted Odoo ERP on a server you own.
Develop, manage, and debug Railway projects, services, and deployments from within agents.
- odooOAuthcom.odooconsole
Odoo ERP for AI agents: hosted OAuth endpoint, gated writes, one endpoint for every instance.
Manage Appwrite projects, databases, auth, storage, functions, and messaging; search Appwrite docs
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables 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.2824 npm40MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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 npmMIT
- FlicenseNot gradedqualityDmaintenanceAn 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-
- AlicenseNot gradedqualityDmaintenanceEnables 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.5AGPL 3.0