MCP SFTP Orchestrator Server

Orquesta tareas en servidores remotos mediante SSH y SFTP con una cola persistente. Ideal para DevOps y agentes de IA.

Documentación

🚀 MCP Orchestrator — Serveur d'orchestration SSH/SFTP

Version : 9.0.1
License : MIT
Node : >= 18.0.0

Un serveur MCP (Model Context Protocol) qui donne à un agent IA la capacité d'exécuter des commandes SSH, des transferts SFTP, et du monitoring sur des serveurs distants. File d'attente persistante, pool de connexions SSH, exécution hybride synchrone/asynchrone.


📦 Installation

git clone https://github.com/fkom13/mcp-sftp-orchestrator.git
cd sftp-mcp
npm install
cp .env.example .env
# Éditer .env avec vos chemins

Prérequis : Node.js >= 18.0.0


⚙️ Configuration (.env)

Toutes les variables sont optionnelles. Les valeurs par défaut sont conçues pour un usage standard.

VariableDéfautDescription
MCP_DATA_DIR~/.config/mcp-orchestratorDossier où sont stockés servers.json, apis.json, queue.json, history.json
MCP_SYNC_TIMEOUT_S120Délai en secondes avant qu'une tâche passe en arrière-plan (retour immédiat au client, tâche continue)
MCP_DEFAULT_CMD_TIMEOUT_S600Timeout SSH par défaut en secondes. 0 = aucune limite
MCP_INTERACTIVE_CMD_TIMEOUT_S300Timeout pour les commandes interactives. 0 = aucune limite
MCP_MAX_WAIT_TIMEOUT_S600Timeout maximum pour l'outil task_wait
MAX_CONNECTIONS_PER_SERVER5Nombre max de connexions SSH simultanées par serveur
MIN_CONNECTIONS_PER_SERVER1Nombre min de connexions SSH maintenues par serveur
IDLE_TIMEOUT300000Délai en ms avant fermeture d'une connexion SSH inactive (5 min)
KEEP_ALIVE_INTERVAL30000Intervalle keepalive SSH en ms (30s)
MAX_QUEUE_SIZE1000Nombre maximum de jobs dans la file d'attente
SAVE_INTERVAL5000Intervalle de sauvegarde de la queue sur disque en ms (5s)
MCP_DEBUGfalsetrue pour activer les logs détaillés dans stderr

🔌 Connexion au client MCP (OpenCode, Claude Desktop, etc.)

{
  "mcpServers": {
    "orchestrator": {
      "command": "node",
      "args": ["/chemin/vers/sftp-mcp/server.js"],
      "env": {
        "MCP_DATA_DIR": "/chemin/vers/sftp-mcp/data"
      }
    }
  }
}

🧰 Référence des Outils (29 outils)

Diagnostic & Aide

OutilDescription
helpGuide complet : liste des outils, variables .env, astuces d'utilisation
system_diagnosticsDiagnostic complet (queue, pool, serveurs, APIs). verbose:true pour les logs

Gestion des Serveurs

OutilDescription
server_addAjouter/modifier un alias de serveur (host, user, keyPath ou password)
server_listLister tous les serveurs configurés avec leurs détails
server_removeSupprimer un alias de serveur

Gestion du Catalogue API

OutilDescription
api_addAjouter une API au catalogue de monitoring
api_listLister toutes les APIs configurées
api_removeSupprimer une API du catalogue
api_checkTest de santé d'une API via son alias (utilise SSH + curl)

Exécution de Tâches

OutilDescription
task_execExécuter une commande SSH. Paramètre timeout en secondes (0 = infini)
task_exec_interactiveSSH avec gestion des prompts (yes/no, menus, passwords). Supporte responses avec regex
task_exec_sequenceSéquence de plusieurs commandes SSH sur le même serveur
task_transferTransfert SFTP fichier ou dossier. force:true pour écraser sans confirmation
task_transfer_multiTransferts SFTP multiples avec support de patterns glob (*, ?, [])

Monitoring

OutilDescription
get_system_resourcesCPU, RAM, Disque d'un serveur
get_services_statusStatut des services systemd, Docker, PM2
get_fail2ban_statusStatut Fail2Ban (toutes les jails ou une spécifique)
check_api_healthTest HTTP direct sur une URL (via SSH + curl)

Logs

OutilDescription
get_pm2_logsLogs PM2 d'une application spécifique ou toutes
get_docker_logsLogs d'un container Docker
tail_fileDernières lignes d'un fichier distant (équivalent tail -n)

File d'Attente & Suivi

OutilDescription
task_queueVoir toutes les tâches (en cours, en attente, terminées)
task_statusDétail complet d'une tâche par son ID
task_historyHistorique des tâches exécutées, filtrable par alias
task_retryRelancer une tâche échouée ou crashée
task_waitAttendre la fin d'une tâche passée en arrière-plan (jusqu'à 600s)
task_logsLogs internes du système MCP
queue_statsStatistiques de la file d'attente
pool_statsStatistiques du pool de connexions SSH

📖 Guide d'Utilisation

Commandes longues (docker build, grosses installs)

1. Lancer avec timeout:0 → task_exec { alias: "vps", cmd: "docker build ...", timeout: 0 }
2. Si ça dépasse 120s → passe en arrière-plan avec un ID
3. Récupérer le résultat → task_wait { id: "abc123" }

Transferts SFTP (façon FileZilla)

  • Fichier nouveau : upload/download sans rien de spécial
  • Fichier existe déjà : refusé avec message "Utilisez force:true pour écraser"
  • Avec force: true : écrase sans rien demander
  • Dossier → dossier : transfert récursif automatique
  • Patterns glob : task_transfer_multi avec *.txt, data?.json, etc.

Mode interactif

{
  "alias": "vps",
  "cmd": "apt upgrade",
  "interactive": true,
  "autoRespond": true,
  "responses": {
    "Do you want to continue": "y",
    "restart services": "yes"
  }
}

Les clés de responses supportent les expressions régulières. Ex: "[YyNn]\\\\?""y".


🏗️ Architecture

Client MCP (stdio ou HTTP)
    │
server.js ─── 29 outils MCP enregistrés
    │
    ├── queue.js ─── File d'attente persistante (JSON + backup auto)
    ├── ssh.js ───── Exécution SSH (pool ou connexion dédiée interactive)
    ├── sftp.js ──── Transferts SFTP (upload/download, glob, force)
    ├── sshPool.js ─ Pool de connexions SSH persistantes (max 5/serveur)
    ├── servers.js ─ CRUD alias de serveurs
    ├── apis.js ──── CRUD catalogue d'APIs
    ├── history.js ─ Historique des 500 dernières tâches
    ├── config.js ── Configuration centralisée (CLI > .env > defaults)
    └── utils.js ─── Utilitaires (escapeShellArg)

Cycle de vie d'un job

pending → running → completed / failed
                      ↓ (si redémarrage pendant running)
                    crashed → retry → pending

🔒 Sécurité

  • escapeShellArg() : toutes les URLs et chemins sont échappés avant d'être passés à curl/shell
  • Détection de secrets en clair : au démarrage, un warning est loggé si servers.json ou apis.json contiennent des mots de passe/clés API
  • Recommandation : utilisez des clés SSH (pas de mots de passe) et stockez les clés API dans Vaultwarden plutôt qu'en clair

🧪 Tests

node diagnose.js        # Diagnostic complet
node test_mcp.js        # Test smoke MCP
node test_features.js   # Tests unitaires (queue, pool, glob, prompts, crash)

🛣️ Roadmap

VersionChangement
8.2.0Ménage, uniformisation erreurs, nettoyage logs
8.3.0Transferts SFTP blindés (fichier vs dossier, force:true)
8.4.0Timeouts longues opérations, task_wait
8.5.0SSH interactif amélioré (menus, regex, password)
8.6.0Sécurité (escapeShellArg, détection secrets)
9.0.0Nettoyage, uniformisation finale, outil help, transport stdio uniquement
9.0.1Corrections sécurité (injection shell, vestiges code)

📄 Licence

MIT — Copyright (c) 2025-2026 Franck (fkom13)