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_policyentries (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:
| Action | Description |
|---|---|
list_models | List all models that have an active MCP policy |
describe_model | Fields, field types, required/readonly flags |
list_methods | Public methods available on a model |
list_actions | Window actions defined for the model |
list_reports | QWeb 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:
| Action | Equivalent ORM | Policy |
|---|---|---|
search_read | model.search_read(domain, fields, limit, offset, order) | read |
search_count | model.search_count(domain) | read |
read | model.browse(ids).read(fields) | read |
read_group | model.read_group(domain, fields, groupby) | read |
name_search | model.name_search(name, operator, limit) | read |
get_messages | Read chatter messages for a record | read |
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:
| Action | Description |
|---|---|
update | Write field values to the given record IDs |
archive | Set active = False on the given record IDs |
unarchive | Set 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"
}
}
}odoo_unlink
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": {}
}
}