Odoo MCP Skeleton
by daitianjun
README.md
# Odoo MCP Skeleton
This is a Python skeleton for an Odoo MCP server built with `fastmcp`.
It includes:
- `FastMCP` tool registration
- `FastAPI` HTTP service
- `secret-key` header authentication for `/mcp`
- Odoo JSON-RPC client wrapper
- Example read-only tools
## Quick Start With uv
1. Install `uv`.
2. Enter the project directory.
3. Sync dependencies:
```bash
uv sync
```
4. Copy environment variables:
```bash
copy .env.example .env
```
5. Fill in:
- `MCP_SECRET_KEY`
- `ODOO_BASE_URL`
- `ODOO_DB`
- `ODOO_USERNAME`
- `ODOO_PASSWORD`
6. Start the server:
```bash
uv run uvicorn odoo_mcp.main:app --host 127.0.0.1 --port 8080
```
On Windows PowerShell, you can also use:
```powershell
.\run.ps1
```
## Authentication
Clients must send this header when connecting to the MCP endpoint:
```text
secret-key: your-secret-value
```
## Suggested MCP Endpoint
```text
http://127.0.0.1:8080/mcp
```
## Troubleshooting Logs
If you see this pattern:
```text
GET /mcp HTTP/1.1 307 Temporary Redirect
GET /mcp/ HTTP/1.1 404 Not Found
```
it usually means the outer FastAPI app and the inner FastMCP app both added an `/mcp` path. This project mounts FastMCP at `/mcp` and configures the inner FastMCP HTTP app with `path="/"`, so the final endpoint stays:
```text
http://127.0.0.1:8080/mcp
```
If you see requests to these paths:
```text
/.well-known/oauth-protected-resource
/.well-known/oauth-authorization-server
/.well-known/openid-configuration
```
those are MCP client OAuth discovery probes. They can return `404` when you use simple `secret-key` header authentication instead of OAuth.
## Common uv Commands
```bash
uv sync
uv run uvicorn odoo_mcp.main:app --host 127.0.0.1 --port 8080
uv run python -c "import odoo_mcp; print('ok')"
```
## Notes About `fastmcp` Versions
`FastMCP` has changed quickly across versions. This skeleton isolates the MCP-to-ASGI mounting logic in [`src/odoo_mcp/server.py`](C:/Users/tianjun.dai/Documents/AI转型项目/tools/odoo-mcp/src/odoo_mcp/server.py). If your installed version exposes a different HTTP adapter, update only that file.
## Example Tools
- `odoo_healthcheck`
- `search_customers`
- `get_customer_detail`
- `list_sale_orders`