Installation¶
New in v1.6.0
- Install commands by surface:
/plugin install ...inside Claude Code, orclaude plugin install ... --scope userin a terminal. A/plugincommand typed in PowerShell fails. See As a Claude plugin. - Two copies of odoo-tools: the signs, and the copies check and the options check that leave one current copy. See Two copies of odoo-tools.
odoo_versionnames the copy that answers (pluginblock). See Verify.- Windows: without the
python3command,claude mcp listreports the server asFailed to connectwithConnection closed. The PowerShell command that fixes it is in Requirements. - The
not_startedstatus and a local session: the statusnot_startedwith the reasonuser_config_unsupportedis the Cowork and Claude chat case, and no update changes it. Use a local session of the Code tab or Claude Code on your computer; Claude Code needs no administrator rights. See As a Claude plugin. - Docker: the sandbox of Odoo 14.0 to 19.0 comes with an API key for
the plugin (see Local deployment), and the container
mode image is
ghcr.io/transgenia/odoo-mcp-tools:1.6.0.
New in v1.5.1
- New session-start hook,
hooks/session_start.py, in place ofhooks/check_options.py: it reads no plugin option and no credential. When the last 14 days record neither a successful connection to Odoo nor a server start with every connection setting, it says where the Odoo tools run. See Verify. - Local diagnostics: the server writes metadata to
${CLAUDE_PLUGIN_DATA}/diagnostics(ODOO_DIAG_DIR), and/odoo-tools:odoo-doctorturns it into a support report. See Support. - Credentials: the server no longer reads
ODOO_HTTP_BEARER; it reads only the API key or password that the plugin options pass to it. - Docker: the container mode of
/odoo-tools:deploy-localmarks the plugin's data folder so that the hook stays silent, and its image isghcr.io/transgenia/odoo-mcp-tools:1.5.1.
New in v1.5.0
Secure permissions by default. To keep the 1.4 behavior, set the
Permission profile option to full.
- Two new options, both with defaults: Permission profile
(
standard; alsoreadonly,builderorfull) and Permission policy file (empty, or the absolute path to a JSON file with per-model rules). See Permission policy. - Read-only mode now hides the write tools (calling one still explains why it is refused).
- Audit log: the server writes one line per tool call to the plugin's
data folder (
${CLAUDE_PLUGIN_DATA}/audit), and keeps it 90 days. - Offline check of a policy file with
--check-policy. - Docker: the environment file can set the policy and the audit folder; the header-based multi-tenant path was removed.
- The container mode image is
ghcr.io/transgenia/odoo-mcp-tools:1.5.0.
New in v1.4.1
A documentation and diagnostics release: the MCP server's behavior does not change.
- One-step install:
/plugin install odoo-tools --marketplace Transgenia/MCP-Odoo-Tools-CE-EE-and-online(Claude Code 2.1.275 or later). On older versions the usual two commands still work. - Where the tools run: the Odoo tools run in Claude Code; Cowork and Claude chat load the skills and commands without the tools. See Where it works.
- Missing-options notice at session start: a second
SessionStarthook tells you which required options (URL, database, login) have no saved value. It never reads the API key or password. See Security. - Configuration without a dialog:
claude plugin configure(Claude Code 2.1.285 or later) for remote or headless machines. - Windows: the session-start hooks need Git Bash (see Requirements).
- The container mode image is
ghcr.io/transgenia/odoo-mcp-tools:1.4.1.
New in v1.4.0
- 28 tools: six new ones for Odoo Online, useful on any Odoo 10-19
(
odoo_online_profile,odoo_api_catalog,odoo_access_check,odoo_record_documents,odoo_import_preview,odoo_import). See the Tools reference. - JSON-2 transport: on Odoo saas~18.4 / 19.0+ with an API key,
automode uses Odoo's new JSON-2 API, because Odoo 22 and Odoo Online saas~21.1 remove/xmlrpcand/jsonrpc. Newjson2value for Transport preference. See Compatibility. odoo_read_groupusesformatted_read_groupfrom saas~18.4 on and keeps its classic output.- Odoo Community 10.0 to 19.0 sandbox (was 16.0 to 19.0). See Local deployment.
- Fixed:
odoo_versionno longer reports success with a wrong API key or password; an HTTP 429 no longer switches transport.
New in v1.3.0
- Guided route:
/odoo-tools:odoo-setup-mcpwalks you through setup, verification, training, daily use and deployment. See Quickstart. - Local infrastructure:
/odoo-tools:deploy-localstarts an Odoo 16-19 sandbox on Docker, or the MCP server as a container (ghcr.io/transgenia/odoo-mcp-tools) for machines without Python. See Local deployment. - Releases and packages: every version is published as a GitHub Release (plugin zip + sdist/wheel) and as a GHCR image.
- Support: connection errors say how to fix them and whom to contact. Nothing to reconfigure when you update.
Changes in v1.2.0
Starting with version 1.2.0, the MCP server no longer uses uv (nor
uv run --frozen). The plugin launches it with python3 directly from the
bundled source, with no third-party runtime dependencies (Python
standard library only): nothing is installed or downloaded at start, and
server/uv.lock was removed. You do not need to reconfigure anything:
the plugin options you already entered are kept; you just need python3
3.9 or newer on the PATH instead of uv (see Requirements below).
Also:
- Timeout: the
ODOO_TIMEOUTdefault goes from 30 to 120 s (Odoo's defaultlimit_time_real), and it is now the Request timeout plugin option. XML-RPC honors it too: before, an unresponsive Odoo could block an XML-RPC call indefinitely. - All 9 skills and commands now load. Before, a
skills/SKILL.mdat the root ofskills/hid 5 of the 6 skills, so/odoo-tools:odoo-setup-mcpdid not exist. - Fixed a deadlock in
odoo_versionon Community instances. - Tool arguments are validated against each tool's schema: if they do
not match, the call is refused with
Input validation error: ...before reaching Odoo. - In
automode, a write is never replayed over XML-RPC after a timeout or an HTTP 5xx: the error says the call "may or may not have been applied". See Troubleshooting.
Changes in v1.1.0 / migration
Starting with version 1.1.0, the plugin is configured through plugin
options (userConfig) and no longer reads ODOO_* environment
variables from your shell. If on v1.0.0 you exported ODOO_* in
~/.bashrc, ~/.zshrc or with setx, enter those values once in
/plugin → odoo-tools → Configure options (you can then remove them
from your shell profile). The standalone server (Docker,
python -m odoo_mcp) still reads the ODOO_* variables.
As a Claude plugin (recommended)¶
Install it once, from Transgenia's marketplace, in one of these two ways.
Inside Claude Code (typed in a session):
/plugin install odoo-tools --marketplace Transgenia/MCP-Odoo-Tools-CE-EE-and-online
/odoo-tools:odoo-setup-mcp
In a terminal (PowerShell, Terminal or bash), for every folder:
claude plugin install odoo-tools --marketplace Transgenia/MCP-Odoo-Tools-CE-EE-and-online --scope user
then start Claude Code and type /odoo-tools:odoo-setup-mcp. A /plugin
command goes inside Claude Code, never in the terminal: typed in PowerShell, it
fails with a "not recognized" error. A claude plugin command goes in the
terminal, never in the chat. On Windows, if claude is not recognized right
after you install Claude Code, open a new PowerShell window (see
Requirements).
The first form adds the marketplace and installs the plugin in one step (Claude
Code 2.1.275 or later). On an older Claude Code, which has no --marketplace
flag, add the marketplace first, inside Claude Code:
Claude Code needs no administrator rights: its native installer puts it in
your home folder (~/.local/bin/claude on macOS and Linux), and on Windows
Anthropic's guide says you do not need to run it as Administrator. On a Team or
Enterprise plan your organization decides which plugins you get and whether
the Code tab of Claude Desktop offers local sessions.
The Claude plugin directory publishes a version only after Anthropic reviews it, so it can offer an older odoo-tools than Transgenia's marketplace (for example 1.4.0, before the permission policy of 1.5.0), and checking for updates in the Claude apps finds no newer version until then. In Cowork and Claude chat no version runs the Odoo tools, so an update does not change that there. Install one copy only: the guided route checks it (see Two copies of odoo-tools).
Claude Code prompts for the connection details when the plugin is enabled. To
change them later: /plugin → odoo-tools → Configure options, or
/plugin configure <id> in a session (VS Code: the gear icon on the plugin's
row). The options dialog does not say which copy of the plugin it edits.
The plugin options exist only in Claude Code
Cowork does not prompt for plugin options and ignores this plugin's MCP
server, because its connection options have no default, and Claude chat
ignores a plugin's local MCP server. So the Odoo tools are not available in
either (the skills and commands still load). Claude Desktop names that case
for this plugin's server with the status not_started and the reason
user_config_unsupported; no update of the plugin changes it. A cloud
session of Claude Code is a separate case: it has the plugin synced but not
its options, which stay on the computer where you entered them, so use a
local session. On claude.ai on the web, the
plugin's three-dot menu offers actions such as remove, edit with Claude or
duplicate, and no place for the connection options. See
Where it works and
Troubleshooting.
Without the interactive dialog (claude plugin configure)¶
In scripts, or on remote or headless machines (Claude Code 2.1.285 or later):
claude plugin configure <id> --jsonlists the options without a saved value. On a working setup that list still holds the credential you do not use (API key or password) and the options that have defaults; onlyodoo_url,odoo_db,odoo_loginand one credential must be set.claude plugin configure <id> --values-stdinsaves values read from stdin as a JSON object of single-line strings. Restart Claude Code afterwards.
<id> is the full name@marketplace id that claude plugin list shows (for
example odoo-tools@synced for a plugin synced from your Claude account). Pipe
the JSON from a protected file or your secret manager; never type the key in
the command line or in the chat.
The plugin's mcpServers entry launches the server with:
run_stdio.py puts the bundled source in server/src first on sys.path (so
no other odoo_mcp package installed on your machine can shadow it) and starts
the stdio MCP server. The server uses only the Python standard library (the
MCP protocol and the JSON-2, JSON-RPC and XML-RPC transports are implemented
on it), so it
installs and downloads nothing at start: the code that runs is exactly the
readable code shipped in the plugin folder. No PyPI publication, no uv and no
virtualenv are needed.
Plugin options¶
| Option | Required | Notes |
|---|---|---|
| Odoo URL | yes | scheme + host, e.g. https://my-company.odoo.com (no trailing path) |
| Odoo database | yes | database name |
| Odoo login | yes | login (usually an email) of the Odoo user; prefer a least-privilege user |
| Odoo API key | yes* | Odoo ≥ 14: Preferences → Account Security → New API Key. Odoo 19+ needs it for JSON-2, the only API left in Odoo 22. sensitive option |
| Odoo password (Odoo < 14 only) | yes* | Odoo 10-13 only (no API keys). sensitive option |
| Transport preference | no | auto (default) / json2 / jsonrpc / xmlrpc. auto uses JSON-2 on Odoo saas~18.4 / 19.0+ with an API key, and JSON-RPC then XML-RPC otherwise |
| Request timeout | no | number, maximum seconds per Odoo call (default: 120, Odoo's default limit_time_real; min 5, max 3600); maps to ODOO_TIMEOUT |
| Read-only mode | no | boolean (default: off); the write, delete, import and Studio tools are not listed, and calling one is refused before anything reaches Odoo (maps to ODOO_READONLY) |
| Permission profile | no | standard (default), readonly, builder or full: what the Odoo tools may do on top of the Odoo user's own access rights. full keeps the 1.4 behavior. See Permission policy (maps to ODOO_POLICY) |
| Permission policy file | no | empty (default), or the absolute path to a JSON file with per-model rules on top of the profile, e.g. ~/.config/odoo-tools/policy.json. Keep it outside your projects. Read once when the server starts (maps to ODOO_POLICY_FILE) |
* fill one of the two: API key (Odoo ≥ 14) or password (Odoo < 14).
The plugin's mcpServers entry also sets ODOO_AUDIT_DIR to
${CLAUDE_PLUGIN_DATA}/audit and ODOO_AUDIT_RETENTION_DAYS to 90: the server
writes one audit line per tool call, with names and counts, never values or
secrets (see Audit trail). Since v1.5.1 it also sets
ODOO_DIAG_DIR to ${CLAUDE_PLUGIN_DATA}/diagnostics: the server's local
diagnostics, metadata only (see Local storage).
The default profile is standard
Under standard, odoo_unlink, odoo_add_field and
odoo_add_automation are not listed, and, among other things, outbound
email (except internal notes) and changes to users, rights, modules and
settings are refused. If your workflow needs everything the Odoo user may
do, choose full; for fields, views and automations on a sandbox,
builder. A profile change needs a reconnect of the server (/mcp).
The sensitive options (API key and password) are entered masked and stored in
the operating system's secure credential store, never in settings.json or
your shell profile. You do not need to (and should not) export ODOO_* in
~/.bashrc, ~/.zshrc or with setx for the plugin.
Two copies of odoo-tools¶
Claude Code can run two copies with the same name at once, for example one from the Claude plugin directory in a project folder and one from Transgenia's marketplace for your user. Then the options you save can go to one copy while the tools of the other answer. The signs:
- Configure options shows no Permission profile (a copy older than 1.5.0);
odoo_versionanswers without apolicyblock;- the plugin's Errors tab says
Plugin option "odoo_url" isn't setfor a copy you never configured. That message comes from Claude Code: the copy it names (shown inclaude plugin list) has no saved options.
Since v1.6.0, odoo_version names the copy that answers (plugin.copy, see
Verify), and the guided route stops on a copy older than 1.5.0,
before any write.
The copies check and the options check¶
Inside Claude Code, the guided route (/odoo-tools:odoo-setup-mcp) and
/odoo-tools:odoo-doctor run the copies check and, for the copy it keeps, the
options check. These are the shell commands, which Claude runs for you in
Claude Code:
claude plugin list --json | python3 "${CLAUDE_PLUGIN_ROOT}/server/run_stdio.py" --check-copies
claude plugin configure <id> --json | python3 "${CLAUDE_PLUGIN_ROOT}/server/run_stdio.py" --check-options
${CLAUDE_PLUGIN_ROOT} is the plugin folder, and <id> the copy to keep, such
as odoo-tools@transgenia-odoo-tools. Each check reads on stdin the JSON that a
Claude Code command prints: it runs no program, contacts nothing and never
prints a sensitive value, whatever the input holds. Both read UTF-8, also from
a Windows pipe. It exits 0 when there is nothing to fix, 1 when there is
something, and 2 when the input is not that JSON; --json prints the report as
JSON. The options check needs Claude Code
2.1.285 or later. If claude is not found, its full path is
"$HOME/.local/bin/claude".
This is the copies check with an old copy from the directory in a project folder and a current one from Transgenia's marketplace:
odoo-tools copies Claude Code knows in this folder:
active odoo-tools@anthropic-plugin-directory 1.4.0 (project, ~/projects/odoo)
active odoo-tools@transgenia-odoo-tools 1.6.0 (user)
not loaded odoo-tools@synced unknown (synced from claude.ai): a copy on this computer has the same name and takes precedence
To fix:
- 2 copies are active at once, so Claude Code may use the tools of one and the options of another. Keep one: odoo-tools@transgenia-odoo-tools 1.6.0 (user).
- odoo-tools@anthropic-plugin-directory 1.4.0 (project, ~/projects/odoo) is older than 1.5.0: it has no permission policy, profile or audit log.
In a terminal (PowerShell, Terminal or bash), not inside Claude Code:
cd ~/projects/odoo
claude plugin uninstall odoo-tools@anthropic-plugin-directory --scope project
Then restart Claude Code, or run /reload-plugins inside it.
Result: 2 to fix
How to read it:
- Each copy comes with its state, id, version and scope:
active(loaded in this folder),not loaded(a claude.ai copy behind a local copy of the same name, which takes precedence),other folder(an installation of another folder, with the noteinstalled for that folder only) ordisabled. One plugin id installed in two scopes is one copy, and a project or local installation counts only in its own folder: its project folder, or a folder inside it. To fixsays what to correct: two copies active at once, or a copy older than 1.5.0, with no permission policy, profile or audit log. It names the copy to keep and prefers, in this order, one with the permission policy, the one from Transgenia's marketplace, the newest, and the one in your user scope.In a terminalgives the exact commands that remove the others: acdto the project folder, quoted when bash or PowerShell needs it (a Windows path is written with/), thenclaude plugin uninstall <id> --scope <scope>(for a copy in your user scope, only--scope user, with nocd). If the folder name contains",$,`,!,[or](wildcards for PowerShell'scd), or if it is a network path (with\), a comment line,# first change to this folder by hand: ..., comes instead of thecd: change to that folder yourself. Run them in PowerShell, Terminal or bash, never as/plugincommands, then restart Claude Code or run/reload-pluginsinside it.- A copy managed on claude.ai cannot be removed from the terminal: the
Note:line says to remove it there (Customize, Plugins). When every active copy is older than 1.5.0, it also gives the commands that leave a current copy. For an old copy from Transgenia's marketplace they areclaude plugin marketplace update transgenia-odoo-tools, thenclaude plugin update odoo-tools@transgenia-odoo-tools --scope <scope>, with acdto the project folder first for a project or local copy. Uninstalling and installing again can reuse an outdated local copy of the marketplace and put the same old version back. The update commands always work. For a copy from another marketplace, the commands that remove it, then the one that installs the copy from Transgenia's marketplace. When no copy is active, it gives the command that installs one. Before an install, when Transgenia's marketplace is already known, it updates it first. Result: ok, or how many things there are to fix.
The options check lists the Odoo URL, the database, the login, which credential
is set (API key, password or none, never its value), Read-only mode and,
on a copy with the permission policy, the profile and the policy file. Of the
URL it shows only the scheme, host and port: it never repeats user info, a
path, a query or a fragment, which can hold a password or a copied portal
link's token. When the URL holds an @, or when it cannot read a host, it says
the URL is set and shows no part of it: a password with # or ? would move
where the URL is split. Under To fix it flags a copy without the
Permission profile
option (older than 1.5.0: run the copies check), the required options that are
missing, a missing credential, a URL with any @ (refused as holding a user
name or password) and a URL that is not scheme and host only. Under Note: it
warns about an API key and a password set at once (the API key is used), the
trailing / of the URL (ignored), plain http to another computer and a
request timeout under 30 s. You enter the missing options in the dialog that
you open inside Claude Code with /plugin configure <id>, never in the chat.
Removing a copy from the terminal¶
Without Claude, in a terminal and from the project folder, claude plugin list
shows every copy with its version and scope; keep one odoo-tools@... and
remove the others there:
Use the id and the scope that claude plugin list shows (--scope user for a
copy installed for your user), then restart Claude Code. The directory's copy is
odoo-tools@anthropic-plugin-directory; there is no
odoo-tools@claude-plugins-official.
If the copy you keep is an old copy from Transgenia's marketplace (older than
1.5.0), do not uninstall it to install it again: the install can reuse an
outdated local copy of the marketplace and put the same old version back. The update commands always work: update the marketplace, then
the copy, with the scope that claude plugin list shows (for a project or
local copy, from the project folder):
claude plugin marketplace update transgenia-odoo-tools
claude plugin update odoo-tools@transgenia-odoo-tools --scope user
Run the MCP server directly (standalone)¶
# from a checkout, with python3 3.9+ (nothing to install)
python3 server/run_stdio.py
# or installed as a package (a virtualenv is recommended); provides the odoo-mcp command
pip install ./server && odoo-mcp
Requirements¶
- MCP server:
python33.9 or newer on thePATH. Nothing else: zero third-party runtime dependencies. Check it withpython3 --version.- macOS:
python3ships with Apple's Command Line Tools (xcode-select --install). If your Mac asks for an administrator to install them and you are not one, your IT team installs them, or ask Transgenia for assisted setup. - Linux: distributions ship
python3(if it is missing, install it with your package manager, e.g.sudo apt install python3). - Windows: the command must be named
python3. The Microsoft Store Python providespython3.exe; the python.org installers only createpython.exe/py.exe: install the Microsoft Store Python or put apython3.exeon thePATH(a copy of or hard link topython.exein the same folder; the PowerShell command is below). A PowerShell ordoskeyalias is not enough, because Claude Code starts the command directly. Withoutpython3,claude mcp listreports the plugin's server asFailed to connectwithConnection closed, and nothing names Python. See Troubleshooting. - Windows, session-start hooks: they are shell commands, so they need
Git for Windows (Git Bash). Without it Claude Code runs them in
PowerShell, where they fail with a
SessionStarthook error. If Git Bash is installed but Claude Code does not find it, setCLAUDE_CODE_GIT_BASH_PATH. The MCP server is not affected. - Windows, after installing Claude Code, Git or Python: open a new
PowerShell window and restart Claude Code; a window opened before the
install does not see the new
PATH(claudeis not recognized, orwhere.exe gitfinds nothing). Claude Code's native installer putsclaude.exein%USERPROFILE%\.local\bin.
- macOS:
- Fallback CLI (optional): Node.js 18+.
Windows: a python3.exe next to python.exe
The hard link, in PowerShell:
$python = (Get-Command python -ErrorAction Stop).Source
New-Item -ItemType HardLink -Path (Join-Path (Split-Path $python) "python3.exe") -Target $python
It needs write access to the Python folder: for an installation under
C:\Program Files, run PowerShell as administrator. If
Get-Command python finds nothing, or a file under WindowsApps, Python
is not on PATH: run the python.org installer again and select "Add
python.exe to PATH", or install the Microsoft Store Python. CI checks this
fix on Windows (windows-launch.yml).
Optional extras¶
pip install -e "./server[cache]" # schema cache with TTL (cachetools)
pip install -e "./server[metrics]" # Prometheus metrics at /metrics
pip install -e "./server[otel]" # OpenTelemetry traces (OTLP)
The extras never block startup: if they are not installed, those capabilities simply stay inactive (graceful degradation; the schema cache then uses a standard-library implementation). The plugin installs no extras.
Standalone configuration (environment variables)¶
Applies only when you run the server outside the plugin (Docker,
python -m odoo_mcp, python3 server/run_stdio.py from a checkout). Inside
the plugin, these values are filled from the plugin options.
| Variable | Required | Notes |
|---|---|---|
ODOO_URL |
yes | https://host (no trailing path) |
ODOO_DB |
yes | database name |
ODOO_LOGIN |
yes | login email |
ODOO_API_KEY |
yes* | Odoo ≥ 14; created in Account Security. The only credential JSON-2 accepts |
ODOO_PASSWORD |
yes* | use it in Odoo < 14 (no API keys) |
ODOO_TRANSPORT_PREF |
no | auto (default) / json2 / jsonrpc / xmlrpc (see Compatibility) |
ODOO_READONLY |
no | 1 lists and runs only the read tools (option Read-only mode) |
ODOO_POLICY |
no | permission profile: readonly, standard (default), builder or full (option Permission profile, see Permission policy) |
ODOO_POLICY_FILE |
no | absolute path to an optional policy file (option Permission policy file) |
ODOO_AUDIT_DIR |
no | audit folder; stderr (the default outside the plugin) or off |
ODOO_AUDIT_RETENTION_DAYS |
no | days an audit file is kept (default 90; 0 keeps them) |
ODOO_DIAG_DIR |
no | folder of the local diagnostics (server.jsonl, metadata only); unset or off writes nothing. The plugin passes ${CLAUDE_PLUGIN_DATA}/diagnostics |
ODOO_TIMEOUT, ODOO_CACHE_TTL |
no | integers (seconds); ODOO_TIMEOUT (120 by default) applies to JSON-RPC and, since v1.2.0, to XML-RPC too |
ODOO_METRICS, ODOO_OTEL_ENDPOINT |
no | optional observability |
* you must set one of ODOO_API_KEY or ODOO_PASSWORD.
The MCP server does not persist credentials to disk; its audit lines only hold names, counts and timings, and its local diagnostics only metadata. Transgenia does not receive your credentials or your data; tool results do go back to your MCP client and your model provider, as with any tool. See Privacy.
Check a policy file before you configure it (offline, nothing is sent to Odoo):
python3 server/run_stdio.py --check-policy ~/.config/odoo-tools/policy.json --explain res.users:write
See --check-policy.
The support report also runs offline:
python3 server/run_stdio.py --diagnose reads the local diagnostics
(ODOO_DIAG_DIR) and the audit (ODOO_AUDIT_DIR), or the folders you pass with
--diag-dir and --audit-dir, and never contacts Odoo. See
Support.
Fallback CLI (optional)¶
Requires Node.js 18+. It installs the CLI in ~/.claude/tools/odoo-cli and
creates a local .env there, readable only by your user, with placeholders:
you paste the secret (API key or password) yourself in your own editor; Claude
never asks for it in the chat.
See the Fallback CLI page for the command details.
Docker (optional)¶
The repository's docker/
directory builds an image that runs the same stdio server. Attach with
docker run -i --rm --env-file ./odoo.env odoo-mcp-tools, where odoo.env is
a file you create with the ODOO_* variables (chmod 600, kept out of version
control). That file can also set the permission policy and the audit folder;
mount the policy file read-only and the audit folder writable by the
container's user (mcp):
# in odoo.env
# ODOO_POLICY=standard
# ODOO_POLICY_FILE=/policy/policy.json
# ODOO_AUDIT_DIR=/audit
docker run -i --rm --env-file ./odoo.env \
-v ~/.config/odoo-tools/policy.json:/policy/policy.json:ro \
-v ~/.odoo-tools/audit:/audit ghcr.io/transgenia/odoo-mcp-tools:1.6.0
Without an audit folder, the audit lines go to docker logs. Since v1.5.0 the
server never takes an Odoo URL or secret from a client request: the
header-based multi-tenant path (X-Odoo-Url/Db/Login + Bearer) was removed,
and ODOO_MULTITENANT is still parsed but reserved, with no effect. Since
v1.5.1 the server reads no other credential: ODOO_HTTP_BEARER, which it read
but never used, is no longer read. Without ODOO_DIAG_DIR, the container writes
no local diagnostics. A remote HTTP mode, where the server keeps the Odoo credential
and clients authenticate to it, is on the roadmap and needs its own design.
Verify¶
Call the odoo_version tool (or run /odoo-tools:odoo-doctor). A successful
response reporting version, edition, deployment and transport confirms the
end-to-end installation (since v1.4.0, odoo_version signs in first, so a wrong
credential no longer passes as a working connection). See
Connection and discovery.
If at session start you see a notice that begins with
odoo-tools: In Cowork and Claude chat this plugin's Odoo tools do not run, the
local diagnostics record, in the last 14 days, neither a successful connection to
Odoo nor a server start with every connection setting. In Claude Code, enter the
options in Configure options and restart; in Cowork or Claude chat, open a
local session of the Code tab of Claude Desktop. See
Troubleshooting.
Since v1.5.0, the odoo_version response includes a policy block with the
active profile, the digest and the hidden tools. If at session start the plugin
tells you that the policy locked the tools at the last server start
(the permission policy locked the Odoo tools), ask Claude to call
odoo_version for the reason, fix the option or the file and reconnect the
server with /mcp. See
Troubleshooting.
Since v1.6.0 the response also carries a plugin block: the odoo-tools version
that answered and, in Claude Code, its installed copy (plugin@marketplace, for
example odoo-tools@transgenia-odoo-tools), also when the policy is locked. A
response without a policy block comes from a copy older than 1.5.0: the
guided route and /odoo-tools:odoo-doctor stop there. See
Two copies of odoo-tools.