# io.github.YawLabs/ssh-mcp (npm · @yawlabs/ssh-mcp)

MCP server for SSH operations with built-in diagnostics

- Trust score: 66/100 (medium)
- Change this week: +52
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-07

## Components

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

## Channel facts

- Registry: `npm`
- Package: `@yawlabs/ssh-mcp`
- Version: `0.12.0`
- 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-08-07.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Known CVEs were checked across the 102 of 106 dependencies we could resolve, so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Dependency health was assessed across the 102 of 106 dependencies we could resolve, so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 19/100
  - Repository check failed: no source repository is declared.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 16 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 75/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3059 tokens (~145/item across 21 items; 21 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 40/100
  - Stability observed for 12 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.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add yawlabs-ssh-mcp -- npx -y @yawlabs/ssh-mcp
```

### Codex

```bash
codex mcp add yawlabs-ssh-mcp -- npx -y @yawlabs/ssh-mcp
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add yawlabs-ssh-mcp --command npx --arg -y --arg @yawlabs/ssh-mcp
```

### Hermes

```yaml
mcp_servers:
  yawlabs-ssh-mcp:
    command: "npx"
    args: ["-y", "@yawlabs/ssh-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "yawlabs-ssh-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@yawlabs/ssh-mcp"
      ]
    }
  }
}
```

## 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-08-07 (score 66, +1)

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

### 2026-08-05 (score 65, +1)

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

### 2026-08-03 (score 64, +1)

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

### 2026-08-02 (score 63, +63)

- [security regression] Provenance: unverified → fail
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [functional regression] Security disclosure: unverified → fail
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] Tool coverage: unverified → 100
- [functional] Licence: MIT

### 2026-08-01 (score 0, −14)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-31 (score 14, −6)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 20, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-27 (score 38)

First indexed and scored.

## MCP tools (21)

### `ssh_exec` (~292 tokens)

Execute a command on a remote host via SSH. The command is interpreted by the remote login shell — pipes, redirects, globs, and other shell metacharacters work as expected. Returns stdout, stderr, and exit code. Use `env` to set environment variables for this call without modifying the command string. Subject to SSH_MCP_COMMAND_WHITELIST / SSH_MCP_COMMAND_BLACKLIST if configured (policy is checked against the env-prefixed command).

Input parameters:

- `command` (string, required): Shell command to execute on the remote host (interpreted by the remote login shell)
- `env` (object): Environment variables to set for this command. Injected as a `KEY='value' ...` prefix; works on any sshd regardless of AcceptEnv config. Values are POSIX-single-quoted, so any byte is safe.
- `host` (string, required): SSH hostname or IP address
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `timeout` (integer): Command timeout in milliseconds (default: 30000)
- `username` (string): SSH username (default: current user)

### `ssh_read_file` (~137 tokens)

Read a file from a remote host via SFTP.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `path` (string, required): Absolute path to the remote file. Must start with /.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `username` (string): SSH username (default: current user)

### `ssh_write_file` (~157 tokens)

Write content to a file on a remote host via SFTP. Creates or overwrites the file.

Input parameters:

- `content` (string, required): File content to write
- `host` (string, required): SSH hostname or IP address
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `path` (string, required): Absolute path to the remote file. Must start with /.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `username` (string): SSH username (default: current user)

### `ssh_upload` (~153 tokens)

Upload a local file to a remote host via SFTP.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `localPath` (string, required): Path to the local file to upload
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `remotePath` (string, required): Absolute path on the remote host. Must start with /.
- `username` (string): SSH username (default: current user)

### `ssh_download` (~155 tokens)

Download a file from a remote host to local filesystem via SFTP.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `localPath` (string, required): Local path to save the downloaded file
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `remotePath` (string, required): Absolute path to the remote file. Must start with /.
- `username` (string): SSH username (default: current user)

### `ssh_ls` (~138 tokens)

List files in a directory on a remote host via SFTP.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `path` (string, required): Absolute path to the remote directory. Must start with /.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `username` (string): SSH username (default: current user)

### `ssh_stat` (~187 tokens)

Get metadata for a file or directory on a remote host via SFTP. Returns size, permissions (octal), uid/gid, mtime/atime, and type flags (isFile, isDirectory, isSymbolicLink). Use this instead of parsing `ls -la` output.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `path` (string, required): Absolute path to the remote file or directory. Must start with /.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `username` (string): SSH username (default: current user)

### `ssh_mkdir` (~189 tokens)

Create a directory on a remote host via SFTP. Set `recursive: true` to create parent directories as needed (like `mkdir -p`). Existing intermediate dirs are tolerated; an existing leaf path is still an error.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `path` (string, required): Absolute path of the directory to create
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `recursive` (boolean): Create parent directories as needed (default: false). Like `mkdir -p`.
- `username` (string): SSH username (default: current user)

### `ssh_delete` (~204 tokens)

Delete a file or empty directory on a remote host via SFTP. Auto-detects the path type and calls the right SFTP op (unlink for files/symlinks, rmdir for empty dirs). Recursive directory delete is intentionally NOT supported -- for that, use ssh_exec with `rm -rf` explicitly so the destructive intent is visible in the tool trace.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `path` (string, required): Absolute path of the file or empty directory to delete. Must start with /.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `username` (string): SSH username (default: current user)

### `ssh_diagnose` (~85 tokens)

Diagnose SSH connectivity issues. Checks ssh-agent status, loaded keys, known_hosts, SSH config, and attempts a test connection. Use this BEFORE attempting SSH operations if you suspect connectivity issues, or AFTER a failed SSH operation to understand why it failed.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `port` (integer): SSH port (default: 22)

### `ssh_agent_ensure` (~46 tokens)

Ensure ssh-agent is running and reachable. Starts a new agent if needed and sets environment variables so subsequent SSH operations work. Use this FIRST when SSH operations fail with agent-related errors.

### `ssh_key_list` (~49 tokens)

List all SSH private keys in ~/.ssh/ with their type, fingerprint, and whether they are loaded in the agent. Use this to find which keys are available and which ones need to be loaded.

### `ssh_key_load` (~67 tokens)

Load an SSH private key into the running agent. Ensures the agent is running first. Use this after ssh_key_list shows a key that is not loaded.

Input parameters:

- `keyPath` (string, required): Path to the SSH private key to load (e.g. ~/.ssh/id_ed25519)

### `ssh_config_lookup` (~64 tokens)

Resolve the effective SSH configuration for a host. Shows hostname, user, port, identity files, proxy settings, and all other options from ~/.ssh/config. Use this to understand how SSH will connect to a host.

Input parameters:

- `host` (string, required): SSH hostname or IP address

### `ssh_known_hosts_fix` (~81 tokens)

Remove a stale host key from known_hosts and re-scan the host to add the current key. Use this when you see 'Host key verification failed' errors, typically after a server has been recreated or reprovisioned.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `port` (integer): SSH port (default: 22)

### `ssh_test` (~73 tokens)

Quick connectivity test to an SSH host. Reports success/failure with timing and actionable error details. Lighter and faster than ssh_diagnose — use this for a quick check before running operations.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `port` (integer): SSH port (default: 22)

### `ssh_git_check` (~89 tokens)

Test Git-over-SSH authentication to a hosting provider (GitHub, GitLab, Bitbucket, etc). Verifies your SSH key is registered and working. Use this when git clone/pull/push fails with SSH errors.

Input parameters:

- `host` (string): Git hosting hostname (default: "github.com")
- `user` (string): SSH user for the git host (default: "git")

### `ssh_multi_exec` (~204 tokens)

Execute a command on multiple remote hosts in parallel. Returns results per host. Use this instead of calling ssh_exec multiple times — it's faster and shows results side by side. Subject to SSH_MCP_COMMAND_WHITELIST / SSH_MCP_COMMAND_BLACKLIST if configured (policy is checked once before fan-out).

Input parameters:

- `command` (string, required): Shell command to execute on all hosts
- `hosts` (array, required): List of SSH hostnames or IPs
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `timeout` (integer): Command timeout in milliseconds (default: 30000)
- `username` (string): SSH username (default: current user)

### `ssh_find` (~292 tokens)

Search for files on a remote host. Wraps the find command with structured parameters so you don't have to construct find syntax manually.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `maxdepth` (number): Maximum directory depth to search
- `maxsize` (string): Maximum file size (e.g. '10M', '500k')
- `minsize` (string): Minimum file size (e.g. '1M', '100k')
- `name` (string): Filename pattern with wildcards (e.g. '*.log', 'config.*')
- `newer` (string): Reference file path -- find matches files modified more recently than this file
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `path` (string, required): Directory to search in (e.g. /var/log, /home/user)
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `timeout` (integer): Command timeout in milliseconds (default: 30000)
- `type` (string): File type: f=file, d=directory, l=symlink
- `username` (string): SSH username (default: current user)

### `ssh_tail` (~215 tokens)

Read the last N lines of a file on a remote host, optionally filtering by a grep pattern. Use this for reading log files instead of ssh_exec with manual tail/grep commands.

Input parameters:

- `grep` (string): Case-insensitive pattern to filter lines
- `host` (string, required): SSH hostname or IP address
- `lines` (integer): Number of lines to read from the end (default: 100). Must be a positive integer.
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `path` (string, required): Absolute path to the file to tail
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `timeout` (integer): Command timeout in milliseconds (default: 30000)
- `username` (string): SSH username (default: current user)

### `ssh_service_status` (~182 tokens)

Check the status of a systemd service on a remote host. Returns whether it's active, its PID, uptime, and description. Use this instead of ssh_exec with systemctl.

Input parameters:

- `host` (string, required): SSH hostname or IP address
- `password` (string): SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
- `port` (integer): SSH port (default: 22)
- `privateKeyPath` (string): Path to SSH private key
- `service` (string, required): Systemd service name (e.g. nginx, sshd, docker)
- `timeout` (integer): Command timeout in milliseconds (default: 30000)
- `username` (string): SSH username (default: current user)

## Diagnostics

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

## Score history

- 2026-08-07: 66
- 2026-08-06: 65
- 2026-08-05: 65
- 2026-08-04: 64
- 2026-08-03: 64
- 2026-08-02: 63
- 2026-08-01: 0
- 2026-07-31: 14
- 2026-07-30: 20
- 2026-07-28: 38
- 2026-07-27: 38

## Links

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