From c4467d0da24ae0e9d79b03d90604752edc84d354 Mon Sep 17 00:00:00 2001 From: Folzo Date: Sun, 10 May 2026 17:53:21 +0200 Subject: [PATCH] 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) --- .env.example | 14 +- docker-compose.yml | 22 +++ docs/01-architecture/services.md | 50 +++++ docs/02-configuration/mcp-et-n8n.md | 106 +++++++++-- docs/LEANTIME-INSTALLATION.md | 286 ++++++++++++++++++++++++++++ leantime-mcp/Dockerfile | 16 ++ 6 files changed, 482 insertions(+), 12 deletions(-) create mode 100644 docs/LEANTIME-INSTALLATION.md create mode 100644 leantime-mcp/Dockerfile diff --git a/.env.example b/.env.example index 69c5f44..802f20d 100644 --- a/.env.example +++ b/.env.example @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml index 7c6bdfb..3f261fe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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) diff --git a/docs/01-architecture/services.md b/docs/01-architecture/services.md index af44375..8552a5c 100644 --- a/docs/01-architecture/services.md +++ b/docs/01-architecture/services.md @@ -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) | diff --git a/docs/02-configuration/mcp-et-n8n.md b/docs/02-configuration/mcp-et-n8n.md index e0ade41..b99ccf7 100644 --- a/docs/02-configuration/mcp-et-n8n.md +++ b/docs/02-configuration/mcp-et-n8n.md @@ -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 diff --git a/docs/LEANTIME-INSTALLATION.md b/docs/LEANTIME-INSTALLATION.md new file mode 100644 index 0000000..e2d5955 --- /dev/null +++ b/docs/LEANTIME-INSTALLATION.md @@ -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 +``` \ No newline at end of file diff --git a/leantime-mcp/Dockerfile b/leantime-mcp/Dockerfile new file mode 100644 index 0000000..b99db8d --- /dev/null +++ b/leantime-mcp/Dockerfile @@ -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"] \ No newline at end of file