SSH MCP Server
SSH MCP сервер (paramiko)
SSH MCP сервер на базе Paramiko, который умеет выполнять команды на удалённых машинах и перемещать файлы через SFTP. Доступен два типа транспорта, выбираемые переменной окружения / флагом:
http– конечная точка MCP streamable-http на пути/mcp(сюда подключается Cherry Studio), плюс документированный интерфейс OpenAPI/Swagger (/docs,/openapi.json).stdio– классический транспорт MCP stdio (для локального запуска /docker exec).
ВАЖНО о портах: 2222 — это порт MCP-сервера, к которому подключается Cherry Studio. Это НЕ SSH-порт удалённой машины! SSH-порт удалённой машины обычно 22 (
SSH_PORT). Итак: Cherry Studio →http://<host-IP>:2222/mcp→ MCP-сервер → paramiko → SSH-порт22удалённой машины.
Доступные MCP-инструменты
Инструменты без состояния (stateless) — простые разовые операции
Инструмент | Описание |
| Проверка соединения и аутентификации с удалённой машиной. |
| Выполнение ОДНОЙ команды оболочки в свежем подключении (stdout / stderr / exit-код). Нет памяти: |
| Загрузка локального файла на удалённую машину через SFTP. |
| Скачивание файла с удалённой машины через SFTP. |
Инструменты с сохранением состояния (stateful), интерактивные сессии — живая оболочка
Они держат живую оболочку открытой, где состояние сохраняется между вызовами (смена каталога после cd, переменные через export, обработка интерактивных промптов: пароль sudo, ответ [Y/n] для apt и т.д.).
Инструмент | Описание |
| Шаг 1 — открыть новую интерактивную оболочку, возвращает |
| Шаг 2 — отправить текст (команду или ответ на промпт) в сессию. |
| Шаг 3 (необязательно) — читать дополнительный вывод без отправки (для медленных/долгих команд). |
| Шаг 4 — закрыть сессию. Обязательно закрывай, когда закончил. |
| Список открытых сессий (хост, пользователь, бездействие), например если потерял |
Описания инструментов (docstring) намеренно содержат очень подробные, простые инструкции на английском — «USE THIS WOW...», чтобы потребляющая модель точно понимала, когда и как использовать каждый инструмент.
Параметры каждого инструмента (host, port, username, password, private_key, private_key_path, passphrase, timeout) можно указать:
при каждом вызовом отдельно, или
по умолчанию в файле
.env(переменныеSSH_*). То, что не указано в вызове, берётся системой из окружениячающих переменных.
Поддерживаемая аутентифиция: пароль и ключ (inline PEM или путь к файлу, с опциональной фразой). Неизвестные ключи хоста сервер принимает автоматически (AutoAddPolicy), чтобы автоматизация шла бесшовно.
Related MCP server: SSH MCP Server
Использование без состояния и с состоянием (интерактивное)
Что когда имользовать?
Одна самостоятельная команда (например,
ls,uptime,df -h) →ssh_execute. Каждый вызов открывает свежное соединение, выполняет одну команду, затем закрывает. Без памяти:cdиexportне выживают до следующего вызова и на интерактивный промпт отвечать не умеют.Всё интерактивное или многошаговое (сохранение состояния после
cd/export, ввод пароля sudo, ответ на apt[Y/n], последовательные зависимости команды) → интерактивная сессия:ssh_open_session→ssh_send→ssh_read→ssh_close_session.
Рекомендуемый процесс работы (сессия)
ssh_open_session→ получаешьsession_id(и входной баннер / первый промпт вinitial_output).ssh_send→ вводишь команду или отвечаешь на промпт.session_idнужно передавать при каждом вызове. По умолчанию также отправляет Enter.ssh_read(опционально) → для медленных/долгих команд собирает дополнительный вывод без отправки.ssh_close_session→ когда закончил, закрой сессию.
С помощью ssh_list_sessions в любой момент можно посмотреть открытые сессии (хост, пользователь, бездействие), если потерял session_id.
Примеры (через REST-эндпоинты)
Открытие сессии:
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..."}Смена каталога, которая сохраняется (сохранение состояния):
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 futnaКоманда sudo + ответ на промпт пароля:
# 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"}'Ответ на вопрос [Y/n] от 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"}'Закрытие сессии:
curl -X POST http://localhost:2222/api/ssh/session/close \
-H "Content-Type: application/json" \
-d '{"session_id":"<ID>"}'Таймаут / бездействие / ошибки: каждая операция с сессией оппортунистически закрывает сессии, которые бездействуют дольше отпущенного
SSH_SESSION_IDLE_TIMEOUT(по умолчанию 600 сек.), а также те, у которых питание канала умерло. Одновременно может быть открыто не болееSSH_MAX_SESSIONS(по умолчанию 20) сессий — достижение лимита ясно сообщается об ошибке. Еслиsession_idуже не существует, ответ точно говорит, что сделать (открыть новую или посмотреть черезssh_list_sessions).
Структура проекта
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. Быстрый запуск с Docker (рекомендуется)
Подготовка
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.)Сборка и запуск (HTTP-режим)
docker compose up -d --buildЭто запускает сервер в HTTP-режиме и публикует порт 2222 на хосте (ports: "2222:2222").
Проверка
curl http://localhost:2222/health
# {"status":"ok","service":"ssh-mcp-server","mcp_endpoint":"/mcp"}Swagger UI (в браузере):
http://localhost:2222/docsOpenAPI JSON:
http://localhost:2222/openapi.jsonMCP-эндпоинт (Cherry Studio):
http://<host-IP>:2222/mcp
Остановка
docker compose down2. HTTP-режим вручную (без Docker, для разработки)
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. Режим stdio
Для сервера, работающего в контейнере, через docker exec:
docker exec -i -e TRANSPORT=stdio ssh-mcp-server python -m app.serverИли напрямую, без Docker:
TRANSPORT=stdio python -m app.server4. Интеграция с Cherry Studio
A) HTTP (streamable-http) режим — рекомендуется, работает и через сеть
Контейнер работает в Docker у тебя на ноутбуке, а Cherry Studio использует IP хоста и порт 2222.
Запусти сервер:
docker compose up -d --buildDockerОпредели IP-адрес машины (хоста), на котором работает Docker:
Linux:
hostname -I→ например192.168.1.50Если Cherry Studio работает на той же машине, подойдёт и
localhost/127.0.0.1.
Cherry Studio → Настройки (Settings) → MCP Servers → Add / Новый сервер.
Укажи следующее:
Type / Тип:
Streamable HTTP(если нет —SSE/HTTP)URL / Endpoint:
http://<host-IP>/2222/mcpнапример
http://192.168.1.50:2222/mcpна той же машине:
http://localhost:2222/mcp
Сохрани и включи (Enable) сервер. Cherry Studio загрузит инструменты
ssh_test,ssh_execute,ssh_upload,ssh_download.
Если подключаешься с удалённой машины, убедись, что порт 2222 доступен (брандмауэр должен разрешить), а Docker слушает на
0.0.0.0(так настроено по умолчанию).
B) Режим stdio
Если Cherry Studio ожидает stdio MCP-сервер (запускает команду):
Command:
dockerArguments:
exec -i -e TRANSPORT=stdio ssh-mcp-server python -m app.server
(Для этого контейнер ssh-mcp-server должен работать — docker compose up -d.)
5. Конфигурация .env
Переменная | Описание | По умолчанию |
|
|
|
| Адрес привязки MCP HTTP |
|
| Порт MCP HTTP (к нему подключается Cherry Studio) |
|
| Адрес удалённой машины | – |
| SSH-порт удалённой машины |
|
| Пользователь SSH | – |
| Пароль SSH (или используй ключ) | – |
| Простой ключ (PEM) | – |
| Путь к файлу приватного ключа (в контейнере) | – |
| Парольная фраза приватного ключа | – |
| таймаут подключения (сек.) |
|
| Автоматическое закрытие бездействующей интерактивной сессии через N сек. (0 = нет) |
|
| Максимум одновременно открытых интерактивных сессий |
|
Аутентификация по ключу в Docker
Подмонтируй ключи в контейнер и задай путь. В docker-compose.yml раскомментируй строку volumes:
volumes:
- ./keys:/keys:roзатем в .env:
SSH_PRIVATE_KEY_PATH=/keys/id_ed255196. REST-эндпоинты для тестирования (OpenAPI)
HTTP-режим, помимо MCP-эндпоинта Cherry Studio, предоставляет также REST-эндпоинты — они выполняют те же SSH-операции и удобны в использовании через curl / Swagger UI:
Метод | Путь | Операция |
GET |
| Статус |
GET |
| Информация о сервере |
POST |
| Тест подключения |
POST |
| Выполнение команды |
POST |
| Загрузка файла (SFTP) |
POST |
| Скачивание файла (SFTP) |
POST |
| Открытие интерактивной сессии (шаг 1) |
POST |
| Отправка ввода в сессию (шаг 2) |
POST |
| Чтение вывода без отправки (шаг 3) |
POST |
| Закрытие сессии (шаг 4) |
GET |
| Список открытых сессий |
Пример (разовое выполнение без сохранения состояния):
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"}'Замечания по безопасности
Секретов никогда нет в коде — всё читается из
.env/ параметра вызова.Файл
.envисключается файлами.dockerignoreи обычно.gitignore— не коммить его в систему контроля версий.Сервер использует
AutoAddPolicy(автоматическое принятие неизвестных ключей хоста). В закрытой сети это удобно; в более строгой среде стоит использовать известные ключи хоста.Открывай порт MCP
2222только в доверенной сети.
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