MCP SSH Manager

Run commands, move files and manage databases on many SSH servers, with per-server safety modes

By Jérémy Christillin (individual) TypeScript Local · stdio DevOps and monitoringDatabases

68 popularity score ★ 534 ↓ 2.9k/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add ssh-manager -- npx -y mcp-ssh-manager
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "ssh-manager": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-ssh-manager"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "ssh-manager": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-ssh-manager"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "ssh-manager": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "mcp-ssh-manager"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.ssh-manager]
command = "npx"
args = ["-y", "mcp-ssh-manager"]
Gemini CLITerminal
gemini mcp add --scope user ssh-manager npx -- -y mcp-ssh-manager
Local (from source)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

FirstTerminal
git clone https://github.com/bvisible/mcp-ssh-manager.git
cd mcp-ssh-manager
npm install
Claude CodeTerminal
claude mcp add ssh-manager -- node '<ABSOLUTE_PATH_TO_CLONE>/src/index.js'
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "ssh-manager": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/src/index.js"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "ssh-manager": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/src/index.js"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "ssh-manager": {
      "type": "stdio",
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/src/index.js"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.ssh-manager]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/src/index.js"]
Gemini CLITerminal
gemini mcp add --scope user ssh-manager node -- '<ABSOLUTE_PATH_TO_CLONE>/src/index.js'

Settings 7

Set together: config files
SSH_ENV_PATH Optional: Exact .env file to load. Hosts are set there as one block of SSH_SERVER_<NAME>_ variables per server. Without it the server tries SSH_MANAGER_ENV, then ~/.ssh-manager/.env, the working folder, your home folder and last the package folder.
SSH_MANAGER_HOME Optional: Folder for the manager's own files, including the .env it looks for first. Default ~/.ssh-manager.
SSH_MANAGER_ENV Optional: Another way to point at a .env, honoured since 4.0. A missing file is skipped.
SSH_CONFIG_PATH Optional: TOML file with host entries, read after the .env and the vault. Default ~/.codex/ssh-config.toml.
Set together: limits
MCP_SSH_DEFAULT_TIMEOUT Optional: Command timeout in ms. MCP_SSH_MAX_TIMEOUT caps what a call may ask for and is 300000 by default. Default 120000.
MCP_SSH_MAX_OUTPUT_LENGTH Optional: Characters of command output returned before the rest is cut and counted. Default 10000.
MCP_SSH_MAX_TIMEOUT Optional: Upper bound in ms on the timeout a single call may request. Default 300000.

What it does

mcp-ssh-manager lets an agent work on your servers over SSH. You list the hosts in a .env or TOML file, and from then on the agent can run commands and move files on them. It also tails logs, opens tunnels and handles database dumps. Version 4.0 brings a control plane. It is optional and comes as a browser page or a desktop app, with an encrypted vault for credentials and a step where a person approves commands before they run on a given server. Skip it and nothing changes. Host keys are the exception: those are now checked.

What it needs

RuntimeNode.js 18+
Runs onmacOS, Windows, Linux
Also
  • SSH access to each host by key, password or ssh-agent
  • rsync for ssh_sync, plus sshpass when the host uses a password

The npm package needs Node 18 or newer. The desktop app, fetched with ssh-manager app, carries its own runtime. Each host is described by its own set of SSH_SERVER_<NAME>_ variables (host, user, key or password, port, mode) or by a TOML entry.

Limits

Command timeouts are advisory: the README says a command can keep running on the host after the timeout, and on Linux/macOS hosts a system timeout wrapper is used to stop it. Output is cut to 10000 characters and commands time out after 120 s by default (MCP_SSH_MAX_OUTPUT_LENGTH, MCP_SSH_DEFAULT_TIMEOUT), up to 5 minutes. ssh_monitor targets Linux hosts. Since 3.8.6 a changed host key is refused until cleared with ssh-keygen -R. The README calls the group tool ssh_group_execute in places; its real name is ssh_execute_group. The registry entry still describes 3.8.2.

Who it suits

People who already look after servers by SSH and want an agent for routine checks and deploys, with a lock on the hosts that matter.

Tools 37

11 only read, 22 change things, 4 can delete or overwrite. A ? marks an optional parameter.

ssh_list_servers
List the configured hosts with their group and security mode
ssh_execute changes
Run a shell command on a host, in a given folder or the host's default oneserver?: stringcommand?: stringcwd?: stringtimeout?: number
ssh_execute_sudo changes
Run a command with sudo, the password sent on the channel's stdinserver?: stringcommand?: stringpassword?: stringcwd?: stringtimeout?: number
ssh_execute_group changes
Run one command on every host in a group, in parallel, in turn or rollinggroup?: stringcommand?: stringstrategy?: enumdelay?: numberstopOnError?: booleancwd?: string
ssh_group_manage changes
Create, change, delete and list named host groups in local configaction?: enumname?: stringservers?: arraydescription?: stringstrategy?: enumdelay?: numberstopOnError?: boolean
ssh_upload changes
Copy one local file to a hostserver?: stringlocalPath?: stringremotePath?: string
ssh_download changes
Copy one file from a host to this machineserver?: stringremotePath?: stringlocalPath?: string
ssh_sync deletes
Sync files or folders either way with rsync, optionally deleting extra filesserver?: stringsource?: stringdestination?: stringexclude?: arraydryRun?: booleandelete?: booleancompress?: booleanverbose?: booleanchecksum?: booleantimeout?: number
ssh_deploy changes
Push files to a host, set owner and mode, keep a backup copy and restart a serviceserver?: stringfiles?: arrayoptions?: object
ssh_tail
Read or follow the end of a remote log, with an optional grep filterserver?: stringfile?: stringlines?: numberfollow?: booleangrep?: string
ssh_monitor
Snapshot CPU, memory, disk, network or process use on a hostserver?: stringtype?: enuminterval?: numberduration?: number
ssh_health_check
Report host health from CPU, memory, disk, load and uptimeserver?: stringdetailed?: boolean
ssh_service_status
Check whether named services are runningserver?: stringservices?: array
ssh_process_manager deletes
List top processes, show one, or send it a kill signalserver?: stringaction?: enumpid?: numbersignal?: enumsortBy?: enumlimit?: numberfilter?: string
ssh_alert_setup changes
Set, read or check CPU, memory and disk alert thresholdsserver?: stringaction?: enumcpuThreshold?: numbermemoryThreshold?: numberdiskThreshold?: numberenabled?: boolean
ssh_session_start changes
Open a persistent shell on a host and return its IDserver?: stringname?: string
ssh_session_send changes
Run a command in an open shell, keeping its folder and variablessession?: stringcommand?: stringtimeout?: number
ssh_session_list
List open shellsserver?: string
ssh_session_close changes
Close one open shell, or all of themsession?: string
ssh_tunnel_create changes
Start a local, remote or SOCKS (dynamic) tunnel through a hostserver?: stringtype?: enumlocalHost?: stringlocalPort?: numberremoteHost?: stringremotePort?: number
ssh_tunnel_list
List running tunnelsserver?: string
ssh_tunnel_close changes
Stop one tunnel, or every tunnel to a hosttunnelId?: stringserver?: string
ssh_connection_status changes
Show, reconnect, drop or clean up pooled connectionsaction?: enumserver?: string
ssh_key_manage changes
Check, list, accept or remove a host's key in the local known_hostsaction?: enumserver?: stringautoAccept?: boolean
ssh_history
Show commands this server process has run, filtered by host, outcome or textlimit?: numberserver?: stringsuccess?: booleansearch?: string
ssh_backup_create changes
Back up a MySQL, PostgreSQL or MongoDB database or file paths on a hostserver?: stringtype?: enumname?: stringdatabase?: stringdbUser?: stringdbPassword?: stringdbHost?: stringdbPort?: numberpaths?: arrayexclude?: arraybackupDir?: stringretention?: numbercompress?: boolean
ssh_backup_list
List the backups kept on a hostserver?: stringtype?: enumbackupDir?: string
ssh_backup_restore deletes
Restore a database or files from an earlier backup over what is thereserver?: stringbackupId?: stringdatabase?: stringdbUser?: stringdbPassword?: stringdbHost?: stringdbPort?: numbertargetPath?: stringbackupDir?: string
ssh_backup_schedule changes
Add a cron job on the host for recurring backupsserver?: stringschedule?: stringtype?: enumname?: stringdatabase?: stringpaths?: arrayretention?: number
ssh_db_dump changes
Dump a remote database to a file on the host, gzipped by defaultserver?: stringtype?: enumdatabase?: stringoutputFile?: stringdbUser?: stringdbPassword?: stringdbHost?: stringdbPort?: numbercompress?: booleantables?: array
ssh_db_import deletes
Load a dump file on the host into a remote databaseserver?: stringtype?: enumdatabase?: stringinputFile?: stringdbUser?: stringdbPassword?: stringdbHost?: stringdbPort?: numberdrop?: boolean
ssh_db_list
List databases, or the tables or collections in oneserver?: stringtype?: enumdatabase?: stringdbUser?: stringdbPassword?: stringdbHost?: stringdbPort?: number
ssh_db_query
Run a SELECT or a MongoDB find on a remote databaseserver?: stringtype?: enumdatabase?: stringquery?: stringcollection?: stringdbUser?: stringdbPassword?: stringdbHost?: stringdbPort?: number
ssh_alias changes
Add, remove or list short names for hostsaction?: enumalias?: stringserver?: string
ssh_command_alias changes
Add, remove, list or suggest shortcuts for frequent commandsaction?: enumalias?: stringcommand?: string
ssh_hooks changes
List, enable, disable or show automation hooksaction?: enumhook?: string
ssh_profile changes
List, switch or show the active profile of aliases and hooksaction?: enumprofile?: string

Similar servers