Odoo ClaudeBLOCK
Self-hosted MCP server connecting Claude to Odoo 15→19 — 197+ tools, multi-tenant, Bulgaria l10n
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Production-grade Model Context Protocol (MCP) server suite for Odoo ERP
Odoo MCP server for Claude Code and Claude.ai — turn any self-hosted Odoo instance (15 → 19) into an AI assistant via the Model Context Protocol. 197+ tools, multi-tenant, Bulgaria localization (НАП, ДДС, ЕИК) included.
Connect Claude, Claude Code, and any MCP-compatible client to Odoo, GitHub, filesystem, Portainer, Teams, and more — through a unified, authenticated gateway.
[](LICENSE) [](https://www.odoo.com) [](https://modelcontextprotocol.io) [](https://www.docker.com) [](https://github.com/rosenvladimirov)
Quick Start · Why this vs alternatives? · Use Cases · Architecture · MCP Servers · Companion Modules · Deployment
Two tracks. You are on branch 3.0 — the preview track for integrators, current v3.3.8. The stable track is branch `2.0`, current v2.31.0. All releases: Releases · details in Two Tracks.🇧🇬 Български README
See Claude editing a live Odoo sale order — real CRUD, real auto-recalculation
▶ Watch the full 4-minute demo: [Running Odoo 18 Entirely Through AI — Claude Code + MCP Server
be0f97c36427OBSERVED · 2026-10-08Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add claude-terminal-gateway --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env API_KEY=${API_KEY} --env API_KEYS_FILE=${API_KEYS_FILE} --env AUTH_CACHE_TTL=${AUTH_CACHE_TTL} -- npx -y [email protected]{
"mcpServers": {
"claude-terminal-gateway": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
"API_KEY": "${API_KEY}",
"API_KEYS_FILE": "${API_KEYS_FILE}",
"AUTH_CACHE_TTL": "${AUTH_CACHE_TTL}"
}
}
}
}Exposed tools (127)
86 read · 23 write · 18 destructive. Blast radius: 18 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
backup_history | read | ADMIN: list backup/restore ops. Read-only. |
backup_list | read | ADMIN: list backups (optionally per target). Read-only. |
cf_dns_create | write | Create DNS record. ttl=1 means Auto. |
cf_dns_delete | destructive | Delete a DNS record. |
cf_dns_list | read | List DNS records in a zone. |
cf_dns_update | write | Patch a DNS record. Pass any of: type, name, content, proxied, ttl. |
cf_tunnel_config_get | read | Get the current ingress/config of a tunnel. |
cf_tunnel_config_put | write | Replace the full ingress config. Last entry must be { |
cf_tunnel_list | read | List cloudflared tunnels in an account. |
cf_tunnel_route_add | write | Add (or replace) one ingress rule + create CNAME record. |
cf_tunnel_route_remove | destructive | Remove ingress rule by hostname + delete its CNAME record. |
cf_zones_list | read | List zones (optional filter by name). |
contabo_account_info | read | Return the authenticated customer |
contabo_instances_list | read | List VPS instances on the account (name, IP, status, plan). |
contabo_object_storage_get | read | Get one Object Storage instance in full detail. |
contabo_object_storage_stats | read | Get usage stats (GB used, object count, etc) for an Object Storage instance. |
contabo_object_storages_list | read | List Object Storage instances (subscriptions) on the account. |
ee_clone | read | Clone Odoo Enterprise repository with GitHub token authentication. |
ee_depends | read | Show full dependency tree of an EE module (CE + EE deps). |
ee_deploy | write | Deploy EE from buffer to target (rsync). Buffered mode only. |
ee_license_status | read | Read Enterprise license status from an Odoo instance (expiration, code, reason). |
ee_link | write | Create symlink for specific EE modules in the Odoo addons path (selective install). |
ee_modules | read | List all Enterprise modules with category, license, depends. Filter by category, country, or keyword. |
ee_oca_conflicts | read | Detect conflicts between Enterprise and OCA modules: name collisions, model overlaps. |
ee_oca_recommend | read | For a module that exists in both EE and OCA — compare and recommend which to use. |
ee_search | read | Search Enterprise modules by name, summary, or dependency. |
ee_token_check | read | Validate GitHub token — check access to odoo/enterprise private repo. |
ee_unlink | destructive | Remove symlinks for EE modules from addons path. |
ee_update | write | Git pull Enterprise repository. |
google_auth_status | read | Check Google authentication status. |
google_calendar_create_event | write | Create a new calendar event. |
google_calendar_delete_event | destructive | Delete a calendar event. |
google_calendar_events | read | List upcoming calendar events. Supports time range and text search. |
google_calendar_list | read | List all available Google calendars. |
google_calendar_update_event | write | Update an existing calendar event. Only provided fields are changed. |
google_gmail_labels | read | List all Gmail labels (folders). |
google_gmail_read | read | Read a specific Gmail message by ID. Returns full body, headers, and labels. |
google_gmail_send | write | Send an email or reply to an existing message. |
identify_totp_disable | write | Disable TOTP two-factor for YOUR current identified profile (removes the stored secret). |
identify_totp_status | read | Report whether YOUR current profile has TOTP two-factor enrolled. |
mcp_drop_elevation | destructive | End the current elevation window early. Logs to audit. |
mcp_elevation_status | read | Return whether the server is currently elevated, and remaining TTL. |
memory_delete | destructive | Delete a memory file from personal or shared storage. |
memory_read | read | Read a memory file by filename. Searches personal first, then shared. |
migrate_history | read | ADMIN: list past migration assessments. Read-only. |
module_deploy_history | write | ADMIN: list past deploy/rollback ops (optionally per target). |
oca_changelog | read | Generate CHANGELOG from newsfragments using oca-towncrier. |
oca_clone_repo | read | Clone a specific OCA repository by name. |
oca_deploy | write | Deploy OCA repos from buffer to target (rsync). Only in buffered mode. |
oca_fix_website | read | Fix website URL in addon manifests using oca-fix-manifest-website. |
oca_gen_icon | read | Generate default OCA icon for addon(s) using oca-gen-addon-icon. |
oca_gen_readme | read | Generate README for an OCA addon using oca-gen-addon-readme. |
oca_gen_requirements | read | Generate requirements.txt from addon external_dependencies using oca-gen-external-dependencies. |
oca_gen_table | read | Generate addons table in repo README.md using oca-gen-addons-table. |
oca_link | write | Create symlink for OCA addon module in the Odoo addons path. |
oca_migrate | read | Migrate OCA repos to a new Odoo version branch using oca-migrate-branch. |
oca_search | read | Search for a module across all cloned OCA repos by name or keyword. |
oca_status | read | Show git status of all OCA repos (branch, clean, behind, modules count). |
oca_update | write | Git pull all OCA repos in the working directory (recursive). |
odoo_connections | read | List all configured Odoo connections. |
odoo_create | write | Create one or more records. Returns list of new IDs. |
odoo_disconnect | destructive | Remove an Odoo connection. |
odoo_fields_get | read | Get field definitions for an Odoo model. Returns field names, types, labels, and attributes. |
odoo_fp_remove_action | destructive | Remove a tax action map entry from a fiscal position (l10n_bg_tax_admin). |
odoo_list_models | read | List available Odoo models (ir.model). Optionally filter by name pattern. |
odoo_read | read | Read specific records by IDs. |
odoo_report | read | Generate a PDF report for records. Returns base64-encoded PDF. |
odoo_search | read | Search for record IDs matching a domain filter. |
odoo_search_count | read | Count records matching a domain. |
odoo_search_read | read | Search and read records in one call. Most common operation. |
odoo_unlink | destructive | Delete records by IDs. |
odoo_version | read | Get Odoo server version info. |
odoo_web_export | read | Export records to structured data via web session (Odoo export_data). |
odoo_web_logout | destructive | Destroy web session and logout. |
odoo_web_report | read | Download PDF report via web session. Returns base64-encoded PDF. |
odoo_write | write | Update existing records. |
provision_list_api_keys | read | ADMIN ONLY: List active provisioning API keys (without hashes). |
provision_revoke_api_key | destructive | ADMIN ONLY: Revoke an issued API key by key_id. |
public_access_barcode | read | Generate barcode image via /report/barcode/{type}/{value}. |
public_access_download | read | Download attachment/binary content by ID via /web/content/{id}. Public route. |
public_access_export_csv | read | Export Odoo list data as CSV via web session. |
public_access_export_xlsx | read | Export Odoo list data as XLSX file via web session. Returns base64. |
public_access_image | read | Download image field from record via /web/image/{model}/{id}/{field}. |
public_access_portal_home | read | Get portal home page content via web session (/my/home). |
public_access_portal_invoices | read | Get list of portal invoices (/my/invoices). Returns HTML page content. |
public_access_portal_orders | read | Get list of portal sale orders (/my/orders). Returns HTML page content. |
public_access_portal_purchases | read | Get list of portal purchase orders (/my/purchase). |
public_access_portal_tickets | read | Get list of portal helpdesk tickets (/my/tickets). |
public_access_report_html | read | Render report as HTML via web session. |
public_access_report_pdf | read | Download PDF report via web session. Route: /report/pdf/{report_name}/{doc_ids}. |
public_access_report_xlsx | read | Download XLSX report via OCA reporting-engine (/report/xlsx/{name}/{ids}). |
public_access_shop | read | Get website shop product listing (/shop). Returns HTML. |
public_access_sitemap | read | Download sitemap.xml from Odoo website. |
s3_bucket_create | write | Create a new bucket on the configured S3 endpoint. |
s3_bucket_delete | destructive | Delete an S3 bucket. Set force=true to delete all objects first. |
s3_bucket_stats | read | Return object_count + total_bytes + oldest/newest object key for a bucket. |
s3_buckets_list | read | List all S3 buckets for the configured account on the target endpoint. |
s3_object_delete | destructive | Delete a single object from a bucket. |
s3_object_get | read | Download an object (text). Binary or >max_bytes objects return metadata only. |
s3_objects_delete_prefix | destructive | Delete all objects under a prefix in one bucket. Returns count. |
s3_objects_list | read | List objects in a bucket (prefix-filtered, page size-capped). |
secrets_revoke | destructive | ADMIN: mark a secret revoked (audit). |
session_handoff_cancel | read | Cancel an offer you created (offerer only). |
session_link_revoke | destructive | Revoke a session link by id (owner or admin). |
supervisor_history | read | ADMIN: list past supervisor ops (optionally per target). |
supervisor_rebuild | read | Make every farm layer a PURE symlink farm from /opt. |
supervisor_run | write | Orchestrate the canonical host ``supervisor.py`` (github / OCA / EE / |
supervisor_status | read | Drift report for one odoo container |
supervisor_targets | read | List SSH-capable hosts (connections.json entries with an ssh block). |
telegram_agent_get_scenario | read | Get the full scenario for an enrolled chat. |
telegram_agent_list | read | List enrolled chats with their mode/persona/skills. |
telegram_agent_set_scenario | write | Replace the scenario for an enrolled chat. |
telegram_agent_unenroll | write | Stop agentic handling for a chat. |
telegram_auth_status | read | Check Telegram authentication status. |
telegram_configure | write | Set Telegram API credentials (api_id and api_hash from my.telegram.org). |
telegram_get_dialogs | read | List recent Telegram chats (users, groups, channels). |
telegram_get_messages | read | Read messages from a Telegram chat. Chat can be @username, phone, or numeric ID. |
telegram_search_contacts | read | Search Telegram contacts by name or username. |
telegram_send_message | write | Send a Telegram message. Chat can be @username, phone, or numeric ID. |
telegram_sub_list | read | List a principal |
telegram_sub_remove | destructive | Remove a chat from a principal |
tenant_current | read | Return the currently active tenant (or null) and its tool count. |
tg_listen_status_howto | read | Return the commands to inspect listener/session state. |
user_connection_activate | read | Activate one of your personal connections as the working connection. |
user_connection_delete | destructive | Delete a personal connection. |
user_connection_list | read | List your personal connections. |
who_am_i | read | Show current user identity and active connection. |
Trust audit
BLOCKgrade F · trust 58/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (18 observation(s))
- Network
- declared (18 observation(s))
- Shell
- declared (1 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
# --from-file=id_ed25519=$HOME/.ssh/id_ed25519 \
# --from-file=id_ed25519.pub=$HOME/.ssh/id_ed25519.pub \
# --from-file=known_hosts=$HOME/.ssh/known_hosts
id_ed25519: ""
id_ed25519.pub: ""
- NODE_TLS_REJECT_UNAUTHORIZED=0
verify=False, timeout=30,
verify=False, timeout=timeout,
verify=False, timeout=120,
verify=False, timeout=120,
mod = __import__(mod_name)
PAYLOAD="$(python3 -c "import json,urllib.parse; print(urllib.parse.quote(json.dumps({'token':'${TOKEN}'})))")"# Portainer server URL (e.g. http://192.168.1.100:9000)
$PUrl = Read-Host " Portainer URL (e.g. http://192.168.1.100:9000)"
read -p " Portainer URL (e.g. http://192.168.1.100:9000): " P_URL
print("\nПрекъснато.")print(f"\nГотово. Memory файловете са в: {memory_dir}")("sk-ant-api03-AbCdEfGhIjKlMnOpQrSt", True),cf_dns_delete, cf_tunnel_route_remove, ee_unlink, google_calendar_delete_event, mcp_drop_elevation, memory_delete, odoo_disconnect, odoo_fp_remove_action, odoo_unlink, odoo_web_logout, provision_revok
.nojekyll
exec(compile(match.group(0), fn, "exec"), ns)
ns["_SECRET_CONN_KEYS"] = eval(f"({keys.group(1)})") # noqa: S307 - our own literalexec(compile(match.group(0), fn, "exec"), ns) # noqa: S102 - our own source
- ../../base
- proxy_services.json=../../../proxy_services.json
Gates applied: no_behavioural_pass.
be0f97c36427full audit observations/trust-audit/mcp-server/rosenvladimirov__odoo-claude.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | be0f97c36427 | BLOCK | F | 58 | first audit |
Questions
What is the Odoo Claude MCP server?
Self-hosted MCP server connecting Claude to Odoo 15→19 — 197+ tools, multi-tenant, Bulgaria l10n
What tools does Odoo Claude expose?
127 in total: 86 read-only, 23 that write, and 18 that can delete or overwrite (cf_dns_delete, cf_tunnel_route_remove, ee_unlink, google_calendar_delete_event, mcp_drop_elevation). Every one is listed on this page with its risk.
Is Odoo Claude safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (58/100) and found 10 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 18 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does Odoo Claude need?
It reads ANTHROPIC_API_KEY, API_KEY, API_KEYS_FILE, AUTH_CACHE_TTL, BRIDGE_TOKEN, CENTRIFUGO_API_KEY, CENTRIFUGO_TOKEN_HMAC_SECRET, CF_API_TOKEN, CONTABO_API_PASSWORD, CONTABO_AUTH_URL, CONTABO_CLIENT_SECRET and GITHUB_PERSONAL_ACCESS_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Odoo Claude run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as claude-terminal-gateway at 3.0.0.
How current is this page?
The grade is for one exact copy of the source (be0f97c36427), read on 2026-10-08. The repository is watched and re-audited when it changes.