mcp2term
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp2termrunls -laand show me the output"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp2term
Expose un terminal interactif via MCP (Model Context Protocol) sur Internet grâce à ngrok, pour permettre à ChatGPT, Claude Desktop ou tout client MCP d'exécuter des commandes shell à distance.
Architecture
[Client MCP] <--HTTPS--> [ngrok (Basic Auth)] <--> [FastMCP Server] <--> [Shell (cmd/bash)]Related MCP server: Claude Desktop Commander MCP
Prérequis
Python ≥ 3.11
ngrok est optionnel : s'il n'est pas installé, il est téléchargé automatiquement.
Installation
pip install -r requirements.txtOu via pip (rend la commande mcp2term disponible) :
pip install .Configuration
Copier et éditer le fichier .env :
cp .env.example .envVariables disponibles :
Variable | Obligatoire | Description |
| Non* | Token d'authentification ngrok |
| Non* | Identifiants au format |
| Non | Chemin vers une config ngrok existante ( |
| Non | Nom d'un tunnel défini dans |
| Non | Adresse d'écoute locale (défaut: |
| Non | Port local (défaut: |
| Non |
|
| Non |
|
* Sans token ni auth, le tunnel ngrok ne s'ouvre pas ; le serveur reste accessible en local uniquement.
Obtenir un token : https://dashboard.ngrok.com/authentication
Utilisation
# Démarrage normal (ngrok en arrière-plan)
python mcp2term.py
# Mode local uniquement (pas de tunnel ngrok)
python mcp2term.py --local-only
# Options personnalisées
python mcp2term.py --port 9000 --host 0.0.0.0 --log-level DEBUG
# Réutiliser une config ngrok déjà en place (domaine réservé, région...)
python mcp2term.py --ngrok-config ~/.config/ngrok/ngrok.yml
python mcp2term.py --ngrok-config ~/.config/ngrok/ngrok.yml --ngrok-tunnel-name mon-tunnelLa version du schéma (tunnels: v2 ou endpoints: v3) est détectée automatiquement à partir du champ
version: du fichier de config.
Limitation avec --ngrok-tunnel-name sur une config v3 : NGROK_BASIC_AUTH est ignoré (l'API v3
rejette ce champ pour un endpoint nommé). Pour protéger un tunnel nommé v3, configurer l'authentification
directement sur l'endpoint dans le fichier ngrok.yml (traffic_policy), ou ne pas utiliser
--ngrok-tunnel-name.
Options CLI
Option | Description |
| Adresse d'écoute (défaut: |
| Port d'écoute (défaut: |
|
|
| Désactive le tunnel ngrok |
| Tunnel ngrok sans Basic Auth (accès public complet) |
| Chemin vers une config ngrok existante ( |
| Nom d'un tunnel défini dans cette config à réutiliser |
| Affiche l'aide |
Ce qui se passe au lancement
Démarre un shell interactif (cmd.exe sur Windows, bash sur Unix)
Lance le serveur MCP en local (immédiatement, sans attendre ngrok)
En arrière-plan : télécharge ngrok si nécessaire, configure le token, tente d'ouvrir un tunnel (2 tentatives avec retry)
Si le tunnel est établi : affiche l'URL publique
Si le tunnel échoue : le serveur reste accessible en local
Surveillance : un thread vérifie l'état du tunnel toutes les 30s (backoff x2 en cas d'erreur) et le reconnecte automatiquement si perdu
Outils MCP
Outil | Paramètres | Description |
|
| Exécute une commande shell (état persistant) |
|
| Change le répertoire courant |
| — | Retourne le dossier courant, le type de shell et le PID |
| — | Tue et relance le shell |
| — | Envoie Ctrl+C à la commande en cours |
|
| Envoie du texte à l'entrée standard (commandes interactives) |
|
| Lit un fichier (protection anti-traversal, max 10 MB) |
|
| Écrit un fichier (création des dossiers parents si nécessaire, max 10 MB) |
|
| Démarre un programme interactif (PTY réel) : nano, vim, top, htop… |
|
| Envoie des touches à la session interactive (texte + touches spéciales) |
| — | Retourne l'écran rendu (grille texte) et la position du curseur |
|
| Redimensionne le terminal de la session interactive |
| — | Arrête la session interactive |
| — | Statut : uptime, URL ngrok, nombre de commandes, état du shell |
Détail des outils
execute_command(command, timeout=15)
Le shell conserve l'état (répertoire courant, variables d'environnement) entre les commandes.
timeout: temps max d'attente de la sortie (défaut: 15s). Passer à 60s+ pour les commandes longues.Le shell est automatiquement réinitialisé après 10 minutes d'inactivité.
read_file(path) et write_file(path, content)
Les chemins sont résolus relativement au répertoire courant du shell.
Les traversées de répertoire (../) sont bloquées.
Taille max : 10 MB.
Mode interactif (PTY)
execute_command utilise de simples pipes : les programmes plein écran/curses
(nano, vim, top, htop) ne peuvent pas s'y afficher correctement. Le mode
interactif alloue un vrai PTY à un processus séparé et restitue l'écran rendu
en texte (via pyte, un émulateur de
terminal VT100 pur Python) au lieu des séquences ANSI brutes.
Exemple : start_interactive("nano fichier.txt") → send_keys("hello")
→ send_keys("<CTRL-X>") → send_keys("y<ENTER>") → stop_interactive().
Syntaxe des touches (send_keys) : le texte littéral est envoyé tel quel ;
les touches spéciales s'écrivent entre chevrons : <ENTER> <ESC> <TAB>
<BACKSPACE> <UP> <DOWN> <LEFT> <RIGHT> <HOME> <END> <PGUP>
<PGDN> et <CTRL-X> (n'importe quelle lettre).
Limitations :
Une seule session interactive à la fois —
stop_interactiveavant d'en démarrer une autre encore en cours.Modèle "instantané" :
read_screenretourne l'état actuel de l'écran, pas un flux vidéo continu. Pour un programme qui se rafraîchit tout seul (top,htop), il faut interrogerread_screenà nouveau pour voir l'évolution.Linux/macOS uniquement (POSIX) — retourne une erreur explicite sur Windows.
Configuration client (ChatGPT / Claude Desktop)
Ajouter un serveur MCP distant :
URL :
https://votre-sous-domaine.ngrok.io/mcpType : Streamable HTTP
Authentification : Basic Auth (utilisateur/mot de passe du
.env)
Sécurité
Rate Limiting
Le serveur limite chaque session à 30 appels d'outils par minute. Au-delà, une erreur est retournée.
Protection anti-traversal
read_file et write_file vérifient que le chemin résolu reste dans le répertoire de base du shell. Les tentatives de ../ sont bloquées.
Masquage des credentials
Les tokens et mots de passe sont systématiquement masqués dans les logs (****).
Journalisation des sessions
Chaque appel d'outil est horodaté avec un identifiant de session, permettant le traçage des actions.
Docker
docker build -t mcp2term .
docker run -it --rm -p 8765:8765 -v ./.env:/app/.env mcp2term --local-onlyLe shell s'exécute dans le conteneur : bash, curl, git et nano sont préinstallés.
Les fichiers créés par les commandes sont perdus à l'arrêt du conteneur sauf si tu montes un volume :
docker run -it --rm -p 8765:8765 -v "$PWD/data:/workspace" -w /workspace mcp2termAjouter des outils au conteneur
Édite le Dockerfile et ajoute la ligne dans la section dédiée :
RUN apt-get install -y --no-install-recommends nodejs
# ou via pip
RUN pip install --no-cache-dir poetryReconstruis l'image : docker build -t mcp2term .
Tests
pip install pytest httpx
python -m pytest tests/ -vTests d'intégration : initialisation, liste des outils, exécution de commande,
health check, mode interactif (démarrage/envoi de touches/redimensionnement/
arrêt, refus d'une seconde session concurrente).
Le serveur est automatiquement démarré/arrêté par les fixtures pytest.
La fidélité de rendu de programmes complets comme nano/vim/htop (dépendante de
TERM/terminfo) n'est pas testée en CI — à vérifier manuellement avec un
client réel après toute modification du mode interactif.
Dépendances
mcp— SDK MCP officiel (Anthropic)pyngrok— Client Python pour ngrok (auto-installation du binaire)python-dotenv— Chargement du.envpyte— Émulateur de terminal VT100 pur Python, utilisé pour restituer un écran texte lisible en mode interactif
Logs
Niveau | Usage |
| Démarrage, arrêt, URL ngrok, commandes exécutées, fichiers écrits |
| Timeouts, rate limit, erreurs tunnel, traversées de répertoire |
| Appels d'outils, stdin/stdout brut, état du tunnel, reconnexion, send_stdin |
Activer avec LOG_LEVEL=DEBUG dans .env ou --log-level DEBUG.
This server cannot be deployed
Maintenance
Related MCP Connectors
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Run commands and read/write files on your servers over Termalin's keyless tunnels (hosted MCP).
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Related MCP Servers
- AlicenseAqualityFmaintenanceAn MCP server that enables secure terminal command execution, directory navigation, and file system operations through a standardized interface for LLMs.1031 PyPI97MIT
- AlicenseAqualityBmaintenanceAllows Claude desktop app to execute terminal commands and edit files on your computer through MCP, with features including command execution, process management, and diff-based file editing.26122,945 npm9,665MIT
- FlicenseAqualityDmaintenanceA lightweight MCP server that provides AI assistants with access to a system's terminal through a secure terminal tool. It enables users to execute shell commands and receive stdout, stderr, and exit codes directly within an MCP-compatible client.1-
- FlicenseAqualityBmaintenanceMCP server that provides AI access to a local terminal, enabling command execution, directory navigation, and system operations with persistent session state.51-