Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

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

+15 this week 75 Trust /100
Trust breakdown (7 categories)

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
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
Install

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

# add to Claude Code
claude mcp add tuanle96-mcp-odoo -- uvx odoo-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "tuanle96-mcp-odoo": {
      "command": "uvx",
      "args": [
        "odoo-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "tuanle96-mcp-odoo": {
      "command": "uvx",
      "args": [
        "odoo-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add tuanle96-mcp-odoo -- uvx odoo-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tuanle96-mcp-odoo": {
      "type": "local",
      "command": [
        "uvx",
        "odoo-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add tuanle96-mcp-odoo --command uvx --arg odoo-mcp
# ~/.hermes/config.yaml
mcp_servers:
  tuanle96-mcp-odoo:
    command: "uvx"
    args: ["odoo-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "tuanle96-mcp-odoo": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "odoo-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add tuanle96-mcp-odoo -t stdio -c uvx -a odoo-mcp
// mcp.json
{
  "mcpServers": {
    "tuanle96-mcp-odoo": {
      "command": "uvx",
      "args": [
        "odoo-mcp"
      ]
    }
  }
}
Changelog

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
Diagnostics

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 →

MCP tools · 41 exposed · ~2,582 tokens

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 →

Tool Tokens
accounting_health_across_instances ~95

AR/AP aging fanned out across instances — the partner-network sweep

NameTypeReqDescription
as_ofOptional ISO date used as the aging reference date.
directionstringAging direction: 'receivable' or 'payable'.
instancesOptional instance selector; defaults to all eligible instances.
top_partnersintegerMaximum top partners to include in each aging report; capped at 100.
NameTypeReqDescription
as_of
combined_buckets
combined_total_outstanding
direction
elapsed_ms
errorSanitized error message when success is false.
errors
instance_count
instances_queried
results
skipped_opt_out
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.
unknown_instances

No examples provided.

accounting_health_summary ~26

Open receivable/payable item counts and draft invoice backlog

NameTypeReqDescription
instance
NameTypeReqDescription
draft_invoices
errorSanitized error message when success is false.
open_payable_items
open_receivable_items
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

aggregate_across_instances ~53

Read-only aggregate fanned out across instances with combined grand totals

NameTypeReqDescription
domain
group_byarrayyes
instances
measures
modelstringyes
NameTypeReqDescription
combined_count
combined_measures
elapsed_ms
errorSanitized error message when success is false.
errors
instance_count
instances_queried
model
results
skipped_opt_out
successbooleanyesFalse when the call failed; see error.
toolReporting 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.

NameTypeReqDescription
domain
group_byarrayyes
instance
lazyboolean
limit
measures
modelstringyes
offsetinteger
order
NameTypeReqDescription
errorSanitized error message when success is false.
fallback_reason
group_by
major_version
measures
methodformatted_read_group (19+) or read_group.
model
row_count
rowsAggregated group rows.
successbooleanyesFalse when the call failed; see error.
toolReporting 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

NameTypeReqDescription
log_textstringyes
source_version
target_version
NameTypeReqDescription
resultobjectyes

No examples provided.

build_domain ~39

Build a validated Odoo domain from structured conditions

NameTypeReqDescription
conditionsarrayyes
fields_metadata
logical_operatorstring
NameTypeReqDescription
conditionsNormalized field/operator/value conditions.
domainValidated Odoo domain expression.
errorSanitized error message when success is false.
issuesValidation errors and warnings.
metadata_used
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

business_pack_report ~82

Report expected modules, models, and safe discovery calls for a business pack

NameTypeReqDescription
instanceOptional configured Odoo instance name; uses the default if omitted.
packstringyesBusiness pack to report, such as sales, crm, inventory, accounting, or hr.
use_live_metadatabooleanWhether to inspect live models and installed modules.
NameTypeReqDescription
resultobjectyes

No examples provided.

cancel_async_task ~25

Cancel a pending or running background task

NameTypeReqDescription
task_idstringyes
NameTypeReqDescription
created_at
errorSanitized error message when success is false.
finished_at
name
note
result
started_at
status
successbooleanyesFalse when the call failed; see error.
task_id
toolReporting 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.

NameTypeReqDescription
approval
attachment_ids
bodystringyes
confirmboolean
instance
message_typestring
modelstringyes
partner_ids
record_idintegeryes
subtype_xmlid
NameTypeReqDescription
resultobjectyes

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

NameTypeReqDescription
checks
instance
key_fields
modelstringyes
sample_limitinteger
NameTypeReqDescription
checks_run
errorSanitized error message when success is false.
instance
model
results
sample_limit
skipped_restricted_fields
successbooleanyesFalse when the call failed; see error.
summary
toolReporting tool name.

No examples provided.

diagnose_access ~153

Diagnose ACL and record-rule visibility for an Odoo model

NameTypeReqDescription
domainOptional Odoo domain used for the visibility check.
expected_countOptional expected visible record count for comparison.
include_rulesbooleanWhether to include matching record-rule metadata.
instanceOptional configured Odoo instance name; uses the default if omitted.
limitintegerMaximum metadata rows to inspect; capped at 500.
modelstringyesTechnical Odoo model name to inspect.
observed_errorOptional error text or structured error to classify.
operationstringAccess operation to diagnose, such as read or write.
record_idsOptional record IDs to check directly.
NameTypeReqDescription
resultobjectyes

No examples provided.

diagnose_odoo_call ~168

Diagnose an Odoo model call without executing it

NameTypeReqDescription
argsOptional positional call arguments.
include_debugbooleanWhether to include additional diagnostic details.
kwargsOptional keyword call arguments.
metadataOptional model or method metadata used by the diagnosis.
methodstringyesOdoo model method name to diagnose.
modelstringyesTechnical Odoo model name to diagnose.
observed_errorOptional error text or structured error to classify.
target_versionOptional target Odoo version for compatibility checks.
transportstringTransport to assess, such as 'auto', 'xmlrpc', or 'json2'.
use_live_metadatabooleanWhether to request live metadata; this preview tool does not fetch it.
NameTypeReqDescription
resultobjectyes

No examples provided.

execute_approved_write ~34

Execute a previously previewed and confirmed standard write

NameTypeReqDescription
approvalobjectyes
confirmboolean
NameTypeReqDescription
resultobjectyes

No examples provided.

execute_method ~94

Execute a custom method on an Odoo model

NameTypeReqDescription
argsOptional positional method arguments.
instanceOptional configured Odoo instance name; uses the default if omitted.
kwargsOptional keyword method arguments.
methodstringyesOdoo model method to call; direct create, write, and unlink are blocked.
modelstringyesTechnical Odoo model name, for example 'res.partner'.
NameTypeReqDescription
resultobjectyes

No examples provided.

fit_gap_report ~61

Classify Odoo requirements into fit/gap implementation buckets

NameTypeReqDescription
available_fields
available_models
business_context
installed_modules
requirementsarrayyes
use_live_metadataboolean
NameTypeReqDescription
resultobjectyes

No examples provided.

generate_json2_payload ~65

Build a JSON-2 request preview without network access

NameTypeReqDescription
args
base_url
database
include_database_headerboolean
kwargs
methodstringyes
modelstringyes
NameTypeReqDescription
resultobjectyes

No examples provided.

get_async_task ~26

Poll a background task's status and result

NameTypeReqDescription
task_idstringyes
NameTypeReqDescription
created_at
errorSanitized error message when success is false.
finished_at
name
note
result
started_at
status
successbooleanyesFalse when the call failed; see error.
task_id
toolReporting tool name.

No examples provided.

get_model_fields ~50

Get field metadata for a specific Odoo model

NameTypeReqDescription
field_names
instance
max_fieldsinteger
modelstringyes
relevance
NameTypeReqDescription
count
errorSanitized error message when success is false.
rankingRelevance scores when relevance="top".
relevance_applied
restricted_fieldsFields marked restricted by the field ACL.
resultMapping of field name to fields_get metadata.
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

get_odoo_profile ~70

Read a bounded profile of the connected Odoo environment

NameTypeReqDescription
include_modulesbooleanWhether to include installed-module metadata.
instanceOptional configured Odoo instance name; uses the default if omitted.
module_limitintegerMaximum installed modules to include; capped at 500.
NameTypeReqDescription
errorSanitized error message when success is false.
metadata_used
profileServer, user-context, transport, and module metadata.
successbooleanyesFalse when the call failed; see error.
toolReporting 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.

NameTypeReqDescription
errorSanitized error message when success is false.
pluginsOpt-in plugin load state and tool filtering.
rate_limits
runtimeNon-secret runtime security posture.
serverServer name, instructions, surface counts.
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

index_knowledge ~60

Fetch a bounded slice of records and build a local BM25 knowledge index

NameTypeReqDescription
domain
fields
instance
limitinteger
modelstringyes
replaceboolean
NameTypeReqDescription
documents_in_index
errorSanitized error message when success is false.
fetched
indexed
indexed_fieldsExplicit field list or 'smart selection'.
instance
max_documents
model
redacted_fields
skipped_over_budget
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

inspect_model_relationships ~63

Inspect model relationships and required field metadata

NameTypeReqDescription
fields_metadata
include_computedboolean
include_readonlyboolean
instance
modelstringyes
use_live_metadataboolean
NameTypeReqDescription
resultobjectyes

No examples provided.

knowledge_stats ~17

Report local knowledge index sizes and document budget

Input schema present but exposes no named parameters.

NameTypeReqDescription
errorSanitized error message when success is false.
indexes
max_documents
successbooleanyesFalse when the call failed; see error.
toolReporting 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.

NameTypeReqDescription
errorSanitized error message when success is false.
successbooleanyesFalse when the call failed; see error.
tasks
toolReporting tool name.

No examples provided.

list_instances ~17

List configured Odoo instance names without credentials

Input schema present but exposes no named parameters.

NameTypeReqDescription
defaultName of the default instance.
errorSanitized error message when success is false.
instance_count
instancesInstance entries (never credentials).
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

list_models ~34

List Odoo models with optional name filtering

NameTypeReqDescription
instance
limitinteger
query
NameTypeReqDescription
count
errorSanitized error message when success is false.
result
successbooleanyesFalse when the call failed; see error.
toolReporting 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)

NameTypeReqDescription
namestringyes
NameTypeReqDescription
resultobjectyes

No examples provided.

preview_write ~60

Preview create, write, or unlink without executing it

NameTypeReqDescription
context
instance
modelstringyes
operationstringyes
record_ids
values
values_list
NameTypeReqDescription
resultobjectyes

No examples provided.

read_attachment ~44

Read an ir.attachment's metadata and size-capped base64 content

NameTypeReqDescription
attachment_idintegeryes
include_databoolean
instance
NameTypeReqDescription
attachmentir.attachment metadata row.
data_base64Base64 content when under the size cap.
data_included
errorSanitized error message when success is false.
max_bytes
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.
warnings

No examples provided.

read_record ~44

Read a single Odoo record by model and ID

NameTypeReqDescription
fields
instance
modelstringyes
record_idintegeryes
NameTypeReqDescription
errorSanitized error message when success is false.
fields_used
redacted_fields
resultThe record (field-ACL redacted).
smart_fields_applied
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

receivable_payable_aging ~107

Aged receivable/payable report bucketed by days overdue

NameTypeReqDescription
as_ofOptional ISO date used as the aging reference date.
directionstringAging direction: 'receivable' or 'payable'.
instanceOptional configured Odoo instance name; uses the default if omitted.
limitintegerMaximum open-item lines to inspect.
top_partnersintegerMaximum top partners to include; capped at 100.
NameTypeReqDescription
as_of
buckets
direction
errorSanitized error message when success is false.
line_count
partner_count
partners
skipped_lines
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.
total_outstanding
truncated

No examples provided.

scan_addons_source ~44

Scan local Odoo addon source without importing addon code

NameTypeReqDescription
addons_paths
max_file_bytesinteger
max_filesinteger
NameTypeReqDescription
resultobjectyes

No examples provided.

schema_catalog ~110

Build and cache a bounded Odoo model schema catalog

NameTypeReqDescription
include_fieldsbooleanWhether to include field metadata for each model.
instanceOptional configured Odoo instance name; uses the default if omitted.
limitintegerMaximum catalog models to return; capped at 500.
modelsOptional technical model names to include in the catalog.
queryOptional text used to filter catalog models.
refreshbooleanWhether to bypass and refresh the cached catalog.
NameTypeReqDescription
count
errorSanitized error message when success is false.
metadata_used
resultModel entries; fields included when requested.
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

search_across_instances ~57

Read-only search fanned out across configured Odoo instances, merged and attributed

NameTypeReqDescription
domain
fields
instances
limit_per_instanceinteger
modelstringyes
NameTypeReqDescription
elapsed_ms
errorSanitized error message when success is false.
errors
instance_count
instances_queried
merged
merged_count
model
results
skipped_opt_out
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.
unknown_instances

No examples provided.

search_employee ~33

Search for employees by name

NameTypeReqDescription
instance
limitinteger
namestringyes
NameTypeReqDescription
errorError message, if any
resultList of employee search results
successbooleanyesIndicates if the search was successful

No examples provided.

search_holidays ~77

Search for holidays within a date range

NameTypeReqDescription
employee_idOptional employee ID used to filter holidays.
end_datestringyesEnd date in YYYY-MM-DD format.
instanceOptional configured Odoo instance name; uses the default if omitted.
start_datestringyesStart date in YYYY-MM-DD format.
NameTypeReqDescription
errorError message, if any
resultList of holidays found
successbooleanyesIndicates if the search was successful

No examples provided.

search_knowledge ~47

Relevance-ranked local BM25 search over previously indexed records

NameTypeReqDescription
instance
limitinteger
modelstringyes
querystringyes
NameTypeReqDescription
errorSanitized error message when success is false.
instance
model
query
resultsBM25-ranked snippets from the local index.
successbooleanyesFalse when the call failed; see error.
toolReporting 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

NameTypeReqDescription
domain
fields
instance
limitinteger
modelstringyes
offsetinteger
order
query
NameTypeReqDescription
count
errorSanitized error message when success is false.
fields_used
query_fields_usedFields matched by the free-text query shortcut.
redacted_fields
resultMatched records (field-ACL redacted).
smart_fields_applied
successbooleanyesFalse when the call failed; see error.
toolReporting tool name.

No examples provided.

submit_async_task ~38

Run an allowlisted long-running read operation in the background

NameTypeReqDescription
instance
operationstringyes
params
NameTypeReqDescription
created_at
errorSanitized error message when success is false.
finished_at
name
note
result
started_at
status
successbooleanyesFalse when the call failed; see error.
task_id
toolReporting tool name.

No examples provided.

upgrade_risk_report ~136

Report Odoo upgrade and JSON-2 migration risks

NameTypeReqDescription
include_debugbooleanWhether to include additional diagnostic details.
methodsOptional model method metadata to assess for compatibility.
modulesOptional module metadata to assess for upgrade risks.
observed_errorsOptional observed upgrade or migration errors to classify.
source_findingsOptional source-code findings to include in the risk report.
source_versionOptional current Odoo version.
target_versionOptional target Odoo version.
use_live_metadatabooleanWhether to request live metadata; this preview tool does not fetch it.
NameTypeReqDescription
resultobjectyes

No examples provided.

validate_write ~75

Validate a standard write payload against optional fields_get metadata

NameTypeReqDescription
context
fields_metadata
instance
modelstringyes
operationstringyes
record_ids
use_live_metadataboolean
values
values_list
NameTypeReqDescription
resultobjectyes

No examples provided.

Common questions

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.