AgentSkillsCN

managing-odoo

通过 Odoo ERP 的 XML-RPC API 管理企业会计业务。 当您需要创建发票、记录支出、查询财务数据,或管理客户与产品时,此功能便能助您一臂之力。 但请注意:此功能不适用于 QuickBooks 或 Xero(两者使用不同的系统)。

SKILL.md
--- frontmatter
name: managing-odoo
description: |
  Manage business accounting via Odoo ERP using XML-RPC API.
  Use when creating invoices, recording expenses, querying financial data,
  or managing customers and products.
  NOT when using QuickBooks or Xero (different systems).

Odoo Accounting MCP Skill

FastMCP server for Odoo ERP integration via XML-RPC API.

Quick Start

bash
# Start MCP server
python src/mcp_servers/odoo_server.py

# Check connection
python -c "from src.mcp_servers.odoo_server import check_connection; print(check_connection())"

MCP Tools

ToolDescription
create_customer_invoiceCreate customer invoice with line items
record_expenseRecord vendor bill (expense)
get_financial_summaryRevenue, expenses, profit for date range
list_recent_invoicesList recent customer invoices
list_recent_billsList recent vendor bills
list_productsSearch/list products
get_partner_detailsGet customer/vendor details
check_connectionVerify Odoo connectivity

Production Gotchas

Invoice Line Format

Invoice lines require Odoo's special tuple format (0, 0, {...}):

python
# ✓ CORRECT - Tuple format for new lines
invoice_line_values.append((0, 0, {
    'product_id': product_id,
    'name': description,
    'quantity': quantity,
    'price_unit': unit_price
}))

# ✗ WRONG - Plain dictionary
invoice_line_values.append({
    'product_id': product_id,
    ...
})

The (0, 0, {...}) means: "Create new record with these values".

Move Types

Odoo uses move_type to distinguish invoice types:

TypeMove Type
Customer Invoiceout_invoice
Customer Refundout_refund
Vendor Billin_invoice
Vendor Refundin_refund

Partner Auto-Creation

When customer/vendor doesn't exist, system auto-creates:

  • Customers: customer_rank: 1
  • Vendors: supplier_rank: 1

Product Auto-Creation

Missing products are auto-created as type: 'service'. For physical products, create manually in Odoo.

Partner ID Returns Tuple

Partner fields return [id, name] tuple, not just ID:

python
# partner_id = [42, "Acme Corp"]
customer_name = invoice['partner_id'][1]  # "Acme Corp"
customer_id = invoice['partner_id'][0]    # 42

Financial Summary Only Counts Posted

Only invoices/bills with state: 'posted' are included in financial summaries. Draft invoices are excluded.

Date Format Required

All dates must be ISO format YYYY-MM-DD:

python
# ✓ CORRECT
create_customer_invoice(..., invoice_date="2026-01-30")

# ✗ WRONG
create_customer_invoice(..., invoice_date="01/30/2026")

Circuit Breaker Pattern

API calls use circuit breaker for resilience. After 3 failures, circuit opens for 30 seconds.

Configuration

Required in .env:

bash
ODOO_URL=http://localhost:8069    # Odoo server URL
ODOO_DB=digital_fte               # Database name
ODOO_USERNAME=admin               # Odoo username
ODOO_PASSWORD=your_password       # Odoo password (KEEP SECRET)

Setup

1. Odoo Installation

See docs/setup/ODOO_SETUP.md for full setup guide.

Quick local setup:

bash
docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:13
docker run -d -p 8069:8069 --link db:db -e HOST=db -e USER=odoo -e PASSWORD=odoo --name odoo odoo

2. Enable XML-RPC

Odoo 14+ has XML-RPC enabled by default. Verify at: http://localhost:8069/xmlrpc/2/common

3. Create API User

For production, create a dedicated API user with appropriate permissions.

Security Notes

  • All financial operations are audit logged
  • Business domain actions use AuditDomain.BUSINESS
  • No approval workflow by default (add via orchestrator if needed)
  • Keep ODOO_PASSWORD in .env, never commit

Connection Caching

Connection is cached globally to avoid repeated authentication:

python
_odoo_connection = None  # Module-level cache

def get_odoo() -> OdooConnection:
    global _odoo_connection
    if _odoo_connection is None:
        _odoo_connection = OdooConnection(...)
    return _odoo_connection

Verification

Run: python scripts/verify.py

Related Skills

  • generating-ceo-briefing - Uses financial data for reports
  • watching-gmail - Detect invoice requests from emails
  • digital-fte-orchestrator - Process accounting tasks