# io.github.bvisible/mcp-ssh-manager (npm · mcp-ssh-manager)

SSH server management for agents, with per-server read-only and allowlist security modes

- Trust score: 90/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-21

## Components

- npm · `mcp-ssh-manager`: 90/100 (this document), [markdown](https://verifymcp.io/servers/bvisible-mcp-ssh-manager/mcp-ssh-manager.md), [page](https://verifymcp.io/servers/bvisible-mcp-ssh-manager/mcp-ssh-manager)

## Channel facts

- Registry: `npm`
- Package: `mcp-ssh-manager`
- Version: `3.8.5`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-21.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 36 of 104 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to bvisible/mcp-ssh-manager).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 23 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 72/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 6024 tokens (~162/item across 37 items; 37 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 80/100
  - Stability observed for 24 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "ssh_execute" implies "execute" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 37 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the io.github.bvisible/mcp-ssh-manager server?

io.github.bvisible/mcp-ssh-manager runs locally as an npm package, launched with npx -y mcp-ssh-manager. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add bvisible-mcp-ssh-manager -- npx -y mcp-ssh-manager
```

### Cursor

```json
{
  "mcpServers": {
    "bvisible-mcp-ssh-manager": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-ssh-manager"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "bvisible-mcp-ssh-manager": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-ssh-manager"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add bvisible-mcp-ssh-manager -- npx -y mcp-ssh-manager
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bvisible-mcp-ssh-manager": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mcp-ssh-manager"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add bvisible-mcp-ssh-manager --command npx --arg -y --arg mcp-ssh-manager
```

### Hermes

```yaml
mcp_servers:
  bvisible-mcp-ssh-manager:
    command: "npx"
    args: ["-y", "mcp-ssh-manager"]
```

### Netclaw

```json
{
  "McpServers": {
    "bvisible-mcp-ssh-manager": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-ssh-manager"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add bvisible-mcp-ssh-manager -t stdio -c npx -a -y mcp-ssh-manager
```

### Other

```json
{
  "mcpServers": {
    "bvisible-mcp-ssh-manager": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-ssh-manager"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 90, +1)

No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 89, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-16 (score 88, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-14 (score 87, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-12 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-10 (score 85, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-08 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-05 (score 83, +4)

- [functional improvement] Stability: unverified → 0.27

## MCP tools (37)

### `ssh_execute` (~180 tokens)

Runs a shell command over SSH on a named configured server and returns stdout, stderr, and exit code. Mutates remote state depending on the command; not read-only. Expands command aliases before running. Uses the cwd parameter or, if omitted, the server configured default directory; adapts syntax for Linux versus Windows PowerShell targets. Timeout defaults to 120000 ms and is capped at 300000 ms. Under readonly mode destructive commands like rm or dd are refused; under restricted mode the command must match allow patterns. Output is truncated when very large.

Input parameters:

- `command` (string, required): Command to execute
- `cwd` (string): Working directory (optional, uses default if configured)
- `server` (string, required): Server name from configuration
- `timeout` (number): Command timeout in milliseconds (default: 120000, max: 300000)

### `ssh_upload` (~134 tokens)

Uploads one local file to a remote destination path over SFTP on the named server, overwriting any existing remote file at that path. Mutates remote state and is not idempotent beyond replacing the target. Creates no backup. Requires the local file to exist. Does not use sudo, so the remote path must be writable by the configured SSH user. This tool is blocked entirely on servers set to readonly or restricted security mode. For directory trees use ssh_sync instead.

Input parameters:

- `localPath` (string, required): Local file path
- `remotePath` (string, required): Remote destination path
- `server` (string, required): Server name

### `ssh_download` (~124 tokens)

Downloads one remote file from the named server to a local destination path over SFTP, overwriting any existing local file at that path. Affects only the local filesystem and is read-only on the remote side, so it stays allowed even on servers in readonly or restricted security mode. Reads the remote file using the configured SSH user, which must have permission to read it. Handles single files only; use ssh_sync for directories.

Input parameters:

- `localPath` (string, required): Local destination path
- `remotePath` (string, required): Remote file path
- `server` (string, required): Server name

### `ssh_sync` (~397 tokens)

Synchronizes files or directories between local and remote using rsync over SSH on the named server. Each of source and destination must carry a local: or remote: prefix and one side must be local and the other remote; with no prefix it assumes a push from local to remote. On Windows MCP hosts, provide native Windows local paths such as C:\project or .\project; the tool converts drive-letter and UNC paths to MSYS2 format before spawning rsync. Do not pre-convert a local path to /c/project because Node performs local filesystem checks using Windows path semantics. Mutates the destination. Setting delete true removes destination files absent from source, which is destructive; dryRun true previews without changing anything. Compression is on by default. Password authentication requires sshpass installed locally. Blocked on readonly or restricted servers. Timeout defaults to 30000 ms.

Input parameters:

- `checksum` (boolean): Use checksum instead of timestamp for comparison
- `compress` (boolean): Compress during transfer
- `delete` (boolean): Delete files in destination not in source
- `destination` (string, required): Destination path with a "local:" or "remote:" prefix. On Windows, use a native local path such as "local:C:\output" or "local:.\output"; do not pre-convert it to MSYS2 /c/... syntax.
- `dryRun` (boolean): Perform dry run without actual changes
- `exclude` (array): Patterns to exclude from sync
- `server` (string, required): Server name from configuration
- `source` (string, required): Source path with a "local:" or "remote:" prefix. On Windows, use a native local path such as "local:C:\project" or "local:.\project"; do not pre-convert it to MSYS2 /c/... syntax.
- `timeout` (number): Timeout in milliseconds (default: 30000)
- `verbose` (boolean): Show detailed progress

### `ssh_tail` (~174 tokens)

Reads the tail of a remote log file on the named server, optionally filtered by a grep pattern. Read-only; it does not modify remote state. Behavior depends on follow, which defaults to true: in follow mode it starts a streaming tail whose output is written to the server process stderr rather than returned, and the response only reports a session note, so to capture content directly set follow to false to get the last N lines back. The lines parameter defaults to 10.

Input parameters:

- `file` (string, required): Path to the log file to tail
- `follow` (boolean): Follow file for new content (default: true)
- `grep` (string): Filter lines with grep pattern
- `lines` (number): Number of lines to show initially (default: 10)
- `server` (string, required): Server name from configuration

### `ssh_monitor` (~157 tokens)

Collects a read-only snapshot of system resources on the named Linux server by running inspection commands such as top, free, df, ss, and ps. The type parameter selects the view and defaults to overview; other values are cpu, memory, disk, network, and process. Does not change remote state and needs no sudo. The interval and duration parameters are accepted for continuous monitoring intent but a single snapshot is gathered. Targets Linux tooling, so output may be empty on Windows hosts.

Input parameters:

- `duration` (number): Duration in seconds for continuous monitoring
- `interval` (number): Update interval in seconds for continuous monitoring
- `server` (string, required): Server name from configuration
- `type` (string): Type of monitoring (default: overview)

### `ssh_history` (~155 tokens)

Returns the in-memory log of SSH commands previously run through this server process during the current session, formatted with timestamps, server, duration, and success status. Purely local and read-only: it opens no SSH connection and does not persist across restarts. Optional filters narrow the results by server name, by success or failure, and by a search substring in the command text; limit defaults to 20 most recent entries. Does not expose command output, only the commands and their outcomes.

Input parameters:

- `limit` (number): Number of commands to show (default: 20)
- `search` (string): Search in commands
- `server` (string): Filter by server name
- `success` (boolean): Filter by success/failure

### `ssh_session_start` (~119 tokens)

Opens a new persistent interactive shell on the named configured server and returns a generated session ID. Stateful and side-effecting: it establishes (or reuses pooled) SSH connection and keeps an open shell that preserves working directory, environment, and command history across later ssh_session_send calls, unlike one-shot ssh_execute. The optional name is only a human label. The session stays open and consumes a remote shell until ssh_session_close is called.

Input parameters:

- `name` (string): Optional session name for identification
- `server` (string, required): Server name from configuration

### `ssh_session_send` (~144 tokens)

Runs one command inside an already-open session identified by its session ID, reusing the persisted working directory, environment, and history of that shell. Mutates remote state like any shell command and is not idempotent; cd and export update the saved context for subsequent calls. Commands run through a bash-style shell (Unix-oriented). The security policy of the underlying server is enforced, so readonly or restricted servers may refuse. Default timeout is 30000 ms.

Input parameters:

- `command` (string, required): Command to execute in the session
- `session` (string, required): Session ID from ssh_session_start
- `timeout` (number): Command timeout in milliseconds (default: 30000)

### `ssh_session_list` (~100 tokens)

Lists currently active SSH sessions with their ID, server, state, working directory, command count, age, idle time, and any defined variables. Read-only: it inspects in-memory session state and changes nothing on remote hosts or local config. The optional server argument is a case-insensitive substring filter on server name; omit it to list every active session. Closed sessions are excluded from the results.

Input parameters:

- `server` (string): Filter by server name

### `ssh_session_close` (~111 tokens)

Terminates an open SSH session given its session ID, writing exit to the remote shell, ending it, and discarding its in-memory history and context; the session ID becomes unusable afterward. Destructive to session state but does not delete remote files. Passing the literal value all closes every active session at once, ignoring individual close errors. It does not drop the pooled underlying connection, only the interactive shell.

Input parameters:

- `session` (string, required): Session ID to close (or "all" to close all sessions)

### `ssh_execute_group` (~223 tokens)

Runs one command on every server belonging to the named group and returns a per-server success or failure report. Members come from the groups defined with ssh_group_manage plus every server whose configuration carries a matching group field, so a group can exist through the config alone. Mutates remote state on each member and is not idempotent. Best-effort: the security policy of each server is evaluated independently, so readonly or restricted members are reported as failed without aborting the rest unless stopOnError is set. Strategy may be parallel, sequential, or rolling (delay applies between servers). Per-server timeout is 30000 ms; cwd defaults to the default_dir of each server.

Input parameters:

- `command` (string, required): Command to execute
- `cwd` (string): Working directory
- `delay` (number): Delay between servers in ms (for rolling)
- `group` (string, required): Group name (e.g., "production", "staging", "all")
- `stopOnError` (boolean): Stop execution on first error
- `strategy` (string): Execution strategy

### `ssh_group_manage` (~205 tokens)

Creates, updates, deletes, and inspects named server groups used by ssh_execute_group, persisting changes to local configuration only with no remote side effects. The action selects the operation: create, update, delete, add-servers, remove-servers, or list. Every action except list requires name; add-servers and remove-servers also require a non-empty servers array. list is read-only and also reports the groups derived from the per-server group field of the SSH configuration, which are read-only here and change only by editing that configuration. Optional strategy, delay, and stopOnError set default group execution behavior.

Input parameters:

- `action` (string, required): Action to perform
- `delay` (number): Delay between servers in ms
- `description` (string): Group description
- `name` (string): Group name
- `servers` (array): Server names
- `stopOnError` (boolean): Stop on error flag
- `strategy` (string): Execution strategy

### `ssh_list_servers` (~103 tokens)

Lists all SSH servers defined in the loaded configuration, returning for each the name, host, user, port, authentication type (password or key), default directory, group, and description. Read-only and local: it reads configuration only and opens no SSH connections. Deliberately omits secrets, so no passwords, key paths, passphrases, or sudo passwords are returned. Takes no parameters. Useful as a first call to discover which server names other tools accept.

### `ssh_deploy` (~147 tokens)

Deploys a list of local files to remote paths on the named server, uploading each to a temporary location first and then moving it into place. Mutates remote state. By default it backs up any existing target file before overwriting; backup can be disabled per call. Options can set owner and permissions, supply a sudo password, and name a single service to restart afterward. Detects sensible owner and permission defaults from the remote path. Runs pre and post deploy hooks. Blocked entirely on servers in readonly or restricted security mode.

Input parameters:

- `files` (array, required): Array of files to deploy
- `options` (object): Deployment options
- `server` (string, required): Server name or alias

### `ssh_execute_sudo` (~186 tokens)

Runs a command with elevated privileges via sudo on the named server and returns the exit code and output. Prepends sudo when absent. If a password is given, or a sudo password is configured for the server, it is piped to sudo -S and masked in the returned output. Mutates remote state and can be destructive. Honors the cwd parameter or the server default directory and adapts to Linux or Windows. Timeout defaults to 30000 ms. Blocked entirely in readonly mode; in restricted mode the command must satisfy the allow and deny patterns.

Input parameters:

- `command` (string, required): Command to execute with sudo
- `cwd` (string): Working directory
- `password` (string): Sudo password (will be masked in output)
- `server` (string, required): Server name or alias
- `timeout` (number): Command timeout in milliseconds (default: 30000)

### `ssh_command_alias` (~133 tokens)

Manages local shorthand aliases that map a short name to a full command string, stored in local config with no remote execution or side effects. The action selects behavior: add (requires both alias and command), remove (requires alias), list to show all aliases tagged as profile or custom, or suggest to return existing aliases matching a search term passed in the command field. Adding an existing alias overwrites it.

Input parameters:

- `action` (string, required): Action to perform
- `alias` (string): Alias name (for add/remove)
- `command` (string): Command to alias (for add) or search term (for suggest)

### `ssh_hooks` (~115 tokens)

Manages automation hooks that fire around SSH operations such as pre-deploy, toggling them on or off in local configuration only with no immediate remote action. The action selects behavior: list shows each hook with its enabled state, description, and action count; enable and disable flip a hook and both require the hook name; status summarizes which hooks are currently enabled versus disabled. Toggling persists and affects later operations.

Input parameters:

- `action` (string, required): Action to perform
- `hook` (string): Hook name (for enable/disable)

### `ssh_profile` (~106 tokens)

Manages SSH Manager profiles that bundle command aliases and hooks for different project types, affecting local configuration only with no remote side effects. The action selects behavior: list shows available profiles and the active one, current shows the active profile details, and switch activates a named profile and requires the profile argument. A successful switch reports that Claude Code must be restarted before the new profile takes effect.

Input parameters:

- `action` (string, required): Action to perform
- `profile` (string): Profile name (for switch)

### `ssh_connection_status` (~110 tokens)

Inspects and manages the pooled SSH connections held by this server process; affects only local in-memory connections, never remote state. The action parameter selects: status lists active connections with age and keepalive (read-only); reconnect closes then reopens one connection; disconnect closes one connection; cleanup drops aged-out and dead connections. The server parameter is required for reconnect and disconnect and ignored otherwise.

Input parameters:

- `action` (string, required): Action to perform
- `server` (string): Server name (for reconnect/disconnect)

### `ssh_tunnel_create` (~180 tokens)

Opens a new SSH connection to the named server and starts a port-forwarding or SOCKS proxy tunnel that keeps running until closed. The type parameter selects local forward, remote forward, or dynamic SOCKS5 proxy. localPort is always required; remoteHost and remotePort are required for local and remote types but ignored for dynamic. localHost defaults to 127.0.0.1. Returns a tunnel ID used later to close it.

Input parameters:

- `localHost` (string): Local host (default: 127.0.0.1)
- `localPort` (number, required): Local port
- `remoteHost` (string): Remote host (not needed for dynamic)
- `remotePort` (number): Remote port (not needed for dynamic)
- `server` (string, required): Server name or alias
- `type` (string, required): Tunnel type

### `ssh_tunnel_list` (~97 tokens)

Lists currently active SSH tunnels tracked by this process, showing each tunnel ID, server, type, state, local and remote endpoints, active and total connection counts, bytes transferred, error count, and timestamps. Read-only: it does not create, modify, or close anything. The optional server parameter filters results to one server; omit it to list every active tunnel across all servers.

Input parameters:

- `server` (string): Filter by server name

### `ssh_tunnel_close` (~110 tokens)

Tears down active SSH tunnels created earlier, freeing the bound local ports; this affects only local tunnel state, not the remote host. Exactly one of tunnelId or server must be supplied: tunnelId closes that single tunnel, while server closes every tunnel for the named server and reports how many were closed. Supplying neither raises an error. Closing is final and cannot be undone.

Input parameters:

- `server` (string): Close all tunnels for this server
- `tunnelId` (string): Tunnel ID to close

### `ssh_key_manage` (~135 tokens)

Manages SSH host key fingerprints in your local known_hosts file for the named server. The action parameter selects: verify, check, and list are read-only comparisons or listings; accept adds or updates the host key in known_hosts; remove deletes it. accept and remove mutate local state and are blocked on servers configured as readonly. server is required for every action except list. autoAccept defaults to false and should be used with caution.

Input parameters:

- `action` (string, required): Action to perform
- `autoAccept` (boolean): Automatically accept new keys (use with caution)
- `server` (string): Server name (required for most actions)

### `ssh_alias` (~125 tokens)

Manages local name aliases that let you reference a configured server by a shorter or alternative name. The action parameter selects add, remove, or list. add creates an alias pointing to an existing server and requires both alias and server; remove deletes an alias and requires alias; list shows all aliases (read-only). add and remove persist the alias mapping locally. The target server must already exist for add to succeed.

Input parameters:

- `action` (string, required): Action to perform
- `alias` (string): Alias name (for add/remove)
- `server` (string): Server name (for add)

### `ssh_backup_create` (~274 tokens)

Creates a database or file backup on the remote server over SSH, writing a compressed archive plus a JSON metadata file into backupDir. Supports mysql, postgresql, mongodb, and files (full is not yet implemented and errors). Database types require database; files requires paths. After writing it prunes backups older than retention days (default 7); compress defaults to true. Runs pre-backup and post-backup hooks.

Input parameters:

- `backupDir` (string): Backup directory (default: /var/backups/ssh-manager)
- `compress` (boolean): Compress backup (default: true)
- `database` (string): Database name (required for db types)
- `dbHost` (string): Database host (default: localhost)
- `dbPassword` (string): Database password
- `dbPort` (number): Database port
- `dbUser` (string): Database user
- `exclude` (array): Patterns to exclude from backup
- `name` (string, required): Backup name (e.g., production, app-data)
- `paths` (array): Paths to backup (for files type)
- `retention` (number): Retention period in days (default: 7)
- `server` (string, required): Server name
- `type` (string, required): Backup type: mysql, postgresql, mongodb, files, or full

### `ssh_backup_list` (~127 tokens)

Lists existing backups found in backupDir on the remote server, returning each backup id, type, database or paths, size, compression, retention, status, and creation time parsed from stored metadata. Read-only: it inspects the filesystem and mutates nothing. Optional type filters results to mysql, postgresql, mongodb, files, or full. backupDir defaults to the configured backup directory.

Input parameters:

- `backupDir` (string): Backup directory (default: /var/backups/ssh-manager)
- `server` (string, required): Server name
- `type` (string): Filter by backup type

### `ssh_backup_restore` (~215 tokens)

Restores a previously created backup identified by backupId, reading its metadata to pick the engine. This is destructive and overwrites the target: PostgreSQL runs pg_restore with --clean --if-exists which DROPs existing objects, MongoDB runs mongorestore --drop, and MySQL pipes the dump into the live database replacing matching objects. Supports mysql, postgresql, mongodb, and files. Runs pre-restore and post-restore hooks.

Input parameters:

- `backupDir` (string): Backup directory (default: /var/backups/ssh-manager)
- `backupId` (string, required): Backup ID to restore
- `database` (string): Target database name (for db restores)
- `dbHost` (string): Database host (default: localhost)
- `dbPassword` (string): Database password
- `dbPort` (number): Database port
- `dbUser` (string): Database user
- `server` (string, required): Server name
- `targetPath` (string): Target path for files restore (default: /)

### `ssh_backup_schedule` (~193 tokens)

Schedules a recurring backup on the remote server by writing an executable bash script to /usr/local/bin/ssh-manager-backup-NAME.sh and installing a crontab entry for the given cron expression. Mutates the remote filesystem and crontab, and typically needs root to write that path. Supports mysql, postgresql, mongodb, and files; the generated script also deletes backups older than retention days (default 7).

Input parameters:

- `database` (string): Database name (for db types)
- `name` (string, required): Backup name
- `paths` (array): Paths to backup (for files type)
- `retention` (number): Retention period in days (default: 7)
- `schedule` (string, required): Cron schedule (e.g., "0 2 * * *" for daily at 2 AM)
- `server` (string, required): Server name
- `type` (string, required): Backup type

### `ssh_health_check` (~117 tokens)

Runs a comprehensive read-only health check on the named server by executing diagnostic shell commands over SSH, then returns parsed JSON with overall status, CPU, memory, disk usage, and uptime. It only reads metrics and changes nothing on the remote host. Set detailed to true to additionally include load average and network metrics; it defaults to false. Critical CPU, memory, or disk conditions are surfaced in a critical_issues list.

Input parameters:

- `detailed` (boolean): Include detailed metrics (network, load average)
- `server` (string, required): Server name

### `ssh_service_status` (~123 tokens)

Checks the running state of the named system services on a remote server by querying each one over SSH, returning JSON per service plus running and stopped counts and an aggregate health rating. Read-only: it inspects status without starting, stopping, or restarting anything. The services array parameter is required and lists the service names to check, for example nginx, mysql, or docker; common names are resolved to their actual unit names automatically.

Input parameters:

- `server` (string, required): Server name
- `services` (array, required): Service names to check (e.g., nginx, mysql, docker)

### `ssh_process_manager` (~216 tokens)

Lists, inspects, or terminates processes on a remote server over SSH. The action parameter selects: list returns top processes (read-only), info returns details for one process (read-only), and kill sends a signal to terminate a process and mutates remote state. pid is required for kill and info. kill is blocked on servers configured as readonly. signal defaults to TERM, sortBy defaults to cpu, and limit defaults to 20; filter narrows the list by name or command.

Input parameters:

- `action` (string, required): Action: list processes, kill process, or get process info
- `filter` (string): Filter processes by name/command
- `limit` (number): Number of processes to return (default: 20)
- `pid` (number): Process ID (required for kill and info actions)
- `server` (string, required): Server name
- `signal` (string): Signal to send when killing (default: TERM)
- `sortBy` (string): Sort processes by CPU or memory (default: cpu)

### `ssh_alert_setup` (~205 tokens)

Configures and evaluates CPU, memory, and disk usage alert thresholds for a remote server. The action parameter selects: set writes the threshold config to /etc/ssh-manager-alerts.json on the remote host (mutating, may need write access to /etc, and is blocked on readonly servers); get reads back that config; check reads current metrics and compares them to stored thresholds. get and check are read-only. enabled defaults to true; check errors if no config exists yet.

Input parameters:

- `action` (string, required): Action: set thresholds, get config, or check current metrics against thresholds
- `cpuThreshold` (number): CPU usage threshold percentage (e.g., 80)
- `diskThreshold` (number): Disk usage threshold percentage (e.g., 85)
- `enabled` (boolean): Enable or disable alerts (default: true)
- `memoryThreshold` (number): Memory usage threshold percentage (e.g., 90)
- `server` (string, required): Server name

### `ssh_db_dump` (~221 tokens)

Dumps a database to a file on the remote server over SSH; it reads data only and does not modify the database. Supports mysql (using --single-transaction --routines --triggers), postgresql (custom format with --clean --if-exists, restorable via pg_restore), and mongodb. compress defaults to true and gzips the output. The optional tables list applies to MySQL and PostgreSQL only and is ignored for MongoDB.

Input parameters:

- `compress` (boolean): Compress output with gzip (default: true)
- `database` (string, required): Database name
- `dbHost` (string): Database host (default: localhost)
- `dbPassword` (string): Database password
- `dbPort` (number): Database port
- `dbUser` (string): Database user
- `outputFile` (string, required): Output file path (will be created on remote server)
- `server` (string, required): Server name
- `tables` (array): Specific tables to dump (MySQL/PostgreSQL only)
- `type` (string, required): Database type

### `ssh_db_import` (~208 tokens)

Imports a dump file into a target database on the remote server and is destructive to existing data. PostgreSQL uses pg_restore --clean --if-exists which DROPs existing objects before loading; MongoDB uses mongorestore with --drop controlled by the drop flag (default true); MySQL pipes the file into the live database, replacing objects defined in it. Supports mysql, postgresql, mongodb. Compressed .gz inputs are decompressed automatically.

Input parameters:

- `database` (string, required): Target database name
- `dbHost` (string): Database host (default: localhost)
- `dbPassword` (string): Database password
- `dbPort` (number): Database port
- `dbUser` (string): Database user
- `drop` (boolean): Drop existing collections/tables before import (MongoDB only, default: true)
- `inputFile` (string, required): Input file path (on remote server)
- `server` (string, required): Server name
- `type` (string, required): Database type

### `ssh_db_list` (~167 tokens)

Lists database objects on the remote server for the given engine without modifying anything. When database is provided it lists the tables (SQL) or collections (MongoDB) of that database; when omitted it lists all databases with common system databases filtered out. Supports mysql, postgresql, and mongodb. Returns the items and a count. Read-only and safe to call repeatedly.

Input parameters:

- `database` (string): Database name (if provided, lists tables/collections; if omitted, lists databases)
- `dbHost` (string): Database host (default: localhost)
- `dbPassword` (string): Database password
- `dbPort` (number): Database port
- `dbUser` (string): Database user
- `server` (string, required): Server name
- `type` (string, required): Database type

### `ssh_db_query` (~188 tokens)

Runs a read-only query against a remote database. For mysql and postgresql it is strictly limited to SELECT: the query must begin with SELECT and any insert, update, delete, drop, create, alter, truncate, grant, revoke, or exec keyword is rejected before execution. For mongodb it runs a find() and requires the collection parameter. Returns the raw command output as text.

Input parameters:

- `collection` (string): Collection name (MongoDB only)
- `database` (string, required): Database name
- `dbHost` (string): Database host (default: localhost)
- `dbPassword` (string): Database password
- `dbPort` (number): Database port
- `dbUser` (string): Database user
- `query` (string, required): SQL query (SELECT only) or MongoDB find query
- `server` (string, required): Server name
- `type` (string, required): Database type

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/bvisible-mcp-ssh-manager/mcp-ssh-manager#diagnostics

## Score history

- 2026-09-21: 90
- 2026-09-20: 90
- 2026-09-19: 89
- 2026-09-18: 89
- 2026-09-17: 88
- 2026-09-16: 88
- 2026-09-15: 87
- 2026-09-14: 87
- 2026-09-13: 86
- 2026-09-12: 86
- 2026-09-11: 85
- 2026-09-10: 85
- 2026-09-09: 84
- 2026-09-08: 84
- 2026-09-07: 83
- 2026-09-06: 83
- 2026-09-05: 83
- 2026-09-04: 79
- 2026-09-03: 79
- 2026-09-02: 79
- 2026-09-01: 79
- 2026-08-31: 79
- 2026-08-30: 79
- 2026-08-29: 79
- 2026-08-28: 68

## Common questions

### What is the io.github.bvisible/mcp-ssh-manager server?

io.github.bvisible/mcp-ssh-manager is listed in the public MCP registry as io.github.bvisible/mcp-ssh-manager. SSH server management for agents, with per-server read-only and allowlist security modes. This page covers its npm package (mcp-ssh-manager).

### Is the io.github.bvisible/mcp-ssh-manager server safe to use?

io.github.bvisible/mcp-ssh-manager scores 90 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.bvisible/mcp-ssh-manager server expose?

io.github.bvisible/mcp-ssh-manager exposes 37 tools: ssh_execute, ssh_upload, ssh_download, ssh_sync, ssh_tail, and 32 more. Their descriptions and schemas cost roughly 6,024 tokens of context every time the server is loaded.

### Is the io.github.bvisible/mcp-ssh-manager server still maintained?

io.github.bvisible/mcp-ssh-manager is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the io.github.bvisible/mcp-ssh-manager server under?

io.github.bvisible/mcp-ssh-manager declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/mcp-ssh-manager
- Socket report: https://socket.dev/npm/package/mcp-ssh-manager
- Repository: https://github.com/bvisible/mcp-ssh-manager
- Changelog RSS feed: https://verifymcp.io/servers/bvisible-mcp-ssh-manager/mcp-ssh-manager.xml
- Changelog JSON feed: https://verifymcp.io/servers/bvisible-mcp-ssh-manager/mcp-ssh-manager.json
- HTML version of this page: https://verifymcp.io/servers/bvisible-mcp-ssh-manager/mcp-ssh-manager
