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.