mcp-ssh多功能
MCP服务器,用于通过AI助手管理多个SSH服务器。提供11个用于远程命令执行、文件操作和系统监控的工具。
特性
- 多服务器管理 --从单个YAML文件配置和管理多个SSH服务器
- 连接池 --使用每台服务器锁自动重用连接,并在过时的连接上重试
- 11个MCP工具 --执行命令、传输文件、读/写文件、尾日志、列表进程
- 两次运输 --stdio(用于本地MCP客户端)和可流式传输的http(用于网络/远程)
- Cloudflare隧道兼容 --部署在隧道后面以进行远程访问
- MCP工具注释 --破坏性、只读、幂等和开放世界操作的提示
- MCP资源 —
ssh://servers用于列出已配置服务器的资源 - 分页 --目录列表支持
limit/offset对于大型目录 - 输入验证 --路径和过滤器清理以防止命令注入
- 结构化错误 --与代码、消息和建议一致的错误响应
安装
使用紫外线(推荐)
uv tool install mcp-ssh-multi使用pip
pip install mcp-ssh-multi使用uvx(一次拍摄)
uvx --from mcp-ssh-multi ssh-mcp来源
git clone https://github.com/gilberth/mcp-ssh-multi.git
cd mcp-ssh-multi
uv sync配置
1.SSH服务器(SSH_Servers.yaml)
创建一个 ssh_servers.yaml 包含服务器定义的文件:
servers:
proxmox:
host: 192.168.1.100
port: 22
username: root
key_file: ~/.ssh/id_rsa
description: "Proxmox VE hypervisor"
truenas:
host: 192.168.1.101
port: 22
username: root
password: "my-password" # or use key_file
description: "TrueNAS storage server"2.环境变量(.env)
复制 .env.example 到 .env 并自定义:
cp .env.example .env| 变量 | 默认值 | 描述 |
|---|---|---|
SSH_SERVERS_FILE | ssh_servers.yaml | 服务器配置路径 |
SSH_TIMEOUT | 30 | 默认命令超时(秒) |
LOG_LEVEL | INFO | 日志记录级别 |
MCP_PORT | 8086 | HTTP服务器端口 |
MCP_SECRET_PATH | /mcp | HTTP端点路径 |
用法
stdio模式(本地MCP客户端)
ssh-mcp或者使用uvx:
uvx --from mcp-ssh-multi ssh-mcpHTTP模式(网络/远程MCP客户端)
ssh-mcp-web服务器将监听 http://0.0.0.0:8086/mcp 默认情况下。
MCP客户端配置
添加到您的MCP客户端配置中(例如,Claude Desktop):
{
"mcpServers": {
"ssh": {
"command": "uvx",
"args": ["--from", "mcp-ssh-multi", "ssh-mcp"],
"env": {
"SSH_SERVERS_FILE": "/path/to/ssh_servers.yaml"
}
}
}
}对于HTTP模式:
{
"mcpServers": {
"ssh": {
"url": "http://localhost:8086/mcp"
}
}
}工具参考
连接管理
| 工具 | 说明 |
|---|---|
ssh_list_servers | 列出所有已配置的服务器及其连接状态 |
ssh_disconnect | 断开与特定服务器的连接 |
命令执行
| 工具 | 说明 |
|---|---|
ssh_execute | 在远程服务器上执行shell命令 |
文件操作
| 工具 | 说明 |
|---|---|
ssh_upload | 将本地文件上载到远程服务器 |
ssh_download | 从远程服务器下载文件 |
ssh_file_exists | 检查服务器上是否存在文件/目录 |
ssh_list_dir | 列出远程目录的内容(支持分页 limit/offset) |
ssh_read_file | 从远程服务器读取文本文件 |
ssh_write_file | 将内容写入远程服务器上的文件 |
系统监控
| 工具 | 说明 |
|---|---|
ssh_tail_log | 在远程服务器上跟踪日志文件 |
ssh_process_list | 列出正在运行的进程(可选筛选) |
MCP资源
服务器公开以下MCP资源:
| 资源URI | 描述 |
|---|---|
ssh://servers | 具有连接状态的所有已配置SSH服务器的列表 |
更新日志
v0.2.0版本
- 每台服务器连接锁 --将全局锁替换为每服务器异步锁,以提高并发性
- 连接重试 --在过时/丢失的SSH连接上自动重试一次
- MCP工具注释 --已添加
destructiveHint,readOnlyHint,idempotentHint,openWorldHint所有工具 - MCP资源 --已添加
ssh://servers资源端点 - 目录分页 —
ssh_list_dir现在支持limit和offset参数 - 输入验证 --路径净化
ssh_tail_log和过滤器验证ssh_process_list - 结构化错误 --与一致的错误格式
ErrorCode所有工具的枚举 - 动态版本控制 --版本来源于
importlib.metadata而不是硬编码字符串 - 测试套件 --添加了分页、重试逻辑、输入验证和版本一致性测试
v0.1.1
- 首次公开发布,包含11个SSH工具、stdio和HTTP传输
生产部署(LXC+Cloudflare隧道)
在Proxmox LXC容器上的Cloudflare隧道后面运行mcp-ssh-multi作为systemd服务的完整部署指南。
先决条件
- Proxmox LXC容器(Debian 12/13)
- 具有域的Cloudflare帐户
uv和cloudflared安装在LXC上
1.安装依赖项
# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \
-o cloudflared.deb && dpkg -i cloudflared.deb2.创建SSH服务器配置
mkdir -p /ssh-mcp
cat > /ssh-mcp/ssh_servers.yaml .json`。如果你以后需要找到它,请运行 `cloudflared tunnel list`.
Replace with the UUID from "cloudflared tunnel create" output
cat > /root/.cloudflared/config.yml credentials-file: /root/.cloudflared/.json
ingress: - hostname: ssh-mcp.yourdomain.com service: http://localhost:8086 - service: http_status:404 EOF
### 5.创建systemd服务
**mcp-ssh多服务:**
cat > /etc/systemd/system/mcp-ssh-multi.service << 'EOF' [Unit] Description=MCP SSH Multi Server After=network.target
[Service] Type=simple Environment=SSH_SERVERS_FILE=/ssh-mcp/ssh_servers.yaml Environment=MCP_SECRET_PATH=/your-secret-path ExecStart=/root/.local/bin/uvx --from mcp-ssh-multi@latest ssh-mcp-web Restart=always RestartSec=5 StandardOutput=journal StandardError=journal
[Install] WantedBy=multi-user.target EOF
**cloudflared服务:**
cloudflared service install
**启用并启动以下两项:**
systemctl daemon-reload systemctl enable --now mcp-ssh-multi systemctl enable --now cloudflared
### 6.验证
Check services
systemctl status mcp-ssh-multi systemctl status cloudflared
Test the endpoint
curl -s -X POST "https://ssh-mcp.yourdomain.com/your-secret-path" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
### 7.配置您的MCP客户端
{ "mcpServers": { "ssh": { "type": "remote", "url": "https://ssh-mcp.yourdomain.com/your-secret-path" } } }
### 服务管理
View logs
journalctl -u mcp-ssh-multi -f journalctl -u cloudflared -f
Restart services
systemctl restart mcp-ssh-multi systemctl restart cloudflared
### 环境变量
|变量|默认值|描述|
|----------|---------|-------------|
| `SSH_SERVERS_FILE` | `ssh_servers.yaml` |服务器配置路径|
| `SSH_TIMEOUT` | `30` |默认命令超时(秒)|
| `LOG_LEVEL` | `INFO` |日志记录级别|
| `MCP_PORT` | `8086` |HTTP服务器端口|
| `MCP_SECRET_PATH` | `/mcp` |HTTP端点路径(使用机密值)|
## 发展
Install with dev dependencies
uv sync --group dev
Run linting
uv run ruff check src/ tests/ --fix uv run ruff format src/ tests/
Run type checking
uv run mypy src/
Run tests
uv run pytest tests/ -v
## 许可证
麻省理工学院