MCP SFTP Orchestrator

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

Documentación

🚀 MCP Orchestrator — Servidor de orquestación SSH/SFTP

v11.8.0 Security Refresh — Las 82 herramientas ahora publican anotaciones MCP estándar. infra_overview sigue siendo ligero sin argumentos, pero infra_overview { alias: "..." } realiza un descubrimiento en vivo y correlaciona Nginx/dominios, puertos, Docker/Compose y servicios. Ver CHANGELOG.md.

Versión : 11.8.0
Herramientas : 82
Licencia : MIT
Node : >= 18.0.0
Changelog : CHANGELOG.md

Servidor MCP (Model Context Protocol, transporte stdio) que brinda a un agente de IA la capacidad de orquestar un parque de servidores: SSH, SFTP, edición de archivos local/remota (hash-safe), diffs entre servidores, shell PTY, snapshots de infraestructura, notas de protocolo, proyectos, sesiones de trabajo, inventario, confianza SSH (pubkey), grupos de alias y auditoría del parque.


✨ Puntos destacados (v11.6)

ÁmbitoCapacidad
Ejecucióntask_exec multi-servidor / group:oci / dry-run destructivo / force
Archivosfile_read / file_edit (quirúrgico) / file_write + hash + dryRun + backup
Parquenotas, infra_audit, fleet_status, server_inventory
Proyectosregistro local↔remoto + project_diff
Trabajowork_start → ediciones → work_end (nota de intervención automática)
Confianzassh_authorize_key (solo pubkey, dry_run por defecto)
Seguridadsecretos enmascarados, RO global + RO por alias, blocklist, pool SSH robusto

📦 Instalación

git clone https://github.com/fkom13/mcp-sftp-orchestrator.git
cd sftp-mcp   # ou tools/sftp-mcp
npm install
cp .env.example .env
# Éditer MCP_DATA_DIR et chemins de clés

Requisitos previos: Node.js >= 18


⚙️ Configuración (.env)

Todas las variables son opcionales.

VariablePredeterminadoDescripción
MCP_DATA_DIR~/.config/mcp-orchestratorCarpeta de datos (JSON, snapshots, proyectos…)
MCP_SYNC_TIMEOUT_S120Retraso (s) antes de pasar una tarea a segundo plano
MCP_DEFAULT_CMD_TIMEOUT_S600Timeout SSH de comando (s). 0 = infinito
MCP_INTERACTIVE_CMD_TIMEOUT_S300Timeout interactivo (s). 0 = infinito
MCP_MAX_WAIT_TIMEOUT_S600Timeout máximo task_wait (s)
MAX_CONNECTIONS_PER_SERVER5Pool SSH máximo / servidor
MIN_CONNECTIONS_PER_SERVER1Pool SSH mínimo / servidor
IDLE_TIMEOUT300000Cierre de conexión inactiva (ms)
KEEP_ALIVE_INTERVAL30000Keepalive SSH (ms)
MAX_QUEUE_SIZE1000Tamaño máximo de cola de trabajos
SAVE_INTERVAL5000Autoguardado de cola (ms)
MCP_ALLOWED_ROOTS(vacío)Raíces permitidas para rutas locales (CSV)
MCP_READONLYfalse1 = rechaza escrituras / exec mutantes (global)
MCP_COMPACTfalse1 = respuestas truncadas (tokens de agente)
MCP_DEBUGfalseRegistros detallados en stderr

Archivos bajo MCP_DATA_DIR

ArchivoContenido
servers.jsonAlias SSH (host, user, keyPath/password, port?, readonly?)
apis.jsonCatálogo de APIs (secretos enmascarados en herramientas de lectura)
queue.json / queue.backup.jsonTrabajos
history.jsonHistorial de tareas
server_notes.jsonProtocolos / notas por servidor
server_groups.jsonGrupos de alias
projects.jsonRegistro de proyectos
work_sessions.jsonSesiones de trabajo
policies.jsonBlocklist de comandos
tunnels.json / tunnel_allowlist.jsonTúneles SSH
infra_snapshots/Snapshots content-addressable

🔌 Conexión de cliente MCP

Grok / config.toml

[mcp_servers.orchestrator]
command = "node"
args = ["/chemin/absolu/sftp-mcp/server.js"]
# optionnel:
# env = { MCP_DATA_DIR = "/chemin/absolu/sftp-mcp/data" }

OpenCode / Claude Desktop (JSON)

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

Después de modificar el código: recargar el servidor MCP (/mcps → r o reiniciar sesión). Verificar system_diagnostics → version: "11.8.0".


🧰 Referencia de herramientas (82)

Diagnóstico y auditoría

HerramientaDescripción
helpGuía de herramientas + .env + consejos
guideManual de IA (workflows, cheatsheet, errores comunes, auditoría, seguridad)
system_diagnosticsCola, pool, servidores/APIs enmascarados, versión, readOnly
infra_auditResumen del parque + proyectos + notas + bloqueos
infra_overviewServidores + notas (vista ligera)
fleet_statusPing SSH paralelo (latencia, carga, disco)
server_inventoryInventario ligero (pm2/docker/disco/home, caché de 10 min)

Servidores y grupos

HerramientaDescripción
server_addCRUD de alias (keyPath o password, port, readonly)
server_listLista (contraseñas enmascaradas)
server_removeElimina un alias
server_group_list/set/removeGrupos (oci, contabo…). Uso: group:oci o nombre de grupo

Proyectos (v11.6)

HerramientaDescripción
project_list / project_get / project_set / project_removeRegistro
project_resolve→ { local, remote, ignore, runtime }
project_diffDiff local↔remoto del proyecto

Ejemplo project_set:

{
  "name": "p-image",
  "local": { "path": "/home/.../dev-serveur/p-image" },
  "servers": {
    "prod": {
      "alias": "fkomprodmini2_prod",
      "path": "/home/ubuntu/p-image",
      "runtime": { "pm2": "p-image", "port": 5002 },
      "url": "https://pruna.esprit-artificiel.com"
    }
  },
  "ignore": ["node_modules", ".git", "data"]
}

Sesiones de trabajo (v11.6)

HerramientaDescripción
work_startAbre un diario (alias, project, tag, snapshot opcional)
work_logEvento (file_edit, task_exec, …)
work_listSesiones activas (+ historial)
work_endCierre + server_note last_intervention

Confianza SSH (v11.6)

HerramientaDescripción
ssh_authorize_keyAgrega una pubkey en authorized_keys remoto. dry_run por defecto. Fuentes: string | local_path | alias
{
  "target_alias": "fkomprodmini1_prod",
  "source": { "type": "alias", "alias": "vps_contabo" },
  "comment": "fleet-from-contabo",
  "dry_run": true
}

Políticas

HerramientaDescripción
policy_blocklist_list/add/removeBlocklist de comandos (también aplicada a shell + secuencias)

Catálogo de API

HerramientaDescripción
api_add / api_list / api_remove / api_checkMonitoreo (claves enmascaradas en listado)

Ejecución de tareas

HerramientaDescripción
task_execSSH; alias | array | all | group:x; dry_run/force destructivo
task_exec_interactivePrompts sí/no, menús
task_exec_sequenceSecuencia en un servidor (política por paso)
task_transferSFTP upload/download/server_to_server
task_transfer_multiMulti + globs

Archivos / Diff / Shell / Snapshots

FamiliaHerramientas
Archivosfile_read, file_write, file_edit
Diffdiff_files, diff_folders, compare_all_sources
Shellshell_create, shell_exec (+ skip_policy), shell_list, shell_close
Snapshotssnapshot_create/list/diff/restore/delete

Edición segura: file_read → hash → file_edit + expectedHash (+ dryRun / backup).

Notas de servidor

HerramientaDescripción
server_note_set/get/list/removeProtocolo (descripción, servicios, advertencias, intervención)

Monitoreo y registros

HerramientaDescripción
get_system_resourcesCPU / RAM / disco
get_services_statussystemd / Docker / PM2
get_fail2ban_statusFail2Ban
check_api_healthHTTP vía SSH+curl
get_pm2_logs / get_docker_logs / tail_fileRegistros

Cola

HerramientaDescripción
task_queue / task_status / task_history / task_wait / task_logsSeguimiento
task_retry / task_retry_allReintento
task_purgePurga (dry_run por defecto)
queue_stats / pool_statsEstadísticas

Tmux y túneles

HerramientaDescripción
tmux_create/exec/read/list/killSesiones tmux remotas
tunnel_create/list/closeTúneles SSH local/remoto/socks
tunnel_allowlist_add/removePuertos permitidos para túneles

📖 Workflows de agente recomendados

Inicio de sesión

infra_audit  (ou infra_overview)
fleet_status
project_list / project_resolve

Trabajo en un proyecto

work_start { project: "p-image", alias: "fkomprodmini2_prod", tag: "fix-x", message: "…" }
file_read → file_edit (expectedHash, dryRun puis apply)
work_log { type: "file_edit", path: "…" }
work_end { summary: "…" }   → note serveur mise à jour
project_diff { name: "p-image" }

Comandos largos

task_exec { timeout: 0, … }  → si > syncTimeout → task_wait { id }

Destinos multi-servidor

task_exec { alias: "group:oci", cmd: "hostname" }
task_exec { alias: "all", cmd: "uptime" }

🏗️ Arquitectura

Client MCP (stdio)
    │
server.js ─── 82 tools
    │
    ├── queue.js          File d’attente persistante + purge/retry
    ├── ssh.js / sshPool  Exécution + pool (retry safe, port configurable)
    ├── sftp.js           Transferts (server_to_server via sourceAdapter/pool)
    ├── sourceAdapter.js  Local fs | remote SFTP pool
    ├── fileOps.js        Read/write/edit + hash + dryRun + backup
    ├── diffEngine.js / compareEngine.js / diffFormatter.js
    ├── shellSessions.js  PTY persistants + policy
    ├── snapshotManager.js
    ├── projects.js / workSession.js / inventory.js / groups.js / fleet.js
    ├── sshTrust.js       authorized_keys (pubkey only)
    ├── servers.js / apis.js / notes.js / policies.js / tunnels.js
    ├── history.js / guide.js / config.js / utils.js

Ciclo de vida de un trabajo

pending → running → completed | failed | partial
                      ↓ (redémarrage MCP pendant running)
                    crashed → task_retry → pending

🔒 Seguridad

MecanismoDetalle
SecretosEnmascarados en api_list / diagnósticos (*** + últimos 4 caracteres)
Escape de shellescapeShellArg en curl, registros, rutas
Blocklistpolicies.json; shell + secuencia incluidos; skip_policy para forzar
RO globalMCP_READONLY=1
RO alias"readonly": true en servers.json
Destructivotask_exec dry-run si patrón peligroso sin force:true
ConfianzaSolo pubkey; dry_run por defecto
ClavesPreferir keyPath SSH; Vaultwarden para secretos de API

🧪 Pruebas

npm test:unit    # p0 + p1 + p16 (43 tests)
npm test         # unit + smoke MCP + features
node diagnose.js # diagnostic local optionnel
ArchivoCobertura
test_p0_unit.jsutils, políticas, redact, timeouts, versión
test_p1_unit.jsgrupos, purge, destructivo, entorno RO
test_p16_unit.jsproyectos, sesión de trabajo, compact, sshTrust
test_mcp.jssmoke SDK
test_features.jscola / pool / globs / prompts

🛣️ Versiones recientes

VersiónContenidoSnapshot gencodedoc
11.6.1Endurecimiento multi-agente: RO transversal, carpetas/fuerza servidor a servidor, raíces permitidas anti-symlink, quoting shell/tmux, cola + almacenes JSON atómicos—
11.6.0Proyectos, sesiones de trabajo, inventario, ssh_authorize_key, RO alias, compact#23 (documentación final)
11.4.0fleet, infra_audit, grupos, retry_all, purge, reescritura de pool#21
11.3.0Enmascaramiento de secretos, política shell/seq, puerto SSH, espera parcial#20
10.4–10.0operaciones de archivo, diff, shell, snapshots, notas, guía#17–19
9.x / 8.xSFTP force, timeouts, interactivo, seguridad básica—

Detalle: CHANGELOG.md · planes históricos: ROADMAP.md, ROADMAP_EXTENDED.md.


📄 Licencia

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