Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Drive a month-end accounting close on Odoo through odoo-mcp — AR/AP aging, open-item and draft-invoice review, reconciliation checklists, and chatter documentation — with human sign-off at every posting step. Use when the user asks to "close the month", "review receivables/payables", "check aging", or prepare finance reports from Odoo.
.claude/skills/erpipe-org-odoo-month-end-close/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-19 | ✗→✓ | ▲ Improved | 13% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -43% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -27% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 6% | 0% |
You are running a month-end close review against a live Odoo database through odoo-mcp. Finance data is the last place an agent should guess: every number you present must come from a tool result, and every posting action needs the human's explicit approval.
account module installed (verify viabusiness_pack_report(pack="accounting") or get_odoo_profile).
accounting_close_checklist MCP prompt is the compact in-serverversion of this playbook; this skill adds pacing and judgment.
accounting_health_summary — open AR/AP item counts andthe draft-invoice backlog. This is your before-photo; show it.
receivable_payable_aging(direction="receivable")then "payable". Present the bucket table (not due / 1-30 / 31-60 / 61-90 / 90+) with per-partner totals; flag partners with >60d balances.
domain="state","=","draft"],"move_type","in","out_invoice","in_invoice"]]]) — list drafts with amounts and dates; ask which should be posted, which deleted (deletion = human decision, never yours).
account.move.line for open items onreceivable/payable accounts older than the period; summarize by account. Use aggregate_records (groupby account_id) instead of paging raw lines.
data_quality_report(model="account.move") —missing required values and format anomalies on invoices are close blockers.
any state change: preview_write → human reviews the diff → validate_write → execute_approved_write(confirm=true). One document batch at a time.
chatter_post a close summary onthe relevant records (or the human's designated close journal entry) — what was reviewed, what was posted, what is carried over.
accounting_health_summary; report the delta.Close report with: baseline vs final summary, aging tables, actions taken (each with its approval token event), and a carried-over list with owners.
as_of on aging shifts the bucketing reference only — say so if thehuman asks for a "historical snapshot"; do not fake one.
(diagnose_access explains company-based invisibility).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 9,633 | 6,718 | -30% | 1 | 1 | 0% | 481 | 1,301 | +170% | 0 | 0 | — |
case-19 | fail→pass | 9,679 | 7,525 | -22% | 1 | 1 | 0% | 1,784 | 2,015 | +13% | 0 | 0 | — |
case-02 | fail→fail | 27,094 | 6,166 | -77% | 1 | 1 | 0% | 3,716 | 1,153 | -69% | 0 | 0 | — |
case-03 | fail→fail | 23,217 | 8,091 | -65% | 1 | 1 | 0% | 4,199 | 1,263 | -70% | 0 | 0 | — |
case-04 | pass→pass | 6,689 | 3,320 | -50% | 1 | 1 | 0% | 1,164 | 1,127 | -3% | 0 | 0 | — |
case-05 | fail→pass | 12,054 | 3,115 | -74% | 1 | 1 | 0% | 1,964 | 1,128 | -43% | 0 | 0 | — |
case-06 | pass→pass | 12,886 | 2,906 | -77% | 1 | 1 | 0% | 2,014 | 1,148 | -43% | 0 | 0 | — |
case-07 | fail→pass | 13,505 | 5,276 | -61% | 1 | 1 | 0% | 2,013 | 1,471 | -27% | 0 | 0 | — |
case-08 | fail→pass | 16,010 | 8,927 | -44% | 1 | 1 | 0% | 2,463 | 1,746 | -29% | 0 | 0 | — |
case-09 | fail→pass | 10,145 | 6,642 | -35% | 1 | 1 | 0% | 1,741 | 1,848 | +6% | 0 | 0 | — |
case-10 | fail→pass | 12,281 | 5,767 | -53% | 1 | 1 | 0% | 1,750 | 1,676 | -4% | 0 | 0 | — |
case-11 | fail→pass | 8,785 | 4,886 | -44% | 1 | 1 | 0% | 1,389 | 1,409 | +1% | 0 | 0 | — |
case-12 | fail→pass | 8,890 | 2,901 | -67% | 1 | 1 | 0% | 1,405 | 1,182 | -16% | 0 | 0 | — |
case-13 | pass→pass | 11,103 | 2,983 | -73% | 1 | 1 | 0% | 1,886 | 1,177 | -38% | 0 | 0 | — |
case-14 | pass→pass | 12,917 | 9,236 | -28% | 1 | 1 | 0% | 2,224 | 2,124 | -4% | 0 | 0 | — |
case-15 | fail→pass | 11,551 | 5,797 | -50% | 1 | 1 | 0% | 1,977 | 1,654 | -16% | 0 | 0 | — |
case-16 | pass→pass | 11,658 | 8,481 | -27% | 1 | 1 | 0% | 1,776 | 1,916 | +8% | 0 | 0 | — |
case-17 | fail→fail | 14,078 | 8,818 | -37% | 1 | 1 | 0% | 2,118 | 2,055 | -3% | 0 | 0 | — |
case-18 | pass→pass | 13,024 | 3,378 | -74% | 1 | 1 | 0% | 1,822 | 1,208 | -34% | 0 | 0 | — |
case-20 | pass→fail | 16,643 | 6,399 | -62% | 1 | 1 | 0% | 2,752 | 1,053 | -62% | 0 | 0 | — |
case-21 | pass→pass | 12,800 | 12,093 | -6% | 1 | 1 | 0% | 2,232 | 2,709 | +21% | 0 | 0 | — |
case-22 | pass→pass | 14,794 | 9,370 | -37% | 1 | 1 | 0% | 2,348 | 1,740 | -26% | 0 | 0 | — |
case-23 | pass→pass | 11,948 | 8,768 | -27% | 1 | 1 | 0% | 2,158 | 2,322 | +8% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 19 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +35 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.