MCP + SSH: подключаем AI-ассистента к удалённому серверу

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-ассистенту в виде инструментов.