SSH MCP Server
Servidor SSH MCP (paramiko)
Servidor SSH MCP basado en Paramiko, capaz de ejecutar comandos en máquinas remotas y mover archivos mediante SFTP. Está disponible con dos tipos de transporte, seleccionables mediante una variable de entorno / un parámetro:
http– punto final MCP streamable-http en la ruta/mcp(al que se conecta Cherry Studio), además de una interfaz documentada OpenAPI/Swagger (/docs,/openapi.json).stdio– transporte clásico de MCP stdio (para arranque local odocker exec).
Importante sobre los puertos: el 2222 es el puerto del servidor MCP, al que se conecta Cherry Studio. NO es el puerto SSH de la máquina remota. El puerto SSH de la máquina remota suele ser el 22 (
SSH_PORT). Por lo tanto: Cherry Studio →http://<host-IP>:2222/mcp→ servidor MCP → paramiko → puerto SSH22de la máquina remota.
Herramientas MCP disponibles
Herramientas sin estado (stateless): operaciones simples y de una sola vez
Herramienta | Descripción |
| Probar la conexión y la autenticación con una máquina remota. |
| Ejecuta un único comando de shell en una conexión nueva (stdout / stderr / código de salida). No hay memoria: |
| Subir un archivo local a la máquina remota con SFTP. |
| Descargar un archivo de la máquina remota con SFTP. |
Herramientas de sesión interactiva con estado: shell en vivo
Estas mantienen abierto un shell en vivo, donde el estado se conserva entre llamadas (cambio de directorio después de cd, variables exportadas y manejo de prompts interactivos: contraseña de sudo, [Y/n] de apt, etc.).
Herramienta | Descripción |
| Paso 1 – abre un nuevo shell interactivo y devuelve un |
| Paso 2 – envía texto (comando o respuesta a un prompt) a la sesión. El |
| Paso 3 (opcional) – lee más salida sin enviar nada, para comandos lentos o de larga duración. |
| Paso 4 – cierra la sesión. Ciérrala siempre que hayas terminado. |
| Lista las sesiones abiertas (host, usuario, inactividad), por ejemplo, si has perdido el |
Las descripciones de las herramientas (docstrings) incluyen deliberadamente una guía muy detallada, en inglés sencillo, del tipo "USE THIS WHEN...", para que el modelo consumidor sepa claramente cuándo y cómo usar cada herramienta.
Todos los parámetros de las herramientas (host, port, username, password, private_key, private_key_path, passphrase, timeout) pueden especificarse:
por llamada, por separado, o
como valor predeterminado en el archivo
.env(variablesSSH_*). Lo que no se indique en la llamada se toma automáticamente de las variables de entornoSSH_*.
La autenticación admitida es: contraseña y clave (PEM en línea o ruta de archivo, con contraseña opcional). El servidor acepta automáticamente las claves de host desconocidas (AutoAddPolicy) para que la automatización sea fluida.
Related MCP server: SSH MCP Server
Uso sin estado vs. con estado (interactivo)
¿Cuándo usar cada uno?
Un único comando independiente (p. ej.
ls,uptime,df -h) →ssh_execute. Cada llamada abre una conexión nueva, ejecuta un comando y la cierra. No hay memoria:cdyexportno sobreviven a la siguiente llamada y tampoco se puede responder a un prompt interactivo.Cualquier tarea interactiva o de varios pasos (conservar el estado después de
cd/export, escribir la contraseña de sudo, responder[Y/n]a apt, comandos encadenados) → sesión interactiva:ssh_open_session→ssh_send→ssh_read→ssh_close_session.
Flujo de trabajo recomendado (sesión)
ssh_open_session– recibirás unsession_id(y el banner de entrada / el primer prompt eninitial_output).ssh_send– escribe un comando o responde a un prompt. Elsession_idse debe proporcionar en todas las llamadas. Por defecto envía también Enter.ssh_read(opcional) – para comandos lentos o de larga ejecución, recopila más salida sin enviar.ssh_close_session– cuando termines, cierra la sesión.
Con ssh_list_sessions puedes ver en cualquier momento las sesiones abiertas (host, usuario, inactividad), si has perdido algún session_id.
Ejemplos (a través de los endpoints REST)
Apertura de una sesión:
curl -X POST http://localhost:2222/api/ssh/session/open \
-H "Content-Type: application/json" \
-d '{"host":"192.168.1.100","username":"user","password":"secret"}'
# -> {"ok":true,"session_id":"<ID>", "initial_output":"...prompt..."}Cambio de directorio que se conserva (mantener el estado):
curl -X POST http://localhost:2222/api/ssh/session/send \
-H "Content-Type: application/json" \
-d '{"session_id":"<ID>","input":"cd /var/log && pwd"}'
# a következő ssh_send már a /var/log-ban futnaComando sudo y respuesta al prompt de contraseña:
# 1) elindítod a sudo parancsot
curl -X POST http://localhost:2222/api/ssh/session/send \
-H "Content-Type: application/json" \
-d '{"session_id":"<ID>","input":"sudo apt-get update"}'
# 2) a kimenetben megjelenik a "[sudo] password for user:" prompt -> beküldöd a jelszót
curl -X POST http://localhost:2222/api/ssh/session/send \
-H "Content-Type: application/json" \
-d '{"session_id":"<ID>","input":"my_sudo_password"}'Respuesta a la pregunta [Y/n] de apt:
curl -X POST http://localhost:2222/api/ssh/session/send \
-H "Content-Type: application/json" \
-d '{"session_id":"<ID>","input":"sudo apt-get install htop","read_timeout":5}'
# amikor jön a "Do you want to continue? [Y/n]" kérdés:
curl -X POST http://localhost:2222/api/ssh/session/send \
-H "Content-Type: application/json" \
-d '{"session_id":"<ID>","input":"Y"}'Cierre de una sesión:
curl -X POST http://localhost:2222/api/ssh/session/close \
-H "Content-Type: application/json" \
-d '{"session_id":"<ID>"}'Timeouts / inactividad / errores: cada operación de sesión cierra de forma oportunista las sesiones inactivas durante más de
SSH_SESSION_IDLE_TIMEOUT(por defecto, 600 s), así como las que han perdido su canal. A la vez puede haber un máximo deSSH_MAX_SESSIONSsesiones abiertas (por defecto, 20); si se alcanza el límite, se devuelve un mensaje de error claro. Si unsession_idya no existe, la respuesta indica exactamente qué hay que hacer (abre una nueva o revisassh_list_sessions).
Estructura del proyecto
ssh-mcp-server/
├── app/
│ ├── __init__.py
│ ├── ssh_ops.py # paramiko SSH/SFTP műveletek (közös logika)
│ └── server.py # MCP tool-ok + FastAPI/OpenAPI + transport választás
├── requirements.txt
├── Dockerfile
├── docker-compose.yml # 2222:2222 publikálás
├── .env.example
└── README.md1. Inicio rápido con Docker (recomendado)
Preparación
cd ssh-mcp-server
cp .env.example .env
# szerkeszd a .env-et: add meg a távoli gép adatait (SSH_HOST, SSH_USERNAME, stb.)Build e inicio (modo HTTP)
docker compose up -d --buildEsto inicia el servidor en modo HTTP y publica el puerto 2222 en el host (ports: "2222:2222").
Comprobación
curl http://localhost:2222/health
# {"status":"ok","service":"ssh-mcp-server","mcp_endpoint":"/mcp"}Swagger UI (en el navegador):
http://localhost:2222/docsOpenAPI JSON:
http://localhost:2222/openapi.jsonPunto final MCP (Cherry Studio):
http://<host-IP>:2222/mcp
Parada
docker compose down2. Modo HTTP manual (sin Docker, para desarrollo)
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
export TRANSPORT=http HOST=0.0.0.0 PORT=2222
python -m app.server3. Modo stdio
Con el servidor ejecutándose en un contenedor, mediante docker exec:
docker exec -i -e TRANSPORT=stdio ssh-mcp-server python -m app.serverO directamente, sin Docker:
TRANSPORT=stdio python -m app.server4. Integración con Cherry Studio
A) Modo HTTP (streamable-http) — recomendado, funciona también a través de la red
El contenedor se ejecuta en Docker en tu ordenador portátil, y Cherry Studio usa la IP del host y el puerto 2222.
Inicia el servidor:
docker compose up -d --build.Averigua la IP de la máquina (host) donde se ejecuta Docker:
Linux:
hostname -I→ p. ej.192.168.1.50Si Cherry Studio se ejecuta en la misma máquina, también sirve
localhost/127.0.0.1.
Cherry Studio → Configuración (Settings) → MCP Servers → Add / Nuevo servidor.
Introduce los siguientes datos:
Type / Tipo:
Streamable HTTP(criba no aparece,SSE/HTTP)URL / Endpoint:
http://<host-IP>:2222/mcpp. ej.
http://192.168.1.50:2222/mcpen la misma máquina:
http://localhost:2222/mcp
Guárdalo y habilita el servidor. Cherry Studio cargará las herramientas
ssh_test,ssh_execute,ssh_uploadyssh_download.
Si te conectas desde una máquina remota, asegúrate de que el puerto 2222 sea accesible (permítelo en el cortafuegos) y de que Docker escuche en
0.0.0.0(así lo hace por defecto).
B) Modo stdio
Si Cherry Studio espera un servidor MCP por stdio (lanzando un comando):
Command:
dockerArguments:
exec -i -e TRANSPORT=stdio ssh-mcp-server python -m app.server
(Para ello, el contenedor ssh-mcp-server debe estar en ejecución: docker compose up -d.)
5. Configuración de .env
Variable | Descripción | Valor predeterminado |
|
|
|
| Dirección de enlace del HTTP de MCP |
|
| Puerto HTTP de MCP (el que accede Cherry Studio) |
|
| Dirección de la máquina remota | – |
| Puerto SSH de la máquina remota |
|
| Usuario de SSH | – |
| Contraseña de SSH (o utiliza una clave) | – |
| Clave privada en línea (PEM) | – |
| Ruta del archivo de la clave privada (dentro del contenedor) | – |
| Contraseña de la clave privada | – |
| Tiempo de espera de conexión (s) |
|
| Cierre automático de las sesiones interactivas inactivas tras estos segundos (0 = inactivo) |
|
| Número máximo de sesiones interactivas que se pueden abrir a la vez |
|
Autenticación con clave en Docker
Monta las claves en el contenedor y configura la ruta que corresponde. En docker-compose.yml, quita el comentario de la línea volumes:
volumes:
- ./keys:/keys:roy luego en .env:
SSH_PRIVATE_KEY_PATH=/keys/id_ed255196. Endpoints REST para probar (OpenAPI)
El modo HTTP ofrece, junto al punto final MCP de Cherry Studio, también endpoints REST; estos realizan las mismas operaciones SSH y son muy útiles con curl o desde el Swagger UI:
Método | Ruta | Operación |
GET |
| Estado |
GET |
| Información del servidor |
POST |
| Probar conexión |
POST |
| Ejecutar comando |
POST |
| Subir archivo (SFTP) |
POST |
| Descargar archivo (SFTP) |
POST |
| Abrir sesión interactiva (paso 1) |
POST |
| Enviar entrada a la sesión (paso 2) |
POST |
| Leer salida sin enviar (paso 3) |
POST |
| Cerrar sesión (paso 4) |
GET |
| Listar sesiones abiertas |
Ejemplo (ejecución de un solo comando sin estado):
curl -X POST http://localhost:2222/api/ssh/execute \
-H "Content-Type: application/json" \
-d '{"host":"192.168.1.100","username":"user","password":"secret","command":"uname -a"}'Notas de seguridad
Los secretos nunca están en el código — todo se lee desde
.env/ parámetros de invocación.El archivo
.envestá excluido por.dockerignorey normalmente también por el.gitignore— no lo subas en el control version.El servidor usa
AutoAddPolicy(aceptación automática de claves de host desconocidas).En redes privadas es cómodo; en entornos más estrictos conviene usar claves de host conocidas.
El puerto MCP
2222solo debe exponerse en redes de confianza.
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
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to execute commands and transfer files on remote servers over SSH connections.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to securely execute commands, transfer files, and manage port forwarding on remote servers via SSH.9836Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to securely execute commands on remote hosts via SSH and SFTP, with persistent shells, file transfers, screenshots, and an audit log.1MIT
Related MCP Connectors
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).
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/vait90/ssh-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server