Releases: erpipe-org/mcp-odoo
Release list
v1.3.0 — MCP 2026-07-28
MCP 2026-07-28 support for the local/self-hosted Odoo MCP server.
Highlights:
- Stable MCP Python SDK 2.x and the 2026-07-28 protocol lifecycle, while retaining 2025-11-25 client compatibility.
- Era-portable write confirmation: MRTR for modern clients, legacy elicitation for older clients, and approval-token fallback.
- SDK v2 Streamable HTTP runtime wiring, DNS-rebinding protections, OAuth introspection, and httpx2 transport support.
- MCP Inspector v2 release smoke coverage.
Validated with 915 tests across Python 3.10, 3.11, and 3.12, plus a real Odoo 19 XML-RPC/JSON-2/Streamable HTTP smoke exposing all 41 tools.
v1.2.3
Metadata-only ownership refresh after the repository transfer to erpipe-org.
- Republishes odoo-mcp 1.2.3 so the PyPI README carries
mcp-name: io.github.erpipe-org/mcp-odoo. - Refreshes MCP Registry ownership metadata under
erpipe-org. - No runtime behavior changes.
v1.2.2
odoo-mcp 1.2.2
Metadata / packaging release so PyPI and catalogs show the live free hosted product.
Highlights
- Short description points at ERPipe (free v1 hosted MCP for Odoo)
- Local package remains the full 41-tool self-host / stdio server
- Includes typed discovery contracts that landed on
mainafter 1.2.1 (#50, build_domain)
Install
pip install -U odoo-mcp
# or
uvx odoo-mcp --setupHosted (no local process)
https://mcp.erpipe.com/ → workspace MCP https://mcp.erpipe.com/mcp
1.2.1
Community patch: the write-approval gate no longer drops valid tokens on int/float transport drift, the 10 highest-traffic tools describe their parameters to MCP clients, and the test suite is hermetic on developer machines that carry a real Odoo config. All three code changes came from community PRs. 41 tools · 11 prompts · 909 tests.
Fixed
- Write-approval tokens survive int/float transport drift —
canonical_jsonnow collapses integral floats (1.0) to ints before hashing, recursively, booleans untouched. A payload crossing a JS/TS transport layer (where1and1.0are the same value) no longer yields a different SHA-256 approval token betweenvalidate_writeandexecute_approved_write, ending intermittent"approval token does not match the canonical payload"failures on valid, unchanged payloads. Thanks @Xavier-SDK (#48); the stateful half of the story is under discussion in #49. - Hermetic test suite on developer machines — an autouse fixture pins the suite to the CI baseline (no Odoo config), so a real
~/.config/odoo/config.jsonor checkout-levelodoo_mcp_policy.jsonno longer flips instance-resolution semantics and fails instance/knowledge tests locally while CI stays green.
Added
- Per-parameter input descriptions (first 10 tools) —
search_records,read_record,execute_method, the gated-write trio, and the accounting/diagnostics/cross-instance entry points now wrap every non-context parameter inAnnotated[..., Field(description=...)], so MCP clients and inspectors render realinputSchemaproperty descriptions. Coverage pinned byDESCRIBED_INPUT_TOOLSin the schema regression test; remaining groups tracked in #35. Thanks @SyedIshmumAhnaf (#41).
Changed
- Field ranking / smart field selection helpers extracted from
agent_tools.pyinto a dedicatedfield_ranking.pycore module (compatibility re-exports kept, import-linter contract updated, no behavior change). Thanks @vaishnavidesai09 (#42).
1.2.0
Field-ops release: context-safe attachment uploads, an Agent Skills pack, typo-tolerant model-history lookups, and kinder failure modes around Odoo's XML-RPC None-marshalling quirks. 41 tools · 11 prompts · 901 tests.
Highlights
- Local-file attachment uploads —
validate_writeaccepts<field>_from_path(e.g.datas_from_path) for binary fields: the server reads the file itself and the approval only ever carries asha256:<hex>:<size>fingerprint, so a large PDF never has to fit through the agent's context. Fail-closed: requiresODOO_MCP_ATTACHMENT_UPLOAD_ROOTS, enforcesODOO_MCP_MAX_ATTACHMENT_UPLOAD_BYTES, and rides the normalpreview_write→validate_write→execute_approved_writegate. (#46) - Agent Skills pack —
skills/ships 4 business-workflow playbooks in the open Agent Skills format (odoo-data-quality-gate,odoo-migration-copilot,odoo-month-end-close,odoo-agency-fleet-review): judgment layers (evidence rules, pacing, human checkpoints) on top of the tool surface. Install by copying into~/.claude/skills/. - Model-history lookups —
lookup_model_historynow suggests close model names on a miss, and the cross-version rename map covers additional Odoo model renames. (#43, #36)
Fixed
- No more phantom failures on void methods — when Odoo faults server-side with
cannot marshal None unless allow_none is enabled, the method (button_draft,action_post,account.move.line.reconcile, ...) has already executed and committed; only serializing theNonereturn value failed.execute_methodnow reportssuccess: true, result: nullwith an explicit warning instead of an error that invites retrying a side-effect call. - The blocked-side-effect error on
execute_methodnow points at the policy file (ODOO_MCP_POLICY_FILE, default./odoo_mcp_policy.json, re-read on every request — no server restart) as the primary allowlist mechanism, before the env-var fallbacks. get_model_fieldsrequests a bounded, marshal-safeattributeslist — unblocks models whose fullfields_getfaults server-side on Odoo 19 (e.g.product.pricelist). (#44)- Write-policy tests now run from an empty CWD, so a developer checkout carrying a real
odoo_mcp_policy.jsonat the documented default location no longer breaks the suite.
1.1.0
Community-roadmap release: the server becomes a platform, the 16→19/20 migration wave gets real tooling, and the MCP surface gets typed. 41 tools · 11 prompts · 885 tests.
Highlights
- Tool plugins — ship your own tools as pip packages (
odoo_mcp.toolsentry points, stableplugin_apiv1). Opt-in only viaODOO_MCP_PLUGINS; fail-isolated; reported inhealth_check. Runnable example inexamples/plugin-example/, guide + threat model in docs/plugins.md. - Data-quality pack — new
data_quality_reporttool: duplicates, missing required values, orphaned references, format anomalies — evidence-first, field-ACL-aware, read-only, async-capable. docs/data-quality.md - Migration workbench v1 — new
analyze_upgrade_logtool classifies install/update failures into ano_action / needs_review / needs_scriptworklist with fix suggestions; the same action taxonomy now annotatesscan_addons_sourceandupgrade_risk_report. New workflow promptpre_migration_data_quality. - Typed output schemas — the 10 read tools now advertise real
outputSchema(Pydantic models) instead of a generic object; the remaining groups are up for grabs as good first issues. - OAuth hardening — issuer validation on introspection responses,
ODOO_MCP_AUTH_REQUIRE_ISS/ODOO_MCP_AUTH_REQUIRE_AUD, and a TTL introspection cache (ODOO_MCP_AUTH_CACHE_TTL). - One-click install — every release now ships an
odoo-mcp-<version>.mcpbbundle for Claude Desktop (requires uv): download, double-click, fill in URL/db/login/API key. - Server instructions —
ODOO_MCP_INSTRUCTIONS_FILEadds your deployment briefing to the MCPinstructionsfield (idea: #19, thanks @oadiazp). - Per-deployment tool filtering —
ODOO_MCP_TOOLS_INCLUDE/ODOO_MCP_TOOLS_EXCLUDEtrim the surface for small agents.
Fixed
- XML-RPC
ServerProxynow created withallow_none=True— payloads/metadata containingNoneno longer raisecannot marshal None(#25, thanks @WassoufZ).
Notes
1.0.0 — field ACL, cross-instance queries, workflow prompts, head-to-head benchmarks
v1.0.0 — the milestone
Four roadmap phases close the highest-value gaps no open-source Odoo MCP server covered. 27 → 39 tools, 5 → 10 prompts, 854 tests. Verified before release: full pytest/ruff/mypy/import-linter green + real Docker smoke on Odoo 19.
Field-level ACL (open-source first)
Opt-in, per-instance, per-model field allow/deny enforced at a single choke point on every path that returns record data — search_records, read_record, aggregate_records (denied groupby/measure rejected), get_model_fields (marked restricted, not hidden), index_knowledge (excluded before BM25 indexing), and the odoo:// resources. Responses note redacted_fields. Malformed policy fails closed at startup; no policy = byte-identical prior behavior. Until now only commercial bridges offered this. → docs/field-acl.md
Cross-instance fan-out (open-source first)
search_across_instances, aggregate_across_instances, accounting_health_across_instances — ask one question across many client DBs and get merged, _instance-attributed results with a partial-failure map. Selection by list, "all", or {"tags":[...]}; per-instance "cross_instance": false opt-out. Each instance queried under its own field ACL (applied before merge), bounded concurrency, and its own rate-limit budget. No warehouse, no sync. → docs/partner-playbook.md
5 operational workflow prompts (10 total)
invoice_approval_chain, po_to_receipt, customer_onboarding, expense_claim_review, accounting_close_checklist — each names required modules, exact tools per step, and human checkpoints; every write-bearing step routes through the gated workflow. No competitor ships these.
Head-to-head benchmarks
docs/benchmarks.md publishes reproducible, measured latency vs another Odoo MCP server on the same Odoo 19 stack: mcp-odoo p50 9.9 ms search vs 22.4 ms; 9.0 ms read vs 10.9 ms; 16.8 ms list-models vs 19.6 ms (competitor faster on aggregate — stated honestly). The competitor's standard mode 404s without a companion Odoo addon.
Full changelog: CHANGELOG.md
0.9.0 — async tasks, local knowledge search, accounting pack, rate limiting
Highlights
Tool surface: 27 → 36. This release ships the three capabilities no other Odoo MCP bridge has, plus an internal re-architecture.
Background tasks
submit_async_task runs allowlisted long read operations (addon scans, knowledge indexing, AR/AP aging) on a bounded worker pool — the agent keeps reasoning and polls with get_async_task. Results are TTL'd and size-capped; writes are never accepted on the async path.
Local-first knowledge search
index_knowledge fetches a bounded record slice once and builds an in-process BM25 index; search_knowledge answers free-text queries with relevance ranking and zero further RPC calls. Accent-insensitive ("hoa don" matches "hóa đơn"), no embeddings service, no new dependencies, no data leaving the machine.
Accounting pack (read-only)
receivable_payable_aging buckets open posted items by days overdue (not due / 1-30 / 31-60 / 61-90 / 90+) with per-partner totals; accounting_health_summary reports open AR/AP counts and the draft invoice backlog. Odoo 16+.
Rate limiting (opt-in)
ODOO_MCP_RATE_LIMIT_MODE=warn|block tracks per-instance:tool call volume in a sliding window; block refuses over-budget calls on the hot tools. Default off.
Architecture
server.py (2,553 lines) is now a thin re-export surface over domain modules (server_core, tools_read/write/diagnostics/knowledge/accounting/async, prompts). Full backward compatibility — every public symbol still imports from odoo_mcp.server. .importlinter enforces the layering (2 contracts kept).
Also
- Benchmark harness:
scripts/benchmark_tools.py+ docs/benchmarks.md — measured p50 12–25 ms per read tool over MCP stdio against a local Odoo 19 stack. - Claude Desktop Custom Connector guide over Streamable HTTP + OAuth 2.1.
- 804 tests (up from 497), real Docker smoke on Odoo 19 before this release.
Full changelog: CHANGELOG.md
v0.8.0 — Faster onboarding: setup wizard, free-text search, honest comparison
Added
- Free-text
queryparameter onsearch_records— the server builds an ORilikedomain over the model's searchable text fields (identifier columns likename,ref,emailfirst; capped at 5) and ANDs it with any explicitdomain. Falls back tonamewhen field metadata is unavailable. The response reportsquery_fields_used. Agents no longer hand-craft fuzzy-match domains. - Interactive setup wizard —
uvx odoo-mcp --setupprompts for connection details, tests them against the live Odoo, writes an owner-only (0600) config file the server auto-discovers (default~/.config/odoo/config.json), and prints ready-to-paste client snippets for Claude Code, Cursor, and Claude Desktop. docs/comparison.md— an honest per-project feature comparison of Odoo MCP bridges (setup, write safety, transports, multi-instance, diagnostics, testing), including when another bridge fits better.
Changed
- Internal refactor: extracted pure helpers from
server.py(3,053 → ~2,550 lines) intotool_helpers.py,schema_cache.py,access_helpers.py, andwrite_policy.py. All names remain importable fromodoo_mcp.server(guarded by a parity test); no behavior change.
Compatibility
- Tool count stays 27;
queryis optional and additive. No breaking changes. - Verified: 497 tests, real Odoo 19 Docker smoke (XML-RPC + JSON-2, restricted user) before release.
v0.7.0 — Enterprise remote: OAuth resource server, batch create, attachment read
Added
- OAuth 2.1 resource server for HTTP transports — set
ODOO_MCP_AUTH_ISSUER_URL,ODOO_MCP_AUTH_INTROSPECTION_URL, andODOO_MCP_AUTH_RESOURCE_URLto require bearer tokens on Streamable HTTP. Tokens are validated via RFC 7662 introspection (optional client credentials for the introspection call), with an RFC 8707 audience check when the authorization server binds tokens to resources; RFC 9728 protected-resource metadata is served by the MCP SDK. Works with Keycloak, Auth0, Authentik, and any AS supporting introspection. stdio is unaffected; posture appears inhealth_checkasruntime.oauth. - Batch create in the gated write workflow —
preview_write/validate_writeacceptvalues_list(one dict per record, max 100); execution maps to a single atomic Odoocreate(vals_list)call and the approval token covers the whole batch. Per-record differingwritevalues are deliberately rejected (values_list_unsupported_operation) because they would require non-atomic per-record RPC calls. read_attachmenttool (tool count 26 → 27) — readsir.attachmentmetadata plus size-capped base64 content (ODOO_MCP_MAX_ATTACHMENT_BYTES, default 1 MiB, hard cap 16 MiB), with a defensive re-check of the actually fetched payload size and URL-type attachment handling.
Compatibility
- Approval tokens for single-record writes are unchanged; the canonical payload only gains a
values_listkey when batching is used. - OAuth is opt-in; without
ODOO_MCP_AUTH_*env vars the HTTP transport behaves exactly as before. *_SECRETenv vars are now masked in startup logs.
Notes
- The OAuth resource-server flow targets the stable MCP spec (2025-11-25), which SDK 1.27 implements. The remaining "enterprise remote" items — rate limiting and the six OAuth-hardening SEPs — land after the 2026-07-28 stateless spec finalizes.