Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Stdio MCP server for SSH host storage and remote command execution with a connection-pool monitor.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
MCP_SSH_CONFIG_DIR, MCP_SSH_MASTER_KEY, MCP_SSH_POOL_IDLE_MS, MCP_SSH_POOL_MAX_HOSTS标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"ssh-exec-cmd": {
"command": "npx",
"args": [
"-y",
"@xlbbb-cn/mcp_ssh_exec_cmd"
],
"env": {
"MCP_SSH_CONFIG_DIR": "your-value",
"MCP_SSH_MASTER_KEY": "your-value",
"MCP_SSH_POOL_IDLE_MS": "your-value",
"MCP_SSH_POOL_MAX_HOSTS": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add ssh-exec-cmd --env MCP_SSH_CONFIG_DIR=your-value --env MCP_SSH_MASTER_KEY=your-value --env MCP_SSH_POOL_IDLE_MS=your-value --env MCP_SSH_POOL_MAX_HOSTS=your-value -- npx -y @xlbbb-cn/mcp_ssh_exec_cmd运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"ssh-exec-cmd": {
"command": "npx",
"args": [
"-y",
"@xlbbb-cn/mcp_ssh_exec_cmd"
],
"env": {
"MCP_SSH_CONFIG_DIR": "your-value",
"MCP_SSH_MASTER_KEY": "your-value",
"MCP_SSH_POOL_IDLE_MS": "your-value",
"MCP_SSH_POOL_MAX_HOSTS": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"ssh-exec-cmd": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@xlbbb-cn/mcp_ssh_exec_cmd"
],
"env": {
"MCP_SSH_CONFIG_DIR": "your-value",
"MCP_SSH_MASTER_KEY": "your-value",
"MCP_SSH_POOL_IDLE_MS": "your-value",
"MCP_SSH_POOL_MAX_HOSTS": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
MCP_SSH_CONFIG_DIR envMCP_SSH_POOL_IDLE_MS envMCP_SSH_POOL_MAX_HOSTS env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 xlbbb-cn 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:MCP_SSH_MASTER_KEY
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.1.3)于14天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:Spec Driven Development, Remote Desktop Commander, TF Rooms
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Live room availability, rates and stay quotes for 12 New Leaf motels in Twin Falls, Idaho.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
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.
~/.mcp-ssh-server/hosts.json); no FastAPI backend, no database.crypto for AES-256-GCM, pure-JS ssh2 for SSH; runs on Windows / macOS / Linux.npx.pool_status renders the live pool as a desensitized table: uid, name, connection state, executed / failed commands and the last command (secrets and IP addresses masked).remote-ssh-cli manages the very same store (interactive TUI, batch commands, CSV bulk import) and can monitor the connection pool live (one frame per second, q quits).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) |
host_list is the entry point: every host comes back as exactly two fields — sys_name (the name) and uid (the unique identifier).host_id. Pass it back unchanged; never assemble or guess one.Host ' ' not found. host_id must be the exact 'uid' value returned by host_list — call host_list to obtain the valid identifiers. Call host_list again and retry with the value it returns.host_get is deliberately not published to MCP clients: the model only ever sees sys_name + uid, never one host's address, user name or credential. The CLI keeps its own get subcommand for human operators.| 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]
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 |
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
The same thing can be written into ~/.npmrc:
//npm.pkg.github.com/:_authToken=<PAT>
@xlbbb-cn:registry=https://npm.pkg.github.com
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" }
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 |
ip, host, name, port, user, password, …)."" escapes are parsed per RFC 4180, so private key material is never mangled.1 when at least one row failed.--dry-run only validates and reports — nothing is written.remote-ssh-cli banner, and remote-ssh-cli import without 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.
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 |
ConnectionPool the SSH tools use, so the connections it shows are real, reusable sessions.echo (it exists in a POSIX shell *and* in cmd.exe); every probe runs once per interval, so keep --interval reasonable on large host lists.| 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).
~/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" ]
只显示了开头部分;其余内容请在仓库中阅读