feat: integrate Leantime project management via MCP (leantime-mcp + MCPO)

- Add leantime-mcp Dockerfile (daniel-eder/leantime-mcp, SSE transport)
- Add leantime-mcp service to docker-compose.yml on effi-net
- Add Leantime env vars to .env.example (API_KEY, USER_EMAIL, URL)
- Update services.md: Leantime + leantime-mcp entries, dependency diagram, resource table
- Update mcp-et-n8n.md: MCPO config with leantime SSE server, new leantime-mcp section
- Add LEANTIME-INSTALLATION.md: full reinstall guide (XPenology + MCP)
This commit is contained in:
Folzo
2026-05-10 17:53:21 +02:00
parent 21674f6eaf
commit c4467d0da2
6 changed files with 482 additions and 12 deletions
+13 -1
View File
@@ -51,7 +51,19 @@ N8N_PASSWORD=changez_moi_mot_de_passe_securise
SEARXNG_SECRET_KEY=changez_moi_par_une_cle_longue_et_aleatoire
# ═══════════════════════════════════════════════════════════
# 6. CONFIGURATION OPTIONNELLE
# 6. LEANTIME MCP (Gestion de projet)
# ═══════════════════════════════════════════════════════════
# URL d'accès à Leantime (depuis le conteneur MCP)
LEANTIME_URL=http://192.168.1.25:8380
# Clé API Leantime (Company > API Keys dans l'interface Leantime)
LEANTIME_API_KEY=changez_moi_par_cle_api_leantime
# Email de l'utilisateur Leantime utilisé par le MCP
LEANTIME_USER_EMAIL=votre_email@example.com
# ═══════════════════════════════════════════════════════════
# 7. CONFIGURATION OPTIONNELLE
# ═══════════════════════════════════════════════════════════
# Fuseau horaire (déjà configuré dans docker-compose.yml)
# TZ=Europe/Paris
+22
View File
@@ -86,6 +86,28 @@ services:
- ./mcpo-config:/app/config:ro
- ./mcpo-patch.sh:/mcpo-patch.sh:ro
entrypoint: ["sh", "/mcpo-patch.sh"]
networks:
- effi-net
# ─────────────────────────────────────────────────────────
# 3b. LEANTIME MCP - Serveur MCP pour gestion de projet
# → http://192.168.1.27:8079/mcp
# ─────────────────────────────────────────────────────────
leantime-mcp:
build:
context: ./leantime-mcp
dockerfile: Dockerfile
image: effi-leantime-mcp:latest
container_name: effi-leantime-mcp
restart: unless-stopped
environment:
- LEANTIME_URL=http://192.168.1.25:8380
- LEANTIME_API_KEY=${LEANTIME_API_KEY}
- LEANTIME_USER_EMAIL=${LEANTIME_USER_EMAIL}
ports:
- "8079:8079"
networks:
- effi-net
# ─────────────────────────────────────────────────────────
# 4. QDRANT - Vector Store (RAG sémantique)
+50
View File
@@ -14,6 +14,9 @@
| **speaches** | folzo-Corp | 8200 | `speaches:rocm-ct2` (build local) | STT Whisper avec ROCm |
| **openedai-speech** | folzo-Corp | 8100 | `ghcr.io/matatonic/openedai-speech` | TTS Piper/XTTS |
| **Ollama** | folzo-Corp | 11434 | Installation native | LLM (qwen2.5:14b) |
| **SearXNG** | effi-server | 11112 | `searxng/searxng:latest` | Meta-search Engine |
| **Leantime** | XPenology NAS | 8380 | `leantime/leantime:latest` | Gestion de projet |
| **leantime-mcp** | effi-server | 8079 | `effi-leantime-mcp:latest` (build local) | Serveur MCP Leantime |
| **Obsidian** | effi-server | 3100 | `lscr.io/linuxserver/obsidian:latest` | Interface Obsidian web |
---
@@ -200,6 +203,48 @@ curl http://localhost:11434/api/tags
---
### Leantime (Port 8380)
**Rôle** : Gestion de projet open-source (AGPL-3.0)
**Hôte** : XPenology NAS (192.168.1.25)
**Fonctionnalités :**
- Tableaux Kanban, Gantt, Lean Canvas
- Wiki intégré
- Gestion des tickets / tâches
- Timesheet / suivi du temps
- API REST complète
**Configuration :**
- MySQL 8.4 dédié (volume nommé `leantime-db-data`)
- Port 8380 (évite conflits DSM)
- URL d'accès : `http://192.168.1.25:8380`
**Clé API** : Company > API Keys dans l'interface Leantime
---
### leantime-mcp (Port 8079)
**Rôle** : Serveur MCP (Model Context Protocol) pour Leantime
**Image** : `effi-leantime-mcp:latest` (build local depuis `leantime-mcp/Dockerfile`)
**Fonctionnement :**
- Proxy entre MCPO et l'API Leantime
- Transport SSE (compatible MCPO)
- Outils exposés : `list_projects`, `create_project`, `list_tickets`, `create_ticket`, `update_ticket`, `get_ticket`, `get_project`, `list_users`, `get_user`, `add_comment`, `add_timesheet`, `get_timesheets`
**Variables d'environnement :**
- `LEANTIME_URL` : URL Leantime depuis le conteneur (`http://192.168.1.25:8380`)
- `LEANTIME_API_KEY` : Clé API Leantime
- `LEANTIME_USER_EMAIL` : Email utilisateur Leantime
**Note :** Utilise le projet [daniel-eder/leantime-mcp](https://github.com/daniel-eder/leantime-mcp) (standalone, pas le plugin payant Leantime)
---
## Dépendances entre services
```
@@ -207,6 +252,8 @@ open-webui
├──► qdrant (pour RAG)
├──► wol-proxy (pour Ollama)
└──► mcpo (pour outils externes)
└──► leantime-mcp (pour gestion de projet)
└──► Leantime API (sur XPenology NAS)
n8n
└──► Peut appeler tous les services via API
@@ -228,3 +275,6 @@ Obsidian (mobile/desktop)
| speaches | Élevé (GPU) | ~4 GB VRAM | ~3 GB (modèles) |
| openedai-speech | Moyen | ~2 GB VRAM | ~2 GB (voix) |
| Ollama | Élevé (GPU) | ~10 GB VRAM | ~9 GB (qwen2.5:14b) |
| leantime-mcp | Faible | ~200 MB | Négligeable |
| Leantime | Faible-Moyen | ~512 MB | ~100 MB (app) |
| Leantime MySQL | Faible | ~512 MB | Variable (données) |
+95 -11
View File
@@ -13,7 +13,7 @@ Effi s'intègre avec plusieurs outils externes via :
### Rôle
MCPO fait le pont entre OpenWebUI et les outils MCP (Obsidian, système de fichiers, etc.).
MCPO fait le pont entre OpenWebUI et les outils MCP (Obsidian, Leantime, etc.).
### Configuration
@@ -21,23 +21,32 @@ MCPO fait le pont entre OpenWebUI et les outils MCP (Obsidian, système de fichi
```json
{
"mcpServers": {}
"mcpServers": {
"leantime": {
"url": "http://leantime-mcp:8079/sse",
"transport": "sse"
}
}
}
```
Au démarrage, créer ce fichier s'il n'existe pas :
```bash
cat > ~/effi/mcpo-config/config.json << 'EOF'
{"mcpServers": {}}
EOF
```
**Important :** Le transport doit être `sse` (MCPO ne supporte pas StreamableHTTP). Le conteneur `leantime-mcp` doit aussi être configuré en mode SSE.
### Accès
- URL : `http://192.168.1.27:8000`
- URL MCPO : `http://192.168.1.27:8000`
- Port : 8000
### Vérification
```bash
# Lister les outils MCP disponibles
curl -s http://192.168.1.27:8000/v1/tools | jq '.[].name'
# Vérifier la connexion MCPO
docker logs mcpo --tail 20
```
### Dépannage
**Problème : mcpo redémarre en boucle**
@@ -61,9 +70,84 @@ docker compose restart mcpo
docker restart mcpo
```
**Problème : Erreur 400 Bad Request entre MCPO et leantime-mcp**
**Cause** : Incompatibilité de protocole (SSE vs StreamableHTTP)
**Solution** : Vérifier que leantime-mcp est lancé avec `--transport sse` et que la config MCPO pointe vers `/sse` avec `"transport": "sse"`.
---
## n8n - Automatisation
## leantime-mcp - Serveur MCP Leantime
### Rôle
Serveur MCP dédié qui expose l'API Leantime via le protocole MCP, permettant à Effi de gérer les projets et tâches Leantime directement depuis Open WebUI.
### Architecture
```
Open WebUI → MCPO (port 8000) → leantime-mcp (port 8079, SSE) → Leantime API (port 8380, XPenology NAS)
```
### Configuration
**Docker Compose :**
```yaml
leantime-mcp:
build:
context: ./leantime-mcp
dockerfile: Dockerfile
image: effi-leantime-mcp:latest
container_name: effi-leantime-mcp
restart: unless-stopped
environment:
- LEANTIME_URL=http://192.168.1.25:8380
- LEANTIME_API_KEY=${LEANTIME_API_KEY}
- LEANTIME_USER_EMAIL=${LEANTIME_USER_EMAIL}
ports:
- "8079:8079"
networks:
- effi-net
```
**Variables d'environnement (`.env`) :**
```bash
LEANTIME_URL=http://192.168.1.25:8380
LEANTIME_API_KEY=votre_cle_api_leantime
LEANTIME_USER_EMAIL=votre_email@example.com
```
### Outils MCP disponibles
| Outil | Description |
|-------|-------------|
| `list_projects` | Lister les projets |
| `create_project` | Créer un projet |
| `get_project` | Détails d'un projet |
| `list_tickets` | Lister les tickets/tâches |
| `create_ticket` | Créer un ticket |
| `update_ticket` | Modifier un ticket |
| `get_ticket` | Détails d'un ticket |
| `list_users` | Lister les utilisateurs |
| `get_user` | Détails d'un utilisateur |
| `add_comment` | Ajouter un commentaire |
| `add_timesheet` | Ajouter une entrée timesheet |
| `get_timesheets` | Consulter les timesheets |
### Clé API Leantime
Pour générer la clé API :
1. Se connecter à `http://192.168.1.25:8380`
2. Aller dans **Company > API Keys**
3. Créer une nouvelle clé
4. Copier la clé dans `.env` sous `LEANTIME_API_KEY`
### Transport SSE
**Important :** Leantime-mcp utilise le transport SSE (Server-Sent Events), pas StreamableHTTP. MCPO ne supporte que SSE. Le Dockerfile lance le serveur avec `--transport sse`.
---
### Rôle
+286
View File
@@ -0,0 +1,286 @@
# Installation Leantime + MCP Integration
Ce document decrit l'installation complete de Leantime sur XPenology NAS et l'integration MCP avec Effi (Open WebUI via MCPO).
## Architecture
```
Open WebUI (effi-server:3000)
→ MCPO (effi-server:8000)
→ leantime-mcp (effi-server:8079, SSE)
→ Leantime API (XPenology NAS:8380)
```
## Partie 1 : Installation Leantime sur XPenology NAS
### Prerequis
- XPenology NAS avec Docker (DSM 7.2+)
- Acces SSH au NAS
- Reseau local : XPenology sur `192.168.1.25`
### 1. Creer le repertoire de configuration
```bash
ssh admin@192.168.1.25
sudo mkdir -p /volume1/docker/leantime
cd /volume1/docker/leantime
```
### 2. Creer le fichier `.env`
```bash
cat > .env << 'EOF'
LEANTIME_HOST=http://leantime:8380
LEAN_DB_HOST=mysql-leantime
LEAN_DB_USER=leantime
LEAN_DB_PASSWORD=CHANGEZ_MOI_mot_de_passe_securise
LEAN_DB_DATABASE=leantime
LEAN_DB_PORT=3306
LEAN_DEFAULT_TIMEZONE=Europe/Paris
MYSQL_ROOT_PASSWORD=CHANGEZ_MOI_mot_de_passe_root_securise
MYSQL_DATABASE=leantime
MYSQL_USER=leantime
MYSQL_PASSWORD=CHANGEZ_MOI_mot_de_passe_securise
EOF
```
**Important :** `LEAN_DB_PASSWORD` et `MYSQL_PASSWORD` doivent etre identiques. `MYSQL_ROOT_PASSWORD` est distinct.
### 3. Creer le `docker-compose.yml`
```yaml
version: '3.8'
services:
mysql-leantime:
image: mysql:8.4
container_name: mysql-leantime
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- leantime-db-data:/var/lib/mysql
networks:
- leantime-net
leantime:
image: leantime/leantime:latest
container_name: leantime
restart: unless-stopped
depends_on:
- mysql-leantime
environment:
LEAN_DB_HOST: ${LEAN_DB_HOST}
LEAN_DB_USER: ${LEAN_DB_USER}
LEAN_DB_PASSWORD: ${LEAN_DB_PASSWORD}
LEAN_DB_DATABASE: ${LEAN_DB_DATABASE}
LEAN_DB_PORT: ${LEAN_DB_PORT}
LEAN_DEFAULT_TIMEZONE: ${LEAN_DEFAULT_TIMEZONE}
ports:
- "8380:80"
networks:
- leantime-net
volumes:
leantime-db-data:
networks:
leantime-net:
driver: bridge
```
**Notes :**
- Port 8380 pour eviter les conflits avec DSM (port 80/443)
- Volume nomme `leantime-db-data` (pas bind mount) pour eviter les problemes de permissions Synology
- Reseau interne `leantime-net` pour isolation
### 4. Lancer Leantime
```bash
# Premier lancement (initialisation de la base)
docker compose up -d
# Attendre ~30s que MySQL s'initialise, puis verifier :
docker logs mysql-leantime --tail 5
docker logs leantime --tail 10
```
### 5. Creer le compte admin
1. Ouvrir `http://192.168.1.25:8380`
2. Suivre l'assistant de premier lancement
3. Creer le compte admin
### 6. Generer la cle API
1. Se connecter en admin
2. Aller dans **Company > API Keys**
3. Creer une nouvelle cle
4. Noter la cle (elle sera utilisee dans `.env` d'Effi)
### Problemes connus (XPenology)
#### Erreur "Access denied for user"
- Verifier que `MYSQL_PASSWORD` et `LEAN_DB_PASSWORD` sont identiques
- Si la base existe deja, verifier les credentials : `docker exec -it mysql-leantime mysql -u leantime -p`
#### Erreur "data directory has files"
- Utiliser un volume nomme Docker (`leantime-db-data`) au lieu d'un bind mount
- Les permissions Synology sont incompatibles avec les bind mounts MySQL
---
## Partie 2 : Integration MCP sur effi-server
### Prerequis
- effi-server (192.168.1.27) avec docker-compose Effi operationnel
- Leantime operationnel sur `http://192.168.1.25:8380`
- Cle API Leantime generee
### 1. Ajouter les variables d'environnement
Sur effi-server, editer `~/effi/.env` :
```bash
# Leantime MCP
LEANTIME_URL=http://192.168.1.25:8380
LEANTIME_API_KEY=votre_cle_api_leantime_ici
LEANTIME_USER_EMAIL=votre_email@example.com
```
### 2. Construire l'image leantime-mcp
Le Dockerfile est dans `leantime-mcp/Dockerfile` :
```dockerfile
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends git && rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN git clone https://github.com/daniel-eder/leantime-mcp.git && \
cd leantime-mcp && \
pip install --no-cache-dir fastmcp && \
pip install --no-cache-dir -e .
WORKDIR /app/leantime-mcp
EXPOSE 8079
CMD ["fastmcp", "run", "src/leantime_mcp/server.py:app", "--transport", "sse", "--port", "8079", "--host", "0.0.0.0"]
```
**Note :** Le transport SSE est obligatoire car MCPO ne supporte pas StreamableHTTP.
### 3. Configurer MCPO
Le fichier `mcpo-config/config.json` (sur le serveur, gitignore) :
```json
{
"mcpServers": {
"leantime": {
"url": "http://leantime-mcp:8079/sse",
"transport": "sse"
}
}
}
```
### 4. Lancer les conteneurs
```bash
cd ~/effi
# Construire leantime-mcp
docker compose build leantime-mcp
# Lancer tout
docker compose up -d leantime-mcp mcpo
# Verifier les logs
docker logs effi-leantime-mcp --tail 10
docker logs mcpo --tail 15
```
### 5. Verifier la connexion
```bash
# Tester l'endpoint MCPO
curl -s http://192.168.1.27:8000/v1/tools | jq '.[].name'
# Doit retourner les outils Leantime :
# list_projects, create_project, list_tickets, etc.
```
### 6. Tester dans Open WebUI
Dans un chat avec Effi, demander :
- "Liste mes projets Leantime"
- "Cree un projet blablabla"
- "Quelles sont les taches du projet X ?"
---
## Problemes connus (MCP)
#### Erreur 400 Bad Request entre MCPO et leantime-mcp
- **Cause** : Incompatibilite de protocole (SSE vs StreamableHTTP)
- **Solution** : Verifier que leantime-mcp utilise `--transport sse` dans le Dockerfile et que MCPO pointe vers `/sse`
#### mcpo-patch.sh est un dossier au lieu d'un fichier
- **Cause** : Conflit Docker quand le fichier n'existe pas encore
- **Solution** : `docker compose down`, supprimer le dossier, recreer le fichier, puis `docker compose up -d`
#### Module leantime_mcp introuvable
- **Cause** : Mauvais WORKDIR ou mauvais chemin dans CMD
- **Solution** : Verifier que WORKDIR est `/app/leantime-mcp` et que le module s'installe avec `pip install -e .`
---
## Ports recapitulatifs
| Service | Hote | Port | Protocole |
|---------|------|------|-----------|
| Leantime Web UI | XPenology NAS | 8380 | HTTP |
| Leantime MySQL | XPenology NAS | 3306 (interne) | MySQL |
| leantime-mcp | effi-server | 8079 | SSE (MCP) |
| MCPO | effi-server | 8000 | HTTP (OpenAI-compatible) |
---
## Reinstallation rapide
Si vous devez tout reinstaller :
```bash
# Sur effi-server
cd ~/effi
# Arreter les conteneurs concernes
docker compose down leantime-mcp mcpo
# Reconstruire leantime-mcp
docker compose build leantime-mcp --no-cache
# Relancer
docker compose up -d leantime-mcp mcpo
# Verifier
docker logs mcpo -f --tail 20
```
```bash
# Sur XPenology (si reinstalle completement)
cd /volume1/docker/leantime
# ATTENTION : detruit les donnees
docker compose down -v
docker compose up -d
```
+16
View File
@@ -0,0 +1,16 @@
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends git && rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN git clone https://github.com/daniel-eder/leantime-mcp.git && \
cd leantime-mcp && \
pip install --no-cache-dir fastmcp && \
pip install --no-cache-dir -e .
WORKDIR /app/leantime-mcp
EXPOSE 8079
CMD ["fastmcp", "run", "src/leantime_mcp/server.py:app", "--transport", "sse", "--port", "8079", "--host", "0.0.0.0"]