SSH Host Storage & Remote Exec
What it does
Stdio MCP server for SSH host storage and remote command execution with a connection-pool monitor.
- Connects 在你的电脑上运行
- Account or key Needs MCP_SSH_MASTER_KEY
- Category 开发者工具
安装
选择你使用的 AI 应用,然后复制设置。
通过 3/3 项检查 · 在你的电脑上运行
第一步:你用哪个 AI?
选择你用的应用,步骤会显示在下方。
可连接 Claude,但需要先准备
需要 SSH Host Storage & Remote Exec 的密钥(在开发者网站创建) · 需要先在电脑上安装 Node.js(只需一次) · 仅限电脑上的 Claude 应用(Windows 或 Mac),网页和手机不可用
注册并创建 SSH Host Storage & Remote Exec 的密钥
打开开发者网站,注册账户并创建 API 密钥,下一步要用。价格和免费方案请看开发者网站。
打开电脑版 Claude 应用的设置文件
SettingsDeveloperEdit Config
粘贴这些设置并保存文件
正在检查命令 · 通过后才会显示复制按钮
只把密钥粘贴到应用的输入框里,不要粘贴到聊天中或发给任何人
退出 Claude 再重新打开
试一试
用 SSH Host Storage & Remote Exec 告诉我你能帮我做什么,然后做一件给我看✓ 如果 Claude 说正在使用 SSH Host Storage & Remote Exec,或回答中出现 SSH Host Storage & Remote Exec 的工具名称,就表示连接成功
3 项可选设置(不填也能用)
上面的命令不填这些也能用。想调整时再按开发者的说明添加(英文原文)。
MCP_SSH_CONFIG_DIRDirectory holding hosts.json and master.key (default: ~/.mcp-ssh-server).MCP_SSH_POOL_IDLE_MSIdle SSH connections are closed after this many milliseconds (default: 60000, 0 disables pooling).MCP_SSH_POOL_MAX_HOSTSMaximum number of pooled SSH connections (default: 32).
菜单名称已于 2026年11月11日 对照 Anthropic 帮助页面核实 · 你的界面可能因版本略有不同
ChatGPT 暂时无法连接 SSH Host Storage & Remote Exec
SSH Host Storage & Remote Exec 需要安装在你的电脑上,而 ChatGPT 只能连接在网上运行的服务器
你可以改用这些方式
A · 使用能连接 SSH Host Storage & Remote Exec 的应用
- 需要 SSH Host Storage & Remote Exec 的密钥(在开发者网站创建) · 需要先在电脑上安装 Node.js(只需一次) · 仅限电脑上的 Claude 应用(Windows 或 Mac),网页和手机不可用
- 需要 SSH Host Storage & Remote Exec 的密钥(在开发者网站创建) · 需要先在电脑上安装 Node.js(只需一次)
- 需要 SSH Host Storage & Remote Exec 的密钥(在开发者网站创建) · 需要先在电脑上安装 Node.js(只需一次)
- 需要 SSH Host Storage & Remote Exec 的密钥(在开发者网站创建) · 需要先在电脑上安装 Node.js(只需一次)
B · 开发者工具 类中能连接 ChatGPT 的其他服务器
从同类中使用较多的里挑选,仅限用地址即可连接、无需密钥的
- Sentry✓ ChatGPT
- Compiler Explorer✓ ChatGPT
- GitDiagram✓ ChatGPT
可连接 Claude Code,但需要先准备
需要 SSH Host Storage & Remote Exec 的密钥(在开发者网站创建) · 需要先在电脑上安装 Node.js(只需一次)
注册并创建 SSH Host Storage & Remote Exec 的密钥
打开开发者网站,注册账户并创建 API 密钥,下一步要用。价格和免费方案请看开发者网站。
打开终端
Mac:按 Command+空格,输入 Terminal · Windows:打开 PowerShell
粘贴这条命令并按 Enter
正在检查命令 · 通过后才会显示复制按钮
按 Enter 前,把“your-value”改成你的密钥
只把密钥粘贴到应用的输入框里,不要粘贴到聊天中或发给任何人
在 Claude Code 中输入 /mcp
应能看到 SSH Host Storage & Remote Exec 在列表中并显示已连接
试一试
用 SSH Host Storage & Remote Exec 告诉我你能帮我做什么,然后做一件给我看✓ 如果 Claude Code 说正在使用 SSH Host Storage & Remote Exec,或回答中出现 SSH Host Storage & Remote Exec 的工具名称,就表示连接成功
3 项可选设置(不填也能用)
上面的命令不填这些也能用。想调整时再按开发者的说明添加(英文原文)。
MCP_SSH_CONFIG_DIRDirectory holding hosts.json and master.key (default: ~/.mcp-ssh-server).MCP_SSH_POOL_IDLE_MSIdle SSH connections are closed after this many milliseconds (default: 60000, 0 disables pooling).MCP_SSH_POOL_MAX_HOSTSMaximum number of pooled SSH connections (default: 32).
菜单名称已于 2026年11月11日 对照 Anthropic 帮助页面核实 · 你的界面可能因版本略有不同
可连接 Cursor,但需要先准备
需要 SSH Host Storage & Remote Exec 的密钥(在开发者网站创建) · 需要先在电脑上安装 Node.js(只需一次)
注册并创建 SSH Host Storage & Remote Exec 的密钥
打开开发者网站,注册账户并创建 API 密钥,下一步要用。价格和免费方案请看开发者网站。
点击这个按钮打开 Cursor
正在检查命令 · 通过后才会显示复制按钮
填写你的密钥
在 SSH Host Storage & Remote Exec 的设置中,MCP_SSH_MASTER_KEY 还是空的,填入你的密钥并保存
只把密钥粘贴到应用的输入框里,不要粘贴到聊天中或发给任何人
在 Cursor 中以 Agent 模式打开 AI 聊天
试一试
用 SSH Host Storage & Remote Exec 告诉我你能帮我做什么,然后做一件给我看✓ 如果 Cursor 说正在使用 SSH Host Storage & Remote Exec,或回答中出现 SSH Host Storage & Remote Exec 的工具名称,就表示连接成功
3 项可选设置(不填也能用)
上面的命令不填这些也能用。想调整时再按开发者的说明添加(英文原文)。
MCP_SSH_CONFIG_DIRDirectory holding hosts.json and master.key (default: ~/.mcp-ssh-server).MCP_SSH_POOL_IDLE_MSIdle SSH connections are closed after this many milliseconds (default: 60000, 0 disables pooling).MCP_SSH_POOL_MAX_HOSTSMaximum number of pooled SSH connections (default: 32).
菜单名称已于 2026年11月11日 对照 Cursor 帮助页面核实 · 你的界面可能因版本略有不同
可连接 VS Code,但需要先准备
需要 SSH Host Storage & Remote Exec 的密钥(在开发者网站创建) · 需要先在电脑上安装 Node.js(只需一次)
注册并创建 SSH Host Storage & Remote Exec 的密钥
打开开发者网站,注册账户并创建 API 密钥,下一步要用。价格和免费方案请看开发者网站。
点击这个按钮打开 VS Code
正在检查命令 · 通过后才会显示复制按钮
填写你的密钥
在 SSH Host Storage & Remote Exec 的设置中,MCP_SSH_MASTER_KEY 还是空的,填入你的密钥并保存
只把密钥粘贴到应用的输入框里,不要粘贴到聊天中或发给任何人
在 VS Code 中以 Agent 模式打开 AI 聊天
试一试
用 SSH Host Storage & Remote Exec 告诉我你能帮我做什么,然后做一件给我看✓ 如果 VS Code 说正在使用 SSH Host Storage & Remote Exec,或回答中出现 SSH Host Storage & Remote Exec 的工具名称,就表示连接成功
3 项可选设置(不填也能用)
上面的命令不填这些也能用。想调整时再按开发者的说明添加(英文原文)。
MCP_SSH_CONFIG_DIRDirectory holding hosts.json and master.key (default: ~/.mcp-ssh-server).MCP_SSH_POOL_IDLE_MSIdle SSH connections are closed after this many milliseconds (default: 60000, 0 disables pooling).MCP_SSH_POOL_MAX_HOSTSMaximum number of pooled SSH connections (default: 32).
菜单名称已于 2026年11月11日 对照 VS Code 帮助页面核实 · 你的界面可能因版本略有不同
开发者专用:终端命令和 JSON 设置
安装在电脑上
Claude Code
正在检查命令 · 通过后才会显示复制按钮
Claude Desktop (claude_desktop_config.json)
正在检查命令 · 通过后才会显示复制按钮
Cursor (~/.cursor/mcp.json)
正在检查命令 · 通过后才会显示复制按钮
VS Code (mcp.json)
正在检查命令 · 通过后才会显示复制按钮
需要你填写的值
MCP_SSH_CONFIG_DIRenvDirectory holding hosts.json and master.key (default: ~/.mcp-ssh-server).MCP_SSH_MASTER_KEY机密 必填 env64-hex-character AES-256-GCM master key; auto-generated into /master.key when unset.MCP_SSH_POOL_IDLE_MSenvIdle SSH connections are closed after this many milliseconds (default: 60000, 0 disables pooling).MCP_SSH_POOL_MAX_HOSTSenvMaximum number of pooled SSH connections (default: 32).
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
一览
哪些应用可以使用它
依据这个服务器的连接方式和各应用自己的文档,检查于 2026年11月10日。
在你的电脑上运行,适用于
ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatRaycast
它能做什么
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
基础检查i
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月14日
- ✓ 通过
作者与仓库一致
注册名称已通过 GitHub 账户 xlbbb-cn 验证,该账户拥有此仓库
- ✓ 通过
仍在维护
代码最后更新于22天前
- ✓ 通过
有许可证
使用 MIT
- – 不适用
端点有响应
它在你的电脑上运行,没有互联网端点
- – 不适用
使用 OAuth 登录
在你的电脑上运行,改用本地设置
- … 尚未检查
工具描述中没有隐藏指令
它在你的电脑上运行;我们只能读取互联网端点的工具列表
讨论
提问、分享技巧或报告无法使用。按“有帮助”数量排序。
用户评价
还没有评价
与“开发者工具”中的其他服务器比较i
- 星标数多于此分类中其他 5863 个服务器的 69%
- 发布到注册中心的时间比此分类中其他 5863 个服务器的 57% 更新
- 基础检查结果等于或优于此分类中其他 5863 个服务器的 100%
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
常见问题
SSH Host Storage & Remote Exec 安全吗?
它在 3 项适用的基础检查中通过了 3 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
它需要哪些密钥或代码?
你需要填写:MCP_SSH_MASTER_KEY
它在我的电脑上运行还是在云端?
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
它还在维护吗?
GitHub 仓库最后更新于22天前,最新版本(0.1.3)于22天前进入注册中心。
哪些应用可以使用它?
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同类别的其他选择
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Serena MCP: the IDE for your agent
A powerful toolkit for coding, providing semantic retrieval and editing capabilities.
作者的 README
打开 README
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
mcp-ssh-server
A standalone stdio MCP server that turns *SSH host management* and *remote command execution* into MCP tools.
It also ships an interactive / batch CLI (
remote-ssh-cli) for managing SSH hosts on the local machine.
简体中文文档见 README.zh-CN.md。
This is a Node.js re-implementation of the SSH-host half of a FastAPI project (app/services/llm_tools.py + app/utils/ssh_helper.py + app/models/host.py) — without the backend, without the database, without a network service. Any MCP client (Claude Desktop, Continue, a custom agent, …) can start it with npx and talk to it over JSON-RPC.
Highlights
- Fully standalone — its own encrypted JSON store (
~/.mcp-ssh-server/hosts.json); no FastAPI backend, no database. - No native dependencies — Node's built-in
cryptofor AES-256-GCM, pure-JSssh2for SSH; runs on Windows / macOS / Linux. - Standards-compliant stdio MCP — speaks the Model Context Protocol stdio transport and can be launched with
npx. - Credentials never leave the server — host tool responses never contain a password or a private key; the SSH tools decrypt them internally to open a connection and never echo them back.
- Connection pooling — one live SSH session per host, reused across commands and playbook steps.
- Pool monitoring —
pool_statusrenders the live pool as a desensitized table: uid, name, connection state, executed / failed commands and the last command (secrets and IP addresses masked). - CLI companion —
remote-ssh-climanages the very same store (interactive TUI, batch commands, CSV bulk import) and can monitor the connection pool live (one frame per second,qquits).
MCP tools
Nine tools are published:
| Tool | Description |
|---|---|
cli_help | Installation / usage / troubleshooting notes for remote-ssh-cli, optionally narrowed down with topic |
host_list | List the known hosts — only `sys_name` and `uid` (no address, user name or credential); uid is the host_id every other tool expects |
host_create | Add a host (password / private key / passphrase are encrypted at rest) |
host_update | Patch host fields (omitted credential fields keep their current value) |
host_delete | Delete a host |
ssh_run_command | Run a single non-interactive command on a host |
ssh_run_interactive | Run a command that answers prompts (sudo, …) through expect/answer pairs |
ssh_run_playbook | Run a multi-step playbook (structured # @… directives *or* legacy expect:/answer: lines) |
pool_status | Monitor the live connection pool — one desensitized row per host (uid, name, state, executed / failed commands, last command) |
The host identifier contract
host_listis the entry point: every host comes back as exactly two fields —sys_name(the name) anduid(the unique identifier).- Every other tool takes that same value under the name
host_id. Pass it back unchanged; never assemble or guess one. - When an id does not resolve, the tool answers with an actionable error:
Host ' ' not found. host_id must be the exact 'uid' value returned by host_list — call host_list to obtain the valid identifiers.Callhost_listagain and retry with the value it returns. host_getis deliberately not published to MCP clients: the model only ever seessys_name+uid, never one host's address, user name or credential. The CLI keeps its owngetsubcommand for human operators.
Arguments at a glance
| Tool | Arguments | |
|---|---|---|
cli_help | topic? — one of install, list, get, create, update, delete, import, monitor, tui, windows | |
host_list | enabled_only? (bool) | |
host_create | ip_address (required), system_name?, ssh_port? (1-65535, default 22), ssh_username? (default root), ssh_auth_method? (password \ | pubkey), ssh_password?, ssh_private_key?, ssh_private_key_passphrase?, is_enable? (default true) |
host_update | host_id (required) plus any of the fields above — an omitted field keeps its current value | |
host_delete | host_id | |
ssh_run_command | host_id, command, timeout_seconds (1-600, required) | |
ssh_run_interactive | host_id, command, expects? ([{ expect, answer }]), timeout_seconds | |
ssh_run_playbook | host_id, content (the multi-line playbook body), timeout_seconds | |
pool_status | host_id? (one host only), format? (table \ | json), include_history? (bool), include_idle_hosts? (bool) |
ip_address is unique across the store — creating a duplicate fails.
Command results come back as a plain text block:
[stdout]
hello [stderr] [exit_code=0 success=true duration_ms=42]
Quick start
git clone https://github.com/xlbbb-cn/mcp_ssh_exec_cmd.git
cd mcp_ssh_exec_cmd npm install npm run build
The build output lands in dist/ and provides two binaries:
| Binary | Entry point | Purpose |
|---|---|---|
remote-ssh-server | dist/index.js | the stdio MCP server (started by your MCP client) |
remote-ssh-cli | dist/cli.js | interactive / batch host-management CLI |
Install
The package is published to two registries under the same name, @xlbbb-cn/mcp_ssh_exec_cmd:
| Registry | Install command | Auth |
|---|---|---|
| npmjs.org (recommended) | npm install -g @xlbbb-cn/mcp_ssh_exec_cmd | none — the public registry needs no token |
| GitHub Packages | npm install -g @xlbbb-cn/mcp_ssh_exec_cmd --registry=https://npm.pkg.github.com | a personal access token (classic) with read:packages |
GitHub Packages requires authentication for installs as well — even for public packages — so give npm a token first:
npm login --scope=@xlbbb-cn --auth-type=legacy --registry=https://npm.pkg.github.com
Username:
Password:
The same thing can be written into ~/.npmrc:
//npm.pkg.github.com/:_authToken=<PAT>
@xlbbb-cn:registry=https://npm.pkg.github.com
Global install (CLI)
From a local checkout:
npm run build
npm install -g --allow-scripts=ssh2,cpu-features .
Or straight from a registry:
npm install -g @xlbbb-cn/mcp_ssh_exec_cmd # npmjs.org
npm install -g @xlbbb-cn/mcp_ssh_exec_cmd --registry=https://npm.pkg.github.com # GitHub Packages
Afterwards remote-ssh-cli is on your PATH:
remote-ssh-cli # interactive TUI
remote-ssh-cli list # JSON list of every host remote-ssh-cli get remote-ssh-cli create remote-ssh-cli update remote-ssh-cli delete remote-ssh-cli import [--dry-run] remote-ssh-cli monitor # live connection-pool monitor (q quits)
create / update take a JSON file, e.g.:
{
"ip_address": "192.168.1.100", "system_name": "web-01", "ssh_port": 22, "ssh_username": "root", "ssh_auth_method": "password", "ssh_password": "your-password" }
CSV bulk import
remote-ssh-cli import hosts.csv turns every row of the file into one host. The first line must be a header row containing at least an ip_address column:
ip_address,system_name,ssh_port,ssh_username,ssh_auth_method,ssh_password
192.168.1.100,web-01,22,root,password,secret 192.168.1.101,db-01,2222,deploy,password,secret
| Column | Description | Default |
|---|---|---|
ip_address | required, host address, unique across the table | — |
system_name | display name | empty |
ssh_port | SSH port | 22 |
ssh_username | SSH user name | root |
ssh_auth_method | password / pubkey | password |
ssh_password | plain-text password (encrypted before it hits the disk) | — |
ssh_private_key | plain-text private key (encrypted before it hits the disk) | — |
ssh_private_key_path | path to a key file (alternative to ssh_private_key) | — |
ssh_private_key_passphrase | passphrase protecting the key (encrypted before it hits the disk) | — |
is_enable | true/false/1/0/yes/no | true |
- Column names are case-insensitive and accept aliases (
ip,host,name,port,user,password, …). - Quoted commas, embedded newlines and
""escapes are parsed per RFC 4180, so private key material is never mangled. - A bad row never aborts the batch: every row ends up reported as created / skipped (duplicate IP) / failed (invalid data). The command prints a summary and exits with code
1when at least one row failed. --dry-runonly validates and reports — nothing is written.- The CSV template (header + example row) is printed in the
remote-ssh-clibanner, andremote-ssh-cli importwithout a file argument prints the same thing.
Windows note: if you hit
JScript runtime error (800A03EA), make sure npm is >= 10.8.0 or run the command from cmd.exe instead of PowerShell — the.ps1wrapper npm generates may not invokenodeexplicitly on older npm versions. Both entry points ship a#!/usr/bin/env nodeshebang.
Monitor the connection pool
remote-ssh-cli monitor opens a live view of the SSH connection pool. The screen is redrawn once per second and the view is left with the `q` key (Ctrl+C works as well):
SSH connection pool monitor · 15:05:31 · tick 42 · refresh 1000ms · last tick 41ms
pool 2/32 connections · idle timeout 1m00s · probe timeout 5s · press q to quit
HOST ADDRESS USER STATUS LATENCY LAST OK POOL
web-01 192.168.1.100 root up 12ms 15:05:30 1m05s db-01 10.0.0.5:2222 deploy down 8ms - -
problems (1): db-01 (10.0.0.5:2222): connect ECONNREFUSED 10.0.0.5:2222
| Column | Meaning |
|---|---|
STATUS | up (the probe succeeded), down (the connection failed) or disabled (the host is switched off — it is listed but never probed) |
LATENCY | how long the last probe took, end to end |
LAST OK | clock time of the last successful probe |
POOL | age of the pooled connection — how long the session has been reused without being re-established |
- The monitor keeps the pool warm: every host is probed through the very same
ConnectionPoolthe SSH tools use, so the connections it shows are real, reusable sessions. - The CLI runs its own pool — the MCP server is a separate process, so its connections cannot be inspected from the terminal.
- The default probe command is
echo(it exists in a POSIX shell *and* incmd.exe); every probe runs once per interval, so keep--intervalreasonable on large host lists. - Without a terminal (a pipe, a CI job) the monitor prints a single frame instead of looping — there would be no key to stop it.
| Option | Description | Default |
|---|---|---|
--interval | redraw interval | 1000 |
--timeout | per-host probe timeout (1-600 s) | 5 |
--probe-cmd | command used to probe a host | echo |
--host | monitor only this host (repeatable) | all hosts |
--all | also list disabled hosts (never probed) | off |
--once | print a single frame and exit | off |
The same view is available from the interactive TUI (7) Monitor connection pool).
Register it with an MCP client
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": { "ssh": { "command": "npx", "args": ["-y", "-p", "@xlbbb-cn/mcp_ssh_exec_cmd", "remote-ssh-server"] } } }
On GitHub Packages, add the registry to the same snippet:
"args": [
"--registry=https://npm.pkg.github.com", "-y", "-p", "@xlbbb-cn/mcp_ssh_exec_cmd", "remote-ssh-server" ]