{
  "markdown": "# Odoo MCP Server\n\nAn [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server that connects AI agents to Odoo ERP instances. Works with Claude Code, Cursor, Windsurf, and any MCP-compatible client.\n\nSupports **Odoo 17-18** (JSON-RPC) and **Odoo 19+** (JSON-2 API) — auto-detects the best protocol.\n\n![Odoo MCP Server Overview](odoo-mcp.gif)\n\n## Quick Start\n\n```bash\n# Run directly (uv handles dependencies automatically)\nODOO_URL=https://my.odoo.com ODOO_DB=mydb ODOO_USER=admin ODOO_PASSWORD=secret \\\n  uv run odoo_mcp_server.py\n```\n\nNo virtualenv or `pip install` needed — the script has [inline metadata](https://packaging.python.org/en/latest/specifications/inline-script-metadata/) that `uv` resolves automatically.\n\n## Configure in Claude Code\n\nAdd to your project's `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"odoo\": {\n      \"type\": \"stdio\",\n      \"command\": \"uv\",\n      \"args\": [\"run\", \"--python\", \"3.11\", \"--script\", \"/path/to/odoo_mcp_server.py\"],\n      \"env\": {\n        \"ODOO_URL\": \"https://your-instance.odoo.com\",\n        \"ODOO_DB\": \"your-database\",\n        \"ODOO_USER\": \"admin\",\n        \"ODOO_PASSWORD\": \"your-password\"\n      }\n    }\n  }\n}\n```\n\nOr for Odoo 19+ with API key auth:\n\n```json\n{\n  \"mcpServers\": {\n    \"odoo\": {\n      \"type\": \"stdio\",\n      \"command\": \"uv\",\n      \"args\": [\"run\", \"--python\", \"3.11\", \"--script\", \"/path/to/odoo_mcp_server.py\"],\n      \"env\": {\n        \"ODOO_URL\": \"https://your-instance.odoo.com\",\n        \"ODOO_DB\": \"your-database\",\n        \"ODOO_USER\": \"admin\",\n        \"ODOO_API_KEY\": \"your-api-key\"\n      }\n    }\n  }\n}\n```\n\n## Configure in Cursor / Windsurf\n\nAdd to `~/.cursor/mcp.json` or equivalent:\n\n```json\n{\n  \"mcpServers\": {\n    \"odoo\": {\n      \"command\": \"uv\",\n      \"args\": [\"run\", \"--python\", \"3.11\", \"--script\", \"/path/to/odoo_mcp_server.py\"],\n      \"env\": {\n        \"ODOO_URL\": \"https://your-instance.odoo.com\",\n        \"ODOO_DB\": \"your-database\",\n        \"ODOO_USER\": \"admin\",\n        \"ODOO_PASSWORD\": \"your-password\"\n      }\n    }\n  }\n}\n```\n\n## Environment Variables\n\n| Variable | Required | Description |\n|---|---|---|\n| `ODOO_URL` | Yes | Odoo instance URL |\n| `ODOO_DB` | Yes | Database name |\n| `ODOO_USER` | Yes | Login username |\n| `ODOO_PASSWORD` | One of these | Password (Odoo 17-18) |\n| `ODOO_API_KEY` | required | API key (Odoo 19+, preferred) |\n| `ODOO_READONLY` | No | Set to `true` to disable all write operations |\n\n### Read-Only Mode\n\nSet `ODOO_READONLY=true` to disable `create`, `update`, `delete`, and `execute` tools. Useful for safe browsing of production instances:\n\n```json\n{\n  \"mcpServers\": {\n    \"odoo\": {\n      \"type\": \"stdio\",\n      \"command\": \"uv\",\n      \"args\": [\"run\", \"--python\", \"3.11\", \"--script\", \"/path/to/odoo_mcp_server.py\"],\n      \"env\": {\n        \"ODOO_URL\": \"https://production.odoo.com\",\n        \"ODOO_DB\": \"prod\",\n        \"ODOO_USER\": \"readonly-user\",\n        \"ODOO_PASSWORD\": \"secret\",\n        \"ODOO_READONLY\": \"true\"\n      }\n    }\n  }\n}\n```\n\n## Available Tools\n\n### Core CRUD\n\n| Tool | Description |\n|---|---|\n| `odoo_search_read` | Query records with domain filters, field selection, pagination |\n| `odoo_search_count` | Count matching records without fetching data |\n| `odoo_export` | Bulk export up to 2000 records per call for spreadsheets |\n| `odoo_create` | Create new records |\n| `odoo_update` | Update existing records by ID |\n| `odoo_delete` | Delete records by ID |\n| `odoo_execute` | Run any model method (action_confirm, action_post, etc.) |\n\n### Discovery\n\n| Tool | Description |\n|---|---|\n| `odoo_list_models` | Discover available models with keyword filter |\n| `odoo_get_fields` | Inspect field definitions for any model |\n| `odoo_doctor` | Health diagnostics (version, modules, users, crons, errors) |\n| `odoo_connection_info` | Show current connection details |\n\n### Model Customization\n\n| Tool | Description |\n|---|---|\n| `odoo_model_info` | Get comprehensive model metadata in one call — fields, views, actions, defaults, sort order |\n| `odoo_set_default` | Set, update, or clear a field's default value (handles ir.default + JSON encoding) |\n| `odoo_get_view` | Get the fully rendered (merged) form/tree/search view XML |\n| `odoo_modify_action` | Change a window action's domain, context, sort order, limit, or view modes |\n\n## Example Usage\n\nOnce configured, ask your AI agent:\n\n- \"List all sale orders from this month\"\n- \"Show me the fields on res.partner\"\n- \"Create a new contact named Acme Corp\"\n- \"Run a health check on the Odoo instance\"\n- \"Export all products to a spreadsheet\"\n- \"Confirm sale order 42\"\n\n### Model Customization Examples\n\n- \"What's the default sort order for sale.order?\"\n- \"Change the default invoice policy on products to 'delivery'\"\n- \"Show me the form view for res.partner\"\n- \"What window actions exist for account.move? Change the default sort to date desc\"\n- \"List all custom fields on res.partner\"\n- \"What fields are required on sale.order?\"\n\n## Model Customization Tools — Detailed Reference\n\n### odoo_model_info\n\nReturns everything about a model in one call, eliminating the need for multiple exploratory queries.\n\n```\nodoo_model_info(model=\"sale.order\")\n```\n\nReturns:\n- `default_order` — the model's `_order` attribute (e.g. `\"date_order desc, id desc\"`)\n- `rec_name` — the field used for display name in dropdowns\n- `field_count` — total number of fields\n- `fields_by_type` — field count grouped by type (`many2one: 12, char: 8, ...`)\n- `custom_fields` — user-created fields (x_ prefix or state=manual)\n- `relational_fields` — all Many2one, One2many, Many2many with their targets\n- `required_fields` — fields that must be filled\n- `views` — base views (form, tree, search) with IDs and priorities\n- `actions` — window actions with their domain, context, and view modes\n- `defaults` — current ir.default values set for this model's fields\n\n### odoo_set_default\n\nManages field defaults via ir.default with proper JSON encoding. The most common source of agent errors when done manually.\n\n```\n# Set global default\nodoo_set_default(model=\"product.template\", field_name=\"invoice_policy\", value=\"delivery\")\n\n# Set user-specific default\nodoo_set_default(model=\"sale.order\", field_name=\"warehouse_id\", value=2, user_id=5)\n\n# Remove a default\nodoo_set_default(model=\"product.template\", field_name=\"invoice_policy\", value=null)\n```\n\nThe tool:\n1. Finds the field_id in ir.model.fields (validates the field exists)\n2. JSON-encodes the value automatically\n3. Creates or updates the ir.default record\n4. Returns before/after values for confirmation\n\n### odoo_get_view\n\nReturns the fully rendered view XML after all inheritance is applied — what the user actually sees, not the raw fragments stored in ir.ui.view.\n\n```\nodoo_get_view(model=\"sale.order\", view_type=\"form\")\nodoo_get_view(model=\"res.partner\", view_type=\"tree\")\nodoo_get_view(model=\"account.move\", view_type=\"search\")\n```\n\nReturns:\n- `arch` — the complete merged XML\n- `view_id` — the base view ID\n- `fields_in_view` — list of field names present in the view\n\n### odoo_modify_action\n\nChanges how a model appears in the UI by modifying its window action (ir.actions.act_window).\n\n```\n# List actions for a model (read-only)\nodoo_modify_action(model=\"sale.order\")\n\n# Change default sort order\nodoo_modify_action(action_id=42, order=\"date_order desc\")\n\n# Change default filter and page size\nodoo_modify_action(action_id=42, domain=\"[['state','=','sale']]\", limit=200)\n\n# Add default grouping via context\nodoo_modify_action(action_id=42, context=\"{'group_by': 'partner_id'}\")\n```\n\nThe tool returns before/after values so you can verify what changed.\n\n## How It Works\n\n```\nAI Agent (Claude, Cursor, etc.)\n    ↕ MCP Protocol (stdio)\nOdoo MCP Server\n    ↕ JSON-RPC / JSON-2 API\nOdoo Instance\n```\n\nThe server authenticates once at startup and maintains a persistent connection. All tools use the same authenticated session.\n\n## Requirements\n\n- Python 3.11+\n- [uv](https://docs.astral.sh/uv/) (recommended) or `pip install fastmcp httpx`\n\n## License\n\nMIT\n\n<!-- mcp-name: io.github.oconsole/odoo-simple-mcp -->\n",
  "bytes": 8022,
  "sha": "98f60d478856198893c87dc29820cd0570613012ef5cea8c2cc2980f54d49d00",
  "repo_slug": "oconsole/odoo-mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_odooconsole_odoo_d85a72c8/readme"
}