协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
ssh-mcp-helper【开发与工程】Use when 用户希望安装、配置或新增 ssh-mcp-server 的 MCP 连接(如「帮我装一下 ssh-mcp-server」「给 Cursor/Claude Code 配置 SSH MCP」「在已有 MCP 里加一台远程主机」「ssh-mcp-server 的 mcp.json 怎么写」)。技能通过逐步问答收集主机、认证、传输模式、命令限制等参数,并把生成的 mcpServers JSON 片段写入对应客户端的配置文件。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
帮助用户通过交互式问答完成 @fangjunjie/ssh-mcp-server 的安装预检与 MCP 客户端配置。技能本身不代替用户输入凭据,而是逐项确认认证方式、连接参数与安全策略,最终产出可直接写入 MCP 客户端配置文件的 mcpServers JSON 片段。
核心准则: 所有可枚举的选项(MCP 客户端类型、认证方式、传输模式、是/否开关)必须使用 AskUserQuestion 让用户选择;只有不可枚举的输入(host、用户名、私钥路径、密码、自定义白名单正则等)才允许自由文本提问。
mcpServers 中追加一台 SSH 主机digraph ssh_mcp_helper {
"0. 前置环境检查" [shape=box];
"1. 选择 MCP 客户端" [shape=box];
"2. 单台 vs 多台" [shape=diamond];
"3. 选择认证方式" [shape=box];
"4. 询问连接参数" [shape=box];
"5. 询问高级选项" [shape=box];
"6. 生成 JSON 片段" [shape=box];
"7. 合并写入配置" [shape=box];
"8. 提示重启与验证" [shape=doublecircle];
"0. 前置环境检查" -> "1. 选择 MCP 客户端";
"1. 选择 MCP 客户端" -> "2. 单台 vs 多台";
"2. 单台 vs 多台" -> "3. 选择认证方式" [label="单台"];
"2. 单台 vs 多台" -> "3. 选择认证方式" [label="多台 → 写 ssh-config.json"];
"3. 选择认证方式" -> "4. 询问连接参数";
"4. 询问连接参数" -> "5. 询问高级选项";
"5. 询问高级选项" -> "6. 生成 JSON 片段";
"6. 生成 JSON 片段" -> "7. 合并写入配置";
"7. 合并写入配置" -> "8. 提示重启与验证";
}
node -v 与 npx --version 确认本机有 Node.js(推荐 v18+)| 客户端 | 默认配置位置 |
|---|---|
| Claude Code(全局) | ~/.claude.json 的 mcpServers 字段 |
| Claude Code(项目级) | 项目根 .mcp.json |
| Cursor | ~/.cursor/mcp.json |
| Cline / Continue / 其他 | 让用户提供具体路径 |
--host 等)ssh-config.json 并使用 --config-filepassword — 账号 + 密码privateKey — 账号 + 私钥;再用 AskUserQuestion 确认是否带 passphrasessh-config — 复用 ~/.ssh/config 中的 Host 别名(只需 --host <alias>,可选 --ssh-config-file)ssh-agent — 使用 --agent 指向 socket2fa — 密码 + 私钥 + 键盘交互,追加 --try-keyboard--socksProxy 字符串<command> 占位符的模板exec;若用户标记目标为堡垒机/跳板机,改 shell 并追问 --shell-ready-timeout--allowed-local-paths / --allowed-remote-paths--pre-connect装配规则:
command 固定为 "npx"args 第一项 "-y",第二项 "@fangjunjie/ssh-mcp-server""--host 192.168.1.1"ssh-config.json(数组或对象格式皆可),客户端配置里只放 --config-file <绝对路径>mcpServers 下;若存在同名 key,先 AskUserQuestion 让用户选择覆盖 / 改名 / 取消list-servers,或对该连接执行 execute-command "whoami"| 场景 | 关键参数 |
|---|---|
| 账号密码 | --host --port --username --password |
| 私钥(可带 passphrase) | --host --port --username --privateKey [--passphrase] |
| 复用 ssh config 别名 | --host <alias> (+可选 --ssh-config-file) |
| SOCKS 代理 | --socksProxy socks://user:pwd@host:port |
| 堡垒机 / 跳板机 | --transport-mode shell --shell-ready-timeout 15000 |
| 多连接 | --config-file /abs/path/ssh-config.json |
| 2FA / MFA | --try-keyboard(搭配密码 + 私钥) |
| 命令白名单 | --whitelist "^ls(?: [A-Za-z0-9_./-]+)*$,^cat [A-Za-z0-9_./-]+quot; |
| 命令黑名单 | --blacklist "^rm .*,^shutdown.*" |
| 命令模板 | --command-template "su root -c '<command>'" |
| 路径白名单 | --allowed-local-paths / --allowed-remote-paths |
"--host 192.168.1.1" 当作一个 args 元素 → ✅ 拆成两个元素 "--host", "192.168.1.1"{ } = , 等字符却用旧式 --ssh "name=...,password=..." → ✅ 改用 --config-file 或 JSON 形式 --sshshell 模式下还想用 upload/download → 该模式禁用 SFTP,需切回 execmcpServers 中的同名 key → 必须先读后合并,覆盖前显式确认--whitelist / --blacklist → 必须主动提醒安全风险最简单的账号密码场景产出:
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456",
"--whitelist", "^ls(?: [A-Za-z0-9_./-]+)*$,^cat [A-Za-z0-9_./-]+quot;
]
}
}
}
多连接场景产出 ssh-config.json + 简化的客户端配置:
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": ["-y", "@fangjunjie/ssh-mcp-server", "--config-file", "/abs/path/ssh-config.json"]
}
}
}