ssh-mcp — безопасный SSH-доступ для ИИ-агентов через MCP
📂 Исходный код на GitHubMCP-сервер на Go, дающий ИИ-ассистентам безопасный и ограниченный SSH-доступ к удалённым серверам: восемь инструментов для выполнения команд, SFTP, синхронизации директорий, проброса портов и сбора статуса — с командной политикой и ограничением путей.
ssh-mcp — это MCP-сервер на Go, который даёт ИИ-ассистентам безопасный и ограниченный доступ к удалённым серверам по SSH. В отличие от сырого shell (небезопасно, без ограничений) или полного отсутствия SSH-доступа, ssh-mcp работает посередине: агент получает небольшой набор аудируемых инструментов, каждый из которых проходит через опциональную whitelist/blacklist-политику команд и ограничения путей.
Сервер работает по stdio и совместим с любым MCP-клиентом: Claude Desktop, Claude Code, Cursor, Devin, VS Code и Cline. Он предоставляет восемь инструментов — выполнение команд, SFTP-перенос файлов, синхронизацию директорий, проброс портов и сбор статуса удалённой системы.
Чем отличается
У типового ассистента, которому нужен доступ к серверу, обычно два варианта: получить сырой shell или не получить ничего. ssh-mcp закрывает эту дыру политиками:
- Command policy — regex-паттерны
whitelistиblacklistпроверяют каждую команду перед выполнением. Без whitelist разрешены все команды, а при старте пишется предупреждение в лог. - Ограничение путей —
allowed_local_pathsиallowed_remote_pathsпридержива SFTP-операции к заданным каталогам и отклоняют path traversal. - Секреты через переменные окружения — пароль, passphrase и код 2FA передаются через env-переменные, никогда в командной строке.
- Hot-reload — при запуске с
--configфайл конфигурации отслеживается и перезагружается без перезапуска сервера. Добавление, удаление или изменение серверов вступает в силу в течение секунд.
Инструменты
| Инструмент | Описание |
|---|---|
execute-command |
Выполнить команду на удалённом сервере |
upload |
Загрузить локальный файл по SFTP |
download |
Скачать удалённый файл по SFTP |
list-remote |
Список удалённой директории по SFTP |
dir-sync |
Рекурсивная синхронизация директории между локальным и удалённым |
port-forward |
Открыть, закрыть и перечислить локальные/удалённые пробросы портов |
server-status |
Сбор статуса системы (CPU, память, диск, GPU, сервисы) |
list-servers |
Список настроенных серверов и статус их подключения |
Подробные аргументы и примеры — в Tools.
Как это работает
- AI-клиент отправляет MCP-запрос
tools/callчерез stdin процессаssh-mcp. - Сервер определяет целевое подключение (по умолчанию — первый настроенный сервер).
- Команда или передача файлов валидируется по командной политике сервера и разрешённым путям.
- Операция выполняется по SSH/SFTP (или открывается проброс порта) с заданным таймаутом и лимитом вывода.
- Структурированный результат возвращается клиенту. Ошибки несут стабильный код
ssh.ToolErrorи флагRetriable— агент сам решает, повторять ли попытку.
Архитектура, раскладка пакетов и полный поток данных запроса описаны в Architecture.
Быстрый старт
git clone https://github.com/overklassniy/ssh-mcp.git
cd ssh-mcp
make build
Минимальный ssh-mcp.toml:
[[server]]
name = "web"
host = "example.com"
username = "deploy"
port = 22
private_key = "~/.ssh/id_ed25519"
Регистрация в клиенте:
ssh-mcp install --client claude-code --config ./ssh-mcp.toml
Перезапустите AI-клиента и попросите агента:
Use the list-servers tool.
Вы увидите свой сервер со статусом connected или disconnected.
Установка
Три способа установки дают один и тот же результат — запись MCP-сервера в конфиг клиент. Полное руководство — в Installation.
-
Локальный бинарник —
make build, затемssh-mcp install --client <client> --config ./ssh-mcp.toml. Поддерживаемые клиенты:claude-desktop,claude-code,cursor,Devin,vscode,cline. -
Docker —
ssh-mcp install --client <client> --docker --config ./ssh-mcp.toml. По умолчанию используетсяghcr.io/overklassniy/ssh-mcp:latest. -
MCPB-бандл — скачайте
.mcpbсо страницы Releases и откройте в клиенте, который поддерживает MCPB (Claude Desktop, Claude Code, MCP for Windows). -
Вставка конфига вручную — подкоманда
snippetгенерирует готовую запись сервера для вашего набора параметров:ssh-mcp snippet --docker --host 192.168.1.1 --user root ssh-mcp snippet --gorun --host 192.168.1.1 --user rootDocker использует опубликованный multi-arch образ;
--gorunзапускаетgo run github.com/overklassniy/ssh-mcp/cmd/ssh-mcp@latest(Go-аналогnpx -y <package>, требует Go-тулчейн). Секреты остаются в блокеenv, никогда вargs.
Односерверный режим позволяет обойтись без TOML-файла, передав параметры подключения флагами:
ssh-mcp --host example.com --user deploy --port 22 \
--private-key ~/.ssh/id_ed25519
Вставка конфига через go run
Если установлен Go-тулчейн (Go 1.26+), бинарник собирать не нужно. Добавьте запись в mcpServers конфига клиента (например, ~/.codeium/Devin/mcp_config.json):
{
"mcpServers": {
"ssh-mcp": {
"command": "go",
"args": [
"run",
"github.com/overklassniy/ssh-mcp/cmd/ssh-mcp@latest",
"--host", "192.168.1.1",
"--port", "22",
"--user", "root",
"--transport", "exec"
],
"env": {
"SSH_MCP_PASSWORD": "your-password"
}
}
}
}
При первом запуске go run скачивает и компилирует последний тегированный релиз и запускает stdio MCP-сервер; дальше работает кэш сборки. Для авторизации по приватному ключу замените SSH_MCP_PASSWORD на SSH_MCP_PASSPHRASE и добавьте --private-key в args. Закрепить версию можно, заменив @latest на @v1.0.0.
Конфигурация
ssh-mcp настраивается TOML-файлом: секция [defaults] верхнего уровня и одна или несколько записей [[server]]. Каждый сервер наследует от [defaults], затем от встроенных значений по умолчанию, и валидируется при старте.
[defaults]
command_timeout = "30s"
connection_timeout = "30s"
sftp_timeout = "5m"
keepalive_interval = "10s"
keepalive_count_max = 3
max_output_bytes = 10485760
transport = "exec"
[[server]]
name = "web"
host = "web.example.com"
username = "deploy"
port = 22
private_key = "~/.ssh/id_ed25519"
whitelist = ["^systemctl status .*", "^journalctl .*", "^ls .*"]
allowed_remote_paths = ["/var/log", "/srv"]
allowed_local_paths = ["~/downloads"]
Полная справка — методы аутентификации, командная политика, ограничения путей, keepalive, режимы транспорта и правила валидации — в Configuration.
Модель безопасности
ssh-mcp не проверяет ключи хостов удалённых серверов (InsecureIgnoreHostKey). Безопасность обеспечивается двумя механизмами, которые настраивает оператор:
- Command policy — regex-паттерны
whitelist/blacklistпроверяют каждую команду, включая отдельные probe-команды, используемыеserver-status, поэтому ограничительный whitelist нельзя обойти. - Ограничение путей —
allowed_local_pathsиallowed_remote_pathsпридерживают SFTP-операции; удалённые пути должны быть абсолютными POSIX-путями.
Чувствительные значения внедряются через переменные окружения:
| Переменная | Назначение |
|---|---|
SSH_MCP_PASSWORD |
Аутентификация по паролю |
SSH_MCP_PASSPHRASE |
Passphrase приватного ключа |
SSH_MCP_2FA_CODE |
Код 2FA для keyboard-interactive аутентификации |
Совместимость
- Клиенты — Claude Desktop, Claude Code, Cursor, Devin, VS Code, Cline.
- Платформы — Windows, macOS, Linux (
amd64,arm64). - Рантайм — Go 1.26+ для сборки или предсобранный бинарник из Releases.
Лицензия
MIT. Полный текст — в LICENSE. Тот же MIT указан в mcpb/manifest.json.
Проект вдохновлён classfang/ssh-mcp-server.
Источник: https://github.com/overklassniy/ssh-mcp