SSH服务器管理服务

MCP SSH Server是一个集中式服务器,允许LLM代理(如Cursor AI、Claude Desktop、Codex等)通过SSH安全地执行命令和管理Linux服务器。

  • by Maxim11111
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 Maxim11111/mcp-ssh

使用说明

MCP SSH服务器

LLM代理的远程SSH管理服务器

一个集中式的MCP(模型上下文协议)服务器,使LLM代理(Cursor AI、Claude Desktop、Codex等)能够通过SSH安全地执行命令和管理Linux服务器。

特性

  • 🔐 安全SSH访问 -基于密钥的自动设置身份验证
  • 🌐 官方MCP SDK -流式HTTP(模型上下文协议/python sdk)
  • 🔏 MCP OAuth(RFC 9728) -Claude Code的受保护资源元数据+浏览器登录;与Bearer相同的API令牌
  • 🔄 实时流媒体 -通过SSE进行实时stdout/stderr流式传输
  • 🔑 基于令牌的身份验证 -具有细粒度权限的承载令牌
  • 🛡️ 安全第一 -命令验证、速率限制、审计日志记录
  • 📊 多服务器支持 -从一个端点管理数百台服务器
  • 🚀 生产就绪 -Docker支持、健康检查、优雅关机
  • 🛠️ CLI管理 -通过CLI工具轻松管理服务器/令牌

快速开始

使用Docker(推荐)

# Clone repository
git clone https://github.com/Maxim11111/mcp-ssh.git
cd mcp-ssh

# Copy example configs
cp config/servers.json.example config/servers.json
cp config/tokens.json.example config/tokens.json

# Copy environment configuration
cp env.example .env

# Edit .env file to customize settings (optional)
# nano .env

# Start with Docker Compose
docker-compose up -d

# Quick view servers list
docker exec -it mcp-ssh-server python -m src.cli server list

# Add your first server
docker exec -it mcp-ssh-server python -m src.cli server add

# Check status
docker-compose logs -f mcp-ssh-server

本地安装

# Install dependencies
pip install -r requirements.txt

# Setup configuration
mkdir -p config keys logs
cp config/servers.json.example config/servers.json
cp config/tokens.json.example config/tokens.json

# Add server
python -m src.cli server add

# Start server (factory loads env each process)
uvicorn src.server_http:create_app --factory --host 0.0.0.0 --port 8000

建筑

[Cursor / Claude Code / Codex / …]
         ↓
  HTTPS → Streamable HTTP POST /mcp (Bearer or OAuth access token)
         ↓
  [MCP SSH Server] → SSH Keys → [Your Linux Servers]
         ↓
  Audit Logs + Security Validation

集 PUBLIC_BASE_URL 在 .env 客户端使用的URL(例如。 https://mcp.example.com 在TLS之后)。SDK在以下网址发布OAuth发现 /.well-known/oauth-protected-resource/mcp 以及授权服务器元数据 /.well-known/oauth-authorization-serverMCP OAuth的浏览器登录位于 /login (粘贴您要放入的相同API令牌 Authorization: Bearer).

客户端配置(快速参考)

客户端 配置 注释
光标 ~/.cursor/mcp.json url + headers.Authorization: Bearer tok_…
克劳德代码 claude mcp add … 或项目配置 使用以结尾的HTTP传输URL /mcp;完成 验证 令牌来自 cli token create,或者如果客户支持,则预先提供承载
OpenAI Codex ~/.codex/config.toml 或 .codex/config.toml [mcp_servers.name] 随着 url = "https://host/mcp" 和 bearer_token_env_var = "MCP_SSH_TOKEN" (或 http_headers)--看 食品法典委员会MCP
谷歌Gemini CLI gemini mcp add … 以结尾的HTTP URL /mcp; -s user =用户级配置;承载者通过 --header "Authorization: Bearer tok_…" 或OAuth /mcp auth <name>
工作室 进程环境 MCP_TOKEN=tok_… 和 python -m src.server_stdio

使用示例

使用Cursor AI

添加 ~/.cursor/mcp.json:

{
  "mcpServers": {
    "ssh-devops": {
      "url": "http://your-server:8000/mcp",
      "headers": {
        "Authorization": "Bearer tok_your_token_here"
      }
    }
  }
}

然后在Cursor聊天中:

You: Install nginx on prod-web-01
AI: Executing command on prod-web-01...
✓ nginx installed successfully

使用克劳德桌面

添加 ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "ssh-devops": {
      "url": "http://your-server:8000/mcp",
      "headers": {
        "Authorization": "Bearer tok_your_token_here"
      }
    }
  }
}

使用克劳德代码(CLI)

在服务器可访问后 PUBLIC_BASE_URL (HTTPS正在生产中):

claude mcp add --transport http ssh-devops https://your-server.example.com/mcp

使用 验证 在 /mcp 出现提示时:打开 /login,从粘贴API令牌 python -m src.cli token create。颁发的访问令牌与您的Bearer令牌是相同的字符串。

使用Google Gemini CLI

添加一个可流式传输的HTTP服务器(用户范围配置在 ~/.gemini/):

gemini mcp add devops https://your-server.example.com/mcp --transport http -s user

如果你使用 持有者令牌 在添加服务器时传递它,而不是浏览器OAuth流:

gemini mcp add devops https://your-server.example.com/mcp --transport http -s user \
  --header "Authorization: Bearer tok_your_token_here"

随着 MCP OAuth,先添加服务器,然后在交互式CLI中运行 /mcp auth devops (浏览器重定向到 http://localhost:7777/oauth/callback).

使用OpenAI Codex(config.toml)

[mcp_servers.ssh_devops]
url = "https://your-server.example.com/mcp"
bearer_token_env_var = "MCP_SSH_TOKEN"

然后 export MCP_SSH_TOKEN=tok_... 在运行Codex之前。

Stdio(本地)

export MCP_TOKEN=tok_your_token_here
export CONFIG_DIR=./config
python -m src.server_stdio

可用工具

MCP SSH服务器为代理提供以下工具:

  • execute_命令 -在服务器上执行shell命令
  • 多次执行 -在多台服务器上并行执行命令
  • read_file -读取文件内容
  • write_file -写入/更新文件
  • list_directory -列出目录内容
  • check_service_status -检查系统服务状态
  • 安装包 -安装软件包(apt/yum/dnf)
  • list_server -获取可用服务器
  • get_system_info -获取系统信息

CLI管理

服务器管理

# Add server with automatic SSH key setup
python -m src.cli server add

# List all servers
python -m src.cli server list

# Test connection
python -m src.cli server test prod-web-01

# Remove server
python -m src.cli server remove prod-web-01

许可证管理

# Create new API token
python -m src.cli token create

# List tokens
python -m src.cli token list

# Revoke token
python -m src.cli token revoke tok_abc123

配置

环境变量(.env)

可以使用环境变量配置服务器。复制 env.example 到 .env 并自定义:

# Copy example configuration
cp env.example .env

# Edit configuration
nano .env

关键配置选项:

# Server Configuration
HOST=0.0.0.0                    # Server bind address
PORT=8000                       # Internal container port
EXTERNAL_PORT=8000              # External Docker host port

# Security
TOKEN_EXPIRY_HOURS=8760        # Token validity period

# Rate Limiting
RATE_LIMIT_PER_MINUTE=60       # Requests per minute
RATE_LIMIT_PER_HOUR=500        # Commands per hour

# SSH Settings
SSH_CONNECTION_TIMEOUT=30       # SSH connection timeout
SSH_COMMAND_TIMEOUT=300        # Command execution timeout

反向代理设置

对于使用反向代理(nginx代理管理器、traefik等)的生产部署:

# Use proxy compose file (recommended)
docker-compose -f docker-compose.yml -f docker-compose.proxy.yml up -d

servers.json

{
  "servers": {
    "prod-web-01": {
      "host": "192.168.1.10",
      "port": 22,
      "user": "deploy",
      "ssh_key_path": "/app/keys/prod_web_ed25519",
      "tags": ["production", "web"],
      "enabled": true,
      "description": "Production web server"
    }
  },
  "security": {
    "allowed_commands_patterns": ["^apt ", "^systemctl ", "^docker "],
    "forbidden_commands": ["rm -rf /", "mkfs"],
    "rate_limit": {
      "requests_per_minute": 60,
      "commands_per_hour": 500
    }
  }
}

tokens.json

{
  "tokens": {
    "tok_abc123...": {
      "name": "cursor-admin",
      "permissions": ["execute", "read", "write", "install"],
      "allowed_servers": ["*"],
      "rate_limit_multiplier": 1.0,
      "enabled": true
    }
  }
}

安全

多层安全

  1. 持有者代币 -API访问控制
  2. SSH密钥 -服务器身份验证(密钥永远不会离开服务器)
  3. 命令验证 -白名单/黑名单模式
  4. 速率限制 -每个令牌请求限制
  5. 审计日志 -记录所有操作
  6. 权限系统 -精细的访问控制

最佳实践

  • 使用ED25519 SSH密钥
  • 定期旋转令牌
  • 配置允许的命令模式
  • 监控审核日志
  • 在生产环境中使用HTTPS(通过nginx代理管理器)
  • 将令牌权限限制为所需的最小值

测试

# Install dev dependencies
pip install -r requirements-dev.txt

# Run tests
pytest

# Run with coverage
pytest --cov=src --cov-report=html

# View coverage report
open htmlcov/index.html

看 测试.md 详细的测试说明。

部署

看 部署.md 用于生产部署指南。

文档

API终点

服务器在单个端点上运行HTTP JSON-RPC(请参见 MCP_PROTOCOL.md):

MCP协议

  • GET /mcp -服务器信息和可用传输
  • POST /mcp -JSON-RPC(方法: initialize, tools/list, tools/call)
  • GET /sse -苏格兰和南方能源公司运输(传统)

效用

  • GET /health -健康检查

环境变量

所有配置都可以通过以下方式进行管理 .env 文件。看 env.example 对于所有可用选项:

# Server Configuration
HOST=0.0.0.0              # Listen host
PORT=8000                 # Internal container port
EXTERNAL_PORT=8000        # External Docker host port
LOG_LEVEL=INFO            # Logging level

# Directory Configuration
CONFIG_DIR=/app/config    # Configuration directory
KEYS_DIR=/app/keys        # SSH keys directory
LOGS_DIR=/app/logs        # Logs directory

# Security Settings
TOKEN_EXPIRY_HOURS=8760   # Token validity period

# Rate Limiting
RATE_LIMIT_ENABLED=true   # Enable rate limiting
RATE_LIMIT_PER_MINUTE=60  # Requests per minute
RATE_LIMIT_PER_HOUR=500   # Commands per hour

# SSH Settings
SSH_CONNECTION_TIMEOUT=30  # SSH connection timeout
SSH_COMMAND_TIMEOUT=300   # Command execution timeout

# Development Settings
DEBUG=false               # Debug mode
RELOAD=false              # Auto-reload on changes

需求

  • Python 3.10+
  • Docker和Docker Compose(用于容器化部署)
  • SSH访问目标服务器
  • OpenSSH客户端

贡献

欢迎投稿!拜托:

  1. 分叉存储库
  2. 创建要素分支
  3. 为新功能添加测试
  4. 确保所有测试通过
  5. 提交拉取请求

许可证

MIT许可证-请参阅 许可证 文件以获取详细信息。

支持

  • GitHub问题: 报告错误
  • 文档:请参阅存储库根目录中的*.md文件
  • 电子邮件:your.email@example.com

致谢


制作❤️ 面向LLM DevOps社区