Skip to main content
Glama
Leov3

Odoo MCP Gateway

by Leov3
README.md
# Odoo MCP Gateway

MVP funcional en FastAPI para administrar múltiples instancias de Odoo desde un panel simple y exponer tools MCP desde un único servicio.

## Requisitos

- Python 3.12
- Docker y Docker Compose

## Generar `ENCRYPTION_KEY`

```bash
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
```

## Configuración local

1. Copia `.env.example` a `.env`.
2. Completa estas variables:
   - `ADMIN_USER`
   - `ADMIN_PASSWORD`
   - `MCP_BEARER_TOKEN`
   - `ENCRYPTION_KEY`
   - `APP_SECRET_KEY`

## Ejecutar con Docker

```bash
docker compose up --build
```

La aplicación queda disponible en:

- Panel admin: `http://localhost:8000/admin`
- Login: `http://localhost:8000/admin/login`
- Ajustes de usuario: `http://localhost:8000/admin/settings`
- Health check: `http://localhost:8000/health`
- MCP por instancia: `http://localhost:8000/<instancia>/mcp/`

## Entrar al panel

Usa el usuario y contraseña definidos en:

- `ADMIN_USER`
- `ADMIN_PASSWORD`

Desde `Settings` puedes cambiar el nombre de usuario y la contraseña del único admin.

## Configurar Easypanel

Ver [Guia de despliegue](./DEPLOYMENT.md).

## Conectar un cliente MCP

Cada instancia configurada expone su propio endpoint MCP. El formato es:

```text
https://tu-dominio/<instancia>/mcp/
```

El endpoint requiere este encabezado:

```text
Authorization: Bearer <MCP_BEARER_TOKEN>
```

Ejemplo:

```bash
curl -H "Authorization: Bearer change_me_long_random_token" https://tu-dominio/compraloahora/mcp/
```

### n8n

Para n8n usa `MCP Client` con:

- `Server Transport`: `HTTP Streamable`
- `MCP Endpoint URL`: `https://tu-dominio/compraloahora/mcp/`
- `Authentication`: `Bearer Auth` o `Header Auth`
- Si usas `Bearer Auth`, pega solo el token.
- Si usas `Header Auth`, define exactamente:
  - `Authorization: Bearer <MCP_BEARER_TOKEN>`

Si el nodo falla con `Bearer Auth`, cambia a `Header Auth` para forzar exactamente ese header.

Las tools ya quedan ligadas a la instancia del endpoint, así que no necesitas pasar `instance` en cada llamada.

Tools expuestas actualmente:

- `odoo_test_connection`
- `odoo_search_partners`
- `odoo_search_leads`
- `odoo_create_lead`
- `odoo_search_sale_orders`
- `odoo_create_partner`
- `odoo_search_products`
- `odoo_search_products_by_sku`
- `odoo_search_products_by_category`
- `odoo_search_product_variants`
- `odoo_search_products_by_stock`
- `odoo_get_partner`
- `odoo_update_partner`
- `odoo_get_product`
- `odoo_get_product_pricing`
- `odoo_get_stock_availability`
- `odoo_get_sale_order`
- `odoo_create_quotation`
- `odoo_add_quotation_line`
- `odoo_update_quotation_line`
- `odoo_confirm_quotation`
- `odoo_send_quotation`
- `odoo_cancel_sale_order`
- `odoo_update_lead_stage`
- `odoo_set_next_activity`
- `odoo_log_note`
- `odoo_search_pipeline`
- `odoo_search_my_activities`

Herramientas de negocio para Mario, pensadas para que n8n gestione el flujo comercial y el estado conversacional fuera del MCP:

- `buscar_cliente_por_telefono`
- `crear_o_actualizar_cliente_whatsapp`
- `buscar_producto_venta`
- `consultar_disponibilidad`
- `crear_cotizacion_whatsapp`
- `actualizar_cotizacion_whatsapp`
- `confirmar_cotizacion_whatsapp`
- `consultar_estado_pedido`
- `crear_actividad_para_vendedor`

Prompt recomendado para el agente:

- [`app/mario_prompt.md`](/home/leonardo/Documentos/Proyectos/ODOO/Odoo%20MCP%20gateway/app/mario_prompt.md)

### Validado en esta instalación

- Endpoint MCP: `https://dev-odoo-mcp-gateway.ouiteb.easypanel.host/compraloahora/mcp/`
- Instancia activa: `Compraloahora`
- URL Odoo: `https://odoo-concept-compralo-ahora-staging-compraloahora-33072015.dev.odoo.com`
- Version: `17`
- API mode: `xmlrpc`
- `odoo_test_connection`: OK

## Seguridad

- No compartas el `MCP_BEARER_TOKEN`.
- No subas `.env` al repositorio.
- El secreto de cada instancia se guarda cifrado con Fernet.
- En edición, el campo secreto se deja vacío y solo se actualiza si escribes uno nuevo.
- Este proyecto no incluye multiusuario, OAuth, ni permisos avanzados.
- El estado conversacional de Mario debe vivir en el agente de n8n, no en el MCP.