mcp2term
Click on "Install 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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityFmaintenanceAn MCP server that enables secure terminal command execution, directory navigation, and file system operations through a standardized interface for LLMs.Last updated1099MIT
- 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.Last updated102633,7418,981MIT
- 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.Last updated1
- AlicenseAqualityDmaintenanceGive Claude Desktop terminal, filesystem, and background-job access on your local Linux machine. Zero-dependency MCP extension, MIT-licensed.Last updated82MIT
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/soobik/mcp2term'
If you have feedback or need assistance with the MCP directory API, please join our Discord server