Skip to main content
Glama
MCP SSH Manager

MCP SSH Manager

by bvisible

npm version npm downloads Version Claude Code OpenAI Codex MCP OpenSSF Scorecard OpenSSF Best Practices License


The problem, in one line

An MCP SSH server is the most dangerous tool you can hand an agent: a shell on machines that matter. Today, when your agent runs something on production, you find out afterwards — if you find out at all.

This one lets you watch, and lets you say no. It is also, on the boring days, simply a very good way to let an assistant do the server work you were going to do yourself.


Related MCP server: MCP SSH Server

Choose your workspace

Desktop application (4.0.3): one installation with its own runtime, terminal, file browser and server settings. No separate Node.js or npm installation. Download it:

Platform

File

Signature

macOS, Apple silicon / Intel

…-arm64.dmg / …-x64.dmg

Signed and notarized by Apple — opens normally

Windows x64 / arm64

…-setup.exe

Not code-signed in 4.0.x. Windows shows "Windows protected your PC": More info → Run anyway. Check the file against the SHA-256 in release-manifest-win32.json on the release (ssh-manager app does it for you). Signing comes in a later release.

Linux x64

.deb, .AppImage

Unsigned, as Linux packages usually are

Already using npm / the CLI? npm update -g mcp-ssh-manager brings 4.0.3, and the V4 engine runs without an interface, from your existing .env, TOML or process variables — no automatic import, no forced wizard, no approval prompt unless you enable one per server. The one behaviour that tightens is SSH host-key verification; read that section of the upgrade and rollback guide before upgrading. To stay on 3.8 for now, pin it: npm install -g mcp-ssh-manager@3.

From the engine to the application in one step. With a V4 engine installed, ssh-manager app downloads the desktop application of the engine's own version, checks it against the release (size and SHA-256 from the release manifest, and on macOS Apple's signature and notarization), installs it and opens it — or just opens it when it is already there. The browser interface of ssh-manager control offers the same as one button. Your agents keep using the npm engine; the application is the window on top of it. Nothing is downloaded unless you ask.

Without npm at all. The application carries the engine too, and your AI tools can start that one: Options → AI tools lists Claude Code, Claude Desktop and Codex, says which ssh-manager each one starts (npm's, the application's, or none yet) and switches it in one click — no Node, no terminal. The same tab, in ssh-manager control, shows npm users which version each tool really runs. A switch rewrites that tool's one ssh-manager entry, keeps its environment variables, and takes effect when the tool next starts; switching back is the same click.

Updates. The application checks for a new version at launch and every six hours and says so where you will see it: a mark on the sidebar, Options → Updates (the running version, the one on offer, a Check now button, release notes) and, once per version, a notification. Downloading is a click, and installing is a second one (Restart to update) or happens when you quit. The npm engine updates with npm, on its own schedule. A change to the interface reaches npm users with the next npm release and application users with the next application release.

Up and running with npm

npm install -g mcp-ssh-manager     # or: brew tap bvisible/mcp-ssh-manager https://github.com/bvisible/mcp-ssh-manager && brew install ssh-manager

ssh-manager server add             # guided: host, user, key or password
claude mcp add ssh-manager mcp-ssh-manager

That's it. Restart Claude Code and ask it something.

OpenAI Codex — same install, then two files. In ~/.codex/config.toml:

[mcp_servers.ssh-manager]
command = "mcp-ssh-manager"
env = { SSH_CONFIG_PATH = "/Users/you/.codex/ssh-config.toml" }
startup_timeout_ms = 20000

And your servers in ~/.codex/ssh-config.toml:

[ssh_servers.production]
host = "prod.example.com"
user = "admin"
key_path = "~/.ssh/id_rsa"
default_dir = "/var/www"
group = "production"

Everything below works identically from Codex — same 37 tools, same config fields.

From source:

git clone https://github.com/bvisible/mcp-ssh-manager.git
cd mcp-ssh-manager && npm install
cd cli && ./install.sh
claude mcp add ssh-manager node /absolute/path/to/mcp-ssh-manager/src/index.js

The MCP engine needs no build. To use the interface (ssh-manager control) from a checkout, build it once: npm run build:ui (the published package and the desktop app already carry it).

Scopes — --scope project writes an .mcp.json your team can commit; --scope user enables it everywhere for you.

Prerequisites — Node 18+, on Linux, macOS or Windows. rsync for ssh_sync, sshpass only if you sync with password auth (brew install hudochenkov/sshpass/sshpass, or apt-get install sshpass).


Then just ask

No syntax to learn. Your assistant already knows how to use the 37 tools; you talk to it in your own words.

You say

What happens

"Why is production slow right now?"

CPU, memory, disk, load average and the top processes, in one round trip

"Back up the database before I deploy."

A compressed, timestamped MySQL/PostgreSQL/MongoDB dump with a retention policy

"Tail the nginx error log on staging."

Live output, streamed as it happens

"Push ./dist to production:/var/www and restart nginx."

The files out, then the restart — with ownership, permissions and a rollback copy handled

"Which of my servers is running out of disk?"

Every server in the group, checked in parallel

"Open a tunnel to the production database."

Local port forward, so your GUI client just connects

"Run docker ps on everything tagged production."

One command, the whole group, sequential or parallel


Watch over its shoulder — the control plane

New in 4.0.0. The application is opt-in: with no vault and no approval enabled, the engine keeps working headlessly, exactly as 3.8.x. See the migration guide for host-key verification and recovery behaviour.

ssh-manager control          # prints a local URL — or `ssh-manager app` for the desktop app

One thing in two wrappers. ssh-manager control runs the whole interface in a browser tab with nothing extra to install; the desktop builds for macOS, Windows and Linux are that same page with the engine inside them, so they need neither Node nor the npm package.

The desktop build adds the two things a browser tab cannot do:

  • It lives in the menu bar. The icon carries a count when something is waiting, and its menu lists what is blocked on you, which shells and commands are open right now, and your servers — so "is anything waiting on me?" costs a glance instead of a window switch. Closing the window leaves it there rather than quitting.

  • It posts real system notifications, with the application's own identity, so macOS and Windows show and route them properly. Destructive requests stay on screen instead of fading after four seconds. macOS asks your permission the first time it needs to.

Stop it before it runs

The agent pauses and waits. You see the machine, the user, the tool, and the command in full — wrapped, never truncated, because half a command is how you approve the wrong thing. A desktop notification fires when something is waiting, because the request that goes unseen is the one that times out and is denied.

Approval is switched on from the interface, per server — not from a file:

Servers → the server → Approval → never (default) | destructive | always

Approval is stored in the vault and cannot be overridden by .env or process variables. Editing connection details preserves it. This prevents accidental configuration overrides from disabling the gate; it is not a security boundary against a process that already controls your local user account or vault files. If you had SSH_SERVER_*_APPROVAL set in a file, the engine says so on every start rather than quietly leaving you unprotected.

The destructive list is deliberately short. A prompt that cries wolf gets clicked through without being read, which is worse than no prompt at all: systemctl restart does not interrupt you, systemctl stop does.

When a request requires approval, a timeout, unreachable socket or disconnected control plane denies it. If nothing is listening, start ssh-manager control or the desktop app before retrying. Servers with approval disabled keep working headlessly.

See what it's doing, while it does it

Output goes through a terminal emulator, not a <pre> tag — what your agent ran looks exactly like what you'd have seen had you typed it yourself, colours and all. Each stream keeps a bounded scrollback, so opening the screen mid-command shows what came before instead of starting blank.

Nothing here touches the disk. A stream can carry secrets — a config being catted, a token echoed by a deploy script — so it lives in memory, capped, and disappears with the window.

Both filesystems, side by side

Drag a file across and it moves directly between your machine and the server through the control plane. The browser never holds the bytes — which is faster, and the only way a multi-gigabyte file works at all.

Health, when you ask for it

Nothing is probed in the background. Each check is an SSH handshake, and a dashboard that connects to every production box on a timer is worse than no dashboard. The button is the whole scheduling policy. Thresholds are yours to set, and crossing one is said in words rather than encoded in a colour.

A shell on any machine

Pick a machine, get a shell — the same one an agent gets, with your keyboard on it. Useful for the ordinary reasons, and for the one people ask about most: running an agent on the server rather than pointing one at it.

Including this machine. The desktop application opens a shell on your own computer too, with your login shell and everything you have configured in it, so you are not switching to a different window to run the local half of the same job. Open as many as you like, on any mix of machines: each is a tab across the top and an entry in the rail, and switching away leaves it running.

Beside it, the commands you would rather not retype, saved per server or for all of them, and picked from a list inside any shell.

And the rest of it

On the same page: an interactive shell on any server, saved commands you pick from a list instead of retyping, groups you can run one command across, the audit trail of what agents ran and what you decided, and your known host keys.

Every screenshot above is the desktop build; each has a browser twin in docs/images/. See ROADMAP-V4.md for what is built and what isn't.


Safe by default

Other SSH MCP servers hand the agent a shell and wish you luck. This one assumes you'd like some say in the matter.

Decide how far it can go — per server

Mode

What the agent can do

unrestricted (default)

Everything. Same as any other SSH MCP server, zero overhead.

readonly

Mutating tools are refused outright — no deploy, no upload, no sudo, no database import. Reads still work.

restricted

Every command must match an allow pattern and no deny pattern. Anything else is refused before it reaches the host.

SSH_SERVER_PROD_MODE=readonly
SSH_SERVER_STAGING_MODE=restricted
SSH_SERVER_STAGING_ALLOW_PATTERNS=^systemctl (status|restart) myapp$;^tail -n \d+ /var/log/
SSH_SERVER_PROD_AUDIT_LOG=~/.ssh-manager/audit.jsonl

This is a second layer under Claude Code's autoApprove, which is all-or-nothing per tool: once ssh_execute is approved, anything goes. Useful when you're sharing the MCP with a third-party agent, a CI bot, or working on a client's machine. Full reference in docs/SECURITY_MODES.md.

Credentials out of the clear-text .env

ssh-manager vault import      # take what you already have, encrypted
ssh-manager vault list        # see it, without ever printing a secret
ssh-manager vault add prod    # add one interactively
ssh-manager vault backup FILE # a copy that survives a new machine

AES-256-GCM, master key in your OS keychain (a 0600 file where there is none — Windows, CI, containers). Only secret values are encrypted: hosts, users and modes stay readable, so the file can still be inspected and diffed. GCM is authenticated, so a tampered vault fails loudly instead of handing a wrong password to a production server.

The key belongs to this machine. A vault copied to a new laptop is ciphertext nobody can open — vault backup writes a copy encrypted under a passphrase you choose, which is what makes the move survivable. Your .env is never modified, not by import, not by the interface, and a setup half in each is a normal state rather than a broken one. Upgrading changes nothing on its own: see docs/MIGRATION.md.

The unglamorous parts, which are the ones that bite

  • Your sudo password never reaches the remote command line. It travels on the SSH channel's stdin, so it isn't visible in ps, in /proc/<pid>/cmdline, or in an auditd trail — unlike the echo "$pass" | sudo -S pattern common in this category (#34).

  • Every shell argument is quoted through one central helper, with a test that drives 340 builder × argument × payload combinations through a real shell to prove none of them execute.

  • Read-only SQL is enforced, not suggested. ssh_db_query refuses anything that isn't a SELECT, runs it inside a read-only transaction, and never lets the psql or mysql client read it as a script, where their own commands (\!) would reach a shell. A MySQL query is therefore one line, without backslashes.

  • Vulnerabilities are published, not buried. SECURITY.md has the reporting process and every advisory already fixed — including the six in v3.8.6, among them a command injection on the machine running the server, triggered by any SSH server it connects to.

  • Reproducible installs. The lockfile is committed, CI installs with npm ci, and a test enforces that every dependency resolves to registry.npmjs.org with an integrity hash and no unreviewed install scripts.


Questions people ask

Can I let an AI agent SSH into my servers safely? Yes, if you decide how far it can go. Per server you can make it read-only, allow only commands that match a pattern, or hold every request (or only the destructive ones) until you approve it in the control plane; credentials can live in an encrypted vault instead of a clear-text .env; and every command and decision is logged. See Safe by default.

How do I use Claude Code or Codex with SSH? npm install -g mcp-ssh-manager, add a server with ssh-manager server add, then claude mcp add ssh-manager mcp-ssh-manager. Codex is set up here. Then ask in plain words: "why is production slow?", "tail the nginx error log on staging".

Does it work with Cursor, Windsurf, Cline or another MCP client? It is a standard stdio MCP server, so any MCP client can run it. Claude Code, Claude Desktop and Codex are the clients documented and tested here. For another one, add what it expects, for example:

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

Do I need Node.js? With npm, yes (Node 18 or later). The desktop application carries its own runtime and engine: install it and connect your AI tools from Options → AI tools, with no Node and no npm.

How is this different from other SSH MCP servers? Most hand the agent a shell. This one lets you choose per server how far it goes, can hold requests until you approve them, keeps an audit trail, and has a desktop app and a browser interface to see it all. It also runs without any of that, as a plain engine configured from a .env or a TOML file, if that is what you want.

Where are my passwords and keys kept? Key files stay where they are. Saved passwords and passphrases can go into the encrypted vault (AES-256-GCM, with the key in your operating system's keychain) rather than a .env.

Is it free? Yes, it is MIT-licensed. The source is here, the package is on npm and the desktop apps are on the releases page.


Reference

Core — always enabled

Tool

What it does

ssh_list_servers

Every configured server, with its group and mode

ssh_execute

Run a command. Falls back to the server's DEFAULT_DIR when no cwd is given

ssh_upload / ssh_download

Move a single file either way

ssh_sync

Bidirectional rsync, with real transfer counts

Backup & restore (v2.1+)

Tool

What it does

ssh_backup_create

MySQL, PostgreSQL, MongoDB or files — compressed, with metadata and retention

ssh_backup_list

Everything available, with size, date and retention

ssh_backup_restore

Restore one, including across databases

ssh_backup_schedule

Put it on cron, with automatic cleanup

See the Backup Guide and examples/backup-workflow.md.

Health & monitoring (v2.2+)

Tool

What it does

ssh_health_check

CPU, memory, disk, network, uptime, load — with an overall verdict

ssh_service_status

nginx, mysql, docker… on systemd or sysv

ssh_process_manager

List, inspect or kill; sort by CPU or memory

ssh_alert_setup

Thresholds, and what happens when one is crossed

ssh_monitor, ssh_tail

Live resource monitoring and log following

Databases (v2.3+)

Tool

What it does

ssh_db_dump

MySQL, PostgreSQL, MongoDB; optional gzip, optional table subset

ssh_db_import

Import a dump, .gz handled automatically

ssh_db_list

Databases, or the tables inside one

ssh_db_query

SELECT only — enforced, not suggested (MySQL: one line, no backslash)

Deployment & sessions

Tool

What it does

ssh_deploy

Files out, with permissions, backup and restart handled — see the Deployment Guide

ssh_execute_sudo

Sudo, with the password on stdin rather than the command line

ssh_session_*

Persistent shells that keep their context between commands

ssh_tunnel_*

Local, remote and SOCKS forwarding

Organisation

Tool

What it does

ssh_alias

Short names for servers

ssh_command_alias

Short names for commands you keep retyping

ssh_group_*, ssh_execute_group

Run one thing across many machines

ssh_hooks

Automation hooks around SSH operations — see Aliases and Hooks

ssh_profile

Swap whole sets of aliases and hooks — default, frappe, docker, nodejs, or your own

All 37 tools cost roughly 43.5k tokens of context. Most people don't need all of them.

ssh-manager tools configure     # interactive wizard
ssh-manager tools list          # what's on right now
ssh-manager tools enable monitoring
ssh-manager tools disable backup

Mode

Tools

Context

Good for

All (default)

37

~43.5k

The full set

Minimal

5

~3.5k

Just SSH, and 92% of the context back

Custom

5–37

varies

Whatever you actually use

Groups: core (5, always on) · sessions (4) · monitoring (6) · backup (4) · database (4) · advanced (14).

Fewer tools also means fewer approval prompts and a faster start. ssh-manager tools export-claude writes the matching auto-approval block.

📖 Complete guide →

Nobody starts here. You have a ~/.ssh/config with forty hosts, or a FileZilla site manager, or a spreadsheet a colleague sent you.

ssh-manager import ~/.ssh/config          # the format is worked out for you
ssh-manager import --from transmit        # or read where a tool keeps its list
ssh-manager import --template servers.xlsx   # or get a form to fill in

Source

How

Spreadsheet (.xlsx)

--template writes one with the columns filled in and three examples to type over

CSV

Comma or semicolon — Excel writes both, depending on where you live

~/.ssh/config

Host, HostName, User, Port, IdentityFile, ProxyJump. Wildcards are skipped, aliases collapse to one server

FileZilla

sitemanager.xml. SFTP sites only — an FTP bookmark is not an SSH server

PuTTY

An exported .reg. A .ppk key is refused with the puttygen line that converts it

Termius

JSON export, groups included

MobaXterm

.mxtsessions, folder becomes the group

Transmit

Its favourites, read directly (macOS)

Import is additive. A name you already have comes back as "already configured — left alone", never a silent overwrite; --replace if that is what you want. Two rows with the same name become web and web_2 rather than one.

No password is ever read. FileZilla keeps them base64-encoded, Transmit in the keychain, PuTTY not at all. Copying a credential out of another application's store is not a favour — it moves a secret you had forgotten into a second place you now have to think about. Hosts, users, ports and key paths come across; you are asked for a password once, when you first connect.

Going the other way:

ssh-manager export servers.xlsx     # or .csv, .env, .toml

Exports carry no passwords, no passphrases, no sudo passwords — an export is a file people email each other and commit by accident.

Two interchangeable formats, read by the same loader: .env is the usual choice with Claude Code, TOML with Codex (from SSH_CONFIG_PATH, or ~/.codex/ssh-config.toml). Both can coexist — the loader merges them.

SSH_SERVER_[NAME]_HOST=hostname_or_ip
SSH_SERVER_[NAME]_USER=username
SSH_SERVER_[NAME]_PASSWORD=password          # or use a key
SSH_SERVER_[NAME]_KEYPATH=~/.ssh/key
SSH_SERVER_[NAME]_CERTPATH=~/.ssh/key-cert.pub # optional: OpenSSH certificate for KEYPATH
SSH_SERVER_[NAME]_PASSPHRASE=key_passphrase  # optional
SSH_SERVER_[NAME]_PORT=22                    # optional
SSH_SERVER_[NAME]_DEFAULT_DIR=/var/www       # optional working directory
SSH_SERVER_[NAME]_SUDO_PASSWORD=…            # optional, for automated deploys
SSH_SERVER_[NAME]_DESCRIPTION=…              # optional
SSH_SERVER_[NAME]_GROUP=production           # optional, free-form label
SSH_SERVER_[NAME]_PLATFORM=windows           # optional: linux (default) | windows
SSH_SERVER_[NAME]_PROXYJUMP=bastion          # optional: another server, as jump host
SSH_SERVER_[NAME]_PROXYCOMMAND=…             # optional: ncat, ssh -W, …
SSH_SERVER_[NAME]_FORWARD_AGENT=true         # optional, and a real security trade-off
SSH_SERVER_[NAME]_ANNOUNCE_AGENT=true        # optional: tell this host an AI agent is driving (off by default)
SSH_SERVER_[NAME]_MODE=readonly              # optional: unrestricted | readonly | restricted
# Approval is NOT a field here — it is set per server from the control plane and
# stored in the vault, so that a shell on one of your machines cannot switch off
# the gate that exists to stop it.
SSH_SERVER_[NAME]_AUDIT_LOG=~/audit.jsonl    # optional JSONL trail

The same thing in TOML:

[ssh_servers.production]
host = "prod.example.com"
user = "admin"
key_path = "~/.ssh/id_rsa"
port = 22
default_dir = "/var/www"
group = "production"
description = "Production server"

[ssh_servers.winhost]
host = "192.168.1.90"
user = "svc-ssh"
key_path = "~/.ssh/winhost_key"
port = 2222
platform = "windows"

[ssh_servers.internal]
host = "10.0.0.5"
user = "admin"
proxy_jump = "bastion"

OpenSSH user certificates — for servers that trust a certificate authority (TrustedUserCAKeys), point CERTPATH / cert_path at the certificate signed for KEYPATH (usually <key>-cert.pub). It is read on every connection, so a short-lived certificate renewed on disk needs no restart, and a missing file fails the connection instead of falling back to the bare key. It takes effect once ssh2 ships certificate support (mscdex/ssh2#1495); until then the plain key is offered, as before. ssh_sync uses the system ssh, which finds <key>-cert.pub next to the key on its own.

Loading order, highest priority first: process environment → .env → the encrypted vault → TOML. A credential you deliberately put in the vault beats one left in a .env; an operator overriding for a single run still beats both.

Profiles bundle aliases and hooks per project type. Set one with export SSH_MANAGER_PROFILE=frappe, or switch from your assistant, which remembers it in ~/.ssh-manager/profile. Ships with default, frappe, docker and nodejs; add your own in profiles/. Custom aliases and hooks also live in ~/.ssh-manager/, so an upgrade keeps them.

More examples: examples/codex-ssh-config.example.toml.

Through a bastion — the tunnel is transparent, every tool works as usual:

SSH_SERVER_BASTION_HOST=bastion.example.com
SSH_SERVER_BASTION_USER=jumpuser
SSH_SERVER_BASTION_KEYPATH=~/.ssh/bastion_key

SSH_SERVER_PRIVATE_HOST=10.0.0.5
SSH_SERVER_PRIVATE_USER=admin
SSH_SERVER_PRIVATE_PROXYJUMP=bastion

Chains work: if bastion itself has a PROXYJUMP, it's followed recursively. Circular references are detected and rejected.

Through a SOCKS proxy or a custom command — it runs locally and forwards to the host, with %h and %p for host and port:

SSH_SERVER_SOCKS_PROXYCOMMAND="ncat --proxy 127.0.0.1:1080 --proxy-type socks5 %h %p"
SSH_SERVER_WINPROXY_PROXYCOMMAND="C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p user@jump-host"

Passphrase-protected keys — load the key into ssh-agent and nothing else is needed; SSH_AUTH_SOCK is picked up automatically, the same mechanism plain ssh uses. Storing PASSPHRASE in the config works too, and is the less good option.

Agent forwarding (FORWARD_AGENT=true, off by default, per server) lets a process on the remote host authenticate to other hosts with your local keys — git clone over SSH on a server without copying a private key there.

⚠️ Anyone who can read the forwarded socket on that host — root included — can impersonate you against other hosts for the life of the connection. Only for servers you trust, exactly as ssh_config(5) advises.

Telling your servers an agent is driving (ANNOUNCE_AGENT=true per server, or SSH_MANAGER_ANNOUNCE_AGENT=true for all of them; off by default). Every command channel then carries AI_AGENT=mcp-ssh-manager, following the AI_AGENT over SSH convention, so a host that records it can tell a session an agent drives from one a person drives — SSH cannot otherwise: same key, same user either way. Contributed by @mthamil107 in #84.

  • The server has to accept it. Stock OpenSSH ships AcceptEnv LANG LC_* and drops anything else silently. Add AcceptEnv AI_AGENT to sshd_config and reload; $AI_AGENT is then set for every command and shell the agent runs, for a profile, a wrapper or an audit hook to record.

  • Off by default, for two reasons. Upgrading must not change what reaches your servers. And the request reaches every host whatever its AcceptEnv — sshd only declines to store it — so a host you do not control would learn an agent is on the other end, and could shape its output for one. ANNOUNCE_AGENT=false keeps one host silent under the global switch.

  • Covered: commands, ssh_tail --follow, interactive sessions, and ssh_sync (via SendEnv, supported since OpenSSH 3.9). Not covered: SFTP transfers — ssh2 would fail the whole SFTP session on a server that refuses the variable — and port forwards, which have no environment.

  • A person is never announced. Everything you do from the control plane — a shell, a file, a health probe, a command across a group — is yours, and reaches the server unlabelled.

Groups — tag servers and they become a group, with no extra file to maintain:

SSH_SERVER_WEB1_GROUP=production
SSH_SERVER_WEB2_GROUP=production

Groups created with ssh_group_manage live in .server-groups.json and additionally carry execution settings (strategy, delay, stop-on-error). When a name exists in both places, membership is the union and the stored settings apply. Names are case-insensitive. A group that exists only through the group field is read-only for ssh_group_manage — change membership by editing the servers.

Claude Code freezes or shows "Interrupted" — almost always an output too large for the context. Output is auto-truncated and the default timeout is two minutes, but you can tune it:

MCP_SSH_MAX_OUTPUT_LENGTH=5000    # default 10000 characters
MCP_SSH_DEFAULT_TIMEOUT=180000    # default 120000 ms
MCP_SSH_COMPACT_JSON=true         # fewer tokens per response

And prefer tail -n 100 huge.log over cat huge.log — the same advice you'd give a colleague.

Tools don't show up — claude mcp list, then restart Claude Code. /mcp inside Claude Code shows the live status.

Connection failed — ssh-manager server test <name> first; it tells you whether it's DNS, the firewall, or the credentials.

Permission denied — check chmod 600 ~/.ssh/your_key, then the username, then what that user is allowed to do on the host.

Still stuck? Open an issue — include the server's PLATFORM and what ssh-manager server test said.

Known limitations, honestly:

  • Command timeouts are advisory. ssh2 can't kill a remote process; on Linux and macOS hosts a timeout wrapper does it properly. On Windows hosts set PLATFORM=windows to skip that wrapper, which OpenSSH for Windows doesn't understand.

  • ssh_sync with password auth needs sshpass. Keys are better anyway. On a Windows host, pass native paths like local:C:\project — drive-letter and UNC paths are converted to MSYS2 form, and a path already written as /c/... is passed through untouched rather than converted twice.

  • Connections are pooled and reused. A stale one reconnects on next use; force it with ssh_connection_status and the reconnect action.

git clone https://github.com/bvisible/mcp-ssh-manager.git
cd mcp-ssh-manager && npm ci
./scripts/setup-hooks.sh      # pre-commit checks, including secret detection

npm test                      # 43 suites
npm run typecheck             # JSDoc through tsc, no build step
npm run test:all              # both, plus ./scripts/validate.sh
npm run test:preview          # isolated candidate fixture, restart and cleanup

The layout:

src/          index.js is the MCP server and its 37 tools; one module per domain
              (ssh-manager, config-loader, session-manager, backup-manager,
               health-monitor, database-manager, tunnel-manager, server-groups…)
cli/          the Bash CLI, plus the Node wrapper that makes it work on Windows
ui/           the control plane's React interface (v4)
desktop/      the Electron build (v4)
profiles/     frappe, docker, nodejs — and room for yours
scripts/      validation, and the rig that regenerates every screenshot and the video
docs/         guides, migration notes, security modes

Pull requests are welcome — CONTRIBUTING.md has the details. Shipping the desktop builds — signing, notarization, and why the Mac App Store is a different product rather than a further step — is in docs/DISTRIBUTION.md.

Nothing in this README's imagery is taken by hand. scripts/demo-env.mjs stands up three real ssh2 servers on the loopback with a seeded vault, a pending approval and a live stream; capture-screenshots.mjs and record-demo.mjs drive Chrome over the DevTools protocol against it; frame-screenshots.py draws the browser and application windows, and macbook-mockup.py draws the laptop. After a UI change, re-run them rather than editing an image.

The hero animation ships twice, light and dark, swapped by <picture> on prefers-color-scheme. A single transparent GIF would have been simpler, but GIF alpha is one bit and transparency defeats its inter-frame compression: the same clip came out at 11.4 MB transparent against 357 KB on a solid ground.


What's new

4.0.3 — a security release; upgrade. ssh_db_query, the read-only tool, could run shell commands on the server through the psql and mysql clients' own commands (\!), including on servers in readonly or restricted mode (GHSA-qmf5-hrhv-5hjm, reported by @orshih6). Every version before it is affected. A MySQL query must now be one line without backslashes. See the CHANGELOG.

4.0.2 — commands reach a Mac, and the desktop terminal is your own. Commands sent to a macOS server no longer fail with timeout: command not found before they start (thanks to Henrik Tilly, #115); the desktop terminal starts a login shell, so what Homebrew installed is found as in Terminal or Warp, and PowerShell on Windows; keystrokes reach the shell in the order they were typed; dependencies refreshed. Nothing to change on upgrade.

4.0.1 — the application tells you about updates. Options → Updates, a mark on the sidebar and a notification once per version, so a new release no longer goes unnoticed in a menu you never open; a tidier Servers toolbar; the interface is built when the package is made rather than committed (what you install is byte for byte the same); and the npm, registry and GitHub descriptions say what V4 is. No change to the engine's behaviour.

4.0.0 — the control plane. See what an agent is running on your servers, with its output, and stop it before it runs. A desktop application for macOS, Windows and Linux, installed from the engine with ssh-manager app; an encrypted vault for credentials; human approval per server; a shell on your own machine alongside the remote ones. Everything new is opt-in — an npm install upgraded from 3.8.x keeps behaving as 3.8.x, which a test installs from the registry and proves. The Windows application is not code-signed in this release. What changes and how to go back.

v3.8.7 — a security release; upgrade. Two advisories fixed: a partial server name or an alias escaped readonly and restricted mode (GHSA-mq9f-5385-rjf4), and ssh_backup_restore's backupId ran commands on the server (GHSA-2wjh-xm9c-7qf9). See the CHANGELOG.

v3.8.6 — a security release; upgrade. Six advisories fixed. The default on-error hook let any SSH server you connect to run a command on your machine; restricted mode only checked how a line started; ssh_db_query could write; host keys were never compared. See the CHANGELOG.

v3.8.5 — a security release. Three command-injection advisories fixed, one of which defeated readonly mode. Upgrade if you use ssh_backup_*, ssh_db_dump, ssh_service_status or ssh_tail.

  • RCE bypassing readonly / restricted (GHSA-m793-whw6-f537) — ssh_service_status and ssh_tail are read-only, so they stay enabled on servers you locked down, and neither quoted its arguments nor consulted the policy layer. A service name like nginx; id > /tmp/pwned executed.

  • RCE through ssh_db_dump (GHSA-796j-h5q5-jx6p) — the stat run after the dump interpolated the output path raw. The v3.6.7 patch had stopped one line short.

  • RCE through every ssh_backup_* tool (GHSA-qwwm-vrm9-4mw8) — backup-manager.js had zero shell escaping across its nine builders while database-manager.js had 95.

Quoting now lives in one module so "did this builder quote its inputs?" has a single answer.

Full changelog, every release back to v1.0.0 →


Documentation · Changelog · Security policy · Roadmap · Issues

Built on the Model Context Protocol, with ssh2 doing the hard part. MIT licensed — see LICENSE.

Made with ❤️ for the Claude Code community

MCP Toplist

Validation before a release

The V4 testing guide describes the offline suites, real npm 3.8.5 → V4 → rollback checks, browser flows, and platform release gates. Use the final V4 test guide to review the actual npm package or desktop candidate with a disposable profile before publication.

Available Tools

37 tools
ssh_alert_setupA

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.

NameRequiredDescriptionDefault
actionYesAction: set thresholds, get config, or check current metrics against thresholds
serverYesServer name
enabledNoEnable or disable alerts (default: true)
cpuThresholdNoCPU usage threshold percentage (e.g., 80)
diskThresholdNoDisk usage threshold percentage (e.g., 85)
memoryThresholdNoMemory usage threshold percentage (e.g., 90)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers. It identifies set as mutating, names the exact config file path, notes write-access requirements, explicitly labels get and check as read-only, reveals the default for enabled, and flags the error case for check.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a high-level purpose statement followed by a compact breakdown of the three actions and their side effects. Every sentence adds necessary information, and the mutating/read-only distinction is front-loaded rather than buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with six parameters and no output schema, the description covers actions, side effects, permissions, defaults, and error conditions well. It stops short of describing the exact shape of get/check return values, but the verbal descriptions of 'reads back that config' and 'compares them to stored thresholds' give an agent enough operational clarity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds real value by explaining what the action parameter does for each enum value and by clarifying the enabled default and check error behavior, which the schema alone does not convey. That warrants a step above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pairing: 'Configures and evaluates CPU, memory, and disk usage alert thresholds for a remote server.' It then enumerates the three action modes, making it clear this tool manages alert thresholds rather than performing general SSH execution or monitoring.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains when to use set, get, and check, and includes important constraints like 'blocked on readonly servers' and 'check errors if no config exists yet.' It does not explicitly compare this tool to sibling tools, but the action-specific guidance is strong enough for an agent to route usage correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_aliasA

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.

NameRequiredDescriptionDefault
aliasNoAlias name (for add/remove)
actionYesAction to perform
serverNoServer name (for add)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively discloses that add and remove persist the alias mapping locally, list is read-only, and add requires the target server to already exist. It doesn't mention error handling (e.g., duplicate alias, removing a non-existent alias) but covers the core side effects and prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: first sentence states the overall purpose, second explains the action parameter and per-action requirements, third covers persistence and the prerequisite for add. It is front-loaded with the core purpose and avoids unnecessary words or padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter tool with an enum action and no output schema, the description is largely complete. It covers all actions, required parameters, persistence behavior, and the add prerequisite. It omits specifics about return values (e.g., what list returns) and error cases, but these are minor for a CRUD-like alias manager. Given the simplicity, the description is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with basic descriptions for each parameter. The description adds meaning by explaining the 'action' parameter selects add/remove/list, that 'alias' is required for add and remove, and 'server' is required for add. This goes beyond the schema's generic descriptions (e.g., 'for add/remove') by specifying conditional requirements and the role of each parameter in different actions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Manages local name aliases that let you reference a configured server by a shorter or alternative name.' It then breaks down the three actions, making the function unambiguous. Though it doesn't explicitly name ssh_command_alias as a distinct sibling, the focus on 'server' aliases versus 'command' aliases makes the differentiation clear without reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (when you need to manage server name aliases) but provides no exclusions or references to sibling tools. It doesn't explicitly say 'use this instead of ssh_command_alias' or mention alternative tools for similar operations. The usage context is implied through the purpose, but the lack of explicit comparison or 'when not to use' guidance leaves a gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_backup_createA

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.

NameRequiredDescriptionDefault
nameYesBackup name (e.g., production, app-data)
typeYesBackup type: mysql, postgresql, mongodb, files, or full
pathsNoPaths to backup (for files type)
dbHostNoDatabase host (default: localhost)
dbPortNoDatabase port
dbUserNoDatabase user
serverYesServer name
excludeNoPatterns to exclude from backup
compressNoCompress backup (default: true)
databaseNoDatabase name (required for db types)
backupDirNoBackup directory (default: /var/backups/ssh-manager)
retentionNoRetention period in days (default: 7)
dbPasswordNoDatabase password

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It candidly discloses side effects: writing two artifacts, pruning old backups by retention, running pre/post hooks, defaulting compression, and erroring on 'full'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences front-load the core action and artifact description, then pack defaults, pruning behavior, and hooks without redundancy. Every sentence contributes operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter remote mutation tool with no annotations and no output schema, the description covers essential conditions, defaults, side effects, and the failure mode for unsupported types. An agent has enough to validate inputs and anticipate consequences before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds valuable cross-parameter constraints: database types require database, files requires paths, and defaults for retention, compress, and backupDir. This goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete action ('Creates...backup'), identifies the transport ('over SSH'), and specifies the output artifacts ('compressed archive plus a JSON metadata file'). The supported types and explicit 'full' error help distinguish it from sibling backup tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly communicates the use context: on-demand SSH backups with type-specific prerequisites and an unsupported full mode. It doesn't explicitly say when to prefer this over ssh_db_dump or ssh_backup_schedule, but the context is strong enough for an agent to infer the intended use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_backup_listA

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.

NameRequiredDescriptionDefault
typeNoFilter by backup type
serverYesServer name
backupDirNoBackup directory (default: /var/backups/ssh-manager)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explicitly states 'Read-only: it inspects the filesystem and mutates nothing', which is a key behavioral disclosure. It also mentions that it parses metadata from stored metadata, providing transparency on the operation's nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the primary purpose, and every sentence adds relevant detail without redundancy. No fluff or unnecessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list operation, the description is complete: it specifies the resource, optional filters, defaults, and the output fields. It does not mention error scenarios or authentication, but these are not typically required for a read-only list. The information provided is sufficient for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description reiterates the type enum and the backupDir default, which are already in the schema, but adds value by explaining the purpose of the 'type' filter and the output fields. It does not significantly extend beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Lists existing backups'), the resource (backupDir on remote server), and enumerates the returned fields. It is distinct from sibling tools like ssh_backup_create or ssh_backup_restore by focusing on listing/inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to invoke the tool (optional type filter, backupDir default) but does not explicitly state when to use it versus alternatives, such as 'use this to view backups instead of creating/restoring'. No exclusions or alternative tool names are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_backup_restoreA

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.

NameRequiredDescriptionDefault
dbHostNoDatabase host (default: localhost)
dbPortNoDatabase port
dbUserNoDatabase user
serverYesServer name
backupIdYesBackup ID to restore
databaseNoTarget database name (for db restores)
backupDirNoBackup directory (default: /var/backups/ssh-manager)
dbPasswordNoDatabase password
targetPathNoTarget path for files restore (default: /)

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it delivers: it explicitly warns that the operation is destructive and overwrites the target, details per-engine behavior (pg_restore --clean --if-exists, mongorestore --drop, MySQL piping), and mentions pre/post-restore hooks. This is exemplary disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four focused sentences: main action first, then destructive warning, then engine-specific details, then supported engines and hooks. Every sentence adds value; no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive restore operation with no annotations or output schema, the description covers the essential behavioral facts, engine differences, supported engines, and hooks. The only notable gap is the lack of any statement about return values, success/failure indication, or required preconditions beyond the existence of the backup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds context about engine selection via metadata but does not elaborate on individual parameter semantics beyond what the schema already provides. No deduction is warranted given the full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Restores a previously created backup identified by backupId'. It also explains the engine-selection mechanism, which distinguishes this from siblings like ssh_backup_create and ssh_db_import. The purpose is immediately unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'previously created backup' clearly ties this tool to backup-creation workflows, and the supported engines are listed. However, it does not explicitly name alternative tools such as ssh_db_import or state when one should be preferred over the other, leaving some routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_backup_scheduleA

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).

NameRequiredDescriptionDefault
nameYesBackup name
typeYesBackup type
pathsNoPaths to backup (for files type)
serverYesServer name
databaseNoDatabase name (for db types)
scheduleYesCron schedule (e.g., "0 2 * * *" for daily at 2 AM)
retentionNoRetention period in days (default: 7)

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states the tool mutates the remote filesystem and crontab, writes an executable script to a specific path, typically needs root, and that the generated script deletes old backups based on retention. This is unusually transparent for a mutating tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: first states the core scheduling action, second discloses side effects and permissions, third lists supported types and default retention. The information is front-loaded and free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a 7-parameter tool: it explains side effects, permission needs, supported backup types, and the retention default. The main gap is that it does not clarify conditional parameter requirements, such as paths being needed when type=files, though the schema partially signals this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds some context by referencing the cron expression, supported backup types, and retention default, but it does not need to deeply explain individual parameters because the schema already documents them well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: it 'schedules a recurring backup' by writing a script and installing a crontab entry. It clearly distinguishes itself from one-off siblings like ssh_backup_create and restore by emphasizing recurrence via cron.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the usage context clear: recurring backups via cron on a remote server, with explicit mention of requiring root to write the target path. It does not explicitly name an alternative for one-off backups, but the recurring/cron framing is sufficient to route an agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_command_aliasA

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.

NameRequiredDescriptionDefault
aliasNoAlias name (for add/remove)
actionYesAction to perform
commandNoCommand to alias (for add) or search term (for suggest)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full transparency burden and does well by disclosing no remote execution, no side effects, local config storage, and overwrite-on-add behavior. It does not mention result format, error handling, or config file location, so it stops short of 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all substantive and well organized: main purpose first, action semantics second, and the overwrite caveat last. There is no filler, and nothing merely repeats the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema or annotations and four distinct actions, the description explains each action's behavior and even gives high-level return expectations for list and suggest. It does not specify exact result formatting or failure behavior, but an agent has sufficient information to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, and the description adds meaningful operational detail beyond the schema by binding each action to its required parameters (e.g., command doubles as the search term for suggest, add needs both alias and command). This mapping is not fully inferable from the enum alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource ('local shorthand aliases' mapping a short name to a full command string) and scopes behavior to local config with no remote execution, which distinguishes it from the many remote-execution siblings. It falls short of 5 because it does not explicitly differentiate from the similarly named 'ssh_alias' sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers clear action-specific usage guidance: add requires both alias and command, remove requires alias, suggest uses the command field as a search term, and list shows profile/custom-tagged aliases. The 'local config with no remote execution or side effects' phrase gives selection context versus remote tools, although no alternative tool is named explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_connection_statusA

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.

NameRequiredDescriptionDefault
actionYesAction to perform
serverNoServer name (for reconnect/disconnect)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden and largely meets it: status is labeled read-only, reconnect closes then reopens, disconnect closes, cleanup drops aged-out/dead connections, and all effects are confined to local in-memory state. It stops short of noting failure modes or in-flight operation impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences: the first sets scope and the second maps actions and parameters. Every clause carries useful information with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema, the description fully equips an agent to choose an action, supply server when required, and anticipate the local-only side effects. Nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema describes both parameters, the description adds real semantic value by explaining each action enum value's effect and the conditional requirement/ignored behavior of server. This is precisely the disambiguation an agent needs beyond the generic schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly identifies the tool as inspecting and managing pooled SSH connections held by the local server process, then breaks it into four explicit actions. The 'never remote state' boundary distinguishes it from sibling SSH tools that operate on remote servers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete action semantics and states exactly when the server parameter is required versus ignored. It does not name sibling alternatives explicitly, but the local-only/never-remote scoping gives an agent enough context to avoid using it for remote-state operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_db_dumpA

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.

NameRequiredDescriptionDefault
typeYesDatabase type
dbHostNoDatabase host (default: localhost)
dbPortNoDatabase port
dbUserNoDatabase user
serverYesServer name
tablesNoSpecific tables to dump (MySQL/PostgreSQL only)
compressNoCompress output with gzip (default: true)
databaseYesDatabase name
dbPasswordNoDatabase password
outputFileYesOutput file path (will be created on remote server)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It transparently notes that the database is not modified, explains engine-specific flags, states that compression defaults to true with gzip, and warns that the tables list is ignored for MongoDB. It could also clarify overwrite behavior for an existing output file, but the core side effects are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient. The main purpose is front-loaded in the first sentence, and every subsequent sentence adds non-obvious operational detail without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no output schema, the description covers the most important operational nuances: read-only behavior, database-specific flags, compression, and table-list limitations. It is slightly incomplete regarding what happens if the remote output file already exists and what the tool returns after completion, but these are minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema: MySQL flags, PostgreSQL custom format and pg_restore compatibility, the compression default, and the MySQL/PostgreSQL-only behavior of the tables parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action, 'Dumps a database to a file on the remote server over SSH,' and clarifies it 'reads data only and does not modify the database.' This clearly differentiates it from sibling tools like ssh_db_import, ssh_db_query, and ssh_db_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool by emphasizing read-only behavior and listing supported database types. It does not explicitly name alternative tools for write operations, but the read-only framing makes the intended use unmistakable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_db_importA

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.

NameRequiredDescriptionDefault
dropNoDrop existing collections/tables before import (MongoDB only, default: true)
typeYesDatabase type
dbHostNoDatabase host (default: localhost)
dbPortNoDatabase port
dbUserNoDatabase user
serverYesServer name
databaseYesTarget database name
inputFileYesInput file path (on remote server)
dbPasswordNoDatabase password

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description fully carries the behavioral burden. It explicitly discloses destructive behavior, the exact PostgreSQL DROP semantics, MongoDB's --drop default, MySQL's replacement behavior, and automatic .gz decompression.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences front-load the most critical fact (destructive), then give DB-specific behavior and supported input handling. No filler or redundant restatement of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential operational facts for a destructive import tool: supported database engines, per-engine destructive behavior, the drop flag's default, and compressed input handling. No output schema is present, but return values are not necessary for an agent to invoke this correctly; the missing details are optional parameters already documented by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters. The description clarifies the drop flag and database-type-specific behavior, but it does not add substantial new detail about most parameters such as server, database, dbHost, dbPort, or inputFile.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear action ('imports a dump file into a target database') with a specific resource and context (remote server). Distinguishes itself from sibling tools like ssh_db_dump and ssh_db_query through the explicit import and destructive-restore framing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context by naming supported database types and explicitly warning that the operation is destructive. Does not name alternative tools or when-not-to-use conditions, but the import purpose is unambiguous enough for an agent to select it over export/query siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_db_listA

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.

NameRequiredDescriptionDefault
typeYesDatabase type
dbHostNoDatabase host (default: localhost)
dbPortNoDatabase port
dbUserNoDatabase user
serverYesServer name
databaseNoDatabase name (if provided, lists tables/collections; if omitted, lists databases)
dbPasswordNoDatabase password

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well by stating the operation is non-modifying, read-only, safe to call repeatedly, and filters system databases. It could add details about authentication or error behavior, but the key behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three compact sentences, front-loaded with the core purpose and safety guarantee. Every sentence earns its place, and there is no redundant phrasing or repeated schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list-style tool with no output schema, the description covers purpose, parameter-dependent behavior, supported engines, return shape, and safety profile. It could mention how credentials are resolved or what happens on connection failure, but nothing critical is missing for selecting and invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents all parameters with descriptions, so the baseline is 3. The description adds meaningful context beyond the schema by explaining how the 'database' parameter changes behavior, which engines are supported, and what the return payload contains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Lists') with a clearly defined resource ('database objects on the remote server') and states it modifies nothing. It also distinguishes its behavior from siblings like ssh_db_query, ssh_db_dump, and ssh_db_import by focusing on introspection only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: when 'database' is provided it lists tables/collections, and when omitted it lists databases with system databases filtered out. It also notes the tool is read-only and safe to call repeatedly, but it does not explicitly name alternatives or state when to prefer another tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_db_queryA

Runs a read-only query against a remote database. For mysql and postgresql it is strictly limited to one SELECT statement: the query must begin with SELECT, and INTO, file functions, and any insert, update, delete, drop, create, alter, truncate, grant, revoke, or exec keyword are rejected before execution; it then runs inside a read-only transaction, so the database itself refuses any write. For mongodb it runs a find() and requires the collection parameter; the query must be a filter document (JSON or mongo shell syntax such as ObjectId("…")), and $where, $function and $accumulator are refused. Returns the raw command output as text.

NameRequiredDescriptionDefault
typeYesDatabase type
queryYesSQL query (SELECT only) or MongoDB find query
dbHostNoDatabase host (default: localhost)
dbPortNoDatabase port
dbUserNoDatabase user
serverYesServer name
databaseYesDatabase name
collectionNoCollection name (MongoDB only)
dbPasswordNoDatabase password

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so thoroughly: it explains pre-execution keyword validation, that the statement then runs inside a read-only transaction so the database itself refuses writes, and the MongoDB-specific bans on $where/$function/$accumulator. It also discloses the return format as raw command text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences that are front-loaded with the core read-only contract before the per-dialect rules; nothing is filler. It is somewhat long, but the length is driven by genuinely distinct per-dialect behavior rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the 9-parameter, 3-dialect surface plus the conditional MongoDB requirement, and explicitly states the return value ('raw command output as text') even though no output schema exists. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it states that the MongoDB path requires the collection parameter (which is not listed in the schema's required array), that query must be a filter document, and that mysql/postgresql query must begin with SELECT.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (runs) plus resource (read-only query against a remote database) and constrains the operation to SELECT/find, which cleanly separates it from write-oriented siblings like ssh_db_import and ssh_db_dump. An agent can tell what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The read-only framing and the enumerated rejections (insert, update, delete, drop, exec, $where, etc.) effectively communicate when this tool is and isn't usable, and imply that write work belongs elsewhere. It stops short of naming a concrete alternative such as ssh_db_import for writing or ssh_db_list for enumeration.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_deployA

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.

NameRequiredDescriptionDefault
filesYesArray of files to deploy
serverYesServer name or alias
optionsNoDeployment options

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to carry safety/behavior information, the description carries the full burden and does so richly. It discloses mutation of remote state, the temporary-upload-before-move sequence, backup-on-overwrite behavior, sudo password usage, hook execution, and blocking on readonly/restricted servers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence in the description earns its place; the core action and mutation warning are front-loaded, followed by backup, option coverage, defaults, hooks, and the security-mode blocker. Despite covering many facets, it stays compact and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a state-mutating deployment tool with nested parameters and no output schema, the description covers almost everything an agent needs: mechanics, backup behavior, options, defaults, hooks, and security restrictions. It does not describe the return format or failure cleanup behavior, which keeps it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it explains that each file is uploaded to a temporary location before being moved, that backup is on by default and can be disabled, that owner/permission defaults are detected from the remote path, and that restart targets a single service. This enriches the bare parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific action, resource, and target: deploying a list of local files to remote paths on a named server, with a distinctive temp-then-move mechanism. It is clear, but it never explicitly contrasts with closely related siblings such as ssh_upload or ssh_sync, so differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context: use for multi-file deployment with backup defaults, owner/permission handling, hooks, optional service restart, and a hard exclusion on readonly/restricted servers. It does not explicitly say when to prefer this over ssh_upload or ssh_sync, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_downloadA

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.

NameRequiredDescriptionDefault
serverYesServer name
localPathYesLocal destination path
remotePathYesRemote file path

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so thoroughly. It discloses side effects ('overwriting any existing local file'), remote-side scope ('read-only on the remote side'), permission requirements ('configured SSH user, which must have permission to read it'), and operational constraints (single file only).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three information-dense sentences front-load the action, then add constraints and alternatives in a logical order. Every sentence earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter tool with no output schema, this description is complete. It covers action, side effects, permission requirements, security-mode compatibility, and the directory alternative. An agent has enough to decide when to use it and how to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description augments the schema by explaining that localPath will be overwritten and that remotePath must be readable by the SSH user, which adds meaningful operational context to the parameter behaviors.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Downloads one remote file from the named server to a local destination path over SFTP.' It explicitly clarifies the single-file scope and points to ssh_sync for directories, making it unmistakably distinct from siblings like ssh_upload and ssh_sync.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It directly states when to use the tool versus alternatives: 'Handles single files only; use ssh_sync for directories.' It also provides a contextual prerequisite—allowed even on servers in readonly or restricted security mode—which helps the agent decide suitability without external lookup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_executeA

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.

NameRequiredDescriptionDefault
cwdNoWorking directory (optional, uses default if configured)
serverYesServer name from configuration
commandYesCommand to execute
timeoutNoCommand timeout in milliseconds (default: 120000, max: 300000)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden of behavioral disclosure. It explicitly states that the tool mutates remote state, expands aliases, handles cwd fallback, adapts to Linux/Windows, has timeout limits, enforces readonly/restricted mode restrictions, and truncates large output. This is comprehensive transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose in the first sentence, then adds details in a logical sequence: mutation, alias expansion, cwd, OS adaptation, timeout, mode restrictions, and truncation. Every sentence carries unique information without redundancy, making it efficient for its depth.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a general execution tool with 4 parameters and no output schema, the description covers return values, edge cases (truncation, mode restrictions), configuration defaults, and behavioral nuances. It is complete enough for an agent to call correctly without missing critical information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter has a description. The description adds value beyond the schema by explaining cwd fallback behavior, timeout default and cap, and command alias expansion, which clarifies the operational context of these parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it runs a shell command over SSH and returns stdout, stderr, and exit code. It distinguishes itself from siblings by detailing alias expansion, OS-adaptive syntax, and timeout behavior, enabling an agent to recognize it as the generic execution tool even without naming alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly say when to use this tool versus siblings like ssh_execute_sudo or ssh_execute_group. It provides behavioral context such as not being read-only and mode restrictions, but the selection criteria are implied rather than stated, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_execute_groupA

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.

NameRequiredDescriptionDefault
cwdNoWorking directory
delayNoDelay between servers in ms (for rolling)
groupYesGroup name (e.g., "production", "staging", "all")
commandYesCommand to execute
strategyNoExecution strategy
stopOnErrorNoStop execution on first error

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so thoroughly: it discloses remote mutation, non-idempotence, per-server policy failures, best-effort semantics, stopOnError interaction, strategy meaning, timeout, and cwd default. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences front-load the primary action and return value, then add only high-value behavioral detail. No filler or repetition of schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating group command with no annotations and no output schema, this description covers membership resolution, failure semantics, strategies, timeout, and cwd default. The only mild gap is an exact report format, but 'per-server success or failure report' is sufficient for invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds material behavior beyond the schema: group membership can exist through config alone, cwd defaults to default_dir, timeout is 30000 ms, and stopOnError only changes the best-effort abort behavior. It also clarifies how delay applies to the rolling strategy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with 'Runs one command on every server belonging to the named group', naming a specific verb, target resource, and group scope. This clearly separates it from single-host tools like ssh_execute and from ssh_execute_sudo.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended context clear: group-wide execution over servers derived from ssh_group_manage or host config. It also explains best-effort failure handling, strategies, and stopOnError, but does not explicitly state when to prefer an alternative such as single-server ssh_execute.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_execute_sudoA

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.

NameRequiredDescriptionDefault
cwdNoWorking directory
serverYesServer name or alias
commandYesCommand to execute with sudo
timeoutNoCommand timeout in milliseconds (default: 30000)
passwordNoSudo password (will be masked in output)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full disclosure burden and more than meets it. It flags that the command 'mutates remote state and can be destructive,' explains sudo -S password piping and output masking, notes readiness for Linux/Windows, cwd honoring, timeout defaults, and readonly/restricted mode constraints. This is exemplary behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized, front-loading the purpose and then layering behavioral details. Each sentence adds distinct value: password handling, mutability/destructiveness, directory and OS behavior, timeout, and execution modes. Slightly long but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description explicitly states the return value (exit code and output) and addresses key context signals: parameters, default timeout, OS adaptation, cwd behavior, and restricted/readonly execution constraints. This is sufficient for an agent to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers all five parameters with descriptions, yielding 100% coverage. The description adds valuable semantics beyond the schema by explaining password piping and masking, the timeout default, cwd honoring, and sudo prepending, giving the agent operational details the schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise, specific verb phrase: 'Runs a command with elevated privileges via sudo on the named server and returns the exit code and output.' This clearly identifies the action, the target resource, the elevation mechanism, and the expected result, making it readily distinguishable from the sibling ssh_execute tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes a clear use context: elevated sudo privileges on a named server, with caveats about password handling and readonly/restricted mode behavior. It does not explicitly name alternatives or state 'when not to use,' but the sudo focus implicitly differentiates it from plain ssh_execute.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_group_manageA

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.

NameRequiredDescriptionDefault
nameNoGroup name
delayNoDelay between servers in ms
actionYesAction to perform
serversNoServer names
strategyNoExecution strategy
descriptionNoGroup description
stopOnErrorNoStop on error flag

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden and does well: it states persistence to local configuration only, absence of remote side effects, and that list also reports read-only derived groups. It does not cover failure semantics or idempotency, but the main safety-relevant behaviors are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: first sentence states purpose and scope, second defines the operation contract, and third explains read-only behavior and optional defaults. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers action semantics, per-action parameter requirements, persistence scope, read-only behavior, and default execution options. It does not describe return values or error behavior for create/update/delete, but the tool is otherwise sufficiently scoped for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds substantial value beyond the schema's 100% parameter coverage by specifying conditional requirements: list is exempt from name, add/remove require non-empty servers, and strategy/delay/stopOnError serve as default execution behavior. These relationships are not encoded in the input schema, making the prose essential.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear compound operation—'Creates, updates, deletes, and inspects named server groups'—and identifies the resource scope as local configuration with no remote side effects. It also names the dependent sibling, ssh_execute_group, distinguishing this management tool from execution tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit per-action usage requirements: list is read-only, all other actions require name, and add-servers/remove-servers require a non-empty servers array. It does not explicitly name a competing alternative, but it clearly positions the tool as local group management in contrast to remote-execution siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_health_checkA

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.

NameRequiredDescriptionDefault
serverYesServer name
detailedNoInclude detailed metrics (network, load average)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the tool is read-only ('only reads metrics and changes nothing') and describes the output structure (parsed JSON, critical_issues list). It also mentions the default value of 'detailed' and what it includes. It does not cover error handling, authentication prerequisites, or behavior on SSH failure, but for a health check these are secondary. The disclosure is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four concise sentences, each adding a distinct piece of value: purpose, safety guarantee, parameter behavior, and output highlights. It is front-loaded with the primary purpose and avoids redundancy. No sentence is wasted; the structure is efficient and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (2 params, no output schema, but no nested objects) and the fact that there are no annotations, the description is remarkably complete. It specifies the return format (parsed JSON), the key fields (status, CPU, memory, disk, uptime, critical_issues), and parameter behavior. The only missing aspects (error handling, auth details) are likely standard across the ssh_* family and adequately implied by the context. Nothing essential for correct invocation is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema: for 'detailed', it clarifies the default (false) and the specific additional metrics (load average and network). For 'server', it implies a predefined named server rather than arbitrary host string. These additions exceed the schema's minimal descriptions, thus warranting a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Runs'), a resource ('the named server'), and a defined outcome ('returns parsed JSON with overall status, CPU, memory, disk usage, and uptime'). It clearly distinguishes this from siblings like ssh_execute (arbitrary commands) and ssh_monitor (likely continuous monitoring) by emphasizing 'read-only health check' and 'diagnostic shell commands'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for one-off health diagnostics and explicitly notes it 'only reads metrics' and 'changes nothing', which suggests safe, non-disruptive use. However, it does not explicitly name alternative tools or state when not to use it (e.g., 'for ongoing monitoring, use ssh_monitor' or 'for arbitrary commands, use ssh_execute'). The context is clear but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_historyA

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.

NameRequiredDescriptionDefault
limitNoNumber of commands to show (default: 20)
searchNoSearch in commands
serverNoFilter by server name
successNoFilter by success/failure

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it opens no SSH connection, is read-only, retains data only for the current process, and does not expose command output. This goes well beyond a basic function statement and gives the agent a precise safety and side-effect profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core function, then adds behavioral caveats and filter semantics in a logical order. Every sentence earns its place with no redundant wording or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup with four optional parameters and no output schema, the description covers what the agent needs: what is returned (timestamps, server, duration, success status), what is excluded (command output), and the current-session limitation. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful context by explaining that filters 'narrow the results', that 'search' targets substring in command text, and that 'limit' defaults to the 20 most recent entries. This is extra value beyond the schema's terse field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the exact action ('Returns the in-memory log of SSH commands') with a specific resource and scope ('through this server process during the current session'). The read-only, local nature and explicit disambiguation from execution tools clearly distinguish it from siblings like ssh_execute or ssh_session_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context that this is for reviewing commands from the current in-memory session only, and explicitly notes it does not persist across restarts. It does not name alternative tools or state when not to use it, but the unique purpose makes usage obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_hooksA

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.

NameRequiredDescriptionDefault
hookNoHook name (for enable/disable)
actionYesAction to perform

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden and handles it well. It explicitly discloses the side-effect profile: changes are local, persistent, have no immediate remote action, and affect later operations. It also describes what list and status reveal, which is useful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core resource and key constraint. The main redundancy is the phrase 'The action selects behavior,' which is followed by an explicit enumeration, but the overall structure is dense and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema, the description is complete: it covers all action branches, parameter usage, side effects, persistence, and the nature of list/status output. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by explaining what each action does and clarifying that enable and disable both require the hook name. This goes beyond the terse schema descriptions and the raw enum values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly identifies the resource as SSH automation hooks and names the supported operations: list, enable, disable, and status. The phrase 'local configuration only with no immediate remote action' helps distinguish this tool from remote-execution siblings like ssh_execute and ssh_deploy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when each action is appropriate, including that list and status are informational, while enable and disable require a hook name. It also notes the tool only affects local configuration and has no immediate remote action, though it does not explicitly name alternative tools or when not to use this one beyond that scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_key_manageA

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.

NameRequiredDescriptionDefault
actionYesAction to perform
serverNoServer name (required for most actions)
autoAcceptNoAutomatically accept new keys (use with caution)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. It explicitly classifies verify/check/list as read-only, states that accept and remove mutate local state, and warns that autoAccept should be used with caution. It also tells the agent that mutation is blocked on readonly servers, which is essential safety context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the tool's purpose, then moves through action semantics and safety conditions. Every sentence contributes information, with no filler or repetition of schema trivia.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main actions, mutation risks, readonly blocking, and parameter requirements. However, it does not clearly distinguish verify, check, and list from one another, which could lead an agent to choose the wrong read-only action. Since there is no output schema, some indication of return behavior would also have improved completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the schema only says 'Action to perform' for action and 'use with caution' for autoAccept. The description adds real semantic value by grouping the enum values into read-only versus mutating operations, clarifying the conditional requirement for server, and giving the default and caution for autoAccept.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: it manages SSH host key fingerprints in the local known_hosts file for a named server. It then enumerates concrete actions, making it easy to distinguish from sibling tools like ssh_execute or ssh_tunnel_create.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains what each action does and notes that server is required for every action except list. It also mentions that accept and remove are blocked on readonly servers, giving useful usage constraints, though it does not explicitly name alternative tools for comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_list_serversA

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully covers behavioral traits: read-only, local, opens no SSH connections, and deliberately omits secrets. This is exemplary transparency for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, front-loading the purpose in the first sentence. Each subsequent sentence adds unique value: return fields, safety, secrets, parameters, and use case.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no output schema, the description is complete: it lists return fields, describes read-only behavior, clarifies no secrets, states no parameters, and gives a concrete usage scenario.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema is empty and the description explicitly states 'Takes no parameters,' leaving no ambiguity. Since there are zero parameters, no further semantics are required, and the baseline of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Lists all SSH servers defined in the loaded configuration' with specific verb and resource, and enumerates the return fields. It distinguishes itself from sibling tools by being the server list, not sessions or tunnels.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit usage context: 'Useful as a first call to discover which server names other tools accept.' It also notes read-only and local behavior, but does not explicitly name alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_monitorA

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.

NameRequiredDescriptionDefault
typeNoType of monitoring (default: overview)
serverYesServer name from configuration
durationNoDuration in seconds for continuous monitoring
intervalNoUpdate interval in seconds for continuous monitoring

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden—and it does excellently. It explicitly states the tool is read-only, changes no remote state, requires no sudo, and only gathers a single snapshot even when interval and duration are provided. This is transparent and prevents misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences with no filler. The main capability is front-loaded, parameter behavior is explained, and important caveats about monitoring semantics, sudo, and platform support each earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The core call-time decision points are covered: inputs, default behavior, safety, and platform caveats. Since there is no output schema, the description could have been slightly more explicit about the shape or format of the returned snapshot, but the named commands and resource categories give a reasonable expectation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all parameters at 100%, but the description adds real value by explaining that type defaults to overview, enumerating its possible values, and clarifying that interval and duration do not actually enable continuous monitoring. This goes beyond the schema without being redundant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Collects a read-only snapshot of system resources on the named Linux server.' It also names the inspection commands and the type parameter's view options, which clearly distinguishes it from execution, transfer, session, and tunnel siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when the tool is appropriate: read-only monitoring without state changes or sudo, and notes a Linux-only expectation with potential empty output on Windows. It does not explicitly name alternatives like ssh_execute or ssh_execute_sudo, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_process_managerA

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.

NameRequiredDescriptionDefault
pidNoProcess ID (required for kill and info actions)
limitNoNumber of processes to return (default: 20)
actionYesAction: list processes, kill process, or get process info
filterNoFilter processes by name/command
serverYesServer name
signalNoSignal to send when killing (default: TERM)
sortByNoSort processes by CPU or memory (default: cpu)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description properly carries the behavioral disclosure burden: it explicitly marks list and info as read-only, kill as mutating remote state, and notes the readonly-server block. It also exposes defaults for signal, sortBy, and limit, which helps the agent predict behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences cover actions, read-only vs mutating behavior, required parameters, constraints, and defaults. The most important behavioral distinction is front-loaded, and every sentence earns its place without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters, 3 enums, and no annotations or output schema, the description covers the essential invocation requirements: action selection, pid requirement, readonly constraint, and default behavior. It does not detail the output shape, but it communicates enough for correct selection and basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, so the baseline is 3. The description mostly repeats information already in the schema property descriptions, such as pid being required for kill/info, filter narrowing by name/command, and the defaults for signal, sortBy, and limit. It adds little novel semantic meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific action verbs ('Lists, inspects, or terminates processes') and names the resource (processes on a remote server over SSH). It clearly distinguishes the three modes via the action parameter, making it immediately obvious what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when each action is appropriate: list and info are read-only, kill mutates state, and kill is blocked on readonly servers. It states that pid is required for kill and info, but it does not explicitly compare this tool to sibling alternatives like ssh_execute.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_profileA

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.

NameRequiredDescriptionDefault
actionYesAction to perform
profileNoProfile name (for switch)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it states the tool's local-only scope, no remote side effects, that switch requires a profile argument, and that a successful switch requires a Claude Code restart.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, each earns its place: scope/safety, action semantics, post-switch behavior. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple enum-driven tool with no output schema, it describes what list/current return and what switch reports, plus side-effect scope. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds semantic meaning by explaining what each action does, and by specifically tying the profile parameter to the switch action as required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Identifies a specific resource (SSH Manager profiles) and the concrete operations (list, current, switch), and immediately disambiguates from the remote-action sibling tools by stating local configuration only, no remote side effects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Conveys clear context: use when working with project-type profiles, and explicitly warns that only local configuration is affected. Does not name alternatives or state when not to use, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_service_statusA

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.

NameRequiredDescriptionDefault
serverYesServer name
servicesYesService names to check (e.g., nginx, mysql, docker)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden and does well: it explicitly says the operation is read-only, describes the JSON response shape, counts, and health rating, and explains automatic name resolution. It doesn't cover error handling or authentication requirements, but the core behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences: what it does and returns, its read-only safety guarantee, and essential parameter guidance. No filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the operation, safety profile, parameter requirements, name resolution behavior, and return value shape, which is especially important given there is no output schema. Minor gaps like error behavior and how the server is identified are not fully addressed, but the agent has enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value by stating services is required, giving concrete examples, and explaining that common names are resolved to unit names automatically. This goes beyond the schema's simple 'Service names to check' description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool checks the running state of services over SSH and lists the key outputs. However, it does not explicitly distinguish itself from closely related siblings like ssh_process_manager or ssh_health_check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes it clear this is for inspecting service status rather than changing it, so usage context is implied. But it does not explicitly state when to prefer this tool over alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_session_closeA

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.

NameRequiredDescriptionDefault
sessionYesSession ID to close (or "all" to close all sessions)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden, and it delivers: it discloses destruction of session state, that remote files are not deleted, that 'all' closes every session while ignoring individual errors, and that the pooled underlying connection is retained. This is far beyond minimal disclosure for a mutating tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence adds a distinct, valuable fact: the core termination behavior, the destructive scope, the special 'all' semantics, and the pooled-connection nuance. There is no filler, and the most important information appears first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive action with no output schema, the description covers everything an agent needs to invoke it correctly: required input format, edge cases ('all'), side effects, and what it does not affect. The description is self-sufficient even though no return-value details are provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the single parameter at 100%, including the special 'all' value. The description adds meaningful behavioral detail beyond the schema, such as the fact that 'all' ignores individual close errors and that the session ID becomes unusable afterward.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: it terminates an SSH session by session ID, with details about writing exit, discarding history/context, and invalidating the ID. It clearly distinguishes itself from sibling tools like ssh_session_start, ssh_session_send, and ssh_session_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the tool's function obvious, but it does not explicitly state when to prefer this tool over alternatives or mention any exclusions. The use case is strongly implied—closing sessions started by ssh_session_start—but the description does not spell out the relationship with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_session_listA

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.

NameRequiredDescriptionDefault
serverNoFilter by server name

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries full responsibility and delivers: it states the operation reads in-memory session state, changes nothing on remote hosts or local config, and excludes closed sessions. This is exactly the behavioral context an agent needs to safely invoke an inspection tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the first defines the tool's output, the second establishes safety, and the third explains parameter behavior. Information is front-loaded and no words are wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter list tool with no output schema, this description is fully sufficient: it states return fields, filter semantics, read-only nature, and exclusion of closed sessions. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents server as 'Filter by server name' (100% coverage), the description adds crucial semantics: the parameter is optional, is a case-insensitive substring match, and omitting it lists all active sessions. This materially improves parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource—'Lists currently active SSH sessions'—and enumerates the exact fields returned, distinguishing it from sibling session-mutation and listing tools. No ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly conveys that this is a read-only inspection tool and explains how to use the optional server filter, including the omit-to-list-all behavior. It does not name explicit alternative tools for mutation, but the read-only framing tells an agent when not to use it, so the usage context is solid.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_session_sendA

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.

NameRequiredDescriptionDefault
commandYesCommand to execute in the session
sessionYesSession ID from ssh_session_start
timeoutNoCommand timeout in milliseconds (default: 30000)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly: it discloses mutation, non-idempotency, persistence of cd/export changes, bash-style Unix interpretation, potential refusal by readonly/restricted servers, and default timeout. This gives the agent a clear safety and side-effect profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-ordered: core purpose first, followed by side-effect warnings and operational constraints. The only slight redundancy is repeating the timeout default already present in the schema, but every other sentence adds valuable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, prerequisites, side effects, shell behavior, security restrictions, and timeout, which is sufficient for invocation. It does not explain the return value or error format, and there is no output schema to compensate, so it is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema documents all three parameters, so the baseline is 3. The description adds extra command-parameter semantics by explaining that commands reuse the session's persisted state and that cd/export mutate that state for later calls, which goes beyond the schema's terse 'Command to execute in the session.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a specific verb and resource: 'Runs one command inside an already-open session identified by its session ID.' It clearly distinguishes this from sibling one-shot tools by emphasizing the persisted session context, so an agent can identify what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly establishes the required context: the session must already be open and is identified by a session ID, implying use after ssh_session_start and not as a standalone execution tool. It does not explicitly name alternatives or exclusions, but the context is strong enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_session_startA

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.

NameRequiredDescriptionDefault
nameNoOptional session name for identification
serverYesServer name from configuration

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It openly states that the tool is stateful, side-effecting, may reuse pooled connections, keeps an open shell, preserves working directory/environment/history, and consumes a remote shell until ssh_session_close is called. This is thorough and accurate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense, information-rich sentences with no redundancy. The core behavior is front-loaded, and every sentence adds value by covering statefulness, lifecycle, comparison to alternatives, and parameter semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description gives the key return value (generated session ID), defines the lifecycle, and warns that the session consumes resources until closed. Sufficient context is provided for an agent to select and invoke the tool successfully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already documented. The description adds meaningful context beyond the schema by explaining that 'server' refers to a named configured server and that 'name' is only a human label, which clarifies intent and prevents misuse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: opens a new persistent interactive shell on a configured server and returns a session ID. It explicitly differentiates from one-shot ssh_execute, and the stateful, multi-call nature is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys when to use this tool: when a persistent shell with preserved context across subsequent calls is needed, and contrasts it with ssh_execute. It could be slightly more explicit about when not to use it or when to choose other siblings, but the intended usage is strongly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_syncA

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.

NameRequiredDescriptionDefault
deleteNoDelete files in destination not in source
dryRunNoPerform dry run without actual changes
serverYesServer name from configuration
sourceYesSource 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.
excludeNoPatterns to exclude from sync
timeoutNoTimeout in milliseconds (default: 30000)
verboseNoShow detailed progress
checksumNoUse checksum instead of timestamp for comparison
compressNoCompress during transfer
destinationYesDestination 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.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so thoroughly. It discloses that the tool mutates the destination, that delete true is destructive, that dryRun true is safe, that compression is on by default, that password auth requires sshpass, that it is blocked on readonly/restricted servers, and that the timeout defaults to 30000 ms.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient, with the core purpose front-loaded and every subsequent sentence carrying operational or safety value. The Windows path warning is lengthy but essential, and no unnecessary fluff is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no annotations and no output schema, the description covers path semantics, defaults, destructive behavior, auth requirements, and blocking conditions comprehensively. The only notable gap is that it does not describe the return value or result output, which would normally be helpful given the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds significant meaning beyond the schema: local:/remote: prefix semantics, Windows native path requirements and the MSYS2 conversion warning, the no-prefix push assumption, and functional details for delete, dryRun, compress, and timeout defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: synchronizes files or directories between local and remote using rsync over SSH on the named server. It clearly distinguishes this from one-way transfer siblings like ssh_upload and ssh_download by requiring local:/remote: prefixes and supporting bidirectional sync.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides strong usage context: both source and destination need prefixes, exactly one side must be local and the other remote, and a missing prefix assumes a push from local to remote. It also gives platform-specific path guidance and prerequisites like sshpass, though it does not explicitly name alternatives or when-not-to-use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_tailA

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.

NameRequiredDescriptionDefault
fileYesPath to the log file to tail
grepNoFilter lines with grep pattern
linesNoNumber of lines to show initially (default: 10)
followNoFollow file for new content (default: true)
serverYesServer name from configuration

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure — and it delivers. It states the tool is read-only and does not modify remote state, and crucially reveals a non-obvious behavior: in follow mode (the default), output is written to server process stderr and the response only returns a session note, not content. It then tells the agent how to get content (set follow=false). This is exactly the kind of behavioral nuance a caller must know and could never infer from the schema alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and every sentence earns its place — purpose, safety claim, behavioral mode explanation, and defaults. The third sentence is a long, multi-clause run-on that packs several facts (streaming, stderr destination, session-note response, follow=false alternative, lines default) into one dense stretch. It is information-dense rather than bloated, but it could be restructured into clearer discrete sentences for easier parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description must explain return behavior — and it does, telling the agent that follow mode yields only a session note while follow=false returns the last N lines. Defaults are disclosed. Minor gaps remain: no mention of error behavior (unknown server, missing file), no clarification of whether grep applies in follow mode, and no detail on what the session note references. These are secondary to the core call-and-interpret cycle, which is well covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds significant value on top: it explains that `follow` changes the entire output behavior (session note vs. returned lines) and that `lines` defaults to 10. It also reinforces `server` as a named configuration entry and `file` as the log path. The description does not merely echo schema text; it explains the behavioral consequences of the key parameter, which lifts it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Reads the tail of a remote log file on the named server, optionally filtered by a grep pattern.' This precisely states what the tool does and clearly differentiates it from siblings like ssh_execute, ssh_monitor, or ssh_db_query — none of which tail log files. An agent can identify this tool's purpose without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is clearly implied: tail a remote log file, with optional grep filtering. The description gives strong internal mode-selection guidance (set follow=false to capture content directly vs. follow=true for streaming). However, it never names alternative tools or states when NOT to use this tool, despite 35 siblings including monitoring-oriented tools (ssh_monitor, ssh_service_status, ssh_health_check) that an agent might confuse it with. The routing to siblings is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_tunnel_closeA

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.

NameRequiredDescriptionDefault
serverNoClose all tunnels for this server
tunnelIdNoTunnel ID to close

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, and it does so thoroughly. It discloses that the operation is irreversible ('Closing is final and cannot be undone'), scoped to local state only, and that the server mode reports how many tunnels were closed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences convey the action, scope, parameter contract, error behavior, and irreversibility without any filler. The most important scoping information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema and no annotations, the description is complete enough to invoke correctly: it explains what each parameter does, the exclusivity constraint, the error case, the local-only effect, and the destructive finality. An agent has sufficient information to decide when and how to call this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already describes both parameters, the description adds critical semantics beyond the schema: the exact-one requirement, the difference between single-tunnel and server-wide closing, and the error condition when neither is supplied. This meaningfully helps an agent choose and populate the right parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Tears down active SSH tunnels') and a clear resource ('active SSH tunnels created earlier'), and immediately clarifies scope by saying it affects only local tunnel state and not the remote host. This distinguishes the tool from related SSH tools like ssh_tunnel_create and ssh_session_close without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit parameter-selection rules: exactly one of tunnelId or server must be supplied, tunnelId targets one tunnel, server targets all tunnels for that server, and supplying neither raises an error. It provides clear operational context, though it does not explicitly name alternatives such as ssh_tunnel_list for discovering tunnel IDs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_tunnel_createA

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.

NameRequiredDescriptionDefault
typeYesTunnel type
serverYesServer name or alias
localHostNoLocal host (default: 127.0.0.1)
localPortYesLocal port
remoteHostNoRemote host (not needed for dynamic)
remotePortNoRemote port (not needed for dynamic)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It clearly states the tunnel 'keeps running until closed' and that a tunnel ID is returned for later closure, which are important side-effect and lifecycle traits. It does not mention authentication requirements or failure modes, but the core persistent behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: three sentences with no redundant wording. It front-loads the core action, then efficiently covers mode selection, required vs. optional parameters, defaults, and return value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description covers the essential invocation details: operation, parameter rules, default values, and return value. It is slightly incomplete by not referencing the sibling close/list tools or noting authentication prerequisites, but it is sufficient for correct basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already has 100% description coverage, the tool description adds significant semantic value beyond it: it explains how 'type' selects among local, remote, and dynamic modes, that localPort is always required, that remoteHost/remotePort are conditionally required, and that localHost defaults to 127.0.0.1. This helps an agent construct valid invocations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Opens a new SSH connection') and names the exact resource ('port-forwarding or SOCKS proxy tunnel'), clearly distinguishing this from generic SSH execution tools. It also explains the tunnel lifecycle and return value, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: when a persistent SSH tunnel is needed. It explains the three tunnel types and parameter requirements per type, but it does not explicitly name alternative sibling tools or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_tunnel_listA

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.

NameRequiredDescriptionDefault
serverNoFilter by server name

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description delivers important behavioral traits: it is read-only, does not create/modify/close anything, and only lists tunnels tracked by this process. It also specifies the exact data returned, though it does not cover potential side effects like error handling or resource limits, which are not critical for a simple list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a compact, well-structured set of three sentences. It leads with the core purpose, lists the output fields, states the read-only nature, and explains the parameter. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with one optional parameter, the description is complete: it identifies the resource, the filter, the output fields, and the read-only semantics. It doesn't mention pagination or output limits, but these are not essential for a simple listing operation and are not indicated by the presence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the 'server' parameter as a filter, but the description adds the nuance that it filters to one server and that omitting it lists all tunnels across servers. This clarifies the optional behavior beyond the schema's basic description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists active SSH tunnels tracked by the process, enumerating the specific fields returned. It distinguishes itself from sibling tools like ssh_tunnel_create and ssh_tunnel_close by being a read-only listing operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (for inspecting active tunnels) and explicitly notes it is read-only, signaling not to use it for modifications. It does not name alternative tools directly, but the read-only statement and the presence of create/close siblings provide adequate context for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh_uploadA

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.

NameRequiredDescriptionDefault
serverYesServer name
localPathYesLocal file path
remotePathYesRemote destination path

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly covers side effects: 'overwriting any existing remote file,' 'mutates remote state and is not idempotent beyond replacing the target,' 'creates no backup,' and the no-sudo limitation. It also discloses security-mode blocking. This is exemplary transparency for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is largely efficient and front-loaded with the core action. However, there is mild redundancy: 'overwriting any existing remote file at that path' is restated by 'not idempotent beyond replacing the target.' Both convey the same overwrite behavior, so a sentence could be trimmed. Overall it remains compact and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter mutation tool with no output schema and no annotations, the description supplies all critical operational context: prerequisites, destination writability, overwrite behavior, backup absence, security-mode restriction, and sibling routing. No essential information an agent needs to call this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% but the descriptions are minimal (e.g., 'Local file path', 'Remote destination path'). The description adds meaningful semantics beyond that: localPath must reference an existing local file, remotePath must be writable by the configured SSH user, and the upload overwrites any existing remote file. This enriches the parameter meaning without overloading.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Uploads one local file to a remote destination path over SFTP on the named server.' It clearly distinguishes itself from siblings like ssh_download (opposite direction) and ssh_sync ('For directory trees use ssh_sync instead'). An agent can understand exactly what this tool does without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative (ssh_sync) and the condition that selects it: 'For directory trees use ssh_sync instead.' It also provides concrete usage constraints: the local file must exist, the remote path must be writable by the SSH user, and the tool is blocked on readonly/restricted servers. This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 36 tool updatesv3.8.5
    • Changedssh_alert_setup1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_alias1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_backup_create1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_backup_list1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_backup_restore1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_backup_schedule1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_command_alias1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_connection_status1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_db_dump1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_db_import1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_db_list1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_db_query1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_deploy3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / files / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / options / additionalProperties
        Removed value: -false
    • Changedssh_download1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_execute1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_execute_group1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_execute_sudo1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_group_manage1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_health_check1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_history1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_hooks1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_key_manage1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_monitor1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_process_manager1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_profile1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_service_status1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_session_close1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_session_list1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_session_send1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_session_start1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_sync1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_tail1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_tunnel_close1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_tunnel_create1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_tunnel_list1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedssh_upload1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
  2. 1 tool updatev3.8.0
    • Changedssh_sync2 fields changed
      • changedInput schema / properties / destination / description
        Previous value: -"Destination path (use \"local:\" or \"remote:\" prefix)"New value: +"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."
      • changedInput schema / properties / source / description
        Previous value: -"Source path (use \"local:\" or \"remote:\" prefix)"New value: +"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."

TDQS

A4/5.0

Scored across 37 tools

Disambiguation3/5

Several tools overlap in purpose: ssh_execute vs ssh_execute_sudo vs ssh_session_send vs ssh_execute_group all run commands; ssh_backup_create vs ssh_db_dump both create database dumps; ssh_backup_restore vs ssh_db_import both restore databases; and ssh_monitor vs ssh_health_check both report resource metrics. Descriptions do clarify boundaries, but with 37 tools the risk of misselection remains moderate.

Naming Consistency4/5

All tools use the ssh_ prefix and snake_case, which is highly consistent. However, the internal ordering mixes verb_noun (ssh_list_servers, ssh_execute_group) with noun_verb (ssh_db_import, ssh_tunnel_list) and standalone nouns (ssh_history, ssh_hooks), a minor deviation from a uniform pattern.

Tool Count2/5

37 tools is heavy for a single server and exceeds the 25-tool threshold where count becomes a burden. While the domain is broad, many subdomains (database, backup, monitoring, sessions, tunnels, configuration) could be split to reduce cognitive load.

Completeness4/5

The surface covers command execution, files, sessions, tunnels, databases, backups, health, services, processes, alerts, aliases, groups, profiles, hooks, keys, and history extensively. Minor gaps exist: no CRUD for SSH server definitions, no direct service start/stop/restart, and no remote file editing tool, though ssh_execute can work around most of these.

Maintenance

ActivityActive
ResponsivenessUsually handled

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables SSH remote access to servers through Claude, allowing users to execute commands, transfer files via SFTP, and manage multiple remote connections using natural language.
    12
    9
    MIT
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Connects Claude to remote servers via SSH to execute commands, manage files, and browse directories. It allows users to add, edit, and switch between multiple server configurations through natural language conversations.
    -
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables Claude Code to control remote servers via SSH for automated deployment, testing, and operations, including command execution and file transfer.
    4
    -