MCP + SSH: подключаем AI-ассистента к удалённому серверу
MCP позволяет подключать к AI-ассистенту внешние инструменты. Один из практичных вариантов — дать ассистенту доступ к удалённому серверу через SSH.
В этой статье настроим связку Windows + OpenCode + `@caikiji/mcp-ssh`, чтобы из OpenCode можно было работать с сервером: выполнять команды, читать и изменять файлы, а также передавать файлы.
В итоге получится:
OpenCode
│
│ MCP
▼
mcp-ssh
│
│ SSH
▼
Удалённый сервер
MCP-сервер запускается на компьютере, а на сам сервер устанавливать MCP не нужно.
Что понадобится
Перед началом нужны:
- Windows;
- установленный OpenCode;
- Node.js;
- SSH-доступ к серверу.
Проверим Node.js и npm:
node -v
npm -v
Обе команды должны вернуть номер версии. Версия Node.js должна быть 18 или новее — этого требует сам MCP-сервер. Если node -v показывает меньше, сначала обнови Node.js, иначе сервер просто не запустится.
Также нам понадобится SSH-доступ. Если ты уже подключаешься к серверу командой вроде:
ssh user@example.com
можно переходить дальше.
1. Настраиваем SSH
Сначала сделаем короткое имя для сервера.
На Windows SSH хранит пользовательскую конфигурацию в:
C:\Users\ТВОЁ_ИМЯ\.ssh\config
Если файла `config` нет — создай его. Расширения `.txt` у файла быть не должно.
Добавь:
Host my-site
HostName example.com
User user
Port 22
Замени `example.com` на адрес своего сервера, а `user` — на SSH-пользователя.
Если SSH использует другой порт, укажи его вместо `22`.
Теперь проверь подключение:
ssh my-site
Если всё настроено правильно, ты попадёшь на сервер.
Для проверки можно выполнить:
pwd
и:
php -v
После этого:
exit
Если `ssh my-site` не работает, сначала нужно исправить SSH-подключение. MCP на этом этапе ещё не участвует.
SSH-ключ
Если сервер использует SSH-ключ, его можно указать в том же конфиге:
Host my-site
HostName example.com
User user
Port 22
IdentityFile C:\Users\ТВОЁ_ИМЯ\.ssh\id_ed25519
Приватный ключ не нужно добавлять в проект или хранить в Git.
2. Устанавливаем MCP SSH
Теперь устанавливаем MCP-сервер:
npm install -g @caikiji/mcp-ssh
Проверить установленный пакет можно командой:
npm list -g @caikiji/mcp-ssh
`@caikiji/mcp-ssh` предназначен для работы с удалёнными серверами через SSH: выполнения команд, работы с файлами и передачи файлов. Он также умеет использовать существующую SSH-конфигурацию.
После установки команда `mcp-ssh` должна находиться из терминала — для этого глобальный каталог bin npm обязан лежать в PATH. Если команда не находится или системный Node.js старый, а нужный живёт отдельно, надёжнее указать полные пути: к `node.exe` нужной версии и к файлу `index.js` установленного пакета. Тогда в конфигурации вместо `"mcp-ssh"` будет пара вроде `["C:/путь/к/node.exe", "C:/путь/к/mcp-ssh/index.js"]`.
3. Подключаем MCP к OpenCode
Теперь OpenCode нужно сообщить, что у него появился новый MCP-сервер.
В корне проекта создай файл:
opencode.json
Если такой файл уже существует — редактируй его, а не создавай второй.
Добавь в конфигурацию MCP:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ssh": {
"type": "local",
"command": [
"mcp-ssh"
],
"environment": {
"SSH_SERVICES": "my-site:user@example.com:22|{env:MY_SSH_PWD}"
},
"enabled": true
}
}
}
Здесь:
ssh
— имя MCP-сервера внутри OpenCode.
type: local
— сервер запускается на твоём компьютере.
command: ["mcp-ssh"]
— команда, которой OpenCode запускает установленный MCP-сервер.
environment / SSH_SERVICES
— как MCP-сервер узнаёт о серверах. Формат записи: `имя:логин@хост:порт|пароль`. Пароль в открытом виде в конфиг не кладём: вместо него подставляем переменную окружения `{env:MY_SSH_PWD}` — её значение OpenCode берёт из окружения при запуске. Задай её один раз на машине и перезапусти терминал, чтобы она подхватилась.
А если подключения уже описаны в `~/.ssh/config`, можно импортировать их целиком:
SSH_SERVICES="$config"
Тогда серверу достаточно имён хостов из SSH-конфига. Без `SSH_SERVICES` (в любом из двух видов) сервер стартует с пустым списком — подключаться будет не к чему, и это самая частая причина ситуации «всё установил, а серверов нет».
OpenCode поддерживает локальные MCP-серверы через конфигурацию `opencode.json`; для них указываются тип `local` и команда запуска. Файл может называться `opencode.json` или `opencode.jsonc`, а лежать — в корне проекта или в глобальном конфиге (`~/.config/opencode/`). Глобальный удобен тем, что MCP доступен во всех проектах сразу.
После изменения конфигурации перезапусти OpenCode.
4. Проверяем MCP
В терминале выполни:
opencode mcp list
В списке должен появиться `ssh` со статусом подключения.
Если MCP подключён, можно переходить к проверке сервера. Имя хоста (`my-site`) совпадает с `Host` из SSH-конфига — по нему MCP понимает, к какому серверу обращаться.
Попроси OpenCode:
Подключись к my-site и выполни pwd.
Затем:
Подключись к my-site и выполни php -v.
И:
Покажи содержимое текущего каталога на my-site.
Если OpenCode выполняет эти действия через MCP и получает ответы от сервера, связка работает.
5. Работаем с файлами
Теперь можно обращаться к удалённым файлам.
Например:
Прочитай файл public_html/index.php на my-site.
Ничего в нём не изменяй.
Или:
Найди в public_html файлы с расширением .log и покажи их список.
Для изменения файла лучше явно обозначать, что именно нужно сделать:
Открой public_html/index.php на my-site.
Замени только этот фрагмент:
...
Перед изменением покажи мне участок файла,
который собираешься изменить.
После изменения проверь синтаксис PHP.
Такой запрос оставляет понятную последовательность: сначала посмотреть, затем изменить, затем проверить.
6. Выполняем команды на сервере
MCP SSH позволяет использовать серверные команды так же, как если бы ты подключился к серверу вручную.
Например:
Покажи свободное место на диске my-site.
или:
Покажи версию PHP на my-site.
или:
Проверь синтаксис файла public_html/index.php командой php -l.
Можно использовать и команды конкретного проекта.
Например, если проект использует Composer:
Покажи версию Composer на my-site.
или:
Выполни composer --version на my-site.
При этом команда выполняется именно на удалённом сервере, а не в локальном терминале Windows.
7. Передаём файлы
MCP SSH также предназначен для передачи файлов.
Например, можно попросить:
Скачай с my-site файл public_html/error.log.
Или передать подготовленный файл на сервер:
Загрузи локальный файл test.php
в public_html/test.php на my-site.
Точный способ передачи зависит от возможностей и версии установленного MCP-сервера, но сам `mcp-ssh` предоставляет операции для работы с удалёнными файлами и их передачи.
8. Подключаем другой проект
Теперь самое полезное: для нового проекта не нужно устанавливать новый MCP.
Допустим, появился второй сервер.
Добавляем его в:
C:\Users\ТВОЁ_ИМЯ\.ssh\config
Например:
Host another-site
HostName another-example.com
User another-user
Port 22
Проверяем:
ssh another-site
Если подключение работает, OpenCode может использовать этот SSH-хост через тот же MCP. Условие: в `SSH_SERVICES` должно стоять `"$config"` — тогда MCP видит все хосты из SSH-конфига. При явном перечислении серверов через `;` у инструментов появляется аргумент, указывающий, на каком сервере работать.
Получается:
mcp-ssh
│
┌─────────┴─────────┐
│ │
my-site another-site
│ │
сервер 1 сервер 2
MCP один, SSH-подключений может быть несколько.
9. Если серверов много
В SSH-конфиге можно хранить сколько угодно подключений:
Host project-a
HostName server-a.example.com
User deploy
IdentityFile C:\Users\ТВОЁ_ИМЯ\.ssh\project-a
Host project-b
HostName server-b.example.com
User deploy
IdentityFile C:\Users\ТВОЁ_ИМЯ\.ssh\project-b
Host project-c
HostName server-c.example.com
User deploy
IdentityFile C:\Users\ТВОЁ_ИМЯ\.ssh\project-c
Проверить любое из них можно обычным SSH:
ssh project-a
ssh project-b
ssh project-c
После этого тот же MCP можно использовать для всех этих серверов.
10. Что делать, если MCP не подключается
Лучше проверять проблему по цепочке.
OpenCode не показывает `ssh`
Проверь `opencode.json`:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ssh": {
"type": "local",
"command": ["mcp-ssh"],
"environment": {
"SSH_SERVICES": "my-site:user@example.com:22|{env:MY_SSH_PWD}"
},
"enabled": true
}
}
}
После изменения перезапусти OpenCode и снова выполни:
opencode mcp list
Команда `mcp-ssh` не найдена
Проверь глобальные npm-пакеты:
npm list -g --depth=0
Если `@caikiji/mcp-ssh` отсутствует:
npm install -g @caikiji/mcp-ssh
`ssh my-site` не работает
Сначала исправь SSH.
Проверь:
ssh my-site
Если получаешь:
Permission denied
проблема связана с авторизацией.
Если:
Could not resolve hostname
проверь `HostName`.
Если:
Connection timed out
проверь адрес, порт и доступность сервера.
Пока обычная команда `ssh my-site` не работает, MCP тоже не сможет нормально подключиться.
11. Безопасность
MCP получает те же возможности, которые есть у SSH-пользователя.
Поэтому не стоит подключать к AI учётную запись с правами, которые ему совершенно не нужны.
Для production особенно внимательно относись к операциям удаления и изменения файлов.
Также не передавай AI без необходимости файлы, содержащие:
- пароли;
- приватные ключи;
- API-токены;
- другие секреты.
Если проект позволяет разделить права, для таких задач лучше использовать отдельного SSH-пользователя или отдельный ключ с необходимыми разрешениями.
Что в итоге получилось
На компьютере установлен один MCP-сервер:
mcp-ssh
OpenCode запускает его через:
opencode.json
Данные о подключениях хранятся отдельно:
C:\Users\ТВОЁ_ИМЯ\.ssh\config
Например:
Host my-site
HostName example.com
User user
Host another-site
HostName another-example.com
User another-user
Схема получается простой:
OpenCode
│
▼
MCP SSH
│
┌─────────┴─────────┐
▼ ▼
my-site another-site
│ │
▼ ▼
сервер 1 сервер 2
При появлении нового проекта достаточно добавить новый SSH-хост и проверить:
ssh новый-хост
Сам MCP при этом менять не нужно.
После настройки AI-ассистент получает инструменты для работы с удалёнными серверами, а SSH остаётся обычным способом подключения к ним.
То есть MCP здесь не заменяет SSH — он делает возможности SSH доступными AI-ассистенту в виде инструментов.