Odoo MCP Server
# Odoo MCP Server
A [Model Context Protocol](https://modelcontextprotocol.io) server for **Odoo**. Connect Claude (or any MCP client) to **your own** Odoo ERP and query, report on, and optionally modify your data in natural language.
Works with any Odoo model. **Safe by default: read-only** unless you explicitly enable writes. Your credentials stay on your machine — nothing is stored or sent anywhere except your own Odoo instance.
## Features
- 🔍 **Generic access to any model** — search, read, count, introspect fields, list models
- 📊 **Ready-made business tools** — overdue invoices, sales summary, low-stock products, top customers
- 🔒 **Read-only by default** — create/update/delete only when you opt in (`ODOO_ENABLE_WRITES=true`)
- 🔑 **Your data, your machine** — configured entirely through environment variables
## Install
Add this to your MCP client config (e.g. Claude Desktop or Claude Code):
```json
{
"mcpServers": {
"odoo": {
"command": "npx",
"args": ["-y", "odoo-mcp-connector"],
"env": {
"ODOO_URL": "https://your-company.odoo.com",
"ODOO_DB": "your-database",
"ODOO_USERNAME": "you@example.com",
"ODOO_API_KEY": "your-odoo-api-key"
}
}
}
}
```
### Getting an Odoo API key
In Odoo: **Settings → Users → (your user) → Account Security → New API Key**. Paste the generated key into `ODOO_API_KEY`. (A password also works, but an API key is safer and revocable.)
### Enabling writes
Read-only is the default. To let the model create, update, or delete records, add:
```json
"ODOO_ENABLE_WRITES": "true"
```
> ⚠️ Odoo holds real business data. Enable writes only when you accept that the model can create, modify, or delete records — always within your Odoo user's own permissions.
## Tools
### Always available (read-only)
| Tool | Purpose |
|---|---|
| `odoo_search_read` | Search + read records from any model |
| `odoo_read` | Read records by ID |
| `odoo_count` | Count records matching a domain |
| `odoo_fields` | Introspect a model's fields (name, type, label) |
| `odoo_list_models` | List available models |
| `odoo_overdue_invoices` | Unpaid customer invoices past their due date |
| `odoo_sales_summary` | Revenue + order count over a date range |
| `odoo_low_stock` | Products at/below a quantity threshold |
| `odoo_top_customers` | Top customers by invoiced revenue |
### Only when `ODOO_ENABLE_WRITES=true`
| Tool | Purpose |
|---|---|
| `odoo_create` | Create a record |
| `odoo_write` | Update records by ID |
| `odoo_unlink` | Delete records by ID (irreversible) |
| `odoo_call` | Call an arbitrary model method |
## Configuration reference
| Variable | Required | Default | Description |
|---|---|---|---|
| `ODOO_URL` | yes | — | Your Odoo base URL |
| `ODOO_DB` | yes | — | Database name |
| `ODOO_USERNAME` | yes | — | Login (email) |
| `ODOO_API_KEY` | yes | — | API key (or password) |
| `ODOO_ENABLE_WRITES` | no | `false` | Set `"true"` to allow writes |
| `ODOO_TIMEOUT_MS` | no | `30000` | Per-request timeout (ms) |
## Development
```bash
npm install
npm test # vitest — fully mocked, no live Odoo needed
npm run build
```
## License
MIT © Falak Sarhan Saade
TDQS
Scored across 9 tools
Each tool has a distinct purpose: generic data access (search_read, read, count, fields, list_models) and specific business reports (overdue_invoices, sales_summary, low_stock, top_customers). No overlap between tools.
All tools follow the 'odoo_<action>' pattern in snake_case. Verbs are clear and consistent (search_read, read, count, list_models) and report names are descriptive nouns. No deviation.
With 9 tools, the set covers basic CRUD operations and several key business reports, which is reasonable for an Odoo MCP server. It is slightly on the lower side but not inadequate.
Significant gaps exist: no create, update, or delete operations for records. The server is largely read-only, which limits agents from performing many real-world tasks like updating invoices or creating sales orders.