Skip to main content
Glama
erpipe-org

Odoo MCP Server

by erpipe-org

Odoo MCP

ERPipe is the managed Odoo MCP gateway from the maintainer of erpipe-org/mcp-odoo, formerly tuanle96/mcp-odoo; the Python project remains the self-hosted server.

Want ChatGPT / Claude on a stable remote URL without running a process?
ERPipe is the hosted product from the same author — free v1 public beta, live in production.
Sign up → add HTTPS Odoo instance(s) → connect once to https://mcp.erpipe.com/mcp (workspace OAuth, multi-instance, gated writes, audit dashboard).
This repo stays the local / self-host Python server (full 41-tool surface, stdio, Docker). TypeScript building blocks: erpipe.

This repo (odoo-mcp)

ERPipe hosted

Run where

Your laptop / Docker / CI

Cloudflare (managed)

Install

uvx odoo-mcp --setup

Sign up at erpipe.com

MCP URL

stdio or local HTTP

https://mcp.erpipe.com/mcp

Clients

Claude Code, Cursor, local agents

ChatGPT (primary), Claude, Cursor, any remote MCP client

Tool surface

41 tools + 11 prompts (full local pack)

43 tools + 7 prompts (workspace multi-instance + governance; catalog)

Multi-instance

Config file / env on your machine

Dashboard + explicit instance key per tool

Writes

Env gate + approval tokens (+ optional MCP elicitation)

Default OFF · HITL inbox · journal · field policy

Audit

Optional JSONL file

Dashboard + D1 audit trail

Cost

Free forever (MIT)

Free v1 beta (fair-use caps)

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: odoo-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 erpipe-org/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.

MCP 2026-07-28

Stateless modern protocol with server/discover, plus automatic compatibility with legacy 2025-11-25 clients on the same endpoint.

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/erpipe-org/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/erpipe-org/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/erpipe-org/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/erpipe-org/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/erpipe-org/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_ofNoOptional ISO date used as the aging reference date.
directionNoAging direction: 'receivable' or 'payable'.receivable
instancesNoOptional instance selector; defaults to all eligible instances.
top_partnersNoMaximum top partners to include in each aging report; capped at 100.

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
as_ofNo
errorNoSanitized error message when success is false.
errorsNo
resultsNo
successYesFalse when the call failed; see error.
directionNo
elapsed_msNo
instance_countNo
skipped_opt_outNo
combined_bucketsNo
instances_queriedNo
unknown_instancesNo
combined_total_outstandingNo

TDQS

C2.3/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, covering the safety profile. The description adds a vague hint of multi-instance scope ('fanned out across instances') but doesn't disclose additional behaviors like output aggregation or performance implications. It doesn't contradict annotations, and the annotation coverage reduces the burden, so a middling score is appropriate.

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 extremely concise (one phrase), but it's cryptic and lacks structure. It doesn't front-load a clear purpose; instead, it uses jargon ('partner-network sweep') that obscures meaning. Conciseness is present but at the expense of clarity, making it only minimally acceptable.

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's complexity (multi-instance, aging direction, top-partner filtering) and the availability of an output schema, the description should explain the aggregation behavior and scope. It fails to describe what 'fanned out' means operationally, how instances are selected, or what the response contains. The schema and annotations help, but the description leaves critical gaps for correct invocation.

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

Parameters3/5

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

Schema coverage is 100% — all four parameters (as_of, direction, instances, top_partners) have detailed descriptions. The description adds no extra meaning about parameters, so the baseline of 3 applies; it neither enriches nor harms parameter understanding.

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

Purpose2/5

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

The description uses cryptic language like 'fanned out across instances' and 'the partner-network sweep' without specifying that it's a read-only AR/AP aging query across multiple instances. It doesn't clearly state the resource or action, making it hard to distinguish from sibling tools like receivable_payable_aging or accounting_health_summary.

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

Usage Guidelines1/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 (e.g., single-instance aging tools or other cross-instance queries). The description gives no context for selecting it based on use case, prerequisites, or exclusions.

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
toolNoReporting tool name.
errorNoSanitized error message when success is false.
successYesFalse when the call failed; see error.
draft_invoicesNo
open_payable_itemsNo
open_receivable_itemsNo

TDQS

C2.6/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, so the safety profile is covered. The description adds no extra behavioral context, such as the meaning of 'open' or that it only returns counts without detail, and it says nothing about the optional 'instance' parameter's effect on results.

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 that conveys the core purpose without padding. It is appropriately terse and front-loaded, though it could benefit from a bit more structure or a second sentence for 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 presence of an output schema, the return format may be documented there, but the description remains incomplete in core areas: it does not explain the 'instance' parameter, does not clarify the tool's single-instance scope versus siblings, and offers no usage guidance. The description is too minimal to be fully self-sufficient.

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 schema has one optional parameter 'instance' with no description, and the schema description coverage is 0%. The tool description also fails to explain what 'instance' refers to or how it affects the output, leaving the agent without essential information for correct invocation.

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 provides receivable/payable item counts and draft invoice backlog, identifying its resource and action. However, it does not explicitly distinguish it from sibling tools like 'receivable_payable_aging' or 'accounting_health_across_instances', which likely cover related but different scopes.

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 gives no guidance on when to use this tool versus alternatives. It does not mention that it is likely for a single instance versus across instances, nor does it note any prerequisites or exclusions. The user is left to infer usage from the name alone.

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
toolNoReporting tool name.
errorNoSanitized error message when success is false.
modelNo
errorsNo
resultsNo
successYesFalse when the call failed; see error.
elapsed_msNo
combined_countNo
instance_countNo
skipped_opt_outNo
combined_measuresNo
instances_queriedNo
unknown_instancesNo

TDQS

B3.1/5.0
Behavior3/5

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

The description says 'Read-only', which is consistent with the annotations (readOnlyHint=true, destructiveHint=false, idempotentHint=true). It adds behavioral context by stating the operation 'fans out across instances' and produces 'combined grand totals', which is beyond what annotations provide. However, it does not disclose other behavioral aspects like potential latency, failure semantics, or how 'instances' is interpreted by default.

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 with no filler words. It front-loads the key qualifier 'Read-only' and immediately conveys the core behavior. It is appropriately sized for the information it delivers, though it sacrifices detail for brevity.

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 cross-instance fan-out, five parameters, and no parameter descriptions, the one-line description is insufficient. It does not mention how instances are specified, what measures or group_by mean, or how domains are applied. An output schema exists, but the description alone leaves too many operational gaps for an agent to use the tool confidently.

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 five parameters (model, domain, group_by, measures, instances). The only hint is the phrase 'across instances', but it does not clarify parameter formats, defaults, or relationships. With no parameter documentation in either schema or description, the agent is left to guess semantics.

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 indicates the tool performs an aggregation operation ('aggregate') that is 'fanned out across instances' with 'combined grand totals', distinguishing it from single-instance aggregation tools like aggregate_records and from cross-instance search tools like search_across_instances. However, it is phrased as a noun phrase rather than an explicit verb+resource construction, which slightly reduces clarity.

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 is for cross-instance aggregation scenarios ('across instances', 'combined grand totals'), but it does not explicitly state when to use this tool instead of alternatives or when not to use it. Sibling tool names provide context, but the description itself offers no direct comparison or exclusion.

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

aggregate_recordsB
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

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds a bit of behavioral context by mentioning the version-specific read_group methods, but does not disclose other traits like error 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.

Conciseness4/5

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

The description is a single sentence that front-loads the purpose. It is concise, but could be slightly more structured to separate the purpose from the implementation 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?

With 9 parameters and no inline parameter explanations, the description is insufficient for an agent to use the tool correctly. The presence of an output schema partially compensates for return value documentation, but parameter semantics are critically lacking.

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% for 9 parameters. The description only hints at group_by and measures (via 'sum/count'), but does not explain key parameters like lazy, domain, order, or instance. This lack of detail hinders correct parameter usage.

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 aggregates Odoo records server-side using Postgres groupby/sum/count. It specifies the underlying methods (formatted_read_group for Odoo 19+, read_group for earlier versions), which distinguishes it from sibling tools like search_records or read_record that return raw 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 the tool is for aggregation tasks, but does not explicitly state when to use it versus alternatives. It lacks guidance on prerequisites, when not to use, or comparison with siblings like aggregate_across_instances.

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.9/5.0
Behavior4/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 description adds value by specifying the classification output (no_action, needs_review, needs_script) and fix suggestions. 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.

Conciseness5/5

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

Single clear sentence with no wasted words. Front-loaded with the verb and resource, immediate understanding of functionality.

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?

With an output schema present and annotations covering safety, the description is largely complete. However, missing parameter semantics slightly reduces completeness for a tool with 3 parameters and zero schema descriptions.

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% and description provides no additional meaning for any of the 3 parameters (log_text, source_version, target_version). The agent must rely solely on parameter names, which are self-explanatory but insufficient for precise invocation.

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 classifies Odoo install/update log errors into a specific migration worklist with categories and fix suggestions. It uniquely identifies the tool's function and resource, distinguishing it from siblings like upgrade_risk_report.

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 or when not to use it. The description implies usage for Odoo log analysis but lacks explicit context or exclusions.

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
toolNoReporting tool name.
errorNoSanitized error message when success is false.
domainNoValidated Odoo domain expression.
issuesNoValidation errors and warnings.
successYesFalse when the call failed; see error.
conditionsNoNormalized field/operator/value conditions.
metadata_usedNo

TDQS

B3.3/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, covering safety expectations. The description adds 'validated,' implying some checking of conditions, but does not explain other behavioral aspects like whether it returns a string or list, or any constraints. Since annotations cover the key safety traits, the description adds minimal extra behavioral clarity.

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, compact sentence with no filler. It efficiently conveys the core action and input. Every word contributes meaning, making it appropriately 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?

The tool has three parameters, one required, and an output schema, yet the description does not explain any of the parameters beyond a vague reference to conditions. It lacks details on how the logical operator or fields metadata influence the output. Even with annotations and an output schema, the description is incomplete for a tool that constructs complex domains.

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 explaining parameters. It only mentions 'structured conditions,' which vaguely maps to the 'conditions' parameter, but completely omits the 'fields_metadata' and 'logical_operator' parameters. Without any elaboration on how these parameters affect domain construction, parameter semantics are severely under-explained.

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: 'Build a validated Odoo domain from structured conditions.' The verb 'build' and resource 'Odoo domain' are specific, and the mention of 'validated' adds a unique aspect. It distinguishes from sibling tools like search_records, which perform queries, whereas this constructs a domain filter.

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, when it is appropriate to build a domain, or suggest any alternative tools. The single sentence is purely declarative without usage context.

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

business_pack_reportA
Read-onlyIdempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
packYesBusiness pack to report, such as sales, crm, inventory, accounting, or hr.
instanceNoOptional configured Odoo instance name; uses the default if omitted.
use_live_metadataNoWhether to inspect live models and installed modules.

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, openWorldHint, idempotentHint, and destructiveHint, providing a clear safety profile. The description adds minimal behavioral context beyond stating the purpose; it does not discuss performance, caching, 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 concise sentence that is front-loaded with the verb and resource. It is efficient and avoids unnecessary words.

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?

With 3 parameters, an output schema, and clear annotations, the description provides adequate context. It covers the primary purpose but could mention the output structure or typical use cases briefly.

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

Parameters3/5

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

Schema coverage is 100%, so the input schema already documents all parameters. The description does not add meaning beyond the schema; it merely restates the tool's purpose.

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 resource 'expected modules, models, and safe discovery calls for a business pack'. It distinguishes this tool from siblings like health checks or search tools by its specific reporting scope.

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, when not to use it, or any prerequisites. The description simply states what it does without contextual usage advice.

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
nameNo
noteNo
toolNoReporting tool name.
errorNoSanitized error message when success is false.
resultNo
statusNo
successYesFalse when the call failed; see error.
task_idNo
created_atNo
started_atNo
finished_atNo

TDQS

C2.7/5.0
Behavior1/5

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

The description directly contradicts the annotation readOnlyHint: true. Cancelling a task is a mutating action, not read-only. The description adds no behavioral context beyond the basic action, and it does not explain side effects like whether cancellation is irreversible or what happens to the task's status. This is a serious inconsistency with 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 with no unnecessary words. It is front-loaded with the core action and resource. There is no redundancy or filler.

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's simplicity (one parameter) and the existence of an output schema, the description could be minimal, but it omits critical usage context and contradicts the annotations. It fails to provide guidance on when to cancel tasks or what the expected outcome is, making it incomplete for an agent to use reliably.

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 provides no information about the task_id parameter beyond its name. Schema description coverage is 0%, so the description must compensate, but it does not explain how to obtain a task_id or what format is expected. The single parameter is self-explanatory by name, but the description adds zero 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 tool's function: cancel a pending or running background task. It uses a specific verb ('cancel') and a specific resource ('background task'), and it distinguishes itself from sibling tools like submit_async_task, get_async_task, and list_async_tasks by being the cancellation action.

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 gives no guidance on when to use this tool versus alternatives. It does not mention checking task status first (e.g., via get_async_task), nor does it state that tasks should be cancelled only when they are no longer needed. There is no discussion 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.

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.6/5.0
Behavior3/5

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

Annotations already indicate write and destructive behaviors; the description adds the approval flow context beyond annotations, but does not fully disclose side effects, error conditions, or the exact effect when the environment variable is not set. It offers some transparency but not exhaustive.

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 two sentences, both front-loaded. The first sentence states the core purpose, the second introduces the approval mode. No extraneous information. Every sentence earns its place.

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 complexity (10 parameters, destructive annotation, approval flow), the description covers the dual-mode usage but lacks details on parameter semantics, error handling, and exactly what the tool returns (though output schema exists). It is minimally complete but leaves significant gaps.

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 10 parameters, the description provides no additional meaning for any parameter. The agent must rely on parameter names alone, which is insufficient for correct usage. The description should have elaborated on key parameters like model, record_id, approval, 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 clearly states the action ('Post a chatter message') and the target resource ('mail.thread record'). This is a specific verb+resource combination that distinguishes it from all sibling tools, none of which perform chatter posting.

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 provides context on the two modes (with approval token vs. direct bypass) but does not explicitly state when not to use this tool or name alternative tools. It gives a practical condition (environment variable) but lacks comprehensive guidance on alternatives or prerequisites.

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.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds value by listing specific quality check categories, but does not disclose behavior like performance impact or error handling. Given the strong annotation coverage, the description provides adequate additional context.

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, front-loaded sentence that efficiently communicates the tool's purpose and scope. No unnecessary words, and it includes the key verb 'run', resource 'Odoo model', and constraints 'read-only' and specific check types.

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 fails to explain how to use the five parameters effectively or what to expect from the checks. For a tool with no schema parameter descriptions, this is insufficient for an agent to craft correct invocations.

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 mentions 'one Odoo model' but does not explain parameters like 'checks' (what string values?), 'instance', 'key_fields', or 'sample_limit'. Users lack guidance on configuring these parameters 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?

The description clearly states the tool runs read-only data-quality checks on one Odoo model, listing specific check types (duplicates, missing values, etc.). It distinguishes itself from sibling tools like 'aggregate_records' or 'diagnose_access' by focusing on data quality and read-only operation.

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, nor any prerequisites or exclusions. While the purpose implies usage for data quality checks, a mention of when not to use it (e.g., for write operations) would improve clarity.

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

diagnose_accessA
Read-onlyIdempotent

Diagnose ACL and record-rule visibility for an Odoo model

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum metadata rows to inspect; capped at 500.
modelYesTechnical Odoo model name to inspect.
domainNoOptional Odoo domain used for the visibility check.
instanceNoOptional configured Odoo instance name; uses the default if omitted.
operationNoAccess operation to diagnose, such as read or write.read
record_idsNoOptional record IDs to check directly.
include_rulesNoWhether to include matching record-rule metadata.
expected_countNoOptional expected visible record count for comparison.
observed_errorNoOptional error text or structured error to classify.

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 readOnlyHint, idempotentHint, and non-destructiveness; the description confirms the diagnostic nature but adds no further behavioral details (e.g., output volume, execution cost).

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 single-sentence description is concise, front-loaded with the verb and resource, and contains no redundant information.

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?

For a 9-parameter tool with full schema and an output schema, the brief description is mostly adequate, though it could briefly mention the nature of the diagnostic output (e.g., 'returns ACL analysis').

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

Parameters3/5

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

Schema coverage is 100%, so the description does not need to explain parameters; it adds no extra meaning beyond what the schema already provides, meeting the baseline.

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 'diagnose' and the resource 'ACL and record-rule visibility for an Odoo model', making the tool's specific purpose distinct from sibling diagnostic tools.

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 like diagnose_odoo_call or when to avoid it; the description lacks context for decision-making.

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

diagnose_odoo_callA
Read-onlyIdempotent

Diagnose an Odoo model call without executing it

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoOptional positional call arguments.
modelYesTechnical Odoo model name to diagnose.
kwargsNoOptional keyword call arguments.
methodYesOdoo model method name to diagnose.
metadataNoOptional model or method metadata used by the diagnosis.
transportNoTransport to assess, such as 'auto', 'xmlrpc', or 'json2'.auto
include_debugNoWhether to include additional diagnostic details.
observed_errorNoOptional error text or structured error to classify.
target_versionNoOptional target Odoo version for compatibility checks.
use_live_metadataNoWhether to request live metadata; this preview tool does not fetch it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/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 'without executing it', reinforcing safety but providing no additional behavioral details 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.

Conciseness5/5

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

The description is a single, concise sentence that immediately conveys the tool's purpose. No unnecessary words or information.

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 the tool has 10 parameters and an output schema, the description is brief but sufficient to understand the core functionality. However, it could briefly mention that the tool analyzes potential issues without side effects, which would improve completeness.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The tool description adds no extra meaning beyond the parameter descriptions in the schema (e.g., it doesn't explain how 'metadata' or 'transport' affect diagnosis).

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 explicitly states 'Diagnose an Odoo model call without executing it', clearly defining the action (diagnose), the resource (Odoo model call), and the key constraint (no execution). This distinguishes it from sibling tools like 'execute_method' which performs actual execution.

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 diagnosis, but does not provide explicit guidance on when to use this tool versus alternatives (e.g., 'execute_method', 'preview_write'). There is no mention of use cases or exclusions.

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

execute_approved_writeC
Destructive

Execute a previously previewed and confirmed standard write

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
approvalYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already indicate destructiveHint=true, but the description adds no details about what gets destroyed, permissions required, or failure behavior, failing to add value beyond 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.

Conciseness3/5

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

The single-sentence description is concise but overly brief, sacrificing essential information for brevity.

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's complexity (nested object, confirm parameter, output schema exists), the description is too minimal to adequately guide an agent, missing return value expectations and parameter specifics.

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?

With 0% schema description coverage, the description provides no guidance on the 'approval' object or 'confirm' boolean, leaving the agent without necessary parameter semantics.

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 'Execute a previously previewed and confirmed standard write' uses a specific verb (execute) and resource (approved write), clearly distinguishing it from sibling tools 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?

The description implies the tool should be used after preview and confirmation, but it does not explicitly state when not to use it or provide alternatives among siblings like 'validate_write'.

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
argsNoOptional positional method arguments.
modelYesTechnical Odoo model name, for example 'res.partner'.
kwargsNoOptional keyword method arguments.
methodYesOdoo model method to call; direct create, write, and unlink are blocked.
instanceNoOptional configured Odoo instance name; uses the default if omitted.

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 flag destructiveHint: true and readOnlyHint: false, indicating the tool can modify data. The description adds no behavioral context beyond the annotations—no mention of side effects, permissions required, or safety considerations. Given the annotations, the description should at least reinforce the destructive nature or clarify when destruction might occur.

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 short sentence, which is concise but not optimally structured. It could be expanded with key information (use case, restrictions) without becoming verbose. Front-loads the core action but omits important guidance.

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 fails to explain return values, error behaviors, or side effects. For a destructive, open-world tool with 5 parameters and many siblings, this is insufficient. The description should at least mention safety warnings or when to prefer this over similar tools.

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

Parameters3/5

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

The input schema has 100% description coverage, with each parameter (model, method, args, kwargs, instance) already described. The tool description adds no additional meaning beyond what the schema provides. Per the rubric, baseline is 3 since schema coverage is high.

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 identifies the action (execute) and the resource (custom method on Odoo model). It distinguishes from siblings like 'execute_approved_write' (specific to writes) and 'diagnose_odoo_call' (testing). However, it could be more precise about what constitutes a 'custom method' versus blocked methods (create/write/unlink), which are noted only in the parameter 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?

No guidance is provided on when to use this tool versus alternatives. The description does not mention prerequisites, comparable tools (e.g., 'execute_approved_write' for safe writes, 'read_record' for reading), or scenarios where this tool is inappropriate. The blocked methods are only stated in a parameter description, not in the tool description.

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.8/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 no behavioral details beyond what annotations provide, so baseline score applies.

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?

Single sentence is too brief for a tool with 6 parameters and an output schema; it lacks necessary details and qualifies as under-specification rather than 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 an output schema and multiple parameters, the description omits how the classification works, how parameters affect results, and what the output contains. Incomplete for the tool's complexity.

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 parameter purpose, format, or interaction. Parameters like 'available_fields' and 'business_context' are left entirely undefined, severely hindering correct invocation.

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 a specific verb 'classify' and resource 'Odoo requirements into fit/gap implementation buckets', clearly distinguishing it from sibling tools like 'read_record' or 'aggregate_records' which do not perform classification.

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?

Description provides no guidance on when to use this tool, prerequisites, or alternatives. It only states what it does, leaving the agent to infer usage context.

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

generate_json2_payloadB
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

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 it is a preview without network access, which reinforces the safe, non-destructive nature. However, it does not disclose any additional behaviors like potential formatting or 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, well-front-loaded sentence with all critical information at the beginning. No extraneous words or repetition.

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?

The tool has 7 parameters and an output schema, but the description ignores both. It does not explain what constitutes a 'JSON-2 request preview' or what the returned payload looks like, leaving the agent underinformed.

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?

Despite 0% schema description coverage, the description adds zero information about the 7 parameters. Terms like 'model', 'method', 'base_url' are left unexplained, so the agent must infer from names alone.

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 specifies the verb 'Build' and the object 'JSON-2 request preview', and adds the key qualifier 'without network access', distinguishing it from sibling tools like 'diagnose_odoo_call' which likely involve actual network calls.

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 (e.g., diagnose_odoo_call or execute_method). It lacks any mention of use cases, prerequisites, or exclusions.

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
nameNo
noteNo
toolNoReporting tool name.
errorNoSanitized error message when success is false.
resultNo
statusNo
successYesFalse when the call failed; see error.
task_idNo
created_atNo
started_atNo
finished_atNo

TDQS

A3.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, and destructiveHint=false, so the safety profile is known. The description adds the behavioral context of polling a background task's status and result, but it does not disclose any additional traits such as behavior when the task is not found, retry logic, or output specifics. Since annotations carry the safety burden, the description provides minimal but adequate transparency beyond 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 is front-loaded with the action 'Poll' and clearly states the resource. It contains no unnecessary words and is easy to parse.

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 the simple structure (one parameter), the presence of an output schema, and annotations covering safety, the description is largely complete. It accurately conveys the tool's purpose and operation. It lacks explicit workflow context (e.g., referencing submit_async_task), but for a simple polling tool, the description is sufficiently comprehensive for an agent to understand and invoke 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% and the description does not mention parameters at all. The only parameter, task_id, is self-explanatory from its name and type, but the description does not compensate for the lack of schema descriptions by explaining how to obtain or use the task_id, leaving the agent to infer its meaning from context.

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 "Poll a background task's status and result" uses the specific verb 'Poll' and clearly identifies the resource (background task's status and result). It distinguishes from sibling tools like submit_async_task, cancel_async_task, and list_async_tasks by indicating a targeted retrieval of a single task's status and result.

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 checking the status of an asynchronous background task, but it does not explicitly state when to use this tool versus alternatives such as list_async_tasks, nor does it mention exclusions. It provides no direct guidance on the workflow (e.g., after submitting a task) or when to prefer another tool.

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

get_model_fieldsB
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

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=false, so the description adds no extra 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.

Conciseness4/5

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

Single sentence with no unnecessary words, though it could be more structured or front-loaded with key information.

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 and an output schema, the description is too minimal; it fails to explain how parameters affect results or what the output contains.

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% and the description does not explain any of the 5 parameters, such as 'model', 'instance', 'relevance', 'max_fields', or 'field_names', leaving the agent uninformed.

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 retrieves field metadata for a specific Odoo model, 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 reading a record's fields or exploring model relationships.

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

get_odoo_profileA
Read-onlyIdempotent

Read a bounded profile of the connected Odoo environment

ParametersJSON Schema
NameRequiredDescriptionDefault
instanceNoOptional configured Odoo instance name; uses the default if omitted.
module_limitNoMaximum installed modules to include; capped at 500.
include_modulesNoWhether to include installed-module metadata.

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

A3.5/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. The description adds minimal behavioral context beyond 'bounded', leaving the precise scope unclear. 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.

Conciseness5/5

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

A single, concise sentence front-loads the core action. No extraneous text, and every word is meaningful.

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?

While the output schema exists (reducing need to describe returns), the term 'bounded profile' is vague. The description could clarify what is included (e.g., version, user info). Adequate but not excellent.

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

Parameters3/5

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

All three parameters have descriptions in the input schema, achieving 100% coverage. The tool description does not add extra meaning beyond what the schema already provides.

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 resource ('bounded profile of the connected Odoo environment'), clearly distinguishing this tool from sibling tools like 'get_model_fields' or 'list_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 is provided on when to use this tool versus alternatives such as 'health_check' or 'list_models'. An agent receives no context about prerequisites or preference conditions.

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/5.0
Behavior3/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 'non-secret runtime safety posture', clarifying scope but not revealing additional behavioral traits 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 sentence, concise, no redundant words. Every part contributes to clarity.

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 zero parameters, rich annotations, and an output schema, the description is sufficient. It omits output details but output schema compensates. No gaps.

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 add parameter meaning. Baseline 4 is appropriate for zero-param tools.

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 reports the server's non-secret runtime safety posture, a specific verb+resource. It distinguishes from health-related siblings like accounting_health_across_instances which focus on different domains.

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. The purpose is implied but no when-not or sibling differentiation is provided, leaving the agent to infer usage context.

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

index_knowledgeB
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
toolNoReporting tool name.
errorNoSanitized error message when success is false.
modelNo
fetchedNo
indexedNo
successYesFalse when the call failed; see error.
instanceNo
max_documentsNo
indexed_fieldsNoExplicit field list or 'smart selection'.
redacted_fieldsNo
documents_in_indexNo
skipped_over_budgetNo

TDQS

B3.4/5.0
Behavior4/5

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

With annotations readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the description adds context by specifying the operation is 'local' and builds a BM25 index, suggesting side effects are confined to the local session. This clarifies that while it's a read operation, it sets up a searchable structure. It does not contradict any annotation and adds useful nuance about scope, though it could mention memory/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.

Conciseness5/5

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

The description is a single, front-loaded sentence of 13 words, free of fluff. Every word earns its place, immediately conveying the action and outcome. It is perfectly sized for quick consumption.

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 has 6 parameters (moderate complexity) and an output schema exists. The description covers the overall purpose but omits any detail about parameters, return value structure, or edge cases like what happens with replace=true. Given the annotations already declare safety, this is adequate for a basic understanding but leaves gaps in knowing how to set up the index correctly, making it minimally complete.

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 makes no mention of any parameters. All six parameters (limit, model, domain, fields, replace, instance) are left unexplained. Since the schema provides no defaults or descriptions, the description needed to compensate but entirely fails to clarify what these parameters do or how they interact. This leaves the agent guessing on parameter usage.

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 'fetch' and 'build' with concrete resources: 'a bounded slice of records' and 'a local BM25 knowledge index'. This clearly distinguishes it from sibling tools like search_knowledge and knowledge_stats, as it focuses on indexing rather than querying. It tells exactly what the tool does.

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?

There is no guidance on when to use this tool instead of alternatives. It does not mention exclusions, prerequisites, or compare to similar tools like search_knowledge or list_instances. The description only states the action without contextual 'when' or 'when not to use', so it fails to help an agent decide between this and related 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.1/5.0
Behavior4/5

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

Description adds context beyond annotations by specifying what is inspected (relationships and required field metadata). Annotations already show readOnlyHint true, destructive false, idempotent true, so the description complements well.

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 with no wasted words. Purpose is front-loaded and clear.

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 6 parameters and no schema descriptions, the description is insufficient. It does not explain parameter usage or return value (though output schema exists). Leaves agent with significant gaps.

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 6 parameters (model, fields_metadata, include_readonly, etc.). The agent must infer meaning solely from parameter names and types.

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?

Description clearly states the tool inspects model relationships and required field metadata, distinguishing it from siblings like get_model_fields which only gets fields. However, it could be more explicit that it is read-only.

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 get_model_fields or search_records. The description does not mention appropriate contexts or exclusions.

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
toolNoReporting tool name.
errorNoSanitized error message when success is false.
indexesNo
successYesFalse when the call failed; see error.
max_documentsNo
total_documentsNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, which already cover safety. The description adds that it reports 'local' knowledge index, which is useful context, but does not elaborate on what exactly is included (e.g., budget specifics, whether it aggregates across instances). 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.

Conciseness5/5

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

The description is a single concise sentence that states exactly what the tool does. No fluff, perfectly front-loaded.

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?

Complexity is low with 0 parameters and a clear purpose. The output schema exists, so return values are presumably documented there. The description covers the main function (sizes and budget) but could mention whether it's instance-specific or aggregated, though 'local' hints at instance-level. Overall complete enough.

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, so schema coverage is 100% trivially. The description adds no parameter details because none exist. Baseline for 0 params is 4, and the description is adequate.

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 local knowledge index sizes and document budget, which is specific and distinguishes it from siblings like index_knowledge and search_knowledge. It lacks a verb like 'get' but the purpose is clear.

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 checking knowledge index stats, but does not explicitly state when to use this tool versus alternatives (e.g., index_knowledge or search_knowledge). No exclusions or contextual triggers are provided.

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
toolNoReporting tool name.
errorNoSanitized error message when success is false.
tasksNo
successYesFalse when the call failed; see error.

TDQS

A3.8/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 safety profile is established. The description adds the newest-first ordering, which is useful, but it does not disclose other behaviors like result limits, pagination, or what 'recent' means. This goes slightly beyond annotations but is minimal.

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 action, resource, and ordering. It is front-loaded and contains no redundant information.

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?

For a zero-parameter list tool with an output schema and good annotations, the description is adequate. The only slight gap is the vague term 'recent' without a defined limit, but the overall simplicity and existing structured data make it sufficiently complete.

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 zero parameters, so the baseline is 4. The description does not need to add parameter meaning, and since there are no params, no additional info 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 identifies the action (list), the resource (background tasks), and the ordering (newest-first). It distinguishes from siblings like get_async_task (fetch specific) and cancel_async_task (cancel), so the purpose is unambiguous.

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 get_async_task or cancel_async_task. The description simply states what it does without context for selection or exclusions.

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.1/5.0
Behavior4/5

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

Adds behavioral context beyond annotations: states the tool requires no credentials. Annotations already cover read-only and idempotent safety, so description is helpful but not critical.

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 with no redundant words. Every part is meaningful.

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?

Tool is simple (0 parameters, output schema exists). Description is sufficient: it names the resource and a key constraint (no credentials). Annotations cover safety.

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; schema coverage is 100%. Description effectively conveys the tool's scope without needing parameter details.

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 the verb 'List', the resource 'configured Odoo instance names', and a key qualifier 'without credentials'. Distinguishes from 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 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 qualifier 'without credentials' implies a condition but does not compare with sibling tools.

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

list_modelsC
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

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, etc. The description adds no behavioral details beyond the listing action, e.g., pagination limits or result ordering, which are relevant but omitted.

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?

A single sentence with no extraneous words. However, it sacrifices useful detail for brevity; still earns a high score for conciseness.

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 adequate for a simple list operation, especially with annotations covering safety and an output schema. But missing details on instance and limit parameters limit 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%. The description only vaguely hints at 'name filtering' for the query parameter, ignoring limit (default 100, implying pagination) and instance (scope). No parameter meanings are clarified.

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 'List' and resource 'Odoo models', and mentions optional name filtering. However, it does not explicitly differentiate from sibling tools like search_records or read_record, leaving some ambiguity.

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 get_model_fields for specific model details or search_records for records. No exclusions 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.

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.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and idempotentHint=true; description adds specific purpose but no additional behavioral traits (e.g., rate limits, data freshness). Consistent 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.

Conciseness5/5

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

Single sentence with example, no wasted words, 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 one parameter and an output schema, the description sufficiently explains the tool's purpose and input without needing additional details.

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?

With 0% schema description coverage, the description compensates by explaining the 'name' parameter expects an old or new model name, illustrated by an example.

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 verb 'look up' and the resource 'Odoo model rename/removal history', with an example distinguishing it from sibling tools like search_records or read_record.

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 or not use this tool versus alternatives; the example provides context but lacks when-not-to-use criteria.

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.9/5.0
Behavior5/5

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

The description matches annotations (readOnly, idempotent) and adds the 'preview without executing' context. No contradiction; behavior is clearly stated.

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, front-loaded sentence with no filler. Every word serves a purpose.

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 omits critical input parameter details (e.g., how to specify records, the difference between values and values_list). The agent needs more guidance 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?

With 0% schema description coverage, the description provides no parameter details. The agent cannot determine what 'values', 'values_list', 'record_ids', etc., mean, severely limiting correct invocation.

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 previews create/write/unlink operations without execution. It uses specific verbs and resources, and distinguishes from siblings like 'execute_approved_write' or '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 Guidelines4/5

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

The description implies use for dry-running operations without committing. It could explicitly say when not to use (e.g., when execution is needed), but the context from sibling names helps.

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

read_attachmentB
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

B3/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. The description adds the behavioral trait of 'size-capped base64 content', warning about potential truncation. This adds value beyond annotations, but only marginally.

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 with no wasted words. However, it omits necessary parameter details, so it sacrifices completeness for brevity.

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 3 parameters (one unexplained), the description is incomplete. It does not explain the optional parameters 'instance' and 'include_data'. Although an output schema exists, the missing parameter documentation is a significant gap.

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% and the description does not explain any parameter semantics. It does not clarify the meaning of 'instance' or 'include_data'. Only 'attachment_id' is inferable from context.

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 'Read', the resource 'ir.attachment', and specifies what is read: 'metadata and size-capped base64 content'. This distinguishes it from sibling 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?

No explicit guidance on when to use this tool vs alternatives. There is no mention of prerequisites or when-not-to-use. The purpose is clear but usage context is not provided.

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

read_recordC
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

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds 'Read' which matches, but does not provide extra behavioral context (e.g., returns full record if fields omitted, or behavior when record not found). With annotations present, a score of 3 is appropriate.

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, no redundant words. Front-loaded with verb and resource. Could add more detail without being verbose.

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?

Output schema exists, so return value is documented. However, with 4 parameters and 0% schema coverage, the description is insufficient to fully guide usage. Sibling tools list is large, and description does not help differentiate.

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. It mentions 'model' and 'record_id' implicitly, but does not explain the 'fields' and 'instance' parameters. No additional meaning beyond parameter names.

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?

Description clearly states verb 'read' and resource 'single Odoo record', with key parameters 'model and ID'. It distinguishes from sibling tools like search_records (which return multiple) and aggregate_records. However, it could explicitly differentiate from read_attachment.

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 search_records, get_model_fields, or execute_method. No context about prerequisites or limitations.

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

receivable_payable_agingA
Read-onlyIdempotent

Aged receivable/payable report bucketed by days overdue

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNoOptional ISO date used as the aging reference date.
limitNoMaximum open-item lines to inspect.
instanceNoOptional configured Odoo instance name; uses the default if omitted.
directionNoAging direction: 'receivable' or 'payable'.receivable
top_partnersNoMaximum top partners to include; capped at 100.

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
as_ofNo
errorNoSanitized error message when success is false.
bucketsNo
successYesFalse when the call failed; see error.
partnersNo
directionNo
truncatedNo
line_countNo
partner_countNo
skipped_linesNo
total_outstandingNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already indicate readOnly, openWorld, idempotent, non-destructive, so the description doesn't contradict them. The description provides a good high-level behavior ('bucketed by days overdue') that complements annotations. However, it doesn't elaborate on side effects (though readOnly implies none) or specific data aggregation behavior, but given the annotations, this is adequate.

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 one sentence, concise and to the point. It communicates the core function without fluff. It could maybe expand on the output, but for a report tool, this is appropriately short.

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 an output schema is present, so return values don't need explanation. However, it doesn't mention the meaning of 'open-item lines' or the purpose of the 'limit' parameter, which could be ambiguous. The tool complexity is moderate (5 params, all documented), so more context would help. Given the output schema exists, it's acceptable but could be slightly more complete.

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?

All parameters have descriptive schema descriptions: as_of (ISO date), limit (max lines), instance (optional Odoo instance), direction (receivable/payable), top_partners (max partners, capped). The description adds context by saying the report is 'bucketed by days overdue', which helps understand what 'as_of' and 'direction' mean. Since schema coverage is 100%, the parameter semantics are already well-covered, but the description reinforces the purpose.

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 produces an 'Aged receivable/payable report' with a specific structure (bucketed by days overdue). It effectively conveys the core purpose and distinguishes it from general reporting tools. However, it doesn't explicitly differentiate from sibling tools like `accounting_health_summary` or `business_pack_report`, which might also involve financial reports.

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 generating aging reports but provides no guidance on when to choose this over alternatives or prerequisites (e.g., configured Odoo connection, instance). Given sibling tools like `accounting_health_summary`, explicit when-to-use guidance is missing. The schema mentions 'instance' and 'direction', but the description doesn't clarify typical use cases.

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

scan_addons_sourceA
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

A3.8/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 the behavioral trait of avoiding code import, which is valuable context beyond annotations. Additional details about scanning behavior could improve transparency, but the description supplements annotations well.

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 front-loads the core action and constraint. Every word earns its place with no redundancy.

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 low complexity (3 optional parameters, output schema exists, annotations cover safety), the description is adequate but lacks details on return values or parameter constraints. It provides the essential purpose but could be more helpful with usage examples or output description.

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?

The description does not explain any of the three parameters (max_files, addons_paths, max_file_bytes). Schema description coverage is 0%, so the description bears the responsibility but fails to clarify their purpose or usage. Parameter names are self-explanatory to some extent, but the description adds no semantics.

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 scans local Odoo addon source, with the key constraint 'without importing addon code', which distinguishes it from import operations. The verb 'scan' and resource 'local Odoo addon source' 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 Guidelines3/5

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

The description provides implied usage by stating it scans without importing, but does not explicitly state when to use this tool versus alternatives. It lacks guidance on when not to use it or how it compares to sibling tools like diagnose_odoo_call or read_record.

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

schema_catalogA
Read-onlyIdempotent

Build and cache a bounded Odoo model schema catalog

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum catalog models to return; capped at 500.
queryNoOptional text used to filter catalog models.
modelsNoOptional technical model names to include in the catalog.
refreshNoWhether to bypass and refresh the cached catalog.
instanceNoOptional configured Odoo instance name; uses the default if omitted.
include_fieldsNoWhether to include field metadata for each model.

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

A3.6/5.0
Behavior4/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 value by stating that the tool builds and caches the catalog, implying that it is a read operation that may return cached data, and that it is bounded. This context enriches the 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.

Conciseness5/5

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

The description is a single, front-loaded sentence with no unnecessary words. Every word contributes to the purpose, making it highly concise and efficient.

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 that an output schema exists and annotations cover safety, the description is mostly complete. However, it does not explain the caching behavior in detail or mention the bounded nature explicitly, which could be helpful for an agent to understand the tool's scope. Still, it is sufficient for a tool with well-documented parameters and schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema documents all parameters fully. The description does not add any additional meaning or constraints beyond what the schema provides, meeting the baseline expectation.

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 action ('Build and cache') and the resource ('bounded Odoo model schema catalog'), which is specific and informative. It distinguishes from sibling tools like 'list_models' or 'get_model_fields' by emphasizing caching and boundedness, but does not explicitly contrast with them.

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 gives no guidance on when to use this tool versus alternatives such as 'list_models', 'get_model_fields', or 'search_records'. No usage context, prerequisites, 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.

search_across_instancesA
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
toolNoReporting tool name.
errorNoSanitized error message when success is false.
modelNo
errorsNo
mergedNo
resultsNo
successYesFalse when the call failed; see error.
elapsed_msNo
merged_countNo
instance_countNo
skipped_opt_outNo
instances_queriedNo
unknown_instancesNo

TDQS

A4/5.0
Behavior4/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 useful behavioral grounding with 'fanned out... merged and attributed', which explains the cross-instance orchestration and result attribution. It does not go into detail about attribution semantics or edge cases, but it complements the annotations well.

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?

This is a single, well-structured sentence that front-loads the key idea ('Read-only') and packs in scope and behavior without waste. It is concise while still being information-dense.

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?

Within its parent object schema and annotations, this description is reasonably effective, and an output schema covers return value semantics. However, main gaps are the lack of parameter semantics and no explicit guidance around when to select this instead of related search_records or aggregate_across_instances. It is minimally complete but not richly enough for a complex fan-out tool.

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 provides essentially no parameter guidance. Parameter names like model, domain, instances, and limit_per_instance are somewhat self-explanatory, but the semantics of null defaults, the format of domain/instances, and how limit is applied are left unexplained.

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 ('search'), names the resource (Odoo instances), and conveys a precise scope ('fan out across configured instances', 'merged and attributed'). It clearly distinguishes this from single-instance search_records and 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 Guidelines4/5

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

The phrase 'fanned out across configured Odoo instances' clearly indicates the main use case is multi-instance search. It does not explicitly name alternatives or list when not to use it, but the context is clear enough for an agent to choose it over search_records or aggregate_across_instances.

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.1/5.0
Behavior3/5

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

The description adds minimal behavioral context beyond the annotations. The annotations already indicate readOnly and idempotent behavior, so the description's statement 'Search for employees' is consistent but does not disclose details about pagination, instance handling, or other traits.

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 concise (one sentence), but it lacks critical details. It is appropriately front-loaded but fails to earn its keep by omitting parameter explanations 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 3 parameters, no schema descriptions, and a substantial sibling list, the description is insufficient. It does not explain the purpose of 'limit' or 'instance', nor how this tool relates to other search tools. The presence of an output schema does not compensate for the lack of input 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?

With 0% schema description coverage, the description must compensate. It only hints at the 'name' parameter ('by name'), but does not explain 'limit' or 'instance'. This leaves the agent without necessary context for proper invocation.

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 'Search' and the specific resource 'employees' with a focus on searching by name. This distinguishes it from sibling tools like 'search_records' or 'search_holidays' which target different resources.

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 'search_records' or 'search_across_instances'. It does not mention exclusions or context for choosing this tool over siblings.

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

search_holidaysA
Read-onlyIdempotent

Search for holidays within a date range

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYesEnd date in YYYY-MM-DD format.
instanceNoOptional configured Odoo instance name; uses the default if omitted.
start_dateYesStart date in YYYY-MM-DD format.
employee_idNoOptional employee ID used to filter holidays.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoError message, if any
resultNoList of holidays found
successYesIndicates if the search was successful

TDQS

A3.8/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. The description does not add any behavioral context beyond what annotations provide, such as pagination or filtering behavior.

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 short sentence that is front-loaded with the key action and resource, containing no unnecessary words.

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 the tool's simplicity, presence of an output schema, and comprehensive annotations, the description is sufficient for understanding the tool's purpose. It could mention that it returns a list of holidays, but the output schema likely covers that.

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

Parameters3/5

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

Schema description coverage is 100% with each parameter adequately described. The tool description adds no additional parameter 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 clearly states the tool searches for holidays within a date range. The verb 'Search' and resource 'holidays' are specific, and it distinguishes from sibling search tools like search_records or search_employee.

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 date-range holiday searches but provides no explicit guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites.

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

search_knowledgeC
Read-onlyIdempotent

Relevance-ranked local BM25 search over previously indexed records

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
modelYes
queryYes
instanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolNoReporting tool name.
errorNoSanitized error message when success is false.
modelNo
queryNo
resultsNoBM25-ranked snippets from the local index.
successYesFalse when the call failed; see error.
instanceNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds algorithmic detail (BM25, local) without contradicting annotations, but does not elaborate on side effects or scope.

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, focused sentence with no redundancy or unnecessary details.

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?

While an output schema exists (so return values need not be explained), the description lacks parameter semantics and usage guidance, 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?

The schema includes four parameters (query, model, limit, instance), but the description provides no explanation for any of them. This is a significant gap, and no compensation is made.

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?

Description clearly states it performs a search over indexed records with BM25 relevance ranking. The term 'local' distinguishes it from cross-instance search tools, though it could be more explicit about the scope.

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 alternative search tools like search_records or search_across_instances. The 'local' hint is implicit but not elaborated.

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

search_recordsC
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

C2.9/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=false. The description reinforces read-only behavior and adds context about query field matching, but does not disclose additional details like pagination, 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.

Conciseness4/5

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

The description is a single concise sentence front-loading the core purpose. It is efficient but could benefit from a brief note about key parameters or guidance.

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 8 parameters and multiple siblings, the description is incomplete. It lacks details on domain syntax, field selection, ordering, and instance specification. The output schema exists but does not compensate for missing parameter 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%, and the description only mentions the 'query' parameter, explaining it matches across name/ref/email-like fields. The other 7 parameters (limit, offset, domain, fields, order, model, instance) receive no explanation, leaving the agent with minimal guidance.

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 it searches Odoo records using read-only search_read with optional free-text query matching across specific fields. However, it does not explicitly differentiate itself from sibling search tools like search_employee or search_across_instances, leaving some ambiguity about when to use each.

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 the many specialized sibling search tools (e.g., search_employee, search_across_instances). The description implies it is generic but does not state exclusions or alternatives.

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

submit_async_taskA
Read-onlyIdempotent

Run an allowlisted long-running read operation in the background

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
instanceNo
operationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
noteNo
toolNoReporting tool name.
errorNoSanitized error message when success is false.
resultNo
statusNo
successYesFalse when the call failed; see error.
task_idNo
created_atNo
started_atNo
finished_atNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description reinforces that by saying 'read operation'. It adds context beyond annotations by specifying 'allowlisted' (implying restrictions), 'long-running' (performance characteristics), and 'background' (execution model). No contradiction exists, and the extra detail is valuable though it does not cover error handling or cancellation behavior.

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 with no redundant words. It delivers the core purpose effectively and is appropriately sized for a straightforward submission tool.

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 present, the return value might be covered elsewhere, but the description fails to provide essential context about the operation allowlist, how to construct parameters, or whether an instance is required. For a tool that submits long-running tasks, users need to know what operations are permitted and how to structure inputs, which is missing. This makes the description incomplete for a 3-parameter tool with 0% schema coverage.

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 carries full responsibility for explaining parameters. However, it only mentions 'operation' implicitly via the word 'operation' in the text, without defining what an operation is, how to specify parameters (params), or what instance refers to. The schema shows three parameters, but none are explained, making param semantics weak.

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 ('Run') and resource ('operation'), and adds qualifiers ('allowlisted', 'long-running', 'read', 'background') that distinguish it from sibling async tools like get_async_task, cancel_async_task, and list_async_tasks. It unambiguously communicates that this tool submits a background read task.

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 phrase 'long-running read operation' implies when to use it (for reads that take time), but it does not explicitly state when not to use it, mention alternatives like synchronous reads, or explain that results should be retrieved via get_async_task. The guidance is implied rather than explicit.

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

upgrade_risk_reportB
Read-onlyIdempotent

Report Odoo upgrade and JSON-2 migration risks

ParametersJSON Schema
NameRequiredDescriptionDefault
methodsNoOptional model method metadata to assess for compatibility.
modulesNoOptional module metadata to assess for upgrade risks.
include_debugNoWhether to include additional diagnostic details.
source_versionNoOptional current Odoo version.
target_versionNoOptional target Odoo version.
observed_errorsNoOptional observed upgrade or migration errors to classify.
source_findingsNoOptional source-code findings to include in the risk report.
use_live_metadataNoWhether to request live metadata; this preview tool does not fetch it.

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?

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description's statement 'Report...risks' is consistent but adds no new behavioral traits beyond confirming it is a report. No side effects, authentication needs, or response details are disclosed.

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, clear sentence with no unnecessary words. It effectively communicates the tool's purpose without redundancy.

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 is too terse for a tool with 8 optional parameters. It does not explain how the parameters affect the risk report, what the output contains, or typical usage patterns, leaving gaps for an AI agent.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter having a clear description. The tool description does not elaborate on parameter usage or relationships, so it adds no value beyond the schema. Baseline score of 3 is appropriate.

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, specifying the resource and action. It distinguishes from siblings like 'analyze_upgrade_log' by focusing on a comprehensive risk report rather than log analysis, but could be more explicit about the scope.

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 such as 'analyze_upgrade_log' or 'generate_json2_payload'. No context on prerequisites, typical use cases, or exclusions is given.

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

validate_writeB
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

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds that validation checks against optional fields_get metadata, but does not explain behavior on failure, return format, or side effects. With annotations, a score of 3 is appropriate.

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, concise and front-loaded. However, it sacrifices informativeness for brevity, missing key details. Still, structure is clean.

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 9 parameters, 0% coverage, and an output schema (unreferenced), the description is incomplete. It does not explain what constitutes a 'standard write payload', how fields_metadata is used, or what the validation result looks like. Essential context for a validation tool is missing.

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 meaning for any of the 9 parameters (e.g., model, operation, values). It only mentions 'standard write payload' and 'fields_get metadata', leaving the agent guessing about parameter roles.

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 validates a write payload against fields_get metadata, using a specific verb (validate) and resource (write payload), distinguishing it from sibling tools like 'preview_write' and 'execute_approved_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 guidance is provided on when to use this tool versus alternatives like preview_write or execute_approved_write. The description lacks context on prerequisites, when validation is needed, or when to skip it.

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. Dates show when Glama detected each change.

  1. 13 tool updatesv1.3.1
    • Changedaccounting_health_across_instances18 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / as_of
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "As Of"
        +}
      • addedOutput schema / properties / combined_buckets
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "number"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Combined Buckets"
        +}
      • addedOutput schema / properties / combined_total_outstanding
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Combined Total Outstanding"
        +}
      • addedOutput schema / properties / direction
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Direction"
        +}
      • addedOutput schema / properties / elapsed_ms
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Elapsed Ms"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / errors
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Errors"
        +}
      • addedOutput schema / properties / instance_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance Count"
        +}
      • addedOutput schema / properties / instances_queried
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instances Queried"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / results
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Results"
        +}
      • addedOutput schema / properties / skipped_opt_out
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Skipped Opt Out"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • addedOutput schema / properties / unknown_instances
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Unknown Instances"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"accounting_health_across_instancesOutput"New value: +"AccountingHealthAcrossInstancesResponse"
    • Changedaccounting_health_summary10 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / draft_invoices
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Draft Invoices"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / open_payable_items
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Open Payable Items"
        +}
      • addedOutput schema / properties / open_receivable_items
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Open Receivable Items"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"accounting_health_summaryOutput"New value: +"AccountingHealthSummaryResponse"
    • Changedaggregate_across_instances17 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / combined_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Combined Count"
        +}
      • addedOutput schema / properties / combined_measures
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "number"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Combined Measures"
        +}
      • addedOutput schema / properties / elapsed_ms
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Elapsed Ms"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / errors
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Errors"
        +}
      • addedOutput schema / properties / instance_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance Count"
        +}
      • addedOutput schema / properties / instances_queried
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instances Queried"
        +}
      • addedOutput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Model"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / results
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Results"
        +}
      • addedOutput schema / properties / skipped_opt_out
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Skipped Opt Out"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • addedOutput schema / properties / unknown_instances
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Unknown Instances"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"aggregate_across_instancesOutput"New value: +"AggregateAcrossInstancesResponse"
    • Changedbuild_domain11 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / conditions
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "items": {},
        +        "type": "array"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Normalized field/operator/value conditions.",
        +  "title": "Conditions"
        +}
      • addedOutput schema / properties / domain
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {},
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Validated Odoo domain expression.",
        +  "title": "Domain"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / issues
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Validation errors and warnings.",
        +  "title": "Issues"
        +}
      • addedOutput schema / properties / metadata_used
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Metadata Used"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"build_domainOutput"New value: +"BuildDomainResponse"
    • Changedcancel_async_task17 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / created_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Created At"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / finished_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Finished At"
        +}
      • addedOutput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Name"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Note"
        +}
      • removedOutput schema / properties / result / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / result / default
        Added value: +null
      • removedOutput schema / properties / result / type
        Removed value: -"object"
      • addedOutput schema / properties / started_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Started At"
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Status"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / task_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Task Id"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"cancel_async_taskOutput"New value: +"AsyncTaskResponse"
    • Changedget_async_task17 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / created_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Created At"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / finished_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Finished At"
        +}
      • addedOutput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Name"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Note"
        +}
      • removedOutput schema / properties / result / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / result / default
        Added value: +null
      • removedOutput schema / properties / result / type
        Removed value: -"object"
      • addedOutput schema / properties / started_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Started At"
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Status"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / task_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Task Id"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"get_async_taskOutput"New value: +"AsyncTaskResponse"
    • Changedindex_knowledge16 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / documents_in_index
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Documents In Index"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / fetched
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Fetched"
        +}
      • addedOutput schema / properties / indexed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Indexed"
        +}
      • addedOutput schema / properties / indexed_fields
        Added value: +{
        +  "anyOf": [
        +    {},
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Explicit field list or 'smart selection'.",
        +  "title": "Indexed Fields"
        +}
      • addedOutput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
      • addedOutput schema / properties / max_documents
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Max Documents"
        +}
      • addedOutput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Model"
        +}
      • addedOutput schema / properties / redacted_fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Redacted Fields"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / skipped_over_budget
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Skipped Over Budget"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"index_knowledgeOutput"New value: +"IndexKnowledgeResponse"
    • Changedknowledge_stats10 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / indexes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Indexes"
        +}
      • addedOutput schema / properties / max_documents
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Max Documents"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • addedOutput schema / properties / total_documents
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Total Documents"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"knowledge_statsOutput"New value: +"KnowledgeStatsResponse"
    • Changedlist_async_tasks8 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tasks
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tasks"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"list_async_tasksOutput"New value: +"ListAsyncTasksResponse"
    • Changedreceivable_payable_aging16 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / as_of
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "As Of"
        +}
      • addedOutput schema / properties / buckets
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Buckets"
        +}
      • addedOutput schema / properties / direction
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Direction"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / line_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Line Count"
        +}
      • addedOutput schema / properties / partner_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Partner Count"
        +}
      • addedOutput schema / properties / partners
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Partners"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / skipped_lines
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Skipped Lines"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • addedOutput schema / properties / total_outstanding
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Total Outstanding"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Truncated"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"receivable_payable_agingOutput"New value: +"ReceivablePayableAgingResponse"
    • Changedsearch_across_instances17 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / elapsed_ms
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Elapsed Ms"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / errors
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Errors"
        +}
      • addedOutput schema / properties / instance_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance Count"
        +}
      • addedOutput schema / properties / instances_queried
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instances Queried"
        +}
      • addedOutput schema / properties / merged
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Merged"
        +}
      • addedOutput schema / properties / merged_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Merged Count"
        +}
      • addedOutput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Model"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / results
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Results"
        +}
      • addedOutput schema / properties / skipped_opt_out
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Skipped Opt Out"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • addedOutput schema / properties / unknown_instances
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Unknown Instances"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"search_across_instancesOutput"New value: +"SearchAcrossInstancesResponse"
    • Changedsearch_knowledge11 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
      • addedOutput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Model"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Query"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / results
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "BM25-ranked snippets from the local index.",
        +  "title": "Results"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"search_knowledgeOutput"New value: +"SearchKnowledgeResponse"
    • Changedsubmit_async_task17 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / created_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Created At"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / finished_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Finished At"
        +}
      • addedOutput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Name"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Note"
        +}
      • removedOutput schema / properties / result / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / result / default
        Added value: +null
      • removedOutput schema / properties / result / type
        Removed value: -"object"
      • addedOutput schema / properties / started_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Started At"
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Status"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / task_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Task Id"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"submit_async_taskOutput"New value: +"AsyncTaskResponse"
  2. 10 tool updatesv1.2.1
    • Changedaccounting_health_across_instances4 fields changed
      • addedInput schema / properties / as_of / description
        Added value: +"Optional ISO date used as the aging reference date."
      • addedInput schema / properties / direction / description
        Added value: +"Aging direction: 'receivable' or 'payable'."
      • addedInput schema / properties / instances / description
        Added value: +"Optional instance selector; defaults to all eligible instances."
      • addedInput schema / properties / top_partners / description
        Added value: +"Maximum top partners to include in each aging report; capped at 100."
    • Changedbusiness_pack_report3 fields changed
      • addedInput schema / properties / instance / description
        Added value: +"Optional configured Odoo instance name; uses the default if omitted."
      • addedInput schema / properties / pack / description
        Added value: +"Business pack to report, such as sales, crm, inventory, accounting, or hr."
      • addedInput schema / properties / use_live_metadata / description
        Added value: +"Whether to inspect live models and installed modules."
    • Changeddiagnose_access9 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"Optional Odoo domain used for the visibility check."
      • addedInput schema / properties / expected_count / description
        Added value: +"Optional expected visible record count for comparison."
      • addedInput schema / properties / include_rules / description
        Added value: +"Whether to include matching record-rule metadata."
      • addedInput schema / properties / instance / description
        Added value: +"Optional configured Odoo instance name; uses the default if omitted."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum metadata rows to inspect; capped at 500."
      • addedInput schema / properties / model / description
        Added value: +"Technical Odoo model name to inspect."
      • addedInput schema / properties / observed_error / description
        Added value: +"Optional error text or structured error to classify."
      • addedInput schema / properties / operation / description
        Added value: +"Access operation to diagnose, such as read or write."
      • addedInput schema / properties / record_ids / description
        Added value: +"Optional record IDs to check directly."
    • Changeddiagnose_odoo_call10 fields changed
      • addedInput schema / properties / args / description
        Added value: +"Optional positional call arguments."
      • addedInput schema / properties / include_debug / description
        Added value: +"Whether to include additional diagnostic details."
      • addedInput schema / properties / kwargs / description
        Added value: +"Optional keyword call arguments."
      • addedInput schema / properties / metadata / description
        Added value: +"Optional model or method metadata used by the diagnosis."
      • addedInput schema / properties / method / description
        Added value: +"Odoo model method name to diagnose."
      • addedInput schema / properties / model / description
        Added value: +"Technical Odoo model name to diagnose."
      • addedInput schema / properties / observed_error / description
        Added value: +"Optional error text or structured error to classify."
      • addedInput schema / properties / target_version / description
        Added value: +"Optional target Odoo version for compatibility checks."
      • addedInput schema / properties / transport / description
        Added value: +"Transport to assess, such as 'auto', 'xmlrpc', or 'json2'."
      • addedInput schema / properties / use_live_metadata / description
        Added value: +"Whether to request live metadata; this preview tool does not fetch it."
    • Changedexecute_method5 fields changed
      • addedInput schema / properties / args / description
        Added value: +"Optional positional method arguments."
      • addedInput schema / properties / instance / description
        Added value: +"Optional configured Odoo instance name; uses the default if omitted."
      • addedInput schema / properties / kwargs / description
        Added value: +"Optional keyword method arguments."
      • addedInput schema / properties / method / description
        Added value: +"Odoo model method to call; direct create, write, and unlink are blocked."
      • addedInput schema / properties / model / description
        Added value: +"Technical Odoo model name, for example 'res.partner'."
    • Changedget_odoo_profile3 fields changed
      • addedInput schema / properties / include_modules / description
        Added value: +"Whether to include installed-module metadata."
      • addedInput schema / properties / instance / description
        Added value: +"Optional configured Odoo instance name; uses the default if omitted."
      • addedInput schema / properties / module_limit / description
        Added value: +"Maximum installed modules to include; capped at 500."
    • Changedreceivable_payable_aging5 fields changed
      • addedInput schema / properties / as_of / description
        Added value: +"Optional ISO date used as the aging reference date."
      • addedInput schema / properties / direction / description
        Added value: +"Aging direction: 'receivable' or 'payable'."
      • addedInput schema / properties / instance / description
        Added value: +"Optional configured Odoo instance name; uses the default if omitted."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum open-item lines to inspect."
      • addedInput schema / properties / top_partners / description
        Added value: +"Maximum top partners to include; capped at 100."
    • Changedschema_catalog6 fields changed
      • addedInput schema / properties / include_fields / description
        Added value: +"Whether to include field metadata for each model."
      • addedInput schema / properties / instance / description
        Added value: +"Optional configured Odoo instance name; uses the default if omitted."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum catalog models to return; capped at 500."
      • addedInput schema / properties / models / description
        Added value: +"Optional technical model names to include in the catalog."
      • addedInput schema / properties / query / description
        Added value: +"Optional text used to filter catalog models."
      • addedInput schema / properties / refresh / description
        Added value: +"Whether to bypass and refresh the cached catalog."
    • Changedsearch_holidays4 fields changed
      • addedInput schema / properties / employee_id / description
        Added value: +"Optional employee ID used to filter holidays."
      • addedInput schema / properties / end_date / description
        Added value: +"End date in YYYY-MM-DD format."
      • addedInput schema / properties / instance / description
        Added value: +"Optional configured Odoo instance name; uses the default if omitted."
      • addedInput schema / properties / start_date / description
        Added value: +"Start date in YYYY-MM-DD format."
    • Changedupgrade_risk_report8 fields changed
      • addedInput schema / properties / include_debug / description
        Added value: +"Whether to include additional diagnostic details."
      • addedInput schema / properties / methods / description
        Added value: +"Optional model method metadata to assess for compatibility."
      • addedInput schema / properties / modules / description
        Added value: +"Optional module metadata to assess for upgrade risks."
      • addedInput schema / properties / observed_errors / description
        Added value: +"Optional observed upgrade or migration errors to classify."
      • addedInput schema / properties / source_findings / description
        Added value: +"Optional source-code findings to include in the risk report."
      • addedInput schema / properties / source_version / description
        Added value: +"Optional current Odoo version."
      • addedInput schema / properties / target_version / description
        Added value: +"Optional target Odoo version."
      • addedInput schema / properties / use_live_metadata / description
        Added value: +"Whether to request live metadata; this preview tool does not fetch it."
  3. 12 tool updatesv1.1.0
    • Changedaggregate_records15 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / fallback_reason
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Fallback Reason"
        +}
      • addedOutput schema / properties / group_by
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Group By"
        +}
      • addedOutput schema / properties / major_version
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Major Version"
        +}
      • addedOutput schema / properties / measures
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Measures"
        +}
      • addedOutput schema / properties / method
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "formatted_read_group (19+) or read_group.",
        +  "title": "Method"
        +}
      • addedOutput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Model"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / row_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Row Count"
        +}
      • addedOutput schema / properties / rows
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Aggregated group rows.",
        +  "title": "Rows"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"aggregate_recordsOutput"New value: +"AggregateRecordsResponse"
    • Addedanalyze_upgrade_log
    • Addeddata_quality_report
    • Changedget_model_fields15 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Count"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / ranking
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Relevance scores when relevance=\"top\".",
        +  "title": "Ranking"
        +}
      • addedOutput schema / properties / relevance_applied
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Relevance Applied"
        +}
      • addedOutput schema / properties / restricted_fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Fields marked restricted by the field ACL.",
        +  "title": "Restricted Fields"
        +}
      • removedOutput schema / properties / result / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / result / default
        Added value: +null
      • addedOutput schema / properties / result / description
        Added value: +"Mapping of field name to fields_get metadata."
      • removedOutput schema / properties / result / type
        Removed value: -"object"
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"get_model_fieldsOutput"New value: +"GetModelFieldsResponse"
    • Changedget_odoo_profile9 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / metadata_used
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Metadata Used"
        +}
      • addedOutput schema / properties / profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Server, user-context, transport, and module metadata.",
        +  "title": "Profile"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"get_odoo_profileOutput"New value: +"GetOdooProfileResponse"
    • Changedhealth_check11 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / plugins
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Opt-in plugin load state and tool filtering.",
        +  "title": "Plugins"
        +}
      • addedOutput schema / properties / rate_limits
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rate Limits"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / runtime
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Non-secret runtime security posture.",
        +  "title": "Runtime"
        +}
      • addedOutput schema / properties / server
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Server name, instructions, surface counts.",
        +  "title": "Server"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"health_checkOutput"New value: +"HealthCheckResponse"
    • Changedlist_instances10 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / default
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Name of the default instance.",
        +  "title": "Default"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / instance_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance Count"
        +}
      • addedOutput schema / properties / instances
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Instance entries (never credentials).",
        +  "title": "Instances"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"list_instancesOutput"New value: +"ListInstancesResponse"
    • Changedlist_models12 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ModelSummary": {
        +    "additionalProperties": true,
        +    "description": "One model entry from list_models / schema_catalog.",
        +    "properties": {
        +      "model": {
        +        "description": "Technical model name, e.g. res.partner.",
        +        "title": "Model",
        +        "type": "string"
        +      },
        +      "name": {
        +        "default": "",
        +        "description": "Human display name.",
        +        "title": "Name",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "model"
        +    ],
        +    "title": "ModelSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Count"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • removedOutput schema / properties / result / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "$ref": "#/$defs/ModelSummary"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / result / default
        Added value: +null
      • removedOutput schema / properties / result / type
        Removed value: -"object"
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"list_modelsOutput"New value: +"ListModelsResponse"
    • Changedread_attachment12 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / attachment
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "ir.attachment metadata row.",
        +  "title": "Attachment"
        +}
      • addedOutput schema / properties / data_base64
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Base64 content when under the size cap.",
        +  "title": "Data Base64"
        +}
      • addedOutput schema / properties / data_included
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Data Included"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / max_bytes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Max Bytes"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "additionalProperties": true,
        -  "title": "Result",
        -  "type": "object"
        -}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warnings"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"read_attachmentOutput"New value: +"ReadAttachmentResponse"
    • Changedread_record14 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / fields_used
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Fields Used"
        +}
      • addedOutput schema / properties / redacted_fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Redacted Fields"
        +}
      • removedOutput schema / properties / result / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / result / default
        Added value: +null
      • addedOutput schema / properties / result / description
        Added value: +"The record (field-ACL redacted)."
      • removedOutput schema / properties / result / type
        Removed value: -"object"
      • addedOutput schema / properties / smart_fields_applied
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Smart Fields Applied"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"read_recordOutput"New value: +"ReadRecordResponse"
    • Changedschema_catalog14 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ModelSummary": {
        +    "additionalProperties": true,
        +    "description": "One model entry from list_models / schema_catalog.",
        +    "properties": {
        +      "model": {
        +        "description": "Technical model name, e.g. res.partner.",
        +        "title": "Model",
        +        "type": "string"
        +      },
        +      "name": {
        +        "default": "",
        +        "description": "Human display name.",
        +        "title": "Name",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "model"
        +    ],
        +    "title": "ModelSummary",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Count"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / metadata_used
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Metadata Used"
        +}
      • removedOutput schema / properties / result / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "$ref": "#/$defs/ModelSummary"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / result / default
        Added value: +null
      • addedOutput schema / properties / result / description
        Added value: +"Model entries; fields included when requested."
      • removedOutput schema / properties / result / type
        Removed value: -"object"
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"schema_catalogOutput"New value: +"SchemaCatalogResponse"
    • Changedsearch_records16 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • addedOutput schema / properties / count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Count"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sanitized error message when success is false.",
        +  "title": "Error"
        +}
      • addedOutput schema / properties / fields_used
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Fields Used"
        +}
      • addedOutput schema / properties / query_fields_used
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Fields matched by the free-text query shortcut.",
        +  "title": "Query Fields Used"
        +}
      • addedOutput schema / properties / redacted_fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Redacted Fields"
        +}
      • removedOutput schema / properties / result / additionalProperties
        Removed value: -true
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / result / default
        Added value: +null
      • addedOutput schema / properties / result / description
        Added value: +"Matched records (field-ACL redacted)."
      • removedOutput schema / properties / result / type
        Removed value: -"object"
      • addedOutput schema / properties / smart_fields_applied
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Smart Fields Applied"
        +}
      • addedOutput schema / properties / success
        Added value: +{
        +  "description": "False when the call failed; see error.",
        +  "title": "Success",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / tool
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reporting tool name.",
        +  "title": "Tool"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "success"
        +]
      • changedOutput schema / title
        Previous value: -"search_recordsOutput"New value: +"SearchRecordsResponse"
  4. 32 tool updatesv1.0.0
    • Addedaccounting_health_across_instances
    • Addedaccounting_health_summary
    • Addedaggregate_across_instances
    • Changedaggregate_records1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Changedbusiness_pack_report1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Addedcancel_async_task
    • Changedchatter_post1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Changeddiagnose_access2 fields changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
      • addedInput schema / properties / observed_error
        Added value: +{
        +  "anyOf": [
        +    {},
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Observed Error"
        +}
    • Changedexecute_approved_write2 fields changed
      • changedInput schema / title
        Previous value: -"execute_approved_writeArguments"New value: +"execute_approved_write_toolArguments"
      • changedOutput schema / title
        Previous value: -"execute_approved_writeOutput"New value: +"execute_approved_write_toolOutput"
    • Changedexecute_method1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Addedget_async_task
    • Changedget_model_fields3 fields changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
      • addedInput schema / properties / max_fields
        Added value: +{
        +  "default": 30,
        +  "title": "Max Fields",
        +  "type": "integer"
        +}
      • addedInput schema / properties / relevance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Relevance"
        +}
    • Changedget_odoo_profile1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Addedindex_knowledge
    • Changedinspect_model_relationships1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Addedknowledge_stats
    • Addedlist_async_tasks
    • Addedlist_instances
    • Changedlist_models1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Addedlookup_model_history
    • Changedpreview_write2 fields changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
      • addedInput schema / properties / values_list
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Values List"
        +}
    • Addedread_attachment
    • Changedread_record1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Addedreceivable_payable_aging
    • Changedschema_catalog1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Addedsearch_across_instances
    • Changedsearch_employee1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Changedsearch_holidays1 field changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
    • Addedsearch_knowledge
    • Changedsearch_records2 fields changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
      • addedInput schema / properties / query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Query"
        +}
    • Addedsubmit_async_task
    • Changedvalidate_write2 fields changed
      • addedInput schema / properties / instance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Instance"
        +}
      • addedInput schema / properties / values_list
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Values List"
        +}
  5. 2 tool updatesv0.3.0
    • Addedaggregate_records
    • Addedchatter_post
  6. 22 tool updatesv0.2.0
    • First observedbuild_domain
    • First observedbusiness_pack_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_model_fields
    • First observedget_odoo_profile
    • First observedhealth_check
    • First observedinspect_model_relationships
    • First observedlist_models
    • First observedpreview_write
    • First observedread_record
    • First observedscan_addons_source
    • First observedschema_catalog
    • First observedsearch_employee
    • First observedsearch_holidays
    • First observedsearch_records
    • First observedupgrade_risk_report
    • First observedvalidate_write

TDQS

B3.3/5.0
Disambiguation4/5

Most tools have clearly distinct purposes thanks to detailed descriptions, but some overlap exists between similar-sounding tools like 'aggregate_across_instances' and 'aggregate_records', or multiple 'report' tools. Agents may occasionally confuse them without careful reading.

Naming Consistency4/5

Tool names consistently use underscores and are generally descriptive, combining verbs and nouns (e.g., list_models, search_records). However, there are some deviations like 'accounting_health_summary' vs 'accounting_health_across_instances' and phrases that alternate verb-first and noun-first patterns.

Tool Count2/5

With 41 tools, the set is heavy and exceeds typical MCP server scopes. While Odoo is a complex ERP, many tools could be consolidated (e.g., combining across-instance variants or merging related reports). This count may overwhelm agents and reduce effective selection.

Completeness4/5

The tool set covers a broad range of Odoo functionalities: CRUD, accounting, model inspection, background tasks, knowledge indexing, and upgrade analysis. Minor gaps exist (e.g., no direct user management or specific business object CRUD), but the suite is comprehensive for a management/analysis server.

Maintenance

ActivitySlowing
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that enables AI assistants to interact with Odoo ERP apps like Inventory, CRM, Sales, and Manufacturing. It allows users to read, create, and manage Odoo records and workflows using natural language commands.
    25
    24
    1
    ISC
  • 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.
    54
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables AI assistants to interact with Odoo ERP, allowing natural language queries, record creation, updates, and deletions.
    LGPL 3.0
  • 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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/erpipe-org/mcp-odoo'

If you have feedback or need assistance with the MCP directory API, please join our Discord server