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 fromserver_version), clamped to 10–19. - Edition —
+esuffix in the version string; if not, the moduleweb_enterpriseis probed (ir.module.module); if not,unknown. - Deployment — host
*.odoo.com⇒saas, otherwiseonprem.
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_id → analytic_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.