Skip to main content
Glama
zhangqi-eiq

SSH Remote File MCP Server

by zhangqi-eiq

SSH Remote File MCP Server

Читайте, редактируйте и выполняйте команды на удалённом сервере через Claude Code — как будто файлы находятся локально.

MCP-сервер, который предоставляет удалённый SSH-хост в виде набора файловых инструментов. После регистрации в Claude Code вы можете попросить его прочитать /home/you/proj/main.py, отредактировать функцию, запустить pytest или выполнить grep по удалённому дереву — при этом он общается с сервером по SSH, с ограничением путей и фильтрацией команд в процессе.

中文文档 / Китайская версия → · GitHub →

Лицензия

MIT — см. LICENSE.


Related MCP server: MCP SSH Server

Возможности

Инструмент

Назначение

ssh_read_file

Чтение удалённого файла

ssh_write_file

Создание или перезапись (а также дозапись) удалённого файла

ssh_edit_file

Поиск и замена в удалённом файле

ssh_list_directory

Список удалённой директории с правами, размером и временем изменения

ssh_run_command

Выполнение shell-команды на удалённом сервере (с фильтрами безопасности)

ssh_search_files

Поиск файлов по маске имени или содержимому

ssh_get_env_info

Снимок ОС / Python / диска / памяти / ЦП

ssh_file_info

Подробная информация о пути


Быстрый старт

# 1. Clone and enter
git clone https://github.com/zhangqi-eiq/server_mcp.git
cd server_mcp

# 2. Install (editable mode — picks up code changes immediately)
python install.py

# 3. Edit your real credentials
#    (file is at ~/.ssh-mcp-server/config.json by default)

# 4. Restart Claude Code, then in a chat:
#    "show me the env of my server"

Вот и всё. install.py делает три вещи:

  1. pip install -e . — устанавливает пакет.

  2. Копирует config.json (со значениями-заглушками) в ~/.ssh-mcp-server/.

  3. Запускает claude mcp add, чтобы сервер появился в Claude Code.

Если у вас ещё нет CLI claude, выполните python install.py --no-register и добавьте запись MCP вручную (см. Ручная настройка).


Ручная настройка

Если вы предпочитаете настроить всё вручную или install.py не зарегистрировал сервер должным образом:

1. Установите пакет

pip install -e .

Это добавляет ssh_mcp_server в путь импорта Python, чтобы python -m ssh_mcp_server мог запустить сервер.

2. Создайте конфигурацию

Скопируйте config.json в ~/.ssh-mcp-server/config.json (загрузчик ищет его здесь, если SSH_MCP_CONFIG не задан) и укажите реальные значения:

mkdir -p ~/.ssh-mcp-server
cp config.json ~/.ssh-mcp-server/config.json
$EDITOR ~/.ssh-mcp-server/config.json

3. Зарегистрируйте в Claude Code

Запись MCP должна запускать сервер через тот интерпретатор Python, в который вы выполнили установку. <python> ниже должен быть абсолютным путём к этому интерпретатору (sys.executable из вашего активированного окружения, например C:\Users\you\.conda\envs\myenv\python.exe в Windows или /home/you/.venv/bin/python в Linux).

Вариант A — на уровне пользователя, доступен в любом проекте:

claude mcp add --scope user ssh-remote \
  -e SSH_MCP_CONFIG="$HOME/.ssh-mcp-server/config.json" \
  -- "<python>" -m ssh_mcp_server

Вариант Б — на уровне проекта, только для этого проекта:

Создайте .mcp.json в корне проекта:

{
  "mcpServers": {
    "ssh-remote": {
      "command": "<absolute path to python>",
      "args": ["-m", "ssh_mcp_server"],
      "env": {
        "SSH_MCP_CONFIG": "/absolute/path/to/your/config.json"
      }
    }
  }
}

Примечание: Claude Code ищет mcpServers в двух местах — ~/.claude.json (управляется CLI, записывается командой claude mcp add) и ~/.claude/settings.json (редактируется вручную). Указанный выше способ через CLI автоматически записывает в нужный файл.


Справочник по конфигурации

Структура config.json:

{
  "ssh": {
    "host": "your-server.example.com",
    "port": 22,
    "username": "your-username",
    "auth": {
      "type": "password",
      "key_path": "",
      "password": "your-password",
      "key_password": ""
    },
    "connect_timeout": 10,
    "keepalive_interval": 30
  },
  "allowed_paths": [
    "/home/your-username/projects"
  ],
  "security": {
    "blocked_commands": ["rm -rf /", "mkfs", ...],
    "max_file_size_mb": 50,
    "max_output_chars": 100000,
    "command_timeout": 30
  }
}

SSH-подключение

Поле

Описание

По умолчанию

ssh.host

Адрес сервера (IP или домен)

обязательно

ssh.port

SSH-порт

22

ssh.username

Имя пользователя для входа

обязательно

ssh.auth.type

"key" или "password"

"key"

ssh.auth.key_path

Путь к закрытому ключу (аутентификация по ключу)

обязательно, если type=key

ssh.auth.password

Пароль для входа (аутентификация по паролю)

обязательно, если type=password

ssh.auth.key_password

Парольная фраза для ключа

пусто

ssh.connect_timeout

Секунды

10

ssh.keepalive_interval

Секунды между keepalive-пакетами

30

Управление доступом

  • allowed_paths — белый список удалённых каталогов. Каждая файловая операция проверяется по этому списку после нормализации ... Запросы за пределами списка отклоняются. Вложенные пути наследуют доступ (например, /data/proj разрешает /data/proj/sub/file.py).

  • security.blocked_commands — список шаблонов shell-команд, которые ssh_run_command отказывается выполнять. По умолчанию покрыты очевидные опасные команды (rm -rf /, mkfs, shutdown, fork-бомбы, прямая запись в блочные устройства). Вы можете расширить список, но никогда не ослабляйте его, чтобы «решить» законную задачу — см. Модель безопасности.

Ограничения ресурсов

Поле

Эффект

По умолчанию

max_file_size_mb

ssh_read_file отказывается читать файлы больше этого размера

50

max_output_chars

ssh_run_command обрезает вывод после этого количества символов

100000

command_timeout

ssh_run_command принудительно завершает процесс после этого количества секунд

30


Аутентификация

По ключу (рекомендуется)

# On your local machine
ssh-keygen -t ed25519 -C "you@example.com"

# Push the public key to the remote
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

Затем в config.json:

"auth": {
  "type": "key",
  "key_path": "~/.ssh/id_ed25519",
  "key_password": ""
}

key_password нужен только в том случае, если сам закрытый ключ зашифрован.

По паролю

"auth": {
  "type": "password",
  "password": "your-password"
}

Пароль хранится в открытом виде в config.json. Предпочтительнее аутентификация по ключу.


Графический менеджер (необязательно)

Небольшой графический интерфейс на Tk позволяет вести несколько профилей серверов и переключаться между ними:

# From source
python server_manager.py

# Or build a standalone Windows exe and put it on PATH
pip install -e ".[gui]"   # adds pyinstaller
python build.py
python setup_global.py
# now `SSH-Server-Manager` is on PATH

Профили хранятся в profiles.json; при переключении выбранный профиль копируется в config.json, чтобы MCP-сервер подхватил его при следующем запуске.


Модель безопасности

Этот сервер намеренно консервативен. Удалённый хост защищён двумя независимыми уровнями:

  1. Ограничение путей. Каждая файловая операция нормализуется (разрешаются .., схлопываются слэши), а затем проверяется по allowed_paths. Обойти список невозможно — проверка выполняется на стороне сервера после разрешения пути на удалённой машине.

  2. Фильтрация команд. ssh_run_command отклоняет любую команду, соответствующую security.blocked_commands (по подстроке). Список по умолчанию блокирует рекурсивное удаление, прямую запись в устройства, завершение работы системы, fork-бомбы и удалённые установщики через shell (curl … | sh). Расширьте список, если нужно разрешить что-то конкретное, — но не вычищайте его.

Чего этот сервер не делает:

  • Он не запускается от root на удалённой машине. Подключайтесь по SSH под обычным пользователем.

  • Он не обходит sudo. Если у указанного пользователя нет прав sudo, то их нет и у сервера.

  • Он не предоставляет интерактивную оболочку. Долго работающие процессы завершаются по command_timeout.


Устранение неполадок

Симптом

Вероятная причина

Решение

claude mcp list ничего не показывает

Сервер зарегистрирован не в той области, или версия CLI claude не читает ~/.claude/settings.json

Используйте claude mcp add --scope user ... (записывает ~/.claude.json)

ModuleNotFoundError: No module named 'mcp'

Установлено в другой Python, чем тот, который использует claude

Запустите install.py тем интерпретатором, который должен использовать Claude Code

ERROR: ssh.host is required

В конфиге всё ещё значения-заглушки

Отредактируйте ~/.ssh-mcp-server/config.json и замените your-server.example.com, CHANGE_ME и т. д.

Access denied: outside allowed paths

Путь, который попыталась использовать LLM, отсутствует в allowed_paths

Добавьте путь в allowed_paths в вашем конфиге

Command blocked: dangerous pattern

LLM попыталась выполнить команду из чёрного списка

Измените security.blocked_commands, если это действительно необходимо

SSH authentication failed

Неверные учётные данные или пользователь

Проверьте в обычной оболочке командой ssh user@host

Сервер запускается, но Claude Code не показывает инструменты

Устаревший процесс расширения VSCode

Полностью закройте и снова откройте VSCode


Структура проекта

server/
├── ssh_mcp_server/         # MCP server package (the actual product)
│   ├── server.py           #   tool definitions
│   ├── ssh_client.py       #   paramiko wrapper
│   ├── security.py         #   path + command validation
│   └── config.py           #   config loader
├── server_manager.py       # Tk GUI for managing profiles
├── profiles.json           # GUI profile store
├── config.json             # runtime config template (placeholder values)
├── setup.py                # pip-installable package metadata
├── install.py              # one-shot installer (install + register)
├── setup_global.py         # optional: deploy GUI exe to PATH
├── build.py                # optional: PyInstaller wrapper for the GUI
├── SSH-Server-Manager.spec # PyInstaller spec for fine-grained builds
├── requirements.txt        # raw dependency pins
├── LICENSE                 # MIT
├── README.md               # this file (English)
└── README.zh.md            # Chinese translation

Лицензия

MIT — полный текст см. в файле.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    A
    quality
    C
    maintenance
    Enables SSH remote access to servers through Claude, allowing users to execute commands, transfer files via SFTP, and manage multiple remote connections using natural language.
    12
    8
    MIT
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Connects Claude to remote servers via SSH to execute commands, manage files, and browse directories. It allows users to add, edit, and switch between multiple server configurations through natural language conversations.
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables Claude Code to control remote servers via SSH for automated deployment, testing, and operations, including command execution and file transfer.
    4

View all related MCP servers

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.

  • Read, edit, publish, and preview your pepita websites from Claude.

View all MCP Connectors

Latest Blog Posts

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/zhangqi-eiq/server_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server