MCP Servers

A collection of Model Context Protocol servers, templates, tools and more.

Conversational AI assistant for Odoo ERP — powered by a local LLM (Ollama) and the Model Context Protocol (MCP), with a two-layer permission system that gates every tool call at both the client and server.

Created 2/23/2026
Updated about 9 hours ago
Repository documentation and setup instructions

Odoo MCP Platform

A conversational AI assistant that talks to your Odoo ERP using the Model Context Protocol (MCP). You chat with a local LLM (via Ollama), it decides which Odoo tools to call, and a two-layer permission system makes sure nothing sensitive runs without approval.


How it works

You (terminal)
    ↓  type a question
MCP Host  ──→  Ollama LLM  ──→  decides which tool to call
    ↓
Permission check (client-side)
    │  allow  → calls the tool immediately
    │  ask    → prints the arguments and asks YOU for y/n approval
    │  deny   → blocks the call before it even leaves the host
    ↓
MCP Server  (HTTP, port 8001)
    ↓
Permission check (server-side)  ← second line of defence
    ↓
Odoo RPC  (port 8069)

Every tool call — whether allowed, denied, or approved by the user — is written to an audit log on both sides.


Project structure

odoo-mcp-platform/
├── .env                          # your secrets & config (never commit this)
├── pyproject.toml                # uv workspace root
│
└── packages/
    ├── odoo-mcp-server/          # FastMCP HTTP server, talks to Odoo
    │   ├── server.py
    │   └── data/
    │       ├── server_permissions.json   # per-tool server policy
    │       └── server_audit.log          # created at runtime
    │
    ├── odoo-mcp-host/            # LLM host + permission client
    │   ├── host.py               # chat loop, sends prompts to Ollama
    │   ├── base_client.py        # MCP HTTP client (connect/cleanup)
    │   ├── permission_client.py  # enforces client-side permissions
    │   └── data/
    │       ├── client_permissions.json   # per-tool client policy
    │       └── client_audit.log          # created at runtime
    │
    └── odoo-mcp-core/            # shared utilities (WIP)

Available tools

| Tool | What it does | Default permission | |---|---|---| | get_product_by_name | Search products by name (case-insensitive) | ✅ allow | | get_product_by_type | List products by type (product, consu, service) | ✅ allow | | add_product | Create a new product in Odoo | ⚠️ ask (requires your approval) |

Permission levels

Each tool can be set to one of three levels, independently on the client and on the server:

  • allow — runs automatically, no interruption.
  • ask — pauses and shows you the arguments before asking "Do you approve? (y/n)". You have to type y to proceed.
  • deny — blocked outright, never reaches Odoo.

To change a tool's permission, edit the JSON file and restart the relevant process:

  • Client policy → packages/odoo-mcp-host/data/client_permissions.json
  • Server policy → packages/odoo-mcp-server/data/server_permissions.json

Requirements

  • Python 3.10+
  • uv (package manager)
  • Ollama running locally with at least one model pulled
  • A running Odoo instance (tested with Odoo 16/17, port 8069)

Setup

1. Clone and install

git clone https://github.com/your-username/odoo-mcp-platform.git
cd odoo-mcp-platform
uv sync --all-packages

2. Configure your environment

Copy the example and fill in your values:

cp .env.example .env
# Odoo connection
ODOO_HOST=localhost
ODOO_PORT=8069
ODOO_DB=your_database_name
ODOO_USER=admin
ODOO_PASSWORD=your_password

# MCP server
MCP_SERVER_HOST=0.0.0.0
MCP_SERVER_PORT=8001

# MCP host
MCP_SERVER_URL=http://localhost:8001/mcp
OLLAMA_MODEL=ministral-3:3b

⚠️ Never commit your .env file. It contains your Odoo password. The .gitignore should already exclude it — double-check before pushing.

3. Pull an Ollama model

The host works best with a model that supports tool-calling:

ollama pull ministral-3:3b   # default, fast, ~2 GB
# or
ollama pull qwen2.5:3b

Running

You need two terminals — one for the server, one for the host.

Terminal 1 — start the MCP server:

uv run packages/odoo-mcp-server/server.py

You should see uvicorn start on http://0.0.0.0:8001.

Terminal 2 — start the host:

uv run packages/odoo-mcp-host/host.py

You'll get a prompt:

💬 Odoo MCP Host (HTTP) Running

You:

Try asking:

You: is the product "Acoustic Bloc Screens" available?
You: show me all service products
You: add a product called "Standing Desk" with price 450

For add_product, the host will pause and ask for your approval before doing anything:

🔒 Permission required for tool: add_product
   Arguments: {
     "name": "Standing Desk",
     "price": 450.0,
     "product_type": "consu"
   }
   Do you approve this action? (y/n):

Type exit to quit cleanly.


Architecture notes

Why two permission layers?

The client layer protects the user — sensitive write operations pause for human approval. The server layer is a separate, independent safety net: even if someone bypasses the host entirely and calls the MCP server directly, the server can still deny or gate the request. Neither layer trusts the other blindly.

Why MCP over plain REST?

MCP gives the LLM a structured, self-describing interface to tools. The model sees the tool names, descriptions, and parameter schemas at startup and decides on its own which tool to call based on the conversation. No custom prompt engineering needed to route requests.

Why Ollama?

Everything runs locally — no API keys, no data leaving your machine. You can swap the model by changing OLLAMA_MODEL in .env.


Roadmap

  • [ ] update_product and delete_product tools
  • [ ] Web UI for approving pending ask requests
  • [ ] Support for Odoo customers and orders
  • [ ] Persistent conversation history

Quick Setup
Installation guide for this server

Install Package (if required)

uvx odoo-mcp-platform

Cursor configuration (mcp.json)

{ "mcpServers": { "mohameddridii-odoo-mcp-platform": { "command": "uvx", "args": [ "odoo-mcp-platform" ] } } }