Skip to content

Releases: erpipe-org/mcp-odoo

v1.3.0 — MCP 2026-07-28

Choose a tag to compare

@tuanle96 tuanle96 released this 29 Jul 02:50

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

Choose a tag to compare

@tuanle96 tuanle96 released this 22 Jul 09:08
326efbd

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

Choose a tag to compare

@tuanle96 tuanle96 released this 20 Jul 17:24

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 main after 1.2.1 (#50, build_domain)

Install

pip install -U odoo-mcp
# or
uvx odoo-mcp --setup

Hosted (no local process)

https://mcp.erpipe.com/ → workspace MCP https://mcp.erpipe.com/mcp

1.2.1

Choose a tag to compare

@tuanle96 tuanle96 released this 14 Jul 14:44

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 driftcanonical_json now collapses integral floats (1.0) to ints before hashing, recursively, booleans untouched. A payload crossing a JS/TS transport layer (where 1 and 1.0 are the same value) no longer yields a different SHA-256 approval token between validate_write and execute_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.json or checkout-level odoo_mcp_policy.json no 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 in Annotated[..., Field(description=...)], so MCP clients and inspectors render real inputSchema property descriptions. Coverage pinned by DESCRIBED_INPUT_TOOLS in the schema regression test; remaining groups tracked in #35. Thanks @SyedIshmumAhnaf (#41).

Changed

  • Field ranking / smart field selection helpers extracted from agent_tools.py into a dedicated field_ranking.py core module (compatibility re-exports kept, import-linter contract updated, no behavior change). Thanks @vaishnavidesai09 (#42).

1.2.0

Choose a tag to compare

@tuanle96 tuanle96 released this 14 Jul 13:27

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 uploadsvalidate_write accepts <field>_from_path (e.g. datas_from_path) for binary fields: the server reads the file itself and the approval only ever carries a sha256:<hex>:<size> fingerprint, so a large PDF never has to fit through the agent's context. Fail-closed: requires ODOO_MCP_ATTACHMENT_UPLOAD_ROOTS, enforces ODOO_MCP_MAX_ATTACHMENT_UPLOAD_BYTES, and rides the normal preview_writevalidate_writeexecute_approved_write gate. (#46)
  • Agent Skills packskills/ 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 lookupslookup_model_history now 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 the None return value failed. execute_method now reports success: true, result: null with an explicit warning instead of an error that invites retrying a side-effect call.
  • The blocked-side-effect error on execute_method now 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_fields requests a bounded, marshal-safe attributes list — unblocks models whose full fields_get faults 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.json at the documented default location no longer breaks the suite.

1.1.0

Choose a tag to compare

@tuanle96 tuanle96 released this 02 Jul 16:08

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.tools entry points, stable plugin_api v1). Opt-in only via ODOO_MCP_PLUGINS; fail-isolated; reported in health_check. Runnable example in examples/plugin-example/, guide + threat model in docs/plugins.md.
  • Data-quality pack — new data_quality_report tool: 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_log tool classifies install/update failures into a no_action / needs_review / needs_script worklist with fix suggestions; the same action taxonomy now annotates scan_addons_source and upgrade_risk_report. New workflow prompt pre_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>.mcpb bundle for Claude Desktop (requires uv): download, double-click, fill in URL/db/login/API key.
  • Server instructionsODOO_MCP_INSTRUCTIONS_FILE adds your deployment briefing to the MCP instructions field (idea: #19, thanks @oadiazp).
  • Per-deployment tool filteringODOO_MCP_TOOLS_INCLUDE / ODOO_MCP_TOOLS_EXCLUDE trim the surface for small agents.

Fixed

  • XML-RPC ServerProxy now created with allow_none=True — payloads/metadata containing None no longer raise cannot marshal None (#25, thanks @WassoufZ).

Notes

  • MCP spec 2026-07-28 / python-sdk 2.0: migration is fully mapped (spiked against mcp==2.0.0b1); this release stays on mcp>=1.27,<2 — the SDK 2.0 port ships as its own release after the SDK is stable.
  • Full details in the CHANGELOG. Roadmap: #27.

1.0.0 — field ACL, cross-instance queries, workflow prompts, head-to-head benchmarks

Choose a tag to compare

@tuanle96 tuanle96 released this 11 Jun 13:05

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

Choose a tag to compare

@tuanle96 tuanle96 released this 11 Jun 07:18

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

Choose a tag to compare

@tuanle96 tuanle96 released this 11 Jun 02:39

Added

  • Free-text query parameter on search_records — the server builds an OR ilike domain over the model's searchable text fields (identifier columns like name, ref, email first; capped at 5) and ANDs it with any explicit domain. Falls back to name when field metadata is unavailable. The response reports query_fields_used. Agents no longer hand-craft fuzzy-match domains.
  • Interactive setup wizarduvx odoo-mcp --setup prompts 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) into tool_helpers.py, schema_cache.py, access_helpers.py, and write_policy.py. All names remain importable from odoo_mcp.server (guarded by a parity test); no behavior change.

Compatibility

  • Tool count stays 27; query is 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

Choose a tag to compare

@tuanle96 tuanle96 released this 11 Jun 01:00

Added

  • OAuth 2.1 resource server for HTTP transports — set ODOO_MCP_AUTH_ISSUER_URL, ODOO_MCP_AUTH_INTROSPECTION_URL, and ODOO_MCP_AUTH_RESOURCE_URL to 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 in health_check as runtime.oauth.
  • Batch create in the gated write workflowpreview_write/validate_write accept values_list (one dict per record, max 100); execution maps to a single atomic Odoo create(vals_list) call and the approval token covers the whole batch. Per-record differing write values are deliberately rejected (values_list_unsupported_operation) because they would require non-atomic per-record RPC calls.
  • read_attachment tool (tool count 26 → 27) — reads ir.attachment metadata 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_list key when batching is used.
  • OAuth is opt-in; without ODOO_MCP_AUTH_* env vars the HTTP transport behaves exactly as before.
  • *_SECRET env 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.