# Managing Odoo

> 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).

- Skill: `majiayu000/managing-odoo` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/managing-odoo`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/managing-odoo/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Finance & Business
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/managing-odoo

---


# 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

| Tool | Description |
|------|-------------|
| `create_customer_invoice` | Create customer invoice with line items |
| `record_expense` | Record vendor bill (expense) |
| `get_financial_summary` | Revenue, expenses, profit for date range |
| `list_recent_invoices` | List recent customer invoices |
| `list_recent_bills` | List recent vendor bills |
| `list_products` | Search/list products |
| `get_partner_details` | Get customer/vendor details |
| `check_connection` | Verify 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:

| Type | Move Type |
|------|-----------|
| Customer Invoice | `out_invoice` |
| Customer Refund | `out_refund` |
| Vendor Bill | `in_invoice` |
| Vendor Refund | `in_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

