Servidor Model Context Protocol (MCP) per a Odoo, implementat amb Node.js / TypeScript. Suporta dos transports: Streamable HTTP (per a agents remots) i stdio (per a integració directa amb Claude Desktop o Claude Code).
Part del TFG "Desenvolupament d'un Agent Intel·ligent per a la Gestió i Suport de Processos Empresarials mitjançant MCP" — TecnoCampus / UPF 2025–2026.
Documentació generada amb Claude Code
- Descripció
- Arquitectura
- Requisits
- Instal·lació
- Configuració
- Ús
- Eines MCP disponibles
- Tests
- Estructura del projecte
Aquest servidor exposa les dades d'Odoo com a eines MCP consumibles per qualsevol agent LLM compatible (Claude, GPT-4o, etc.). Permet a un model de llenguatge:
- Consultar i cercar projectes, tasques i usuaris d'Odoo
- Registrar, consultar i eliminar imputacions d'hores (timesheets)
- Llegir i actualitzar l'estat kanban dels projectes
La comunicació amb Odoo es realitza via XML-RPC 2.0 (l'API nativa d'Odoo). El servidor suporta dos modes de transport MCP:
- Streamable HTTP — sessions stateful via UUID, ideal per a agents remots i desplegaments multi-client
- stdio — comunicació per entrada/sortida estàndard, ideal per a integració local amb Claude Desktop o Claude Code
El servidor pot funcionar en dos modes de transport, seleccionables en temps d'execució.
[LLM Host / Agent]
│ Streamable HTTP (JSON-RPC 2.0)
▼
[Odoo MCP Server] ← Node.js + Express + @modelcontextprotocol/sdk
│ XML-RPC 2.0
▼
[Odoo ERP] ← instància cloud o on-premise
Endpoints HTTP:
| Mètode | Ruta | Funció |
|---|---|---|
POST |
/mcp |
Missatges JSON-RPC (initialize, tools/call) |
GET |
/mcp |
Canal SSE per a notificacions del servidor |
DELETE |
/mcp |
Tancament de sessió |
GET |
/health |
Estat del servidor i sessions actives |
[Claude Desktop / Claude Code]
│ stdin / stdout (JSON-RPC 2.0)
▼
[Odoo MCP Server] ← procés fill, @modelcontextprotocol/sdk
│ XML-RPC 2.0
▼
[Odoo ERP] ← instància cloud o on-premise
En mode stdio, el servidor llegeix missatges JSON-RPC des de stdin i escriu les respostes a stdout. Els logs es redirigeixen a stderr per no interferir amb el protocol.
- Node.js >= 22 LTS
- Instància Odoo 17+ accessible (cloud o local)
- Compte d'usuari Odoo amb permisos de lectura/escriptura sobre els models utilitzats
git clone <repo-url>
cd mcp_js
npm install
npm run buildEl servidor utilitza fitxers .env per entorn. Crea el fitxer corresponent abans d'arrencar:
# .env.dev | .env.test | .env.prod
ODOO_URL=https://la-teva-instancia.odoo.com
ODOO_DB=nom_de_la_base_de_dades
ODOO_USERNAME=usuari@empresa.com
ODOO_PASSWORD=contrasenya_o_token_api
LOG_LEVEL=info # debug | info | warn | errorL'entorn s'activa amb la variable NODE_ENV:
NODE_ENV=dev npm start # .env.dev
NODE_ENV=prod npm start # .env.prod# Compilar
npm run buildnpm start # producció
npm run start:http # equivalent explícit
npm run dev # desenvolupament (NODE_ENV=dev)En arrencar correctament veuràs:
Connecting to Odoo...
Connexion to Odoo stablished
Server running in Streamable HTTP mode on port 3000
POST /mcp - JSON-RPC messages
GET /mcp - SSE channel
DELETE /mcp - Close session
GET /health - Health check
Pots verificar l'estat amb:
curl http://localhost:3000/health
# {"status":"ok","activeSessions":0,"timestamp":"..."}npm run start:stdio # producció
npm run dev:stdio # desenvolupamentO bé directament:
node build/src/index.js --stdio
# o via variable d'entorn:
MCP_TRANSPORT=stdio node build/src/index.jsIntegració amb Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"odoo": {
"command": "node",
"args": ["/ruta/al/projecte/build/src/index.js", "--stdio"],
"env": {
"NODE_ENV": "prod"
}
}
}
}Integració amb Claude Code (fitxer .mcp.json al directori del projecte):
{
"mcpServers": {
"odoo": {
"command": "node",
"args": ["build/src/index.js", "--stdio"],
"env": {
"NODE_ENV": "prod"
}
}
}
}| Eina | Descripció |
|---|---|
projects_get_list |
Llista projectes actius. Filtre opcional per etapa (TODO, DOING, DONE). |
| Eina | Descripció |
|---|---|
tasks_search |
Cerca tasques per projecte, responsable, etiqueta o paraula clau. |
| Eina | Descripció |
|---|---|
users_search |
Cerca usuaris per nom o email. |
users_get_details |
Recupera detalls (nom, email) a partir d'una llista d'IDs. |
| Eina | Descripció |
|---|---|
timesheets_create |
Registra hores en una tasca (task_id, hores, descripció, data opcional, user_id opcional). |
timesheets_get_by_task |
Consulta les imputacions d'una tasca concreta. |
timesheets_delete |
Elimina una imputació per ID. |
| Eina | Descripció |
|---|---|
project_get_state |
Llegeix l'estat kanban d'un projecte. |
project_update_state |
Actualitza l'estat: a_tiempo · en_riesgo · atrasado · en_espera · hecho |
projects_search_by_state |
Filtra tots els projectes per estat, opcionalment per responsable. |
# Tests unitaris
npm test
# Tests unitaris en mode watch
npm run test:watch
# Tests d'integració (requereix .env.test amb Odoo real)
npm run test:integration
# Informe de cobertura
npm run coverageEls tests d'integració requereixen un fitxer .env.test configurat amb una instància Odoo accessible.
src/
├── config/
│ └── index.ts # Validació de variables d'entorn (Zod)
├── core/
│ └── odoo-client.ts # Singleton XML-RPC d'Odoo
├── modules/
│ ├── projects/ # tools.ts · service.ts · schemas.ts
│ ├── tasks/
│ ├── users/
│ ├── timesheets/
│ └── kanban/
├── all-tools.ts # Registre centralitzat de totes les eines
└── index.ts # Servidor HTTP + gestió de sessions MCP
tests/
├── setup.ts
├── unit/
└── integration/