Skip to main content
Glama

Odoo MCP

Odoo MCP turns any Odoo 16+ database into a Model Context Protocol server — using only your existing credentials. No App Store module, no permission setup, no admin access required. Built for local agents, IDEs, and automation tools that need real Odoo context without hand-rolled scripts or unsafe direct write access.

It speaks XML-RPC for Odoo 16-18 and External JSON-2 for Odoo 19+. It exposes a compact MCP surface with read tools, diagnostics, schema discovery, migration helpers, local addon scanning, and a gated write workflow. One server can serve multiple named Odoo instances at once.

Try it in 30 seconds

Once configured (see Setup), ask your agent things like:

"Show me all customers from Spain with unpaid invoices."

"Find products with stock below 10 units in the main warehouse."

"Audit the custom_billing addon for upgrade risks before we move to Odoo 19."

Related MCP server: odooclaw-mcp

Highlights

Capability

What it gives you

41 MCP tools

Read records and attachments, aggregate server-side, post chatter, inspect schema, build domains, scan addons, diagnose calls and upgrade logs, check data quality, access rules, resolve model renames, validate writes, and fan out across instances.

Field-level ACL

Opt-in per-instance, per-model field allow/deny enforced on every read path (records, aggregates, knowledge index, resources). First open-source Odoo MCP with it. See docs/field-acl.md.

Cross-instance queries

Read-only fan-out across many client DBs with merged, attributed, partial-failure-tolerant results — no warehouse, no sync. See docs/partner-playbook.md.

Workflow prompts

11 prompts including 6 end-to-end business workflows (invoice approval, PO match, onboarding, expense review, month-end close, pre-migration data quality) that route writes through the gate.

Background tasks

submit_async_task runs long read operations (addon scans, knowledge indexing, AR/AP aging) on a bounded worker pool; poll with get_async_task while the agent keeps reasoning.

Local-first knowledge search

index_knowledge + search_knowledge give BM25 relevance ranking over a bounded record slice — accent-insensitive, in-process, no embeddings service, no data leaving the machine.

Accounting pack

receivable_payable_aging and accounting_health_summary answer the most common finance questions in one call instead of hand-built domains.

Agent Skills pack

4 business-workflow skills (data-quality gate, migration copilot, month-end close, agency fleet review) — npx skills add tuanle96/mcp-odoo. Developing on Odoo with shell access? Add the 21-skill companion dev suite odoo-ai-skills. See skills/.

Tool plugins

Ship your own tools as pip packages (odoo_mcp.tools entry points) — opt-in via ODOO_MCP_PLUGINS, fail-isolated, no fork needed. Trim the surface per deployment with ODOO_MCP_TOOLS_INCLUDE/EXCLUDE. See docs/plugins.md.

Rate limiting

Opt-in sliding-window budget per instance and tool (ODOO_MCP_RATE_LIMIT_MODE=warn|block), surfaced in health_check.

Multi-instance

One server, several named Odoo instances — optional instance parameter on every tool, list_instances discovery, instance-bound approval tokens, per-instance schema caches.

5 agent prompts

Reusable workflows for failed calls, fit/gap workshops, JSON-2 migration, safe writes, and module audits.

Odoo 16-19 coverage

XML-RPC by default, JSON-2 opt-in for Odoo 19.

Streamable HTTP

Local HTTP/SSE support for clients that do not use stdio.

Smart field selection

search_records and read_record curate business-relevant fields when no fields argument is supplied — drops audit, message, binary, and unstored compute noise. Pass fields=["*"] to opt out.

Server-side aggregation

aggregate_records pushes groupby/sum/count/avg into Postgres via formatted_read_group (Odoo 19+) or read_group (16-18).

Chatter integration

chatter_post adds messages to any mail.thread record under the same approval-token gate as writes — or directly via MCP_CHATTER_DIRECT=1.

Locale plumbing

ODOO_LOCALE injects context.lang automatically on every Odoo call (caller can override).

Structured logging

JSON formatter and rotating file handler via ODOO_MCP_LOG_LEVEL, ODOO_MCP_LOG_JSON, ODOO_MCP_LOG_FILE.

Safe writes

Direct create, write, and unlink are blocked; approved writes require live metadata, a same-session token, explicit confirmation, and an env gate.

Human-in-the-loop approval

ODOO_MCP_ELICIT_WRITES=1 shows a native MCP confirmation form (with a diff summary) before any approved write executes — token flow stays as fallback.

Audit trail

ODOO_MCP_AUDIT_LOG appends one JSONL line per write-path event (preview, validate, execute, chatter) with instance and token digest.

Resilience

Read-only calls retry connection errors with exponential backoff; schema caches are TTL- and LRU-bounded; health_check flags N+1 read loops.

Real smoke tests

Docker Compose validation boots disposable Odoo 16.0, 17.0, 18.0, and 19.0 stacks, including restricted users, custom record rules, and packaged addon XML install/update.

Why Odoo MCP

Trait

Odoo MCP

Other MCP-Odoo bridges

Setup steps on Odoo side

0 — works with any Odoo 16+ instance using credentials you already have.

Often require installing an App Store module, configuring enabled models, and granting per-tool permissions.

Safe write workflow

Approval token + live fields_get validation + explicit confirm + env gate.

Often expose direct create/write/unlink or a "yolo" bypass.

Diagnostics

diagnose_odoo_call, diagnose_access, inspect_model_relationships, upgrade_risk_report, fit_gap_report, business_pack_report, scan_addons_source.

Usually CRUD only.

Transport

XML-RPC (16+) and External JSON-2 (Odoo 19+). Ready for the Odoo 22 XML-RPC removal years early.

Usually XML-RPC only — deprecated since Odoo 19, removed in Odoo 22.

Migration helpers

generate_json2_payload previews the JSON-2 body for any XML-RPC call before you migrate.

None.

Multi-instance

Named instances in one config file, per-tool routing, tokens and caches isolated per instance.

Usually one global connection per server process.

Agent prompts

5 ready-made prompts for diagnose / fit-gap / JSON-2 migration / safe-write / module-audit.

Usually none.

HTTP transport security

DNS-rebinding protection, host/origin allowlists, local-bind by default.

Often missing.

Real Odoo smoke tests

Docker Compose harness boots disposable Odoo 16/17/18/19 stacks per release.

Often mock-based only.

Framework examples

Copy-paste adapters for Cursor, Claude Code, OpenAI Agents, LangGraph, CrewAI, and n8n in examples/.

None.

Audit & approval UX

JSONL audit trail + native elicitation confirm forms — without installing anything in Odoo.

Audit features usually require an Odoo-side module.

Comparing specific projects? See the per-project breakdown in docs/comparison.md.

Setup

Two paths to a working server: set it up yourself, or paste one prompt and let your coding agent do it for you.

For humans

The fastest path is the interactive wizard via uvx, which fetches the package on demand:

uvx odoo-mcp --setup

The wizard asks for your Odoo URL, database, and credentials, tests the connection live, writes the config file, and prints ready-to-paste snippets for Claude Code, Cursor, and Claude Desktop. Prefer a quick smoke check instead? uvx odoo-mcp --health.

Using Claude Desktop on macOS? It reads MCP configuration from:

~/Library/Application Support/Claude/claude_desktop_config.json

Use an absolute Python path because GUI apps may not inherit your shell PATH:

{
  "mcpServers": {
    "odoo": {
      "command": "/opt/homebrew/bin/python3",
      "args": ["-m", "odoo_mcp"],
      "env": {
        "ODOO_URL": "https://your-odoo-instance.com",
        "ODOO_DB": "your-database",
        "ODOO_USERNAME": "your-user",
        "ODOO_PASSWORD": "your-password-or-api-key",
        "ODOO_TRANSPORT": "xmlrpc"
      }
    }
  }
}

More client configs (Windsurf, VS Code, Zed, Continue.dev, Streamable HTTP) are in docs/client-configs.md.

Other ways to install:

pip install odoo-mcp
# or: pipx install odoo-mcp

Prefer a container? See Docker. For local development:

git clone https://github.com/tuanle96/mcp-odoo.git
cd mcp-odoo
uv sync --extra dev

For AI agents

Paste this into Claude Code, Cursor, Codex, or any coding agent and it will install the server for you:

Install the odoo-mcp MCP server (https://github.com/tuanle96/mcp-odoo) in this environment:

1. Ask me for my Odoo URL, database name, username, and password or API key.
   Treat them as secrets: never echo, print, or log these values.
2. Register the server as a stdio MCP server:
   - Claude Code: claude mcp add odoo --env ODOO_URL=<url> --env ODOO_DB=<db>
     --env ODOO_USERNAME=<user> --env ODOO_PASSWORD=<secret> -- uvx odoo-mcp
   - Any other client: write the equivalent config with "command": "uvx",
     "args": ["odoo-mcp"], and the same four env vars.
3. Verify the install: run `uvx odoo-mcp --health`, then call the health_check
   MCP tool and confirm the Odoo connection is reachable.
4. Leave writes disabled (do not set ODOO_MCP_ENABLE_WRITES) unless I
   explicitly ask you to enable them.

Full machine-readable instructions: https://github.com/tuanle96/mcp-odoo/blob/main/llms-install.md

Already know your client? One-liners and config snippets:

claude mcp add odoo --env ODOO_URL=https://mycompany.odoo.com --env ODOO_DB=mycompany \
  --env ODOO_USERNAME=agent@mycompany.com --env ODOO_PASSWORD=your-api-key -- uvx odoo-mcp

Framework SDKs

Copy-paste-runnable integrations live in examples/:

Client

Example

Cursor

examples/cursor/.cursor/mcp.json + agent rules

Claude Code / Codex CLI

snippets in examples/README.md

OpenAI Agents SDK

examples/openai-agents/ — local + hosted variants

LangGraph

examples/langgraph/langchain-mcp-adapters

CrewAI

examples/crewai/ — native mcps=[...] agent

n8n

examples/n8n/ — importable workflow JSON

Configuration reference

Set connection values in the environment:

export ODOO_URL="https://your-odoo-instance.com"
export ODOO_DB="your-database"
export ODOO_USERNAME="your-user"
export ODOO_PASSWORD="your-password-or-api-key"
export ODOO_TRANSPORT="xmlrpc"

For Odoo 19 JSON-2:

export ODOO_TRANSPORT="json2"
export ODOO_API_KEY="your-odoo-api-key"
export ODOO_JSON2_DATABASE_HEADER="1"

ODOO_JSON2_DATABASE_HEADER=1 sends X-Odoo-Database on JSON-2 calls. Set it to 0 only when host or dbfilter routing already selects the intended database.

Optional environment variables:

Variable

Default

Effect

ODOO_CONFIG_FILE

unset

Explicit path to a config file, checked before the standard locations.

ODOO_LOCALE

unset

Inject context.lang on every Odoo call. Caller-supplied context.lang always wins.

ODOO_MCP_MAX_SMART_FIELDS

15

Cap for smart-field selection when caller omits fields.

ODOO_MCP_LOG_LEVEL

INFO

Process logger level (DEBUG/INFO/WARNING/ERROR/CRITICAL).

ODOO_MCP_LOG_JSON

0

Truthy → emit JSON-formatted log lines.

ODOO_MCP_LOG_FILE

unset

Path → enable rotating file handler (10MB × 3 backups).

ODOO_MCP_ENABLE_WRITES

0

Required for execute_approved_write.

ODOO_MCP_ALLOWED_SIDE_EFFECT_METHODS

empty

Exact model.method allowlist (e.g. sale.order.action_confirm).

ODOO_MCP_POLICY_FILE

./odoo_mcp_policy.json if present

Version-controllable side-effect allowlist with review metadata (see odoo_mcp_policy.json.example); merged with the env allowlist.

ODOO_MCP_ALLOW_UNKNOWN_METHODS

0

Broad mode for execute_method. Prefer the exact allowlist above.

ODOO_MCP_AUDIT_LOG

unset

Path → append one JSONL line per write-path event (preview/validate/execute/chatter), tokens stored as digests.

ODOO_MCP_ELICIT_WRITES

0

Truthy → execute_approved_write asks the human via MCP elicitation (native confirm form with a diff summary) before executing; falls back to the token flow when the client cannot elicit.

ODOO_MCP_RETRY_ATTEMPTS

2

Extra attempts for read-only calls on connection errors (0–5). Writes never retry.

ODOO_MCP_RETRY_BACKOFF

0.5

Base retry backoff seconds; doubles per retry.

ODOO_MCP_SCHEMA_CACHE_TTL

600

Schema cache entry lifetime in seconds.

ODOO_MCP_SCHEMA_CACHE_MAX

256

Max schema cache entries (LRU eviction).

ODOO_MCP_RATE_LIMIT_MODE

off

warn tracks per-instance:tool call rates in health_check; block refuses over-budget calls on the hot read tools and execute_method.

ODOO_MCP_RATE_LIMIT_WINDOW

60

Sliding window length in seconds for rate tracking.

ODOO_MCP_RATE_LIMIT_MAX_CALLS

120

Calls allowed per window per instance:tool.

ODOO_MCP_ASYNC_MAX_WORKERS

2

Worker threads for submit_async_task.

ODOO_MCP_ASYNC_MAX_TASKS

50

Max retained background tasks (finished tasks evicted oldest-first).

ODOO_MCP_ASYNC_RESULT_TTL

3600

Seconds a finished background task result stays pollable.

ODOO_MCP_KNOWLEDGE_MAX_DOCS

5000

Total documents allowed across all local BM25 knowledge indexes.

ODOO_MCP_FIELD_POLICY_FILE

shared policy file

Field ACL policy (a field_acl key in the policy file, or a dedicated file here). Denied fields are removed from every read path. See docs/field-acl.md.

ODOO_MCP_CROSS_INSTANCE_WORKERS

4

Bounded concurrency for cross-instance fan-out tools.

MCP_CHATTER_DIRECT

0

Truthy → chatter_post skips the approval token gate and posts immediately.

MCP_ALLOW_REMOTE_HTTP

0

Truthy → permit non-local HTTP binds (still requires external auth/TLS).

MCP_ALLOWED_HOSTS / MCP_ALLOWED_ORIGINS

local

CSV allowlists for HTTP transports.

ODOO_MCP_MAX_ATTACHMENT_BYTES

1048576

Download cap for read_attachment content (hard cap 16 MiB).

ODOO_MCP_ATTACHMENT_UPLOAD_ROOTS

unset

Colon-separated local directories validate_write may read <field>_from_path uploads from (mirrors ODOO_ADDONS_PATHS). Required — fails closed with no roots configured.

ODOO_MCP_MAX_ATTACHMENT_UPLOAD_BYTES

10485760

Size cap for <field>_from_path local-file uploads (hard cap 16 MiB).

ODOO_MCP_AUTH_ISSUER_URL

unset

OAuth 2.1: authorization server issuer. With the two vars below, the HTTP transport becomes a protected resource server (RFC 9728 metadata + bearer validation).

ODOO_MCP_AUTH_INTROSPECTION_URL

unset

RFC 7662 token introspection endpoint of the authorization server.

ODOO_MCP_AUTH_RESOURCE_URL

unset

Canonical URL of this MCP server (RFC 8707 audience check when the AS binds tokens).

ODOO_MCP_AUTH_REQUIRED_SCOPES

empty

CSV scopes required on every request.

ODOO_MCP_AUTH_CLIENT_ID / _CLIENT_SECRET

unset

Credentials for the introspection call when the AS requires client auth.

ODOO_MCP_AUTH_REQUIRE_AUD

0

Truthy → reject tokens whose introspection response has no aud claim (default only checks aud when present).

ODOO_MCP_AUTH_REQUIRE_ISS

0

Truthy → reject introspection responses without an iss claim. A present iss must always match ODOO_MCP_AUTH_ISSUER_URL (mix-up attack hardening).

ODOO_MCP_AUTH_CACHE_TTL

60

Seconds to cache introspection verdicts (0 disables). Bounds both AS load and revocation lag.

ODOO_MCP_PLUGINS

unset

CSV entry-point names to load as third-party tool plugins (group odoo_mcp.tools). Installation alone activates nothing; failures are isolated and reported in health_check. See docs/plugins.md.

ODOO_MCP_TOOLS_INCLUDE / _EXCLUDE

unset

CSV fnmatch globs trimming the registered tool surface per deployment (small agents drown in 41 tools). Removed names listed in health_check.

ODOO_MCP_INSTRUCTIONS_FILE

unset

Plain-text file appended to the server-level MCP instructions every client receives — deployment-specific guidance (fiscal-year rules, naming conventions) without touching tool descriptions.

You can also use odoo_config.json:

{
  "url": "https://your-odoo-instance.com",
  "db": "your-database",
  "username": "your-user",
  "password": "your-password-or-api-key"
}

Multiple Odoo instances

One server can talk to several Odoo databases. Add an instances map to your config file (auto-detected — a file without instances keeps the flat single-instance shape above):

{
  "default": "acme",
  "instances": {
    "acme": {
      "url": "https://acme.odoo.com",
      "db": "acme",
      "username": "bot",
      "api_key": "...",
      "transport": "json2"
    },
    "globex": {
      "url": "https://globex.odoo.com",
      "db": "globex",
      "username": "bot",
      "password": "...",
      "lang": "fr_FR",
      "timeout": 60
    }
  }
}
  • Every read/write tool accepts an optional instance parameter; omitted → the default instance. default itself is optional when only one instance is defined.

  • Each entry supports the same keys as the flat config (url, db, username, password, api_key, transport, json2_database_header, lang) plus timeout and verify_ssl. Instance entries are self-contained: credentials and transport never fall back to env vars (so one instance can never inherit another deployment's ODOO_API_KEY). Only non-credential knobs (ODOO_TIMEOUT, ODOO_VERIFY_SSL, ODOO_LOCALE) act as fallback defaults for entries that omit them. Env overrides like ODOO_TRANSPORT/ODOO_API_KEY still apply to legacy flat configs, as before.

  • ODOO_CONFIG_FILE=/path/to/config.json points at an explicit config file, checked before ./odoo_config.json, ~/.config/odoo/config.json, and ~/.odoo_config.json.

  • Precedence: when ODOO_URL/ODOO_DB/ODOO_USERNAME/ODOO_PASSWORD are all set, the environment wins and defines a single instance named default — unset them to use a multi-instance file.

  • Instance names must match [A-Za-z0-9_-]{1,64}. Clients connect lazily — an instance is only contacted when a tool targets it.

  • Discovery: the list_instances tool returns configured names, URLs, databases, and transports — never credentials.

  • Write-approval tokens encode the instance name, so a token validated against one instance can never execute on another.

  • MCP resources (odoo://…) always use the default instance in this release; use tools for multi-instance access.

Run

Start the MCP server over stdio:

odoo-mcp

or:

python -m odoo_mcp

Start Streamable HTTP for local clients:

odoo-mcp --transport streamable-http --host 127.0.0.1 --port 8000 --path /mcp

Non-local HTTP binds are rejected unless you pass --allow-remote-http or set MCP_ALLOW_REMOTE_HTTP=1. This server does not include built-in HTTP authentication. Put remote HTTP deployments behind your own authentication, TLS, and network policy.

Check runtime posture without starting the server loop:

odoo-mcp --health

MCP Tools

41 tools grouped by use case. Each tool name is a single-purpose handle the agent can call. Tools that talk to Odoo accept an optional instance parameter when multiple instances are configured (see Multiple Odoo instances).

Read & Discover (11)

Tool

Purpose

list_models

List Odoo model technical names and labels.

get_model_fields

Read field metadata for one model.

search_records

Run bounded read-only search_read. Smart-field selection when caller omits fields.

read_record

Read one record by model and ID. Smart-field selection when caller omits fields.

aggregate_records

Server-side groupby/aggregation via formatted_read_group (Odoo 19+) or read_group (16-18).

search_employee

Search employees by name.

search_holidays

Search leave records by date range.

get_odoo_profile

Read server version, user context, transport, database, and installed module summary.

schema_catalog

Build a bounded model catalog with optional field metadata.

build_domain

Build and validate an Odoo domain from structured conditions.

read_attachment

Read an ir.attachment's metadata and size-capped base64 content (ODOO_MCP_MAX_ATTACHMENT_BYTES, default 1 MiB).

Write & Operate (5)

Tool

Purpose

preview_write

Produce a non-executing approval payload for create, write, or unlink.

validate_write

Validate a write payload against trusted live fields_get metadata.

execute_approved_write

Execute only a same-session, live-validated, confirmed write when ODOO_MCP_ENABLE_WRITES=1.

execute_method

Execute a reviewed model method. Direct create, write, and unlink are blocked. Side-effect methods require an exact allowlist or ODOO_MCP_ALLOW_UNKNOWN_METHODS=1.

chatter_post

Post a chatter message on a mail.thread record. Default mode requires the approval-token preview/execute flow.

Diagnose (3)

Tool

Purpose

diagnose_odoo_call

Diagnose a model call without executing it.

diagnose_access

Diagnose ACL and record-rule visibility for the current Odoo credential.

inspect_model_relationships

Group relationship fields, required fields, and create/write hints.

Migrate (3)

Tool

Purpose

generate_json2_payload

Convert XML-RPC-shaped input into JSON-2 endpoint, headers, and named body.

upgrade_risk_report

Surface transport, method, and migration risks across Odoo versions.

lookup_model_history

Resolve outdated model names (account.invoiceaccount.move) against a curated per-version rename catalog.

Audit & Plan (3)

Tool

Purpose

scan_addons_source

Scan local addon source without importing addon code.

fit_gap_report

Classify requirements into standard, configuration, Studio, custom module, avoid, or unknown.

business_pack_report

Report expected modules, models, and discovery calls for sales, CRM, inventory, accounting, or HR.

Knowledge search — local-first (3)

Tool

Purpose

index_knowledge

Fetch a bounded record slice once and build a local BM25 index (accent-insensitive; data never leaves the machine).

search_knowledge

Relevance-ranked free-text search over indexed records with zero further RPC calls.

knowledge_stats

Report per-model index sizes and the ODOO_MCP_KNOWLEDGE_MAX_DOCS budget.

Accounting (2)

Tool

Purpose

receivable_payable_aging

Aged AR/AP report bucketed by days overdue (not due / 1-30 / 31-60 / 61-90 / 90+), with per-partner totals.

accounting_health_summary

Open receivable/payable item counts plus the draft invoice backlog.

Background tasks (4)

Tool

Purpose

submit_async_task

Run an allowlisted long read operation (scan_addons_source, index_knowledge, receivable_payable_aging) on a bounded worker pool. Writes are never accepted.

get_async_task

Poll a task's status and result.

cancel_async_task

Cancel a pending or running task.

list_async_tasks

List live and recently finished tasks.

Cross-instance fan-out — read-only (3)

One question across many configured instances, merged and attributed. See the partner playbook.

Tool

Purpose

search_across_instances

Search every opted-in instance (or a list/tag selection); rows tagged with _instance, partial results on per-instance failure.

aggregate_across_instances

Group/aggregate per instance plus additive grand totals across the fleet.

accounting_health_across_instances

AR/AP aging across every client DB with combined buckets — the partner-network sweep.

Utility (2)

Tool

Purpose

health_check

Report non-secret MCP runtime posture, including rate-limit counters and field-ACL status when enabled.

list_instances

List configured Odoo instance names, URLs, databases, transports, and cross-instance tags — never credentials.

Resources

URI

Description

odoo://models

List available models.

odoo://model/{model_name}

Read model metadata and fields.

odoo://record/{model_name}/{record_id}

Read one record.

odoo://search/{model_name}/{domain}

Search records with a bounded domain.

Prompts

11 prompts: 5 diagnostic, plus 6 operational workflow prompts that encode end-to-end business processes and route every write through the approval gate.

Prompt

Use it for

diagnose_failed_odoo_call

Root-cause a failing Odoo call before retrying.

fit_gap_workshop

Turn raw requirements into Odoo fit/gap buckets.

json2_migration_plan

Plan XML-RPC or JSON-RPC migration to External JSON-2.

safe_write_review

Review a proposed create, write, or unlink.

custom_module_audit

Audit local addon source with scan, risk, and business evidence.

invoice_approval_chain

Triage draft invoices and post each through the write gate with human checkpoints.

po_to_receipt

Three-way match a purchase order against receipt and bill; flags discrepancies (read-only).

customer_onboarding

Dedup-check, then gated-create a customer with contacts and payment terms.

expense_claim_review

Policy-check pending expense claims, then gated approve/refuse.

accounting_close_checklist

Read-only month-end checklist: aging, unreconciled items, draft backlog.

Safe Write Model

Writes are intentionally boring.

  1. preview_write creates a canonical, non-executing payload.

  2. validate_write checks model metadata, required fields, readonly fields, relation hints, record IDs, and payload shape.

  3. execute_approved_write runs only when all gates pass:

    • the approval came from validate_write in the same server process,

    • validation used trusted, non-empty live Odoo fields_get metadata,

    • the token has not expired or been consumed,

    • confirm=true is passed,

    • ODOO_MCP_ENABLE_WRITES=1 is set.

Odoo access rules, record rules, and server-side constraints still decide the final result.

Batch creates go through the same gates: pass values_list (one dict per record, max 100) to preview_write/validate_write — execution maps to a single atomic Odoo create(vals_list) call. Per-record differing write values are deliberately unsupported (they would need one non-atomic RPC per record). Optional extras: ODOO_MCP_ELICIT_WRITES=1 adds a native human-confirmation form, ODOO_MCP_AUDIT_LOG records every write-path event.

Large binary fields (a resume attached to ir.attachment.datas, a product image, ...) don't have to be inlined as base64 in the tool call — pass <field>_from_path instead (e.g. datas_from_path: "/local/path/cv.pdf") to validate_write. The server reads the file itself; the approval only ever carries a sha256:<hex>:<size> fingerprint for that field, never the real content, so nothing large has to round-trip through the calling agent's context. Requires ODOO_MCP_ATTACHMENT_UPLOAD_ROOTS (fails closed otherwise) and respects ODOO_MCP_MAX_ATTACHMENT_UPLOAD_BYTES. No new tool — this rides the same preview_writevalidate_writeexecute_approved_write gate as every other write.

Reviewed side-effect methods such as sale.order.action_confirm can be enabled one by one:

export ODOO_MCP_ALLOWED_SIDE_EFFECT_METHODS="sale.order.action_confirm,res.partner.message_post"

ODOO_MCP_ALLOW_UNKNOWN_METHODS=1 is still supported for trusted deployments, but health_check reports it as broad mode. Prefer exact allowlist entries when you only need a small number of reviewed methods.

Docker

Use the prebuilt GHCR image:

docker pull ghcr.io/tuanle96/mcp-odoo:latest

Or build it locally:

docker build -t mcp/odoo:latest -f Dockerfile .

Run over stdio from an MCP client (replace mcp/odoo:latest with ghcr.io/tuanle96/mcp-odoo:latest to use the prebuilt image):

{
  "mcpServers": {
    "odoo": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e", "ODOO_URL",
        "-e", "ODOO_DB",
        "-e", "ODOO_USERNAME",
        "-e", "ODOO_PASSWORD",
        "-e", "ODOO_TRANSPORT",
        "-e", "ODOO_API_KEY",
        "mcp/odoo:latest"
      ]
    }
  }
}

Run Streamable HTTP locally:

docker run --rm \
  -p 127.0.0.1:8000:8000 \
  -e ODOO_URL \
  -e ODOO_DB \
  -e ODOO_USERNAME \
  -e ODOO_PASSWORD \
  -e ODOO_TRANSPORT \
  -e ODOO_API_KEY \
  mcp/odoo:latest \
  --transport streamable-http \
  --host 0.0.0.0 \
  --port 8000 \
  --allow-remote-http

Test

Run the normal quality gates:

uv run python -m ruff check .
uv run python -m mypy src
uv run python -m pytest

Run real Odoo smoke tests:

uv run --python 3.12 --with-editable . scripts/odoo_compose_smoke.py \
  --versions 16.0 17.0 18.0 19.0 \
  --timeout 360 \
  --inspector-smoke

The smoke harness boots disposable Docker Compose stacks, validates direct Odoo access, validates MCP stdio, and for Odoo 19 also validates JSON-2 and Streamable HTTP.

Run the multi-instance smoke (one stack, three databases, two accounts on one instance):

uv run --python 3.12 --with-editable . scripts/odoo_multi_instance_smoke.py

Compatibility

XML-RPC remains the default transport for broad compatibility. Odoo 19 supports External JSON-2 through ODOO_TRANSPORT=json2. XML-RPC and JSON-RPC are deprecated since Odoo 19 and scheduled for removal in Odoo 22 (fall 2028), so new integrations should plan for JSON-2.

Documentation

Guide

Covers

docs/comparison.md

How Odoo MCP compares to other Odoo MCP bridges

docs/architecture.md

System shape, transports, safety boundaries

docs/multi-instance.md

Multi-database config, routing, isolation model

docs/troubleshooting.md

From error text to root cause (ACL, record rules, routing)

docs/performance.md

Cache/retry knobs, batching patterns, N+1 detection

docs/client-configs.md

Claude Desktop, Docker, Streamable HTTP setups

docs/testing.md

Local gates and the Docker Compose smoke harness

Contributing

Issues, pull requests, and compatibility reports are welcome. Start with CONTRIBUTING.md, include your Odoo version, transport, client type, and the verification you ran.

Security

Do not publish logs that contain Odoo credentials, API keys, database names from private environments, or full Odoo debug traces. Report vulnerabilities through SECURITY.md.

License

MIT. See LICENSE.

Available Tools

41 tools
accounting_health_across_instancesC
Read-onlyIdempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNo
directionNoreceivable
instancesNo
top_partnersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the tool is safe. The description adds 'sweep' which could imply a process, but no additional behavioral context (e.g., permissions, side effects) beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence but lacks structure. It is under-specified, not concise. Every sentence should add value, but this one leaves critical gaps, making it poor rather than concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of 4 parameters with no schema descriptions and a vague description, the tool definition is incomplete. An output schema exists but is not referenced. The description fails to provide adequate context for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description does not explain any of the 4 parameters ('as_of', 'direction', 'instances', 'top_partners'). The description must compensate for the missing schema descriptions but fails entirely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'AR/AP aging fanned out across instances — the partner-network sweep' indicates the resource (AR/AP aging across instances) but lacks a specific verb. The title is null, and the sibling tool 'receivable_payable_aging' likely covers similar single-instance functionality, but no differentiation is provided.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like 'receivable_payable_aging' or other aggregation tools. The phrase 'the partner-network sweep' is vague and does not clarify context or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

accounting_health_summaryC
Read-onlyIdempotent

Open receivable/payable item counts and draft invoice backlog

ParametersJSON Schema
NameRequiredDescriptionDefault
instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, indicating a safe read operation. The description adds that it returns counts and backlog, but does not describe any additional behaviors like rate limits or authorization needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 8 words, efficiently conveying the core output without unnecessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one optional parameter and an output schema exists. The description covers the returned data but lacks parameter clarification, which is needed given the low schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the 'instance' parameter (optional, type string or null). The parameter's role is left ambiguous, providing no added meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies what the tool retrieves (receivable/payable item counts and draft invoice backlog), making the purpose clear. It distinguishes from siblings like 'receivable_payable_aging' which focuses on aging, not counts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. It does not mention when not to use it or provide context about prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aggregate_across_instancesB
Read-onlyIdempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
domainNo
group_byYes
measuresNo
instancesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, so the safety profile is clear. The description adds context about 'fanned out' (parallel execution) and 'combined grand totals', which is beyond annotations but minimal. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short (one sentence), which is concise but lacks structure. It is front-loaded but does not provide enough detail for its complexity. Every sentence earns its place, but more structure would improve clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, 2 required, and 0% schema coverage, the description is incomplete. It does not explain parameters, return values (output schema exists but not provided), or behavior beyond the minimal statement. For a tool with this complexity, it should provide more context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (no descriptions in input schema), so the description must compensate. However, it does not explain any of the 5 parameters (model, group_by, domain, measures, instances). It fails to add meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Read-only aggregate fanned out across instances with combined grand totals', which clearly identifies the verb (aggregate), resource (across instances), and specific scope (combined grand totals). This distinguishes it from siblings like aggregate_records (single instance) and search_across_instances (search, not aggregate).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for cross-instance aggregation with grand totals but does not explicitly state when to use or avoid it, nor does it name alternatives among siblings. Guidance is implied but not explicit, so it's adequate but not strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aggregate_recordsA
Read-onlyIdempotent

Aggregate Odoo records server-side using Postgres groupby/sum/count. Uses formatted_read_group on Odoo 19+ and read_group on earlier versions.

ParametersJSON Schema
NameRequiredDescriptionDefault
lazyNo
limitNo
modelYes
orderNo
domainNo
offsetNo
group_byYes
instanceNo
measuresNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsNoAggregated group rows.
toolNoReporting tool name.
errorNoSanitized error message when success is false.
modelNo
methodNoformatted_read_group (19+) or read_group.
successYesFalse when the call failed; see error.
group_byNo
measuresNo
row_countNo
major_versionNo
fallback_reasonNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint as false. Description adds version-specific implementation details but does not disclose additional behavioral traits beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose, second sentence adds concise implementation detail. No redundant or irrelevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Though output schema exists, the description is too brief for a 9-parameter aggregation tool. It does not explain how to use domain, measures, order, or lazy parameters. Adequate for basic understanding but incomplete for effective usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage for 9 parameters. Description mentions 'groupby/sum/count' but does not explain any parameter meanings or usage. Does not compensate for lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it aggregates Odoo records using Postgres groupby/sum/count, which is a specific verb+resource. It distinguishes from siblings like search_records (raw data) and aggregate_across_instances (cross-instance). The mention of Odoo versions adds specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use vs alternatives. Implied usage is for server-side aggregation rather than fetching individual records, but no exclusions or alternative tool references are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_upgrade_logA
Read-onlyIdempotent

Classify Odoo install/update log errors into a migration worklist (no_action / needs_review / needs_script) with fix suggestions

ParametersJSON Schema
NameRequiredDescriptionDefault
log_textYes
source_versionNo
target_versionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds no further behavioral context (e.g., limitations, performance considerations). With annotations present, this is adequate but not exemplary.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that efficiently conveys purpose and outcomes. No unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three parameters (one required, two optional) and an output schema, the description provides a high-level goal but omits practical details like input constraints, expected version values, or output format. It is barely adequate for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. However, it only mentions 'log errors' without defining 'log_text' or explaining optional version parameters. The agent lacks details on expected input format or version syntax, which is insufficient for 0% coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: classifying Odoo upgrade log errors into three categories with fix suggestions. It uses a specific verb ('classify') and resource ('Odoo install/update log errors'), differentiating it from siblings like 'health_check' or 'upgrade_risk_report' which cover other aspects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for analyzing upgrade logs, but provides no guidance on when to use this tool versus alternatives like 'upgrade_risk_report' or 'scan_addons_source'. No explicit when-not or context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

build_domainB
Read-onlyIdempotent

Build a validated Odoo domain from structured conditions

ParametersJSON Schema
NameRequiredDescriptionDefault
conditionsYes
fields_metadataNo
logical_operatorNoand

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds that the domain is 'validated', but does not elaborate on validation behavior or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no extraneous words. Perfectly concise for the information provided.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description lacks parameter details (especially for 'conditions') and usage context, making it incomplete for effective invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides no information about the three parameters, leaving the agent to rely on the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Build') and resource ('validated Odoo domain'), and 'from structured conditions' distinguishes it from sibling tools like search_records or execute_method.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. No exclusions, prerequisites, or context about when building a domain is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

business_pack_reportB
Read-onlyIdempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
packYes
instanceNo
use_live_metadataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare the tool as readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds that it reports 'expected' items, which is consistent but does not provide additional behavioral insight beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, making it concise. However, it could be slightly expanded to cover parameters without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With three parameters and a complex domain (business pack reporting), the description lacks details about what 'expected' means, how parameters affect output, and any return value semantics. The output schema exists but is not described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description only implicitly references the 'pack' parameter by stating it reports for a business pack. It does not explain the 'instance' or 'use_live_metadata' parameters, leaving significant semantic gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Report' and the specific resource 'expected modules, models, and safe discovery calls for a business pack'. This is distinct from sibling tools, none of which mention 'business pack'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives like fit_gap_report or upgrade_risk_report. The description only states what it does, not the context or prerequisites for use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_async_taskC
Read-onlyIdempotent

Cancel a pending or running background task

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description claims a write action (cancel), but the annotation readOnlyHint: true contradicts this. This is a serious inconsistency. No disclosure of side effects or state changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise but fails to earn its place due to contradiction and lack of useful information. Under-specification is not conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 1 param, annotation contradiction, and no output description (schema exists but not used), the description is incomplete for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no meaning to the 'task_id' parameter. Schema coverage is 0%, so the description should compensate but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'cancel' and the resource 'pending or running background task'. It distinguishes from siblings like submit_async_task and list_async_tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-not or alternative guidance. The description implies usage for cancellation but fails to specify when not to use (e.g., already completed tasks) or alternatives like get_async_task for status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chatter_postA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
modelYes
confirmNo
approvalNo
instanceNo
record_idYes
partner_idsNo
message_typeNocomment
subtype_xmlidNo
attachment_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds value beyond annotations by detailing the approval token requirement and the env variable toggle. Description aligns with annotations (readOnlyHint false, destructiveHint true).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two succinct sentences front-loading the primary action and usage variants, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite moderate complexity (10 params, no param descriptions), the description omits critical parameter details and does not leverage the existing output schema to explain behavior. Agent would struggle to correctly populate all fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fails to explain most parameters (body, model, record_id, etc.), only mentioning 'approval'. Leaves agent with insufficient parameter-level understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Post', resource 'chatter message', and target 'mail.thread record', distinguishing it from siblings like preview_write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on two modes: default requires approval token from preview, direct mode bypasses with environment variable. Does not compare to alternative tools but gives clear usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_quality_reportA
Read-onlyIdempotent

Run read-only data-quality checks on one Odoo model: duplicates, missing required values, orphaned references, format anomalies

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
checksNo
instanceNo
key_fieldsNo
sample_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
errorNoSanitized error message when success is false.
modelNo
resultsNo
successYesFalse when the call failed; see error.
summaryNo
instanceNo
checks_runNo
sample_limitNo
skipped_restricted_fieldsNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, idempotent, non-destructive. The description adds meaningful behavioral context by listing specific check types and stating it operates on one Odoo model. However, it does not explain potential resource impact or return format limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence front-loaded with the core verb and resource. It is concise, includes essential details, and has no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 5 parameters and no schema descriptions, the description provides high-level purpose but insufficient detail for correct invocation. The output schema exists but is not provided; however, the description does not explain return values. The tool's full usage context is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema parameter description coverage is 0%. The description mentions check types (duplicates, missing required, etc.) which likely correspond to the 'checks' parameter, but does not explain other parameters (instance, key_fields, sample_limit) or their formats. The agent must infer from parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs read-only data-quality checks on one Odoo model and lists specific check types (duplicates, missing required values, orphaned references, format anomalies). This distinguishes it from sibling tools like search_records or aggregate_records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for data-quality inspection but does not provide explicit when-to-use or when-not-to-use guidance compared to alternatives like diagnose_odoo_call or inspect_model_relationships. Usage is inferred but not clarified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagnose_accessC
Read-onlyIdempotent

Diagnose ACL and record-rule visibility for an Odoo model

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
modelYes
domainNo
instanceNo
operationNoread
record_idsNo
include_rulesNo
expected_countNo
observed_errorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds no disclosure about side effects, authentication needs, rate limits, or other behavioral traits. It simply restates the purpose, not adding value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence of 10 words. It is concise and directly states the tool's purpose without unnecessary words. While it could benefit from more structure, it earns its place by being clear and brief.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema and rich annotations, the description is too sparse for a tool with 9 parameters and many sibling tools. It doesn't explain the diagnostic context, any prerequisites, or how parameters interact. The description is not complete enough for an agent to reliably invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description offers no explanation for any of the 9 parameters. For example, it doesn't describe what 'instance', 'operation', or 'include_rules' mean. The description fails to compensate for the lack of parameter documentation, making it very difficult for an agent to use the tool correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Diagnose' and a clear resource 'ACL and record-rule visibility for an Odoo model', which distinguishes it from sibling tools like 'diagnose_odoo_call' or 'health_check'. The purpose is immediately clear and unique.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no when-to-use or when-not-to-use guidance. It does not mention alternatives or exclusions. Given the large number of sibling tools, this omission makes it hard for an agent to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagnose_odoo_callB
Read-onlyIdempotent

Diagnose an Odoo model call without executing it

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
modelYes
kwargsNo
methodYes
metadataNo
transportNoauto
include_debugNo
observed_errorNo
target_versionNo
use_live_metadataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, indicating a safe, non-destructive operation. The description adds minimal behavioral context beyond confirming no execution. It does not detail what 'diagnose' entails in terms of output or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that efficiently conveys the core purpose. However, its brevity comes at the cost of omitting necessary parameter and behavioral details, making it under-specified for practical use.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (10 parameters, 2 required, no schema descriptions) and the presence of a diagnostic output schema, the description fails to explain what the diagnosis returns or how parameters affect behavior. This makes the tool incomplete for accurate invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 10 parameters with 0% description coverage, and the tool description provides no information about any parameter meaning. This is a critical gap for an AI agent to correctly invoke the tool, especially for parameters like 'model', 'method', 'args', and 'kwargs'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Diagnose an Odoo model call without executing it' clearly states the tool's purpose with a specific verb ('Diagnose') and resource ('an Odoo model call'), and distinguishes it from sibling tools like 'execute_method' which executes calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for diagnosing without executing, but lacks explicit guidance on when to use this tool versus alternatives like 'execute_method' or 'preview_write'. No mentions of when-not-to-use or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_approved_writeB
Destructive

Execute a previously previewed and confirmed standard write

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
approvalYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds no behavioral context beyond what annotations already provide (destructiveHint: true). No mention of side effects, reversibility, or permissions. Annotation covers destructiveness, so description adds minimal value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, very concise and front-loaded. However, the brevity sacrifices necessary detail, making it less useful than a slightly longer but more informative description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (not provided here) and annotations, the description is too minimal. For a destructive operation with a complex parameter (approval object), it should explain what the approval object is (e.g., from preview_write response) and confirm's function.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description provides no explanation of parameters (confirm and approval). The approval object is not described, nor is the role of the confirm boolean. Critical gap for a tool with nested objects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: executing a previously previewed and confirmed write. It uses specific verb 'execute' and resource 'standard write', and distinguishes from siblings like preview_write and validate_write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies prerequisite of a previewed and confirmed write, but does not explicitly state when to use this tool versus alternatives or provide exclusion criteria. Lacks guidance on required prior steps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_methodC
Destructive

Execute a custom method on an Odoo model

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
modelYes
kwargsNo
methodYes
instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true and idempotentHint=false, so the description's statement 'execute a custom method' implies arbitrary behavior but adds no new context about side effects, authentication needs, or safety precautions. It merely restates the obvious given the annotation flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise but lacks structured details. It is appropriately short but does not provide substantial guidance. Every word earns its place, but the sentence is too brief to be highly informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (openWorldHint, 5 parameters, many sibling tools) and the rich output schema, the description is severely incomplete. It fails to clarify usage context, parameter roles, or how this tool relates to siblings. The output schema exists but no cross-reference is made.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% – no parameter descriptions exist in the schema. The description 'Execute a custom method on an Odoo model' does not explain any of the five parameters (model, method, args, kwargs, instance). Parameter names are somewhat self-explanatory, but the tool would benefit from explaining how to use args/kwargs, especially given the open-world nature.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Execute a custom method on an Odoo model' clearly states the action (execute) and resource (custom method on Odoo model). However, it does not differentiate from sibling tools like 'execute_approved_write' or 'preview_write', which are more specific. The word 'custom' hints at flexibility but could be more explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'execute_approved_write' or 'search_records'. It lacks explicit 'when to use' or 'when not to use' information, leaving the agent to infer from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fit_gap_reportC
Read-onlyIdempotent

Classify Odoo requirements into fit/gap implementation buckets

ParametersJSON Schema
NameRequiredDescriptionDefault
requirementsYes
available_fieldsNo
available_modelsNo
business_contextNo
installed_modulesNo
use_live_metadataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows it's a safe, non-mutating operation. The description adds no further behavioral context, but with the annotations present, the baseline is acceptable. No contradiction observed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no redundancy. Every word contributes to the purpose. It is efficiently front-loaded and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (not shown), the description fails to provide essential context about input format (e.g., what should 'requirements' look like), optional parameters' effect, or expected behavior when optional params are omitted. For a tool with 6 parameters and a specific analysis purpose, this is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning no parameter descriptions in the schema. The description does not elaborate on any parameter, including the required 'requirements'. Parameters like 'available_fields', 'available_models', and others have names that hint at meaning, but the agent gets no format, constraints, or examples. This is a critical gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('classify') and resource ('Odoo requirements'). It specifies the output as 'fit/gap implementation buckets', which is specific. However, it does not differentiate from siblings like 'data_quality_report' or 'upgrade_risk_report', which could also analyze requirements in different ways.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It does not mention prerequisites, context, or typical scenarios. The single-sentence description lacks any usage recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_json2_payloadA
Read-onlyIdempotent

Build a JSON-2 request preview without network access

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
modelYes
kwargsNo
methodYes
base_urlNo
databaseNo
include_database_headerNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint, idempotentHint, and non-destructive. The description adds 'without network access', clarifying local execution. It does not contradict annotations. Additional context like auth needs or rate limits is not needed given the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that effectively communicates the tool's purpose and key behavioral trait (no network access). It is well front-loaded with no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description lacks context about what JSON-2 is, what fields the preview includes, and how to correctly fill the 7 input parameters. The agent may struggle to invoke the tool correctly without additional guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It provides no information about parameter meanings, leaving the agent to infer from names alone. Generic parameters like 'args' and 'kwargs' are particularly ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Build', the resource 'JSON-2 request preview', and the constraint 'without network access'. It distinguishes the tool from siblings, none of which mention JSON-2 or payload preview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to generate a preview of a request payload, but it does not explicitly state when to use it vs alternatives or provide guidance on prerequisites or conflicts. Usage context is implied by the tool name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_async_taskA
Read-onlyIdempotent

Poll a background task's status and result

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds 'poll' context, confirming repeated safe calls (consistent with idempotentHint, readOnlyHint). Does not contradict annotations. Does not disclose additional behaviors like rate limits or typical completion times.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: 5 words in one sentence. No superfluous information. Front-loaded with core action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity (1 param, polling) and presence of output schema, description is sufficient. Covers status and result retrieval. Missing explicit mention of incomplete results if task not done, but 'poll' implies waiting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter task_id has 0% schema description coverage. Description does not explain the parameter's purpose, format, or where to obtain it, failing to compensate for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool polls a background task's status and result. Uses specific verb 'poll' and resource 'task', distinguishing it from sibling tools like submit_async_task, cancel_async_task, and list_async_tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description implies usage after submitting a task, but does not explicitly state when to use this vs alternatives (e.g., list_async_tasks, cancel_async_task). No guidance on prerequisites or context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_model_fieldsC
Read-onlyIdempotent

Get field metadata for a specific Odoo model

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
instanceNo
relevanceNo
max_fieldsNo
field_namesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
countNo
errorNoSanitized error message when success is false.
resultNoMapping of field name to fields_get metadata.
rankingNoRelevance scores when relevance="top".
successYesFalse when the call failed; see error.
relevance_appliedNo
restricted_fieldsNoFields marked restricted by the field ACL.

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds no additional behavioral context (e.g., pagination, filtering behavior, or performance implications).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise but lacks necessary detail. It is appropriately front-loaded but underinformative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five parameters and no schema descriptions, the description is incomplete. It fails to explain parameters, output schema, or usage nuances, leaving agents without essential context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description does not explain any of the five parameters (model, instance, relevance, max_fields, field_names), providing no added meaning beyond the schema's field names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and resource ('field metadata for a specific Odoo model'), clearly distinguishing it from sibling tools like list_models or search_records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as inspect_model_relationships or schema_catalog. No context about prerequisites or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_odoo_profileC
Read-onlyIdempotent

Read a bounded profile of the connected Odoo environment

ParametersJSON Schema
NameRequiredDescriptionDefault
instanceNo
module_limitNo
include_modulesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
errorNoSanitized error message when success is false.
profileNoServer, user-context, transport, and module metadata.
successYesFalse when the call failed; see error.
metadata_usedNo

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, etc. Description adds 'bounded' indicating limited scope but no further details. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence is concise but lacks structure; could be improved by front-loading key behavioral info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with strong annotations and an output schema, the description is minimally adequate but 'bounded' is vague, reducing completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but description does not explain any parameters. Instances, module_limit, and include_modules remain unexplained, though defaults reduce need slightly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states 'Read a bounded profile' which specifies a verb and resource, but 'bounded profile' is vague and does not distinguish from sibling tools like 'health_check' or 'aggregate_across_instances'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. No mention of context, prerequisites, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

health_checkA
Read-onlyIdempotent

Report this MCP server's non-secret runtime safety posture

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
errorNoSanitized error message when success is false.
serverNoServer name, instructions, surface counts.
pluginsNoOpt-in plugin load state and tool filtering.
runtimeNoNon-secret runtime security posture.
successYesFalse when the call failed; see error.
rate_limitsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value by clarifying that it reports 'non-secret' runtime safety posture, which helps the agent understand what information it will get. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that states the tool's purpose without unnecessary words. It is front-loaded with the action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, presence of output schema), the description provides complete context: it reports the server's non-secret runtime safety posture. No additional details are needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, and the input schema is fully descriptive (100% coverage). Per guidelines, baseline is 4 for 0 parameters; the description does not need to add parameter info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Report') and clearly identifies the resource ('this MCP server's non-secret runtime safety posture'). It distinguishes from sibling tools like 'accounting_health_summary' by focusing on general server safety rather than accounting-specific health.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description lacks any guidance on when to use this tool versus alternatives (e.g., when to use 'health_check' vs 'accounting_health_across_instances'). No explicit context or exclusions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

index_knowledgeA
Read-onlyIdempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
modelYes
domainNo
fieldsNo
replaceNo
instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare it read-only, idempotent, and non-destructive; description adds 'bounded slice' and 'local index', but could clarify whether the index persists or is ephemeral.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence front-loads the verb and resource, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given existing annotations and output schema, the description provides the basic action but lacks parameter explanations and details on side effects of building the local index.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds no explanation for any of the 6 parameters (e.g., model, domain, fields) beyond their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it fetches a bounded slice of records and builds a local BM25 knowledge index, distinguishing it from siblings like search_knowledge or knowledge_stats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies use when you need to build a local BM25 index, but provides no explicit when-to-use or when-not-to-use guidance, nor comparisons to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_model_relationshipsB
Read-onlyIdempotent

Inspect model relationships and required field metadata

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
instanceNo
fields_metadataNo
include_computedNo
include_readonlyNo
use_live_metadataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds no additional behavioral context (e.g., that it returns relationships, no side effects). With rich annotations, a 3 is appropriate as the description complements but doesn't expand.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, short sentence with no wasted words. It is concise, though it sacrifices completeness. It could benefit from a brief explanation of parameters or usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 6 parameters (1 required) and no parameter documentation in the description, the description is incomplete. Although an output schema exists, the parameter semantics gap is significant for a tool with many parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description does not explain any of the six parameters (e.g., instance, fields_metadata, include_computed). Parameter names alone are insufficient for accurate usage; e.g., 'instance' is ambiguous without explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Inspect model relationships and required field metadata' clearly states the verb 'inspect' and the specific resources 'model relationships and required field metadata'. It distinguishes from siblings like 'get_model_fields' which focuses on fields, not relationships.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. Among siblings, there are tools like 'get_model_fields', 'schema_catalog', and 'lookup_model_history', but no comparisons or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_statsA
Read-onlyIdempotent

Report local knowledge index sizes and document budget

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly and idempotent. Description adds specifics about what is reported, but doesn't disclose additional behavioral traits like auth or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, directly front-loaded with purpose, no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and simple output, description fully explains the tool's purpose. Output schema covers return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the description doesn't need to add parameter meaning. Baseline applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool reports specific data: local knowledge index sizes and document budget. It distinguishes itself from siblings like search_knowledge or index_knowledge.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. No mention of prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_async_tasksA
Read-onlyIdempotent

List recent background tasks newest-first

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the 'newest-first' ordering, but no mention of pagination, limiting, or filtering behavior. Output schema exists, so return structure is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise (4 words) yet conveys the core purpose and ordering. Every word is meaningful; no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and the presence of an output schema, the description is adequate. It could mention that it returns a list of tasks, but the output schema handles that. The annotations cover safety and idempotence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters (0 params, 100% schema coverage), so baseline is 4 per instructions. The description does not need to add param info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'List' and a clear resource 'recent background tasks' with ordering 'newest-first', which distinguishes it from sibling tools like get_async_task (single task) or submit_async_task (create).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like get_async_task or search_records. The description implies usage for listing recent tasks, but lacks exclusion criteria or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_instancesA
Read-onlyIdempotent

List configured Odoo instance names without credentials

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
errorNoSanitized error message when success is false.
defaultNoName of the default instance.
successYesFalse when the call failed; see error.
instancesNoInstance entries (never credentials).
instance_countNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds the key behavioral trait 'without credentials,' which implies no authentication is required and no sensitive data is exposed. This complements annotations effectively without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, concise sentence that conveys the entire purpose without unnecessary words. It is optimally front-loaded for quick comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is sufficient for a simple, parameterless tool. It states what the tool returns (instance names) and that it is safe. An output schema exists, so return format details are covered there. Could be more complete by noting that the list is static or cached, but overall adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. The description does not need to elaborate. Baseline for zero parameters is 4, as no additional parameter meaning is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List configured Odoo instance names without credentials,' specifying the verb (List) and resource (Odoo instance names). It distinguishes from sibling tools like list_models or list_async_tasks by focusing on instances and emphasizing 'without credentials'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. It does not mention scenarios like listing instances for monitoring or comparison, nor does it exclude cases where credential info is needed. Sibling tools exist for broader operations (e.g., aggregate_across_instances), but no differentiation provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_modelsB
Read-onlyIdempotent

List Odoo models with optional name filtering

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
countNo
errorNoSanitized error message when success is false.
resultNo
successYesFalse when the call failed; see error.

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds no behavioral traits beyond the filtering behavior implied by the query parameter, and does not mention latency, auth requirements, or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, clear sentence with no wasted words. The core action and optional filter are front-loaded, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (3 optional params, output schema present), the description is adequate but minimal. It does not clarify what the output contains (e.g., model names only vs. full details) or how 'limit' and 'instance' affect results, leaving some ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain all parameters. It only hints at 'query' for name filtering but provides no explanation for 'limit' or 'instance'. The output schema exists but is not described, so the agent cannot infer return structure from this description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'List' and clearly identifies the resource 'Odoo models', with the optional name filtering hint. It distinguishes the tool from siblings like 'search_records' or 'get_model_fields' by focusing on listing models themselves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as 'search_records' or 'get_model_fields'. The description implies a use case (listing models with optional filtering) but does not specify exclusions or preferred contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_model_historyA
Read-onlyIdempotent

Look up Odoo model rename/removal history by old or new model name (e.g. account.invoice -> account.move)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description confirms a safe lookup. It adds the detail of looking up history, which is consistent. No contradictions, but could mention limitations if any.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with action and resource. No wasted words. Example enhances understanding without bloating.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple tool with one required parameter, clear annotations, and an existing output schema, the description is complete. No need to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description fully compensates by explaining that the 'name' parameter can be an old or new model name, with a concrete example. Adds significant semantic value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (look up), the resource (Odoo model rename/removal history), and the method (by old or new model name). An example is provided, and it distinguishes from sibling tools like list_models or get_model_fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (to find rename/removal history) but does not explicitly state when not to use or provide alternatives. It gives a clear use context but lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_writeA
Read-onlyIdempotent

Preview create, write, or unlink without executing it

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
valuesNo
contextNo
instanceNo
operationYes
record_idsNo
values_listNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the key behavioral trait 'without executing it,' which aligns with annotations but does not provide additional details like authorization needs or rate limits. This is adequate given the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded and contains no unnecessary words. Every element serves a purpose, making it highly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (not shown), the description lacks guidance on parameter usage and return values. With 7 parameters and no schema descriptions, the description is insufficient for correct tool invocation, especially for an agent unfamiliar with the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 7 parameters with 0% schema description coverage, and the tool description provides no explanation of any parameter. Without compensating information, the agent cannot understand the meaning or proper usage of parameters like 'model,' 'operation,' 'values,' etc.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description "Preview create, write, or unlink without executing it" clearly states the tool's purpose with a specific verb ('preview') and resource scope ('create, write, or unlink'). It distinguishes itself from sibling tools like 'execute_approved_write' and 'validate_write' that perform actual execution or validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: when you want to see the effect of a write operation without committing. It is clear from the context, but it does not explicitly mention alternatives or when not to use this tool, which would make it a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_attachmentA
Read-onlyIdempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
instanceNo
include_dataNo
attachment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
errorNoSanitized error message when success is false.
successYesFalse when the call failed; see error.
warningsNo
max_bytesNo
attachmentNoir.attachment metadata row.
data_base64NoBase64 content when under the size cap.
data_includedNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so safety is clear. The description adds value by specifying that content is 'size-capped', which is crucial behavioral information not captured in annotations. It could be improved by noting the cap size or behavior when exceeded, but overall adds transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that efficiently conveys the tool's purpose and key behavioral details. It is front-loaded with the verb and resource, and every word contributes meaning. No superfluous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 3 parameters, an output schema, and sibling tools that also read data, the description is minimally complete for a simple read tool. However, it lacks parameter explanations and does not clarify the return structure (though output schema may cover that). The size-cap info is good, but overall could be more thorough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description should explain what the three parameters (instance, include_data, attachment_id) mean and how they affect the operation. It does not do so. The description only mentions the overall action, leaving parameter semantics completely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Read' and a precise resource 'ir.attachment', and it clearly states what is returned (metadata and size-capped base64 content). This distinguishes it from sibling tools like read_record or execute_method, which have different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for reading attachments, but it does not provide explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives among the many sibling tools. The context is clear but lacks direct directives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_recordB
Read-onlyIdempotent

Read a single Odoo record by model and ID

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
fieldsNo
instanceNo
record_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
errorNoSanitized error message when success is false.
resultNoThe record (field-ACL redacted).
successYesFalse when the call failed; see error.
fields_usedNo
redacted_fieldsNo
smart_fields_appliedNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety and idempotency are covered. The description adds no extra behavioral context beyond stating it reads a record. With annotations, the burden is lower, but no additional details like return format or error cases are given.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that gets straight to the point. It is front-loaded with the main action and resource, and contains no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is minimal but for a simple read tool with annotations covering behavior, it is fairly complete. However, the absence of parameter descriptions and usage guidance leaves gaps, especially given multiple sibling tools and optional parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning no parameter descriptions exist in the schema. The overall description does not explain any of the four parameters (model, record_id, fields, instance). For clarity, each parameter should be described; the description completely fails to do so.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads a single Odoo record by model and ID. This distinguishes it from siblings like search_records (multiple records) and get_model_fields (metadata). The verb 'read' and resource 'single Odoo record' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, context, or that it is best for known record ID lookups. Sibling tools like search_records are not contrasted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

receivable_payable_agingC
Read-onlyIdempotent

Aged receivable/payable report bucketed by days overdue

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNo
limitNo
instanceNo
directionNoreceivable
top_partnersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, so the description adds only that it is an aged report bucketed by days overdue. This is adequate but does not disclose additional behaviors like potential size limits or performance implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, concise but under-informative. It front-loads the purpose but fails to elaborate on usage or parameters, so it does not earn its place beyond stating the obvious.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters and an output schema, the description lacks detail about how parameters affect output or what the report contains. It does not explain return structure or usage context, leaving the agent inadequately informed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain any of the 5 parameters (as_of, limit, instance, direction, top_partners). The agent must infer meaning from parameter names alone, which is insufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates an aged report for receivables/payables bucketed by days overdue, which is specific and distinct from sibling tools like accounting_health_summary or data_quality_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as accounting_health_summary or search_records. The description does not mention prerequisites, direction selection, or context for choosing receivables vs payables.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_addons_sourceB
Read-onlyIdempotent

Scan local Odoo addon source without importing addon code

ParametersJSON Schema
NameRequiredDescriptionDefault
max_filesNo
addons_pathsNo
max_file_bytesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and idempotent. The description adds a key behavioral trait: 'without importing addon code', explaining it avoids side effects of importing modules.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that is concise and directly states the tool's purpose without extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema but no parameter details in the description, the tool is incomplete for effective use. The description should at least list what the returned data looks like or mention key parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description provides no explanation of the three parameters (max_files, addons_paths, max_file_bytes). Users cannot infer their meaning or usage from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool scans local Odoo addon source files without importing, using a specific verb and resource. It distinguishes from sibling tools that focus on data records or other operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives like read_record or inspect_model_relationships. The description lacks context for appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schema_catalogB
Read-onlyIdempotent

Build and cache a bounded Odoo model schema catalog

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
modelsNo
refreshNo
instanceNo
include_fieldsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
countNo
errorNoSanitized error message when success is false.
resultNoModel entries; fields included when requested.
successYesFalse when the call failed; see error.
metadata_usedNo

TDQS

B3.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint, idempotentHint, and non-destructive. The description adds insight about caching and boundedness, which are behavioral traits not covered by annotations. However, it does not detail side effects (e.g., cache invalidation).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, making it concise and front-loaded. It wastes no words, but could be more informative without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having 6 parameters and an output schema, the description provides almost no context. It does not explain what 'bounded' means, how caching works, or what the output contains. The output schema exists but the description fails to reference it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning no parameter descriptions exist in the schema. The description mentions none of the 6 parameters, so it does not add meaning. Parameters like 'limit', 'query', 'models', 'refresh', 'instance', 'include_fields' are left completely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Build and cache a bounded Odoo model schema catalog', which is a specific action on a defined resource. It is more detailed than a tautology, but it does not differentiate from sibling tools like 'get_model_fields' or 'list_models', which also deal with model schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus its siblings. There is no mention of prerequisites, scenarios, or exclusions. The agent is left to infer from the name and context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_across_instancesB
Read-onlyIdempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
domainNo
fieldsNo
instancesNo
limit_per_instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, destructiveHint; description adds context about fan-out, merging, and attribution, enriching behavioral understanding beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence efficiently states purpose and behavior. Front-loaded with key info, but could benefit from brief parameter enumeration to improve structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite complex cross-instance search with merging and attribution, description omits parameter roles. With 5 params and 0% schema coverage, description is insufficient for agent understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description provides no parameter details. Five parameters (model, domain, fields, instances, limit_per_instance) are undocumented in both schema and description, failing to add meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'search' and resource 'across configured Odoo instances', clearly distinguishing it from sibling tools like 'search_records' which searches a single instance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage for cross-instance search, but no explicit guidance on when to use this vs alternatives like 'search_records' or 'aggregate_across_instances'. No when-not-to-use or prerequisites mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_employeeB
Read-onlyIdempotent

Search for employees by name

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
limitNo
instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoError message, if any
resultNoList of employee search results
successYesIndicates if the search was successful

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds no additional behavioral context such as search behavior (e.g., partial matching, case sensitivity) or result structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise but lacks structure for a tool with multiple parameters. A more structured format (e.g., listing parameters briefly) would improve clarity without adding much length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one required parameter and an output schema, but the description does not mention the output schema or return format. It adequately addresses the core purpose but lacks details on optional parameters and results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It adds meaning for the 'name' parameter implicitly but provides no details on 'limit' or 'instance'. The description only partially explains the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Search') and the resource ('employees') with a specific filter ('by name'). It distinguishes from sibling tools like search_records and search_across_instances by targeting employees specifically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for searching employees by name but does not explicitly state when to use this tool versus alternatives like search_records or search_across_instances. No exclusions or when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_holidaysC
Read-onlyIdempotent

Search for holidays within a date range

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYes
instanceNo
start_dateYes
employee_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoError message, if any
resultNoList of holidays found
successYesIndicates if the search was successful

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering safety and behavior. The description adds no additional context beyond 'search', such as what types of holidays are included or whether results are cached. Given annotations, the description contributes minimal extra insight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no waste. It is front-loaded with the key verb and resource. However, it could be slightly more informative without losing conciseness, e.g., specifying optional filters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters (2 optional) and rich annotations, the description only covers the basic date range constraint. It does not explain how optional filters (instance, employee_id) affect results, nor clarify the source or scope of 'holidays'. The presence of an output schema partially mitigates, but the description is still incomplete for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate. It only hints at 'date range', corresponding to start_date and end_date, but provides no details on format or semantics. The optional parameters instance and employee_id are completely unaddressed. The description adds little beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'search' and the resource 'holidays', with a date range constraint. It is specific enough to distinguish from generic search tools like search_records, but lacks explicit differentiation from other holiday-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for finding holidays within a date range, but does not explicitly state when to use this tool versus alternatives like search_employee or search_records. No exclusions or alternative references are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_knowledgeA
Read-onlyIdempotent

Relevance-ranked local BM25 search over previously indexed records

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
modelYes
queryYes
instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate it is read-only and idempotent. The description adds value by revealing the search is relevance-ranked (BM25) and limited to local (single instance) data, which are behavioral traits not covered by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single 7-word sentence, extremely concise. It conveys the core purpose without waste, but the brevity limits the information conveyed while remaining efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters and an output schema exists, the description is too sparse. It fails to explain the role of 'model' and 'instance', how 'limit' affects results, or what the output contains. The existing output schema partially compensates, but the description lacks sufficient context for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the 4 parameters. However, it only mentions 'previously indexed records', which weakly hints at 'model' and 'instance' but offers no concrete meaning for 'query', 'limit', or the relationship between parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a concrete action ('search'), identifies the resource ('previously indexed records'), and includes the ranking method ('BM25') and scope ('local'). It clearly distinguishes from cross-instance or global search siblings like 'search_across_instances'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for local searches over indexed records but provides no explicit guidance on when to choose this tool over alternatives like 'search_records' or 'search_across_instances'. No exclusions or context are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_recordsA
Read-onlyIdempotent

Search Odoo records with read-only search_read; optional free-text query matches across name/ref/email-like fields

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
modelYes
orderNo
queryNo
domainNo
fieldsNo
offsetNo
instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
countNo
errorNoSanitized error message when success is false.
resultNoMatched records (field-ACL redacted).
successYesFalse when the call failed; see error.
fields_usedNo
redacted_fieldsNo
query_fields_usedNoFields matched by the free-text query shortcut.
smart_fields_appliedNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. Description adds that it uses the search_read method and that query matches name/ref/email-like fields, providing context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, front-loaded sentence efficiently conveys purpose and key feature (free-text query). No extraneous text; every word contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 8 parameters and existing output schema, description covers core search intent but omits details on filtering with domain, field selection, ordering, and pagination. Adequate but incomplete for complex use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% so description must compensate. Only 'query' parameter receives partial description (matches across fields). Other seven parameters (limit, order, domain, etc.) are not described, leaving significant gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search Odoo records with read-only search_read', specifying verb and resource. It distinguishes from sibling tools like search_across_instances by focusing on single-instance search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description mentions optional free-text query but does not specify when to use this tool versus alternatives such as search_across_instances or model-specific searches. No explicit when-not or usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_async_taskB
Read-onlyIdempotent

Run an allowlisted long-running read operation in the background

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
instanceNo
operationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond annotations by specifying 'allowlisted', 'long-running', and 'background'. However, it does not disclose the return value, how to monitor progress, or what happens on completion. Annotations already indicate it's a safe read, so the added value is moderate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence of 8 words with no redundancy. It directly states the action, resource, and constraints, making it efficient for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having annotations and an output schema, the description does not cover important aspects like parameter details, workflow after submission, or relation to sibling tools like 'get_async_task'. It is incomplete for a tool with 3 parameters and async behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate. It explains the 'operation' parameter only implicitly ('allowlisted read operation') and does not clarify 'params' or 'instance' parameters. This leaves significant ambiguity for the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs an allowlisted, long-running read operation in the background. It uses a specific verb ('Run') and resource ('allowlisted long-running read operation'), which distinguishes it from synchronous read tools like 'read_record' or 'search_records'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide guidance on when to use this tool versus alternatives (e.g., synchronous read, other async task tools). It implies usage for long-running reads but lacks explicit when-to-use or when-not-to-use instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upgrade_risk_reportC
Read-onlyIdempotent

Report Odoo upgrade and JSON-2 migration risks

ParametersJSON Schema
NameRequiredDescriptionDefault
methodsNo
modulesNo
include_debugNo
source_versionNo
target_versionNo
observed_errorsNo
source_findingsNo
use_live_metadataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the agent knows it's a safe, read-only operation. The description adds no additional behavioral context; it is consistent but not informative beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence of 6 words. It is efficient and front-loaded, but may be overly brief given the complexity of the tool and the lack of parameter documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema and annotations, the description fails to explain the nature of the risks, how parameters influence the report, or what output format to expect. For a tool with 8 parameters and a potentially complex report, this is insufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention any parameters. With 8 parameters including arrays and optional fields, the agent has no semantic understanding of what each parameter controls, which is a critical deficiency.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports Odoo upgrade and JSON-2 migration risks. It uses a specific verb and resource, and given sibling tools like analyze_upgrade_log and generate_json2_payload, it appears distinct. However, it could be more specific about what constitutes 'risks' or the report format.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as analyze_upgrade_log or fit_gap_report. The description simply states what it does without any usage context or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_writeC
Read-onlyIdempotent

Validate a standard write payload against optional fields_get metadata

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
valuesNo
contextNo
instanceNo
operationYes
record_idsNo
values_listNo
fields_metadataNo
use_live_metadataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description's 'validate' is consistent. It adds minimal behavioral context beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence, but it is overly minimal given the tool's complexity and number of parameters. It could be better structured with more detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 9 parameters and 0% schema coverage, the description is insufficient. Annotations help but do not provide enough context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage and 9 parameters, the description fails to add meaning to any parameter. It does not compensate for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool validates a standard write payload against optional metadata, which is clear and specific. However, it does not differentiate from siblings like execute_approved_write or preview_write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. The description implies validation use but lacks context or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 41 tool updatesv1.1.0
    • First observedaccounting_health_across_instances
    • First observedaccounting_health_summary
    • First observedaggregate_across_instances
    • First observedaggregate_records
    • First observedanalyze_upgrade_log
    • First observedbuild_domain
    • First observedbusiness_pack_report
    • First observedcancel_async_task
    • First observedchatter_post
    • First observeddata_quality_report
    • First observeddiagnose_access
    • First observeddiagnose_odoo_call
    • First observedexecute_approved_write
    • First observedexecute_method
    • First observedfit_gap_report
    • First observedgenerate_json2_payload
    • First observedget_async_task
    • First observedget_model_fields
    • First observedget_odoo_profile
    • First observedhealth_check
    • First observedindex_knowledge
    • First observedinspect_model_relationships
    • First observedknowledge_stats
    • First observedlist_async_tasks
    • First observedlist_instances
    • First observedlist_models
    • First observedlookup_model_history
    • First observedpreview_write
    • First observedread_attachment
    • First observedread_record
    • First observedreceivable_payable_aging
    • First observedscan_addons_source
    • First observedschema_catalog
    • First observedsearch_across_instances
    • First observedsearch_employee
    • First observedsearch_holidays
    • First observedsearch_knowledge
    • First observedsearch_records
    • First observedsubmit_async_task
    • First observedupgrade_risk_report
    • First observedvalidate_write

TDQS

B3.2/5.0

Scored across 41 tools

Disambiguation4/5

Most tools have distinct purposes, but some overlap exists, such as multiple accounting health tools (accounting_health_across_instances, accounting_health_summary, receivable_payable_aging) and several search tools (search_records, search_employee, search_holidays, search_knowledge). However, detailed descriptions help differentiate them.

Naming Consistency4/5

Tool names use snake_case consistently and follow a verb_noun or noun_verb pattern. Most start with verbs like 'search_', 'get_', 'list_', but some start with nouns like 'accounting_health_summary' or 'data_quality_report'. Despite minor deviations, the naming is fairly predictable.

Tool Count3/5

With 41 tools, the set is large but arguably justified for a complex ERP system like Odoo, covering CRUD, accounting, async tasks, knowledge indexing, and more. However, the count is above the typical well-scoped range (3-15) and may feel heavy for agents.

Completeness4/5

The tool surface covers a broad range of Odoo operations including reading, writing (with preview), searching, accounting, employee, holidays, knowledge management, and upgrade analysis. Minor gaps exist, such as no direct 'update_record' tool (writing is through preview_write and execute_approved_write), but overall it is comprehensive.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that connects AI assistants to Odoo ERP instances via the built-in XML-RPC API without requiring any additional addons. It enables users to search, create, update, and manage Odoo records and models through natural language.
    29 npm
    MIT
  • A
    license
    D
    quality
    C
    maintenance
    MCP server for Odoo 18 that provides 85 tools for CRUD operations, business actions, and migration workflows, enabling natural language interaction with Odoo ERP.
    85
    6
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that enables AI assistants to interact with Odoo ERP systems, allowing natural language access to business data, CRUD operations, and instance management without requiring Odoo module installation.
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A read-only MCP server that enables AI assistants to query Odoo instances via XML-RPC, supporting search, read, count, and field inspection without requiring custom modules.
    1
    Mozilla Public 2.0