io.github.tuanle96/mcp-odoo
PYPI · ODOO-MCP · SCANNED SEP 21
Odoo MCP: gated writes, multi-instance. Free hosted: ERPipe (mcp.erpipe.com)
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 0 of 32 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency10
- Repository check failed: the declared repository URL redirects; it must resolve directly. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 54 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability77
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 2615 tokens (~62/item across 42 items; 41 tools + 1 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
- Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage80
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 32% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 43 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the io.github.tuanle96/mcp-odoo server?
io.github.tuanle96/mcp-odoo runs locally as a PyPI package, launched with uvx odoo-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · odoo-mcp
claude mcp add tuanle96-mcp-odoo -- uvx odoo-mcp
{
"mcpServers": {
"tuanle96-mcp-odoo": {
"command": "uvx",
"args": [
"odoo-mcp"
]
}
}
} {
"servers": {
"tuanle96-mcp-odoo": {
"command": "uvx",
"args": [
"odoo-mcp"
]
}
}
} codex mcp add tuanle96-mcp-odoo -- uvx odoo-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"tuanle96-mcp-odoo": {
"type": "local",
"command": [
"uvx",
"odoo-mcp"
],
"enabled": true
}
}
} openclaw mcp add tuanle96-mcp-odoo --command uvx --arg odoo-mcp
mcp_servers:
tuanle96-mcp-odoo:
command: "uvx"
args: ["odoo-mcp"] {
"McpServers": {
"tuanle96-mcp-odoo": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"odoo-mcp"
]
}
}
} assistant mcp add tuanle96-mcp-odoo -t stdio -c uvx -a odoo-mcp
{
"mcpServers": {
"tuanle96-mcp-odoo": {
"command": "uvx",
"args": [
"odoo-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +13
- Malware scan: unverified → pass ▲ security
- Stability: pass → 0.83 functional
- 17 Sept 26 −15
- Malware scan: pass → unverified ▼ security
- Stability: 0.97 → pass security
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 14 Sept 26 −14
- Malware scan: pass → unverified ▼ security
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 10 Sept 26 −3
- Stability: pass → 0.77 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed pypi/odoo-mcp@1.2.2
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 32 packages
| Packages resolved | 32 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
accounting_health_across_instances ~95
AR/AP aging fanned out across instances — the partner-network sweep
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | – | – | Optional ISO date used as the aging reference date. |
| direction | string | – | Aging direction: 'receivable' or 'payable'. |
| instances | – | – | Optional instance selector; defaults to all eligible instances. |
| top_partners | integer | – | Maximum top partners to include in each aging report; capped at 100. |
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | – | – | – |
| combined_buckets | – | – | – |
| combined_total_outstanding | – | – | – |
| direction | – | – | – |
| elapsed_ms | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| errors | – | – | – |
| instance_count | – | – | – |
| instances_queried | – | – | – |
| results | – | – | – |
| skipped_opt_out | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
| unknown_instances | – | – | – |
No examples provided.
accounting_health_summary ~26
Open receivable/payable item counts and draft invoice backlog
| Name | Type | Req | Description |
|---|---|---|---|
| instance | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| draft_invoices | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| open_payable_items | – | – | – |
| open_receivable_items | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
aggregate_across_instances ~53
Read-only aggregate fanned out across instances with combined grand totals
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | – | – |
| group_by | array | yes | – |
| instances | – | – | – |
| measures | – | – | – |
| model | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| combined_count | – | – | – |
| combined_measures | – | – | – |
| elapsed_ms | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| errors | – | – | – |
| instance_count | – | – | – |
| instances_queried | – | – | – |
| model | – | – | – |
| results | – | – | – |
| skipped_opt_out | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
| unknown_instances | – | – | – |
No examples provided.
aggregate_records ~94
Aggregate Odoo records server-side using Postgres groupby/sum/count. Uses formatted_read_group on Odoo 19+ and read_group on earlier versions.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | – | – |
| group_by | array | yes | – |
| instance | – | – | – |
| lazy | boolean | – | – |
| limit | – | – | – |
| measures | – | – | – |
| model | string | yes | – |
| offset | integer | – | – |
| order | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Sanitized error message when success is false. |
| fallback_reason | – | – | – |
| group_by | – | – | – |
| major_version | – | – | – |
| measures | – | – | – |
| method | – | – | formatted_read_group (19+) or read_group. |
| model | – | – | – |
| row_count | – | – | – |
| rows | – | – | Aggregated group rows. |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
analyze_upgrade_log ~56
Classify Odoo install/update log errors into a migration worklist (no_action / needs_review / needs_script) with fix suggestions
| Name | Type | Req | Description |
|---|---|---|---|
| log_text | string | yes | – |
| source_version | – | – | – |
| target_version | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
build_domain ~39
Build a validated Odoo domain from structured conditions
| Name | Type | Req | Description |
|---|---|---|---|
| conditions | array | yes | – |
| fields_metadata | – | – | – |
| logical_operator | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| conditions | – | – | Normalized field/operator/value conditions. |
| domain | – | – | Validated Odoo domain expression. |
| error | – | – | Sanitized error message when success is false. |
| issues | – | – | Validation errors and warnings. |
| metadata_used | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
business_pack_report ~82
Report expected modules, models, and safe discovery calls for a business pack
| Name | Type | Req | Description |
|---|---|---|---|
| instance | – | – | Optional configured Odoo instance name; uses the default if omitted. |
| pack | string | yes | Business pack to report, such as sales, crm, inventory, accounting, or hr. |
| use_live_metadata | boolean | – | Whether to inspect live models and installed modules. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
cancel_async_task ~25
Cancel a pending or running background task
| Name | Type | Req | Description |
|---|---|---|---|
| task_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| created_at | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| finished_at | – | – | – |
| name | – | – | – |
| note | – | – | – |
| result | – | – | – |
| started_at | – | – | – |
| status | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| task_id | – | – | – |
| tool | – | – | Reporting tool name. |
No examples provided.
chatter_post ~109
Post a chatter message on a mail.thread record. Default mode requires an approval token returned from a preview call; set MCP_CHATTER_DIRECT=1 to bypass and post immediately.
| Name | Type | Req | Description |
|---|---|---|---|
| approval | – | – | – |
| attachment_ids | – | – | – |
| body | string | yes | – |
| confirm | boolean | – | – |
| instance | – | – | – |
| message_type | string | – | – |
| model | string | yes | – |
| partner_ids | – | – | – |
| record_id | integer | yes | – |
| subtype_xmlid | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
data_quality_report ~65
Run read-only data-quality checks on one Odoo model: duplicates, missing required values, orphaned references, format anomalies
| Name | Type | Req | Description |
|---|---|---|---|
| checks | – | – | – |
| instance | – | – | – |
| key_fields | – | – | – |
| model | string | yes | – |
| sample_limit | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| checks_run | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| instance | – | – | – |
| model | – | – | – |
| results | – | – | – |
| sample_limit | – | – | – |
| skipped_restricted_fields | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| summary | – | – | – |
| tool | – | – | Reporting tool name. |
No examples provided.
diagnose_access ~153
Diagnose ACL and record-rule visibility for an Odoo model
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | – | Optional Odoo domain used for the visibility check. |
| expected_count | – | – | Optional expected visible record count for comparison. |
| include_rules | boolean | – | Whether to include matching record-rule metadata. |
| instance | – | – | Optional configured Odoo instance name; uses the default if omitted. |
| limit | integer | – | Maximum metadata rows to inspect; capped at 500. |
| model | string | yes | Technical Odoo model name to inspect. |
| observed_error | – | – | Optional error text or structured error to classify. |
| operation | string | – | Access operation to diagnose, such as read or write. |
| record_ids | – | – | Optional record IDs to check directly. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
diagnose_odoo_call ~168
Diagnose an Odoo model call without executing it
| Name | Type | Req | Description |
|---|---|---|---|
| args | – | – | Optional positional call arguments. |
| include_debug | boolean | – | Whether to include additional diagnostic details. |
| kwargs | – | – | Optional keyword call arguments. |
| metadata | – | – | Optional model or method metadata used by the diagnosis. |
| method | string | yes | Odoo model method name to diagnose. |
| model | string | yes | Technical Odoo model name to diagnose. |
| observed_error | – | – | Optional error text or structured error to classify. |
| target_version | – | – | Optional target Odoo version for compatibility checks. |
| transport | string | – | Transport to assess, such as 'auto', 'xmlrpc', or 'json2'. |
| use_live_metadata | boolean | – | Whether to request live metadata; this preview tool does not fetch it. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
execute_approved_write ~34
Execute a previously previewed and confirmed standard write
| Name | Type | Req | Description |
|---|---|---|---|
| approval | object | yes | – |
| confirm | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
execute_method ~94
Execute a custom method on an Odoo model
| Name | Type | Req | Description |
|---|---|---|---|
| args | – | – | Optional positional method arguments. |
| instance | – | – | Optional configured Odoo instance name; uses the default if omitted. |
| kwargs | – | – | Optional keyword method arguments. |
| method | string | yes | Odoo model method to call; direct create, write, and unlink are blocked. |
| model | string | yes | Technical Odoo model name, for example 'res.partner'. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
fit_gap_report ~61
Classify Odoo requirements into fit/gap implementation buckets
| Name | Type | Req | Description |
|---|---|---|---|
| available_fields | – | – | – |
| available_models | – | – | – |
| business_context | – | – | – |
| installed_modules | – | – | – |
| requirements | array | yes | – |
| use_live_metadata | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
generate_json2_payload ~65
Build a JSON-2 request preview without network access
| Name | Type | Req | Description |
|---|---|---|---|
| args | – | – | – |
| base_url | – | – | – |
| database | – | – | – |
| include_database_header | boolean | – | – |
| kwargs | – | – | – |
| method | string | yes | – |
| model | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
get_async_task ~26
Poll a background task's status and result
| Name | Type | Req | Description |
|---|---|---|---|
| task_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| created_at | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| finished_at | – | – | – |
| name | – | – | – |
| note | – | – | – |
| result | – | – | – |
| started_at | – | – | – |
| status | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| task_id | – | – | – |
| tool | – | – | Reporting tool name. |
No examples provided.
get_model_fields ~50
Get field metadata for a specific Odoo model
| Name | Type | Req | Description |
|---|---|---|---|
| field_names | – | – | – |
| instance | – | – | – |
| max_fields | integer | – | – |
| model | string | yes | – |
| relevance | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| ranking | – | – | Relevance scores when relevance="top". |
| relevance_applied | – | – | – |
| restricted_fields | – | – | Fields marked restricted by the field ACL. |
| result | – | – | Mapping of field name to fields_get metadata. |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
get_odoo_profile ~70
Read a bounded profile of the connected Odoo environment
| Name | Type | Req | Description |
|---|---|---|---|
| include_modules | boolean | – | Whether to include installed-module metadata. |
| instance | – | – | Optional configured Odoo instance name; uses the default if omitted. |
| module_limit | integer | – | Maximum installed modules to include; capped at 500. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Sanitized error message when success is false. |
| metadata_used | – | – | – |
| profile | – | – | Server, user-context, transport, and module metadata. |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
health_check ~19
Report this MCP server's non-secret runtime safety posture
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Sanitized error message when success is false. |
| plugins | – | – | Opt-in plugin load state and tool filtering. |
| rate_limits | – | – | – |
| runtime | – | – | Non-secret runtime security posture. |
| server | – | – | Server name, instructions, surface counts. |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
index_knowledge ~60
Fetch a bounded slice of records and build a local BM25 knowledge index
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | – | – |
| fields | – | – | – |
| instance | – | – | – |
| limit | integer | – | – |
| model | string | yes | – |
| replace | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| documents_in_index | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| fetched | – | – | – |
| indexed | – | – | – |
| indexed_fields | – | – | Explicit field list or 'smart selection'. |
| instance | – | – | – |
| max_documents | – | – | – |
| model | – | – | – |
| redacted_fields | – | – | – |
| skipped_over_budget | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
inspect_model_relationships ~63
Inspect model relationships and required field metadata
| Name | Type | Req | Description |
|---|---|---|---|
| fields_metadata | – | – | – |
| include_computed | boolean | – | – |
| include_readonly | boolean | – | – |
| instance | – | – | – |
| model | string | yes | – |
| use_live_metadata | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
knowledge_stats ~17
Report local knowledge index sizes and document budget
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Sanitized error message when success is false. |
| indexes | – | – | – |
| max_documents | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
| total_documents | – | – | – |
No examples provided.
list_async_tasks ~16
List recent background tasks newest-first
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Sanitized error message when success is false. |
| success | boolean | yes | False when the call failed; see error. |
| tasks | – | – | – |
| tool | – | – | Reporting tool name. |
No examples provided.
list_instances ~17
List configured Odoo instance names without credentials
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| default | – | – | Name of the default instance. |
| error | – | – | Sanitized error message when success is false. |
| instance_count | – | – | – |
| instances | – | – | Instance entries (never credentials). |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
list_models ~34
List Odoo models with optional name filtering
| Name | Type | Req | Description |
|---|---|---|---|
| instance | – | – | – |
| limit | integer | – | – |
| query | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| result | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
lookup_model_history ~41
Look up Odoo model rename/removal history by old or new model name (e.g. account.invoice -> account.move)
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
preview_write ~60
Preview create, write, or unlink without executing it
| Name | Type | Req | Description |
|---|---|---|---|
| context | – | – | – |
| instance | – | – | – |
| model | string | yes | – |
| operation | string | yes | – |
| record_ids | – | – | – |
| values | – | – | – |
| values_list | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
read_attachment ~44
Read an ir.attachment's metadata and size-capped base64 content
| Name | Type | Req | Description |
|---|---|---|---|
| attachment_id | integer | yes | – |
| include_data | boolean | – | – |
| instance | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| attachment | – | – | ir.attachment metadata row. |
| data_base64 | – | – | Base64 content when under the size cap. |
| data_included | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| max_bytes | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
| warnings | – | – | – |
No examples provided.
read_record ~44
Read a single Odoo record by model and ID
| Name | Type | Req | Description |
|---|---|---|---|
| fields | – | – | – |
| instance | – | – | – |
| model | string | yes | – |
| record_id | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Sanitized error message when success is false. |
| fields_used | – | – | – |
| redacted_fields | – | – | – |
| result | – | – | The record (field-ACL redacted). |
| smart_fields_applied | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
receivable_payable_aging ~107
Aged receivable/payable report bucketed by days overdue
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | – | – | Optional ISO date used as the aging reference date. |
| direction | string | – | Aging direction: 'receivable' or 'payable'. |
| instance | – | – | Optional configured Odoo instance name; uses the default if omitted. |
| limit | integer | – | Maximum open-item lines to inspect. |
| top_partners | integer | – | Maximum top partners to include; capped at 100. |
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | – | – | – |
| buckets | – | – | – |
| direction | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| line_count | – | – | – |
| partner_count | – | – | – |
| partners | – | – | – |
| skipped_lines | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
| total_outstanding | – | – | – |
| truncated | – | – | – |
No examples provided.
scan_addons_source ~44
Scan local Odoo addon source without importing addon code
| Name | Type | Req | Description |
|---|---|---|---|
| addons_paths | – | – | – |
| max_file_bytes | integer | – | – |
| max_files | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
schema_catalog ~110
Build and cache a bounded Odoo model schema catalog
| Name | Type | Req | Description |
|---|---|---|---|
| include_fields | boolean | – | Whether to include field metadata for each model. |
| instance | – | – | Optional configured Odoo instance name; uses the default if omitted. |
| limit | integer | – | Maximum catalog models to return; capped at 500. |
| models | – | – | Optional technical model names to include in the catalog. |
| query | – | – | Optional text used to filter catalog models. |
| refresh | boolean | – | Whether to bypass and refresh the cached catalog. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| metadata_used | – | – | – |
| result | – | – | Model entries; fields included when requested. |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
search_across_instances ~57
Read-only search fanned out across configured Odoo instances, merged and attributed
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | – | – |
| fields | – | – | – |
| instances | – | – | – |
| limit_per_instance | integer | – | – |
| model | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| elapsed_ms | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| errors | – | – | – |
| instance_count | – | – | – |
| instances_queried | – | – | – |
| merged | – | – | – |
| merged_count | – | – | – |
| model | – | – | – |
| results | – | – | – |
| skipped_opt_out | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
| unknown_instances | – | – | – |
No examples provided.
search_employee ~33
Search for employees by name
| Name | Type | Req | Description |
|---|---|---|---|
| instance | – | – | – |
| limit | integer | – | – |
| name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Error message, if any |
| result | – | – | List of employee search results |
| success | boolean | yes | Indicates if the search was successful |
No examples provided.
search_holidays ~77
Search for holidays within a date range
| Name | Type | Req | Description |
|---|---|---|---|
| employee_id | – | – | Optional employee ID used to filter holidays. |
| end_date | string | yes | End date in YYYY-MM-DD format. |
| instance | – | – | Optional configured Odoo instance name; uses the default if omitted. |
| start_date | string | yes | Start date in YYYY-MM-DD format. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Error message, if any |
| result | – | – | List of holidays found |
| success | boolean | yes | Indicates if the search was successful |
No examples provided.
search_knowledge ~47
Relevance-ranked local BM25 search over previously indexed records
| Name | Type | Req | Description |
|---|---|---|---|
| instance | – | – | – |
| limit | integer | – | – |
| model | string | yes | – |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| error | – | – | Sanitized error message when success is false. |
| instance | – | – | – |
| model | – | – | – |
| query | – | – | – |
| results | – | – | BM25-ranked snippets from the local index. |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
search_records ~78
Search Odoo records with read-only search_read; optional free-text `query` matches across name/ref/email-like fields
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | – | – |
| fields | – | – | – |
| instance | – | – | – |
| limit | integer | – | – |
| model | string | yes | – |
| offset | integer | – | – |
| order | – | – | – |
| query | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| fields_used | – | – | – |
| query_fields_used | – | – | Fields matched by the free-text query shortcut. |
| redacted_fields | – | – | – |
| result | – | – | Matched records (field-ACL redacted). |
| smart_fields_applied | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| tool | – | – | Reporting tool name. |
No examples provided.
submit_async_task ~38
Run an allowlisted long-running read operation in the background
| Name | Type | Req | Description |
|---|---|---|---|
| instance | – | – | – |
| operation | string | yes | – |
| params | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| created_at | – | – | – |
| error | – | – | Sanitized error message when success is false. |
| finished_at | – | – | – |
| name | – | – | – |
| note | – | – | – |
| result | – | – | – |
| started_at | – | – | – |
| status | – | – | – |
| success | boolean | yes | False when the call failed; see error. |
| task_id | – | – | – |
| tool | – | – | Reporting tool name. |
No examples provided.
upgrade_risk_report ~136
Report Odoo upgrade and JSON-2 migration risks
| Name | Type | Req | Description |
|---|---|---|---|
| include_debug | boolean | – | Whether to include additional diagnostic details. |
| methods | – | – | Optional model method metadata to assess for compatibility. |
| modules | – | – | Optional module metadata to assess for upgrade risks. |
| observed_errors | – | – | Optional observed upgrade or migration errors to classify. |
| source_findings | – | – | Optional source-code findings to include in the risk report. |
| source_version | – | – | Optional current Odoo version. |
| target_version | – | – | Optional target Odoo version. |
| use_live_metadata | boolean | – | Whether to request live metadata; this preview tool does not fetch it. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
validate_write ~75
Validate a standard write payload against optional fields_get metadata
| Name | Type | Req | Description |
|---|---|---|---|
| context | – | – | – |
| fields_metadata | – | – | – |
| instance | – | – | – |
| model | string | yes | – |
| operation | string | yes | – |
| record_ids | – | – | – |
| use_live_metadata | boolean | – | – |
| values | – | – | – |
| values_list | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
What is the io.github.tuanle96/mcp-odoo server?
io.github.tuanle96/mcp-odoo is listed in the public MCP registry as io.github.tuanle96/mcp-odoo. Odoo MCP: gated writes, multi-instance. Free hosted: ERPipe (mcp.erpipe.com). This page covers its PyPI package (odoo-mcp).
Is the io.github.tuanle96/mcp-odoo server safe to use?
io.github.tuanle96/mcp-odoo scores 75 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.tuanle96/mcp-odoo server expose?
io.github.tuanle96/mcp-odoo exposes 41 tools: data_quality_report, diagnose_odoo_call, generate_json2_payload, inspect_model_relationships, diagnose_access, and 36 more. Their descriptions and schemas cost roughly 2,582 tokens of context every time the server is loaded.
Is the io.github.tuanle96/mcp-odoo server still maintained?
io.github.tuanle96/mcp-odoo is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.