Odoo Dev MCP Server
by woodwosj
README.md
# Odoo Dev MCP Server
An Odoo V18 module that provides a Model Context Protocol (MCP) server running **within Odoo**. This gives AI agents direct access to Odoo capabilities including terminal control, database operations via Odoo's cursor, filesystem management, Odoo ORM/shell execution, and service administration.
## Key Features
- **Runs as an Odoo Module**: Installable on Odoo.sh and self-hosted Odoo servers
- **HTTP/SSE Transport**: MCP endpoint at `/mcp/v1` (no stdio dependency)
- **Direct Database Access**: Uses Odoo's `env.cr` cursor for SQL operations
- **Odoo ORM Integration**: Execute Python code with full `env` context
- **Phone-Home Registration**: Automatic server registration on module installation
- **Configuration UI**: Settings accessible via Odoo Settings menu
- **Complete Audit Logging**: All operations logged to audit file
## Architecture
```
+---------------------------+
| Odoo Server |
| |
| +---------------------+ |
| | OdooDevMCP Module | |
| | - HTTP Controller | | +------------------+
| | - MCP Server |--------->| Registry API |
| | - Tools/Services | | POST | (phone-home) |
| +---------------------+ | +------------------+
| | | | | |
| v v v v |
| [PG] [FS] [ORM] [SVC] | +------------------+
| | | MCP Client |
| +---------------------+ |<------| (Claude, IDE) |
| | PostgreSQL | | HTTP +------------------+
| +---------------------+ | /mcp/v1
| |
+---------------------------+
```
## Installation
### Prerequisites
- Odoo 18.0
- Python 3.10+
- psycopg2 (usually already installed with Odoo)
- Additional Python packages: `mcp`, `pyyaml`, `requests`, `pydantic`
### On Odoo.sh
1. Add this module to your `custom-addons` directory
2. Install Python dependencies in `requirements.txt`:
```
mcp>=1.0.0
pyyaml>=6.0
requests>=2.28.0
pydantic>=2.0.0
```
3. Push to your Odoo.sh repository
4. Install the module via the Apps menu
### On Self-Hosted Odoo
1. Copy the module directory to your `addons` path:
```bash
cp -r OdooDevMCP /opt/odoo/custom-addons/
```
2. Install Python dependencies:
```bash
source /opt/odoo/venv/bin/activate
pip install mcp pyyaml requests pydantic
```
3. Update the apps list and install:
```bash
# Restart Odoo
sudo systemctl restart odoo
# Or update module list via CLI
odoo -d your_database -u all --stop-after-init
```
4. Install via Odoo UI:
- Go to Apps
- Search for "Odoo Dev MCP Server"
- Click Install
## Configuration
After installation, configure the module via **Settings > MCP Server > Configuration**:
### Server Settings
- **Server Host**: Bind address (default: `127.0.0.1` for localhost only)
- **Server Port**: HTTP port (default: `8768`)
- **API Key**: Bearer token for authentication (leave empty for no auth during development)
- **Log Level**: Logging verbosity (debug, info, warning, error)
### Phone-Home Settings
- **Phone-Home URL**: API endpoint to register server on startup (optional)
- **Heartbeat Interval**: Seconds between heartbeat pings (default: 60)
### Command Settings
- **Default Command Timeout**: Default timeout in seconds (default: 30)
- **Max Command Timeout**: Maximum allowed timeout (default: 600)
### Filesystem Settings
- **Max Read Size**: Maximum file size for reads in MB (default: 10)
- **Max Write Size**: Maximum file size for writes in MB (default: 50)
### Database Settings
- **Query Timeout**: Default query timeout in seconds (default: 30)
- **Max Result Rows**: Maximum rows returned by queries (default: 1000)
### Audit Settings
- **Audit Logging Enabled**: Enable/disable audit logging
- **Audit Log Path**: Path to audit log file (default: `/var/log/odoo/mcp_audit.log`)
## Usage
### MCP Endpoint
The MCP server exposes a JSON-RPC endpoint at:
```
http://your-odoo-server:8069/mcp/v1
```
Or on the configured port:
```
http://your-odoo-server:8768/mcp/v1
```
### Health Check
```bash
curl http://localhost:8768/mcp/v1/health
```
### Capabilities
```bash
curl http://localhost:8768/mcp/v1/capabilities \
-H "Authorization: Bearer your-api-key"
```
### MCP Client Configuration
Configure your MCP client (Claude Code, etc.) to connect:
```json
{
"mcpServers": {
"odoo-dev": {
"url": "http://your-odoo-server:8768/mcp/v1",
"headers": {
"Authorization": "Bearer your-api-key"
}
}
}
}
```
## Available Tools
The module provides 13 MCP tools:
1. **execute_command** - Run shell commands on the server
2. **query_database** - Execute read-only SQL queries via Odoo cursor
3. **execute_sql** - Execute write SQL statements (INSERT, UPDATE, DELETE, DDL)
4. **get_db_schema** - Inspect database schema (tables, columns, indexes, constraints)
5. **read_file** - Read files from the server filesystem
6. **write_file** - Write files to the server filesystem
7. **odoo_shell** - Execute Python code with full Odoo `env` context
8. **service_status** - Check and manage systemd services (odoo, postgresql, nginx)
9. **read_config** - Read Odoo configuration file
10. **list_modules** - List Odoo modules with installation status
11. **get_module_info** - Get detailed info about a specific module
12. **install_module** - Install an Odoo module
13. **upgrade_module** - Upgrade an installed module
## Available Resources
The module provides 5 MCP resources:
1. **odoo://config** - Current Odoo configuration (sensitive values masked)
2. **odoo://logs/{service}** - Recent service logs
3. **odoo://schema/{table}** - Database table schema
4. **odoo://modules** - List of installed modules
5. **odoo://system** - System information (OS, memory, disk, versions)
## Security
### Trust Model
This is a **development and administration tool**. The trust boundary is at the MCP client level. Anyone who can connect to the MCP endpoint has full access to the server.
**This is NOT a public-facing service.** Only use in trusted environments with proper access controls.
### Authentication
- **API Key**: Configure a Bearer token in Settings > MCP Server Configuration
- Clients must include `Authorization: Bearer <api_key>` header
- Leave API key empty during development (not recommended for production)
### Audit Logging
All tool invocations are logged to the configured audit log path:
```
[2026-02-16T10:05:30Z] DB=production USER=2 TOOL=execute_command CMD="systemctl restart odoo" EXIT_CODE=0 DURATION=1200ms
[2026-02-16T10:05:32Z] DB=production USER=2 TOOL=query_database QUERY="SELECT count(*) FROM res_partner" ROWS=1 DURATION=5ms
```
### Rate Limiting
Built-in rate limiting prevents abuse:
- Commands: 10/minute
- Queries: 100/minute
- Write operations: 50/minute
- Shell execution: 5/minute
- File reads: 50/minute
- File writes: 30/minute
### Path Validation
All filesystem operations validate paths to prevent:
- Path traversal attacks (`..` in paths)
- Symlink exploits (resolved before validation)
- Relative path confusion (absolute paths required)
## Phone-Home Registration
On module installation, the server can register itself with a configured API endpoint:
**Payload sent to `phone_home_url`:**
```json
{
"server_id": "database_hostname",
"hostname": "odoo-server-01",
"ip_addresses": {
"primary": "10.0.1.50",
"all": ["10.0.1.50", "172.17.0.1"]
},
"port": 8768,
"transport": "http/sse",
"version": "1.0.0",
"odoo_version": "18.0",
"database": "production",
"capabilities": [...],
"started_at": "2026-02-16T10:00:00Z"
}
```
This enables fleet management and discovery of all deployed Odoo MCP servers.
## Monitoring
### Check Module Status
In Odoo: Apps > Search "MCP" > Check installation status
### View Logs
```bash
# Odoo server log (includes MCP module output)
tail -f /var/log/odoo/odoo.log | grep MCP
# Audit log
tail -f /var/log/odoo/mcp_audit.log
```
### Test Endpoint
```bash
# Health check
curl http://localhost:8768/mcp/v1/health
# Capabilities (requires API key if configured)
curl http://localhost:8768/mcp/v1/capabilities \
-H "Authorization: Bearer your-api-key"
```
## Troubleshooting
### Module won't install
Check logs:
```bash
tail -f /var/log/odoo/odoo.log
```
Common issues:
- Missing Python dependencies (`mcp`, `pyyaml`, `requests`, `pydantic`)
- Python version < 3.10
- Insufficient permissions to create audit log directory
### MCP endpoint returns 404
- Check that Odoo is running
- Verify module is installed (not just "To Install")
- Check server port configuration matches your request URL
### Database operations fail
- Check that the user has database access permissions
- Verify PostgreSQL is running: `systemctl status postgresql`
- Check Odoo's database configuration
### Phone-home not working
- Verify `phone_home_url` is configured in Settings
- Check network connectivity to the registry URL
- Phone-home failures are non-blocking and logged as warnings
## Development
### Module Structure
```
OdooDevMCP/
├── __init__.py # Module initialization + post_init_hook
├── __manifest__.py # Module metadata and dependencies
├── models/
│ ├── __init__.py
│ └── mcp_config.py # Configuration settings model
├── controllers/
│ ├── __init__.py
│ └── mcp_endpoint.py # HTTP controller for MCP protocol
├── tools/
│ ├── __init__.py
│ ├── terminal.py # Command execution
│ ├── database.py # SQL operations via Odoo cursor
│ ├── filesystem.py # File operations
│ ├── odoo_tools.py # Odoo shell, modules, config, services
│ └── registry.py # Tool registry and schemas
├── services/
│ ├── __init__.py
│ ├── mcp_server.py # MCP JSON-RPC handler
│ └── phone_home.py # Registration and heartbeat
├── security/
│ ├── __init__.py
│ ├── security.py # Audit, rate limiting, path validation
│ └── ir.model.access.csv # Access control
├── data/
│ └── mcp_data.xml # Default configuration parameters
├── views/
│ └── mcp_config_views.xml # Configuration UI
└── static/
└── description/
└── icon.png # Module icon
```
### Extending the Module
To add a new tool:
1. Create the tool function in `tools/` (e.g., `tools/my_tool.py`)
2. Add the function to `tools/__init__.py`
3. Register it in `tools/registry.py` in both `get_tool_registry()` and `get_tool_schemas()`
4. Update capabilities in `controllers/mcp_endpoint.py`
## License
LGPL-3 (compatible with Odoo's licensing)
## Support
For issues and questions:
- Check module logs: `/var/log/odoo/odoo.log`
- Check audit logs: `/var/log/odoo/mcp_audit.log`
- Review configuration: Settings > MCP Server
- Open an issue on GitHub
## Changelog
### Version 1.0.0 (2026-02-16)
- Initial release as Odoo V18 module
- 13 tools for Odoo development and administration
- 5 MCP resources
- Phone-home registration on module installation
- Complete audit logging
- HTTP/SSE transport via Odoo controller
- Rate limiting and security controls
- Configuration UI in Odoo Settings
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues