Skip to content

Cross-version compatibility (Odoo 10–19)

The MCP server resolves model, field and capability names according to the detected version, edition and deployment. The authoritative, verifiable source is the repository's delta map (server/src/odoo_mcp/compat/deltas.py); this page summarizes it.

Detection

  • Version — major integer of common.version() (server_version_info[0], or parsed from server_version), clamped to 10–19.
  • Edition+e suffix in the version string; if not, the module web_enterprise is probed (ir.module.module); if not, unknown.
  • Deployment — host *.odoo.comsaas, otherwise onprem.

Model renames

Modern name Historical name Boundary
account.move account.invoice new in v13
account.move.line account.invoice.line new in v13
stock.package stock.quant.package new in v19 (best-effort)

You can pass either name; the resolver returns the valid one in the target instance.

Field changes

Model Field Change Boundary
account.move.line analytic_account_idanalytic_distribution rename v16
product.template uom_po_id removed (use uom_id) v17 (best-effort)
res.partner company_type removed (use is_company) v19 (best-effort)

Removed fields are dropped from the query with a dropped_fields warning, instead of failing the whole call.

Capabilities

Capability Availability
api_key_auth Odoo ≥ 14 (earlier ones require a password)
jsonrpc_api_key only Odoo ≤ 16; v17+ rejects API keys on /jsonrpc → automatic fallback to XML-RPC
update_field_translations Odoo ≥ 16 (earlier ones use writing with language context)

Editions

The Enterprise-exclusive models (heuristic list: documents.document, sign.request, account.consolidation.period, quality.check, helpdesk.ticket, planning.slot, appraisal.appraisal) raise a CompatError when the instance is detected as Community. Runtime module probing is the authoritative source.

"Best-effort" boundaries

Some version boundaries (marked above) are approximate and it is worth confirming them against a real instance. Since the map is flat data covered by table-driven tests, correcting a boundary is a one-line edit plus a test row (see Contributing).

In practice

Always write against the modern name. The agent does not need to know the version: the layer resolves it for you. If a query returns dropped_fields, it means that field does not exist in the target version — check the equivalent modern name in the table above.

Skill reference: /odoo-tools:odoo-crossversion.