Data Tools
Odoo AI MCP Server

Data Tools

Full reference for all data-access MCP tools — query, read, create, write, and delete Odoo records

Data Tools

Data tools cover the full CRUD surface on Odoo records. They are the most frequently used tools in any MCP workflow.


odoo_status

Category: Meta | Policy: None required

Returns a snapshot of the current server and user state. Useful as a first call to discover what is available.

Returns:

  • Authenticated user name, ID, email, company
  • List of companies the user belongs to
  • All enabled ai_connector.model_policy entries (model name + allowed actions)
  • List of all available MCP tool names

Example:

{
  "name": "odoo_status",
  "arguments": {}
}

odoo_discover

Category: Data | Policy: read on target model (or none for list_models)

Inspects Odoo models and their metadata without modifying any data.

action values:

ActionDescription
list_modelsList all models that have an active MCP policy
describe_modelFields, field types, required/readonly flags
list_methodsPublic methods available on a model
list_actionsWindow actions defined for the model
list_reportsQWeb reports linked to the model

Example — describe fields of sale.order:

{
  "name": "odoo_discover",
  "arguments": {
    "action": "describe_model",
    "model": "sale.order"
  }
}

odoo_query

Category: Data | Policy: mapped by action

Unified read tool that combines multiple read operations into one tool. Set show_ui: true to attach an MCP Apps browse card to the response.

action values:

ActionEquivalent ORMPolicy
search_readmodel.search_read(domain, fields, limit, offset, order)read
search_countmodel.search_count(domain)read
readmodel.browse(ids).read(fields)read
read_groupmodel.read_group(domain, fields, groupby)read
name_searchmodel.name_search(name, operator, limit)read
get_messagesRead chatter messages for a recordread

Example — search confirmed sales orders:

{
  "name": "odoo_query",
  "arguments": {
    "action": "search_read",
    "model": "sale.order",
    "domain": [["state", "=", "sale"]],
    "fields": ["name", "partner_id", "amount_total"],
    "limit": 10,
    "show_ui": true
  }
}

odoo_search_read

Category: Data | Policy: read

Direct wrapper around Odoo’s search_read. Returns matching records with only the requested fields.

{
  "name": "odoo_search_read",
  "arguments": {
    "model": "res.partner",
    "domain": [["is_company", "=", true]],
    "fields": ["name", "email", "phone"],
    "limit": 20,
    "offset": 0,
    "order": "name asc"
  }
}

odoo_search_count

Category: Data | Policy: read

Returns the integer count of records matching a domain. No field data is returned.

{
  "name": "odoo_search_count",
  "arguments": {
    "model": "sale.order",
    "domain": [["state", "=", "draft"]]
  }
}

odoo_get_record_summary

Category: Data | Policy: read

Returns a compact, token-efficient summary of a single record. Many2one fields are rendered as {id, name}, One2many/Many2many as arrays of names. A fixed list of noisy fields (EXCLUDED_SUMMARY_FIELDS) is stripped unless explicitly listed in requested_fields.

{
  "name": "odoo_get_record_summary",
  "arguments": {
    "model": "sale.order",
    "record_id": 42,
    "requested_fields": ["name", "partner_id", "order_line", "amount_total"]
  }
}

odoo_create

Category: Data | Policy: create

Creates a new record. Use preview: true to validate the values without actually saving — useful for checking required fields and defaults.

{
  "name": "odoo_create",
  "arguments": {
    "model": "res.partner",
    "values": {
      "name": "ACME Corp",
      "email": "[email protected]",
      "is_company": true
    },
    "preview": false
  }
}

odoo_write

Category: Data | Policy: write

Updates one or more existing records.

action values:

ActionDescription
updateWrite field values to the given record IDs
archiveSet active = False on the given record IDs
unarchiveSet active = True on the given record IDs
{
  "name": "odoo_write",
  "arguments": {
    "model": "sale.order",
    "ids": [42, 43],
    "action": "update",
    "values": {
      "note": "Updated via AI assistant"
    }
  }
}

Category: Data | Policy: unlink (can_delete)

Permanently deletes records. All odoo_unlink calls are routed through the approval queue — the deletion is not executed until a human reviewer approves it in Odoo.

{
  "name": "odoo_unlink",
  "arguments": {
    "model": "res.partner",
    "ids": [99],
    "reason": "Duplicate record — merged into partner ID 42"
  }
}

The response will contain an approval request ID. Review it in MCP Server → Approvals or via the systray notification.


odoo_execute_kw

Category: Data | Policy: mapped by args.method

Calls any public ORM method on a model. The method name must be in the RPC_METHOD_TO_ACTION_MAP or match an action_*, button_*, or do_* prefix to be allowed through the policy gate.

[!WARNING] Methods not in the mapping and not matching the prefix pattern are blocked. Private methods starting with _ are always blocked.

{
  "name": "odoo_execute_kw",
  "arguments": {
    "model": "sale.order",
    "method": "action_confirm",
    "args": [[42]],
    "kwargs": {}
  }
}