使用说明
远程上下文mcp服务器
MCP服务器用于SSH远程服务器管理。通过SSH连接到多个远程服务器、执行命令、传输文件和跟踪长时间运行的进程——所有这些都来自您的LLM。
特性
- 多个SSH连接 --根据需要配置任意数量的服务器,通过连接池重复使用
- 两种身份验证方法 --用户名/密码或SSH私钥(按文件路径),带有可选的基于文件的密钥(
passwordFile/passphraseFile) - 主机密钥验证(TOFU) -每个服务器的指纹被固定在第一个连接上,并在每次重新连接时进行验证,以捕获中间人的尝试
- 指挥安全 --危险命令在执行前会被自动阻止(阻止列表),敏感服务器可以选择每个连接的允许列表
- 长时间运行过程跟踪 --异步运行命令,轮询状态,并在运行中取消命令
- 每个流程历史记录 --每个命令执行都记录有stdout、stderr、退出代码和计时(有界,以避免无限内存增长)
- 持久审计日志 --每次执行都可以选择性地附加到本地JSONL文件中,以实现跨重启的可追溯性
- SFTP文件传输 --通过相同的SSH连接上传/下载文件
安装
npx remote-context-mcp-server
或全局安装:
npm install -g remote-context-mcp-server
配置
设置 SSH_CONNECTIONS 带有JSON连接对象数组的环境变量:
[
{
"name": "production",
"host": "192.168.1.100",
"port": 22,
"username": "ubuntu",
"passwordFile": "/home/user/.secrets/prod-password"
},
{
"name": "staging",
"host": "staging.example.com",
"port": 22,
"username": "deploy",
"privateKeyPath": "/home/user/.ssh/id_rsa"
},
{
"name": "dev-box",
"host": "10.0.0.5",
"port": 2222,
"username": "admin",
"privateKeyPath": "/home/user/.ssh/dev_key",
"passphrase": "keypassphrase",
"allowedCommands": ["git ", "npm ", "ls", "cat ", "df", "systemctl status"]
}
]
连接字段
| 字段 | 必填 | 描述 |
|---|---|---|
name |
是 | 工具中用于引用此连接的唯一标识符 |
host |
是 | IP地址或主机名 |
port |
无 | SSH端口(默认值: 22) |
username |
是 | SSH用户名 |
password |
否* | 身份验证密码(内联) |
passwordFile |
否* | 包含密码的文件的路径-- 首选 结束 password 所以秘密不会直接存在 SSH_CONNECTIONS/env |
privateKeyPath |
否* | 私钥文件的绝对路径(例如。 ~/.ssh/id_rsa) |
passphrase |
否 | 私钥的密码短语(内联) |
passphraseFile |
否 | 包含密钥密码的文件路径——首选 passphrase |
allowedCommands |
No | 正则表达式模式数组(锚定在命令的开头)。设置后,此连接上只允许使用匹配的命令——将默认块列表反转为敏感/生产服务器的显式分配列表 |
*要么 password, passwordFile,或 privateKeyPath 必须提供。
使用时 passwordFile/passphraseFile,使引用的文件只能由运行MCP服务器的用户读取(chmod 600).
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
SSH_CONNECTIONS |
-- | 连接配置的JSON数组(必填) |
KNOWN_HOSTS_PATH |
~/.remote-context-mcp/known_hosts.json |
存储可信主机密钥指纹(TOFU)的位置 |
SSH_POOL_IDLE_MS |
300000 (5分钟) |
空闲池SSH连接在关闭前保持打开状态的时间 |
MAX_OUTPUT_BYTES |
1000000 (1 MB) |
截断前每个进程跟踪的最大stdout/stderr大小 |
MAX_PROCESS_RECORDS |
500 |
内存中保存的最大进程记录数;在此之后,最旧的非运行记录将被删除 |
AUDIT_LOG_PATH |
~/.remote-context-mcp/audit.jsonl |
写入持久审计日志的位置 |
AUDIT_LOG_DISABLED |
false |
设置为 "true" 禁用持久审核日志 |
克劳德桌面/光标设置
添加到MCP配置文件中:
{
"mcpServers": {
"remote-context": {
"command": "npx",
"args": ["-y", "remote-context-mcp-server"],
"env": {
"SSH_CONNECTIONS": "[{\"name\":\"my-server\",\"host\":\"192.168.1.100\",\"username\":\"ubuntu\",\"passwordFile\":\"/home/user/.secrets/my-server-password\"}]"
}
}
}
}
可用工具
ssh_list_connections
列出所有已配置的连接。随时都可以安全地拨打电话——永远不会暴露凭据。
ssh_ping
测试与指定服务器的SSH连接,并返回延迟+服务器信息。
connection_name: "production"
ssh_exec
在远程服务器上执行命令。运行前是否提示用户确认取决于MCP客户端的设置——服务器本身不会强制确认,但无论客户端设置如何,它总是强制执行命令filter/allowlist。
connection_name: "production"
command: "df -h"
working_directory: "/var/www" (optional)
timeout_seconds: 30 (optional, default 30)
async: false (optional, default false)
dry_run: false (optional, default false)
集 async: true 对于长时间运行的命令,该工具返回 process_id 命令立即在后台运行。集 dry_run: true 无需连接或执行任何操作,即可查看已解析的命令和筛选结果。
ssh_get_process
检索被跟踪进程的完整状态和输出(stdout+stderr)。
process_id: "proc_abc123_xyz"
ssh_list_processes
列出当前会话中的所有进程记录(仅元数据,无输出)。
connection_name: "production" (optional filter)
status: "running" (optional filter: running|completed|failed|timeout|blocked|killed)
ssh_kill_process
取消以开头的正在运行的命令 ssh_exec (通常为 async: true 一)。
process_id: "proc_abc123_xyz"
ssh_upload_file
通过SFTP将本地文件上传到远程服务器。
connection_name: "production"
local_path: "./build/app.tar.gz"
remote_path: "/opt/releases/app.tar.gz"
ssh_download_file
通过SFTP从远程服务器下载文件。
connection_name: "production"
remote_path: "/var/log/app.log"
local_path: "./app.log"
指挥安全
以下类型的命令会被自动阻止:
- 从根目录或关键目录中递归删除文件系统(
rm -rf /,rm -rf /*,rm -rf /home,rm -rf /etc, …) - 破坏性等效物(
find / -deletePython的shutil.rmtree('/')) - 磁盘格式化(
mkfs,wipefs) - 直接设备写入(
dd if=... of=/dev/...) - 叉式炸弹
- 远程脚本执行(
curl | bash,wget | sh) - 代码执行混乱(
base64 -d | bash) - 根密码更改
- SSH密钥注入
authorized_keys - 服务器关闭/重新启动命令
此阻止列表是 纵深防御,不是保证 --它基于正则表达式,无法捕获所有等效命令。对于敏感或生产连接,设置 allowedCommands 在connection配置中,将该连接切换为显式的allowlist。
命令过滤器始终验证完全解析的命令(包括任何 cd 前缀来自 working_directory),因此走私空壳商无法绕过 working_directory.
已阻止的命令会记录其状态 blocked 以及解释他们被拒绝的原因。
进程状态
| 状态 | 含义 |
|---|---|
running |
命令当前正在执行 |
completed |
命令已完成,退出代码为0 |
failed |
命令已完成,退出代码为非零 |
timeout |
命令超过了配置的超时时间 |
blocked |
命令被安全筛选器/allowlist拒绝 |
killed |
命令已通过取消 ssh_kill_process |
许可证
麻省理工学院
