# Odoo Agency Fleet Review

> Review many client Odoo databases at once through odoo-mcp's cross-instance tools — fleet-wide accounting health, per-client aging, partial-failure triage — for agencies and partners managing 5–50 instances. Use when the user asks "which client...", "across all instances/databases", or wants a fleet/portfolio status.

- Skill: `erpipe-org/odoo-agency-fleet-review` (Agent Skill)
- Install (CLI): `npx skillmds@latest add erpipe-org/odoo-agency-fleet-review`
- Raw SKILL.md: https://api.skillmd.com/api/skills/erpipe-org/odoo-agency-fleet-review/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: erpipe-org (https://skillmd.com/u/erpipe-org)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/erpipe-org/odoo-agency-fleet-review

---


# Odoo agency fleet review

You are answering questions across a fleet of client Odoo databases through
one odoo-mcp server with named instances. Every result is tagged with its
`_instance`; one client being down must never sink the whole answer.

## Prerequisites

- Multi-instance config (`ODOO_CONFIG_FILE` with an `instances` map).
  `list_instances` shows names, tags, and which allow cross-instance reads
  (`"cross_instance": false` opts a client out — respect it silently).
- Cross-instance tools are read-only by design. Writes happen per-instance
  through the normal gate, one client at a time.

## Playbook

1. **Map the fleet:** `list_instances` — report count, tags, default, and
   any opted-out clients (just the count, not a complaint).
2. **Fleet health:** `accounting_health_across_instances(instances="all")`
   (or `{"tags": ["managed"]}`). For fleets >10, run via
   `submit_async_task` and poll.
3. **Triage the errors map first.** The response carries per-instance
   `errors` — an unreachable client is a finding in itself (report it,
   with `diagnose_odoo_call` output if the human wants the cause), not a
   reason to retry the whole fan-out.
4. **Rank and drill down.** Present a per-client table sorted by the metric
   the human asked about (e.g. overdue AR). For the worst clients, drill
   down with instance-scoped calls:
   `receivable_payable_aging(instance="client_x")`,
   `search_records(..., instance="client_x")`.
5. **Cross-client comparisons stay honest:** averages are deliberately not
   merged across instances (different currencies/configs) — compare counts
   and per-client aggregates, never invent a fleet-wide average.
6. **Per-client actions:** anything beyond reading switches to that single
   instance and goes through the write gate there. Approval tokens are
   instance-bound; never reuse one across clients.

## Output format

Fleet summary (reachable/unreachable/opted-out counts), the ranked
per-client table with `_instance` labels, drill-down findings, and a
follow-up list grouped by client.

## Hard rules

- Never name an opted-out instance's data in results — it is opted out.
- Each instance runs under its own field ACL and rate budget; if a client's
  response says `redacted_fields`, that is policy, not an error.
- Fan-out is bounded (`ODOO_MCP_CROSS_INSTANCE_WORKERS`); for very large
  fleets prefer the async path over repeated synchronous sweeps.

