@fkom13/mcp-sftp-orchestrator 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +22 -0
- package/README.md +102 -0
- package/apis.js +88 -0
- package/config.js +34 -0
- package/history.js +44 -0
- package/package.json +40 -0
- package/publish1github.md +216 -0
- package/queue.js +377 -0
- package/server.js +773 -0
- package/servers.js +58 -0
- package/sftp.js +248 -0
- package/ssh.js +492 -0
- package/sshPool.js +272 -0
- package/test_features.js +112 -0
package/.env.example
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Chemin où seront stockés les fichiers servers.json et history.json
|
|
2
|
+
# Par défaut, ce sera ~/.config/mcp-orchestrator
|
|
3
|
+
MCP_DATA_DIR="/home/fkomp/Bureau/oracle/tools/sftp-mcp/data"
|
|
4
|
+
|
|
5
|
+
# Délai en secondes avant qu'une tâche ne passe en arrière-plan (mode asynchrone)
|
|
6
|
+
MCP_SYNC_TIMEOUT_S=30
|
|
7
|
+
|
|
8
|
+
# Timeout pour l'exécution synchrone (ms)
|
|
9
|
+
SYNC_TIMEOUT=30000
|
|
10
|
+
|
|
11
|
+
# Taille maximale de la queue
|
|
12
|
+
MAX_QUEUE_SIZE=1000
|
|
13
|
+
|
|
14
|
+
# Pool de connexions
|
|
15
|
+
MAX_CONNECTIONS_PER_SERVER=5
|
|
16
|
+
MIN_CONNECTIONS_PER_SERVER=1
|
|
17
|
+
IDLE_TIMEOUT=320000
|
|
18
|
+
KEEP_ALIVE_INTERVAL=300000
|
|
19
|
+
|
|
20
|
+
# Sauvegarde
|
|
21
|
+
SAVE_INTERVAL=5000
|
|
22
|
+
HISTORY_RETENTION=2678400000
|
package/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# 🚀 MCP SFTP/SSH Orchestrator
|
|
2
|
+
|
|
3
|
+
Un serveur MCP (Model-Context-Protocol) puissant pour l'orchestration de tâches distantes. Il gère des connexions SSH et SFTP, une file d'attente de tâches persistante, et expose un ensemble riche d'outils pour la gestion de serveurs, le monitoring, et l'exécution de commandes via une interface `stdio` compatible avec les LLM.
|
|
4
|
+
|
|
5
|
+
✨ **Fonctionnalités Principales**
|
|
6
|
+
|
|
7
|
+
- **Gestion de Serveurs** : Ajoutez, listez et supprimez des configurations de serveurs SSH/SFTP.
|
|
8
|
+
- **Exécution de Tâches SSH** : Simple, interactive, ou en séquence.
|
|
9
|
+
- **Transferts de Fichiers SFTP** : Upload/Download de fichiers et dossiers, avec support des patterns `glob`.
|
|
10
|
+
- **File d'Attente Intelligente** : Mode hybride (synchrone/asynchrone) et persistance des tâches.
|
|
11
|
+
- **Pooling de Connexions** : Gère un pool de connexions SSH pour une exécution ultra-rapide.
|
|
12
|
+
- **Outils de Monitoring** : Surveillez les ressources système, le statut des services (systemd, Docker, PM2) et Fail2Ban.
|
|
13
|
+
- **Outils de Logs** : Récupérez les logs de PM2, Docker, ou suivez la fin d'un fichier (`tail`).
|
|
14
|
+
|
|
15
|
+
## 📦 Installation
|
|
16
|
+
|
|
17
|
+
Ce projet est conçu pour être utilisé comme un outil MCP dans un environnement compatible (comme la `gemini-cli`).
|
|
18
|
+
|
|
19
|
+
Enregistrez ce MCP auprès de votre client en utilisant la configuration suivante :
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"mcp-sftp-orchestrator": {
|
|
25
|
+
"command": "npx",
|
|
26
|
+
"args": [
|
|
27
|
+
"@fkom13/mcp-sftp-orchestrator"
|
|
28
|
+
],
|
|
29
|
+
"env": {
|
|
30
|
+
"MCP_DATA_DIR": "~/.config/mcp-orchestrator"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Le client MCP lancera automatiquement le serveur via `npx` lors de son premier appel.
|
|
38
|
+
|
|
39
|
+
## 🛠️ Configuration
|
|
40
|
+
|
|
41
|
+
Le serveur est configurable via des variables d'environnement. Vous pouvez créer un fichier `.env` à la racine du projet si vous l'exécutez localement pour le développement.
|
|
42
|
+
|
|
43
|
+
- `MCP_DATA_DIR`: Le dossier où seront stockées les données (configurations des serveurs, historique, etc.). Par défaut : `~/.config/mcp-orchestrator`.
|
|
44
|
+
- `MCP_SYNC_TIMEOUT_S`: Le délai en secondes avant qu'une tâche longue ne passe en arrière-plan. Par défaut : `30`.
|
|
45
|
+
|
|
46
|
+
## 🧰 Référence des Outils (API)
|
|
47
|
+
|
|
48
|
+
Voici la liste complète des outils exposés par ce serveur MCP.
|
|
49
|
+
|
|
50
|
+
### Gestion des Serveurs
|
|
51
|
+
|
|
52
|
+
- `server_add`: Enregistre ou met à jour les informations de connexion d'un serveur.
|
|
53
|
+
- `server_list`: Affiche la liste de tous les alias de serveurs configurés.
|
|
54
|
+
- `server_remove`: Supprime un alias de serveur de la configuration.
|
|
55
|
+
|
|
56
|
+
### Exécution de Tâches
|
|
57
|
+
|
|
58
|
+
- `task_exec`: Exécute une commande SSH (hybride synchrone/asynchrone).
|
|
59
|
+
- `task_transfer`: Transfère un fichier ou dossier via SFTP (hybride synchrone/asynchrone).
|
|
60
|
+
- `task_exec_interactive`: Exécute une commande SSH interactive (gère les prompts `yes/no`, etc.).
|
|
61
|
+
- `task_exec_sequence`: Exécute plusieurs commandes SSH en séquence sur le même serveur.
|
|
62
|
+
- `task_transfer_multi`: Transfère plusieurs fichiers/dossiers avec support de patterns `glob`.
|
|
63
|
+
|
|
64
|
+
### Monitoring & Diagnostics
|
|
65
|
+
|
|
66
|
+
- `get_system_resources`: Récupère les métriques système vitales (CPU, RAM, Disque).
|
|
67
|
+
- `get_services_status`: Récupère le statut des services (systemd, Docker, PM2).
|
|
68
|
+
- `get_fail2ban_status`: Récupère les informations du service Fail2Ban.
|
|
69
|
+
|
|
70
|
+
### Récupération de Logs
|
|
71
|
+
|
|
72
|
+
- `get_pm2_logs`: Raccourci pour récupérer les logs PM2.
|
|
73
|
+
- `get_docker_logs`: Raccourci pour récupérer les logs d'un container Docker.
|
|
74
|
+
- `tail_file`: Affiche les dernières lignes d'un fichier distant.
|
|
75
|
+
|
|
76
|
+
### Gestion de la File d'Attente (Queue)
|
|
77
|
+
|
|
78
|
+
- `task_queue`: Affiche le statut de toutes les tâches dans la file d'attente.
|
|
79
|
+
- `task_status`: Récupère les détails d'une tâche par son ID.
|
|
80
|
+
- `task_history`: Affiche l'historique des dernières tâches lancées.
|
|
81
|
+
- `task_retry`: Relance une tâche qui a échoué ou crashé.
|
|
82
|
+
- `queue_stats`: Affiche les statistiques de la queue de tâches.
|
|
83
|
+
|
|
84
|
+
### Gestion des APIs (Monitoring Externe)
|
|
85
|
+
|
|
86
|
+
- `api_add`: Ajoute une API au catalogue de monitoring.
|
|
87
|
+
- `api_list`: Affiche toutes les APIs configurées.
|
|
88
|
+
- `api_remove`: Supprime une API du catalogue.
|
|
89
|
+
- `api_check`: Lance un test de santé sur une API.
|
|
90
|
+
|
|
91
|
+
### Administration du Serveur MCP
|
|
92
|
+
|
|
93
|
+
- `task_logs`: Affiche les logs du système MCP lui-même.
|
|
94
|
+
- `pool_stats`: Affiche les statistiques du pool de connexions SSH.
|
|
95
|
+
|
|
96
|
+
## 🤝 Contribution
|
|
97
|
+
|
|
98
|
+
Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une *Issue* pour signaler un bug ou proposer une fonctionnalité, ou une *Pull Request* pour soumettre des modifications.
|
|
99
|
+
|
|
100
|
+
## 📄 Licence
|
|
101
|
+
|
|
102
|
+
Ce projet est sous licence MIT.
|
package/apis.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import config from './config.js';
|
|
4
|
+
|
|
5
|
+
const APIS_FILE = path.join(config.dataDir, 'apis.json');
|
|
6
|
+
|
|
7
|
+
let apis = {};
|
|
8
|
+
|
|
9
|
+
let isInitialized = false;
|
|
10
|
+
let initPromise = null;
|
|
11
|
+
|
|
12
|
+
// Charger les APIs au démarrage
|
|
13
|
+
async function loadApis() {
|
|
14
|
+
try {
|
|
15
|
+
const data = await fs.readFile(APIS_FILE, 'utf-8');
|
|
16
|
+
apis = JSON.parse(data);
|
|
17
|
+
} catch (err) {
|
|
18
|
+
if (err.code === 'ENOENT') {
|
|
19
|
+
// Le fichier n'existe pas encore, c'est normal
|
|
20
|
+
apis = {};
|
|
21
|
+
} else {
|
|
22
|
+
console.error("Erreur lors du chargement de apis.json:", err);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function ensureInitialized() {
|
|
28
|
+
if (isInitialized) return;
|
|
29
|
+
if (!initPromise) {
|
|
30
|
+
initPromise = loadApis().then(() => { isInitialized = true; });
|
|
31
|
+
}
|
|
32
|
+
return initPromise;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Sauvegarder les APIs
|
|
36
|
+
async function saveApis() {
|
|
37
|
+
await ensureInitialized();
|
|
38
|
+
try {
|
|
39
|
+
await fs.writeFile(APIS_FILE, JSON.stringify(apis, null, 2));
|
|
40
|
+
} catch (err) {
|
|
41
|
+
console.error("Erreur lors de la sauvegarde de apis.json:", err);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Ajouter ou mettre à jour une API
|
|
46
|
+
async function addApi(alias, apiConfig) {
|
|
47
|
+
await ensureInitialized();
|
|
48
|
+
apis[alias] = apiConfig;
|
|
49
|
+
await saveApis();
|
|
50
|
+
return { success: true, message: `API '${alias}' ajoutée/mise à jour avec succès.` };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Lister toutes les APIs
|
|
54
|
+
async function listApis() {
|
|
55
|
+
await ensureInitialized();
|
|
56
|
+
return apis;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Obtenir une API par son alias
|
|
60
|
+
async function getApi(alias) {
|
|
61
|
+
await ensureInitialized();
|
|
62
|
+
const apiConfig = apis[alias];
|
|
63
|
+
if (!apiConfig) {
|
|
64
|
+
throw new Error(`L'alias d'API '${alias}' est inconnu.`);
|
|
65
|
+
}
|
|
66
|
+
return apiConfig;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Supprimer une API
|
|
70
|
+
async function removeApi(alias) {
|
|
71
|
+
await ensureInitialized();
|
|
72
|
+
if (!apis[alias]) {
|
|
73
|
+
throw new Error(`L'alias d'API '${alias}' est inconnu.`);
|
|
74
|
+
}
|
|
75
|
+
delete apis[alias];
|
|
76
|
+
await saveApis();
|
|
77
|
+
return { success: true, message: `API '${alias}' supprimée avec succès.` };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Initialiser le module
|
|
81
|
+
ensureInitialized();
|
|
82
|
+
|
|
83
|
+
export default {
|
|
84
|
+
addApi,
|
|
85
|
+
listApis,
|
|
86
|
+
getApi,
|
|
87
|
+
removeApi
|
|
88
|
+
};
|
package/config.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
|
|
7
|
+
// --- Début de la Correction ---
|
|
8
|
+
// Trouve le chemin du .env par rapport à l'emplacement de ce script, et non du répertoire de travail
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
dotenv.config({ path: path.join(__dirname, '.env') });
|
|
12
|
+
// --- Fin de la Correction ---
|
|
13
|
+
|
|
14
|
+
// Analyser les arguments de la ligne de commande (ex: --data-dir=...)
|
|
15
|
+
const args = process.argv.slice(2).reduce((acc, arg) => {
|
|
16
|
+
const [key, value] = arg.split('=');
|
|
17
|
+
if (key && value) {
|
|
18
|
+
acc[key.replace(/^--/, '')] = value;
|
|
19
|
+
}
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
|
|
23
|
+
const config = {
|
|
24
|
+
// La hiérarchie reste la même : les arguments en ligne de commande écrasent le .env, qui écrase le défaut.
|
|
25
|
+
dataDir: args['data-dir'] || process.env.MCP_DATA_DIR || path.join(os.homedir(), '.config', 'mcp-orchestrator'),
|
|
26
|
+
syncTimeout: parseInt(args['sync-timeout'] || process.env.MCP_SYNC_TIMEOUT_S || '10', 10) * 1000,
|
|
27
|
+
defaultCommandTimeout: parseInt(process.env.MCP_DEFAULT_CMD_TIMEOUT_MS || '300000', 10),
|
|
28
|
+
interactiveCommandTimeout: parseInt(process.env.MCP_INTERACTIVE_CMD_TIMEOUT_MS || '120000', 10)
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Créer le dossier de données s'il n'existe pas
|
|
32
|
+
fs.mkdirSync(config.dataDir, { recursive: true });
|
|
33
|
+
|
|
34
|
+
export default config;
|
package/history.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import config from './config.js';
|
|
4
|
+
const HISTORY_FILE_PATH = path.join(config.dataDir, 'history.json');
|
|
5
|
+
|
|
6
|
+
async function readHistory() {
|
|
7
|
+
try {
|
|
8
|
+
await fs.access(HISTORY_FILE_PATH);
|
|
9
|
+
const data = await fs.readFile(HISTORY_FILE_PATH, 'utf-8');
|
|
10
|
+
return JSON.parse(data);
|
|
11
|
+
} catch (error) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function writeHistory(history) {
|
|
17
|
+
await fs.writeFile(HISTORY_FILE_PATH, JSON.stringify(history, null, 2));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function logTask(jobDetails) {
|
|
21
|
+
const history = await readHistory();
|
|
22
|
+
const logEntry = {
|
|
23
|
+
jobId: jobDetails.id,
|
|
24
|
+
timestamp: new Date().toISOString(),
|
|
25
|
+
type: jobDetails.type,
|
|
26
|
+
alias: jobDetails.alias,
|
|
27
|
+
command: jobDetails.type === 'ssh' ? jobDetails.cmd : `${jobDetails.direction} ${jobDetails.local} -> ${jobDetails.remote}`
|
|
28
|
+
};
|
|
29
|
+
history.unshift(logEntry); // Ajoute au début
|
|
30
|
+
if (history.length > 500) { // Garde les 500 dernières commandes
|
|
31
|
+
history.pop();
|
|
32
|
+
}
|
|
33
|
+
await writeHistory(history);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function getHistory(filters = {}) {
|
|
37
|
+
let history = await readHistory();
|
|
38
|
+
if (filters.alias) {
|
|
39
|
+
history = history.filter(log => log.alias === filters.alias);
|
|
40
|
+
}
|
|
41
|
+
return history;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default { logTask, getHistory };
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fkom13/mcp-sftp-orchestrator",
|
|
3
|
+
"version": "6.0.0",
|
|
4
|
+
"description": "Un serveur MCP stdio pour l'orchestration de tâches distantes avec exécution hybride (synchrone/asynchrone) et configuration flexible.",
|
|
5
|
+
"main": "server.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mcp-sftp-orchestrator": "server.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"test": "node test_features.js"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/fkom13/mcp-sftp-orchestrator.git"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"orchestrator",
|
|
20
|
+
"ssh",
|
|
21
|
+
"sftp",
|
|
22
|
+
"automation"
|
|
23
|
+
],
|
|
24
|
+
"author": "fkom13",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://github.com/fkom13/mcp-sftp-orchestrator/issues"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://github.com/fkom13/mcp-sftp-orchestrator#readme",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@modelcontextprotocol/sdk": "^1.17.0",
|
|
32
|
+
"dotenv": "^16.4.5",
|
|
33
|
+
"glob": "^11.0.3",
|
|
34
|
+
"micromatch": "^4.0.5",
|
|
35
|
+
"ssh2": "^1.15.0",
|
|
36
|
+
"ssh2-sftp-client": "^9.1.0",
|
|
37
|
+
"uuid": "^9.0.1",
|
|
38
|
+
"zod": "^3.23.8"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
C'est un excellent projet ! Vous avez mis en place un orchestrateur MCP très complet avec un pool de connexions SSH, une file d'attente persistante, et une gestion avancée des tâches.
|
|
2
|
+
|
|
3
|
+
Pour le publier sur GitHub et rédiger un bon README.md, voici une approche structurée et un modèle de README que vous pouvez copier-coller et adapter.
|
|
4
|
+
|
|
5
|
+
1. Comment le Rendre Public sur GitHub
|
|
6
|
+
"Rendre public" un projet MCP comme le vôtre signifie deux choses :
|
|
7
|
+
|
|
8
|
+
Héberger le code source (pour que d'autres puissent le télécharger et l'exécuter).
|
|
9
|
+
|
|
10
|
+
Rendre le serveur MCP "découvrable" (pour que les clients MCP, comme les LLM, puissent l'utiliser).
|
|
11
|
+
|
|
12
|
+
Votre projet est un serveur stdio, ce qui signifie qu'il est conçu pour être exécuté localement par un client MCP (il communique via stdin/stdout, pas via un port réseau). Le "public" ici signifie que d'autres personnes peuvent cloner votre dépôt et l'exécuter localement pour gérer leurs propres serveurs.
|
|
13
|
+
|
|
14
|
+
Étapes pour la Publication :
|
|
15
|
+
Nettoyer le projet :
|
|
16
|
+
|
|
17
|
+
Assurez-vous que votre fichier .gitignore inclut bien /node_modules, .env, et le contenu de votre dossier data/ (comme servers.json, queue.json, etc.) pour ne pas "commiter" vos secrets ou vos données personnelles.
|
|
18
|
+
|
|
19
|
+
Un bon .gitignore pour ce projet :
|
|
20
|
+
|
|
21
|
+
Extrait de code
|
|
22
|
+
|
|
23
|
+
# Fichiers de dépendances
|
|
24
|
+
node_modules/
|
|
25
|
+
|
|
26
|
+
# Fichiers de configuration locaux
|
|
27
|
+
.env
|
|
28
|
+
|
|
29
|
+
# Données de l'application (contient des clés, l'historique, etc.)
|
|
30
|
+
data/*.json
|
|
31
|
+
data/*.backup.json
|
|
32
|
+
# Gardez les fichiers .json d'exemple si vous en avez
|
|
33
|
+
!data/servers.example.json
|
|
34
|
+
Créer le dépôt GitHub :
|
|
35
|
+
|
|
36
|
+
Allez sur GitHub et créez un nouveau dépôt public (par exemple, sftp-mcp-orchestrator).
|
|
37
|
+
|
|
38
|
+
N'initialisez PAS avec un README ou .gitignore si vous avez déjà les vôtres.
|
|
39
|
+
|
|
40
|
+
Lier et Pousser votre code :
|
|
41
|
+
|
|
42
|
+
Dans votre dossier de projet local, exécutez ces commandes (en remplaçant l'URL par la vôtre) :
|
|
43
|
+
|
|
44
|
+
Bash
|
|
45
|
+
|
|
46
|
+
# Initialiser git (si ce n'est pas déjà fait)
|
|
47
|
+
git init -b main
|
|
48
|
+
git add .
|
|
49
|
+
git commit -m "Initial commit: Ajout du serveur MCP Orchestrator"
|
|
50
|
+
|
|
51
|
+
# Lier à votre dépôt distant
|
|
52
|
+
git remote add origin https://github.com/VOTRE_NOM_UTILISATEUR/sftp-mcp-orchestrator.git
|
|
53
|
+
|
|
54
|
+
# Pousser le code
|
|
55
|
+
git push -u origin main
|
|
56
|
+
Ajouter une Licence :
|
|
57
|
+
|
|
58
|
+
Créez un fichier LICENSE à la racine. Pour un projet de ce type, MIT ou Apache 2.0 sont des choix courants et permissifs. Cela indique aux autres comment ils peuvent utiliser votre code.
|
|
59
|
+
|
|
60
|
+
Rédiger le README.md :
|
|
61
|
+
|
|
62
|
+
C'est l'étape la plus importante pour l'adoption. Créez un fichier README.md à la racine de votre projet.
|
|
63
|
+
|
|
64
|
+
2. Modèle de Documentation README.md
|
|
65
|
+
Voici un modèle complet pour votre README.md. Copiez-collez ce contenu dans un fichier README.md à la racine de votre projet et modifiez l'URL du dépôt.
|
|
66
|
+
|
|
67
|
+
(Début du fichier README.md)
|
|
68
|
+
|
|
69
|
+
🚀 sftp-mcp: Orchestrateur de Tâches Distantes
|
|
70
|
+
Un serveur MCP (Model-Context-Protocol) puissant pour l'orchestration de tâches distantes. Il gère des connexions SSH et SFTP, une file d'attente de tâches persistante, et expose un ensemble riche d'outils pour la gestion de serveurs, le monitoring, et l'exécution de commandes via une interface stdio compatible avec les LLM.
|
|
71
|
+
|
|
72
|
+
✨ Fonctionnalités Principales
|
|
73
|
+
Gestion de Serveurs : Ajoutez, listez et supprimez des configurations de serveurs SSH/SFTP (stockées de manière sécurisée).
|
|
74
|
+
|
|
75
|
+
Exécution de Tâches SSH :
|
|
76
|
+
|
|
77
|
+
Exécution simple (task_exec).
|
|
78
|
+
|
|
79
|
+
Exécution interactive avec gestion des prompts (task_exec_interactive).
|
|
80
|
+
|
|
81
|
+
Exécution de séquences de commandes (task_exec_sequence).
|
|
82
|
+
|
|
83
|
+
Transferts de Fichiers SFTP :
|
|
84
|
+
|
|
85
|
+
Upload/Download de fichiers et dossiers (task_transfer).
|
|
86
|
+
|
|
87
|
+
Support des patterns "glob" pour les transferts multiples (task_transfer_multi).
|
|
88
|
+
|
|
89
|
+
File d'Attente (Queue) Intelligente :
|
|
90
|
+
|
|
91
|
+
Hybride : Les tâches rapides retournent un résultat direct (synchrone) ; les tâches longues passent en arrière-plan (asynchrone).
|
|
92
|
+
|
|
93
|
+
Persistante : La file d'attente est sauvegardée sur disque et restaurée au redémarrage.
|
|
94
|
+
|
|
95
|
+
Reprise sur Erreur : Les tâches "crashées" (si le serveur redémarre) peuvent être relancées (task_retry).
|
|
96
|
+
|
|
97
|
+
Pooling de Connexions : Gère un pool de connexions SSH persistantes pour une exécution ultra-rapide des commandes.
|
|
98
|
+
|
|
99
|
+
Outils de Monitoring : Récupérez les ressources système, le statut des services (systemd, Docker, PM2) et le statut de Fail2Ban.
|
|
100
|
+
|
|
101
|
+
Outils de Logs : Récupérez facilement les logs de PM2, de Docker, ou suivez la fin d'un fichier (tail).
|
|
102
|
+
|
|
103
|
+
Catalogue d'API : Gérez et monitorez la santé de vos propres API externes.
|
|
104
|
+
|
|
105
|
+
⚙️ Installation
|
|
106
|
+
Clonez le dépôt :
|
|
107
|
+
|
|
108
|
+
Bash
|
|
109
|
+
|
|
110
|
+
git clone https://github.com/VOTRE_NOM_UTILISATEUR/sftp-mcp-orchestrator.git
|
|
111
|
+
cd sftp-mcp-orchestrator
|
|
112
|
+
Installez les dépendances :
|
|
113
|
+
|
|
114
|
+
Bash
|
|
115
|
+
|
|
116
|
+
npm install
|
|
117
|
+
🛠️ Configuration
|
|
118
|
+
Créez votre fichier .env :
|
|
119
|
+
|
|
120
|
+
Bash
|
|
121
|
+
|
|
122
|
+
cp .env.example .env
|
|
123
|
+
Modifiez le .env (Optionnel) : Le script créera par défaut un dossier de données dans ~/.config/mcp-orchestrator. Vous pouvez changer ce comportement en modifiant MCP_DATA_DIR dans votre fichier .env.
|
|
124
|
+
|
|
125
|
+
Extrait de code
|
|
126
|
+
|
|
127
|
+
# Chemin où seront stockés servers.json, history.json, etc.
|
|
128
|
+
MCP_DATA_DIR="/home/user/.config/mcp-orchestrator"
|
|
129
|
+
|
|
130
|
+
# Délai en secondes avant qu'une tâche ne passe en arrière-plan
|
|
131
|
+
MCP_SYNC_TIMEOUT_S=30
|
|
132
|
+
Ajoutez votre premier serveur : Ce serveur n'est utile que s'il peut se connecter à d'autres machines. Vous devez ajouter des serveurs via un client MCP (comme un LLM ou un CLI) en utilisant l'outil server_add.
|
|
133
|
+
|
|
134
|
+
Exemple d'appel (ce que vous demanderiez à votre LLM) :
|
|
135
|
+
|
|
136
|
+
"Ajoute un serveur avec l'alias vps_prod, l'hôte 123.45.67.89, l'utilisateur admin et le chemin de clé /home/user/.ssh/id_rsa_prod."
|
|
137
|
+
|
|
138
|
+
🏃 Lancement
|
|
139
|
+
Ce projet est un serveur MCP stdio. Il n'expose pas de port HTTP. Il est conçu pour être lancé par un client MCP (comme un SDK ou un CLI) qui communique avec lui via l'entrée/sortie standard.
|
|
140
|
+
|
|
141
|
+
Pour l'utiliser, vous devez enregistrer ce serveur auprès de votre client MCP. La commande de lancement est :
|
|
142
|
+
|
|
143
|
+
Bash
|
|
144
|
+
|
|
145
|
+
node /chemin/complet/vers/sftp-mcp-orchestrator/server.js
|
|
146
|
+
🧰 Référence des Outils (API)
|
|
147
|
+
Ce serveur expose une suite complète d'outils. Un client MCP compatible (comme un LLM) saura automatiquement quels paramètres sont requis en inspectant le schéma Zod de chaque outil.
|
|
148
|
+
|
|
149
|
+
Gestion des Serveurs
|
|
150
|
+
Outil Description
|
|
151
|
+
server_add Enregistre ou met à jour les informations de connexion d'un serveur.
|
|
152
|
+
server_list Affiche la liste de tous les alias de serveurs configurés.
|
|
153
|
+
server_remove Supprime un alias de serveur de la configuration.
|
|
154
|
+
|
|
155
|
+
Exporter vers Sheets
|
|
156
|
+
|
|
157
|
+
Exécution de Tâches
|
|
158
|
+
Outil Description
|
|
159
|
+
task_exec Exécute une commande SSH (hybride synchrone/asynchrone).
|
|
160
|
+
task_transfer Transfère un fichier ou dossier (SFTP) (hybride synchrone/asynchrone).
|
|
161
|
+
task_exec_interactive Exécute une commande SSH interactive (gestion des prompts yes/no, etc.).
|
|
162
|
+
task_exec_sequence Exécute plusieurs commandes SSH en séquence sur le même serveur.
|
|
163
|
+
task_transfer_multi Transfère plusieurs fichiers/dossiers (SFTP) avec support de patterns glob.
|
|
164
|
+
|
|
165
|
+
Exporter vers Sheets
|
|
166
|
+
|
|
167
|
+
Monitoring & Diagnostics
|
|
168
|
+
Outil Description
|
|
169
|
+
get_system_resources Récupère les métriques système vitales (CPU, RAM, Disque) d'un serveur.
|
|
170
|
+
get_services_status Récupère le statut des services (systemd, Docker, PM2) sur un serveur.
|
|
171
|
+
check_api_health Vérifie la disponibilité et le temps de réponse d'un endpoint HTTP/S.
|
|
172
|
+
get_fail2ban_status Récupère les informations du service Fail2Ban.
|
|
173
|
+
|
|
174
|
+
Exporter vers Sheets
|
|
175
|
+
|
|
176
|
+
Récupération de Logs
|
|
177
|
+
Outil Description
|
|
178
|
+
get_pm2_logs Raccourci pour récupérer les logs PM2 d'une application.
|
|
179
|
+
get_docker_logs Raccourci pour récupérer les logs d'un container Docker.
|
|
180
|
+
tail_file Affiche les dernières lignes d'un fichier distant.
|
|
181
|
+
|
|
182
|
+
Exporter vers Sheets
|
|
183
|
+
|
|
184
|
+
Gestion de la File d'Attente (Queue)
|
|
185
|
+
Outil Description
|
|
186
|
+
task_queue Affiche le statut de toutes les tâches dans la file d'attente.
|
|
187
|
+
task_status Récupère les détails d'une seule tâche par son ID.
|
|
188
|
+
task_history Affiche les dernières tâches lancées (peut être filtré par alias).
|
|
189
|
+
task_retry Relance une tâche qui a échoué ou crashé.
|
|
190
|
+
queue_stats Affiche les statistiques détaillées de la queue de tâches.
|
|
191
|
+
|
|
192
|
+
Exporter vers Sheets
|
|
193
|
+
|
|
194
|
+
Gestion des APIs (Monitoring Externe)
|
|
195
|
+
Outil Description
|
|
196
|
+
api_add Ajoute ou met à jour une API dans le catalogue de monitoring.
|
|
197
|
+
api_list Affiche toutes les APIs configurées dans le catalogue.
|
|
198
|
+
api_remove Supprime une API du catalogue en utilisant son alias.
|
|
199
|
+
api_check Lance un test de santé sur une API du catalogue (via un serveur distant).
|
|
200
|
+
|
|
201
|
+
Exporter vers Sheets
|
|
202
|
+
|
|
203
|
+
Administration du Serveur MCP
|
|
204
|
+
Outil Description
|
|
205
|
+
task_logs Affiche les logs du système MCP lui-même.
|
|
206
|
+
pool_stats Affiche les statistiques du pool de connexions SSH persistantes.
|
|
207
|
+
|
|
208
|
+
Exporter vers Sheets
|
|
209
|
+
|
|
210
|
+
🤝 Contribution
|
|
211
|
+
Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une Issue pour signaler un bug ou proposer une fonctionnalité, ou une Pull Request pour soumettre des modifications.
|
|
212
|
+
|
|
213
|
+
📄 Licence
|
|
214
|
+
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
|
|
215
|
+
|
|
216
|
+
(Fin du fichier README.md)
|