Skip to main content
Glama
YawLabs

SSH MCP Server

by YawLabs

@yawlabs/ssh-mcp

npm version License: MIT

Mache SSH fit für KI-Tools. Ein MCP-Server, der deine SSH-Umgebung verwaltet, Fehler diagnostiziert, sie behebt und deinem Agenten Fernzugriff auf alles ermöglicht.

Entwickelt und gepflegt von Yaw Labs.

Das Problem

KI-CLI-Tools laufen in Subprozessen, in denen SSH ständig fehlschlägt. Der Agent versucht git pull und erhält Permission denied (publickey). Er versucht, sich per SSH mit einem Server zu verbinden, und der Agent-Socket ist veraltet. Er versucht zu deployen, und der Host-Key hat sich geändert, weil die Instanz neu erstellt wurde. Jedes Mal weiß die KI nicht, was los ist, und gerät in eine Sackgasse.

Dies passiert in jeder Situation, die SSH-Keys erfordert:

  • Git — clone, pull, push, fetch, submodules, LFS

  • Paketmanagernpm install, pip install, go get, cargo, composer aus privaten Repos

  • Serverzugriff — SSH, SCP, SFTP, rsync

  • Tunneling — Port-Weiterleitung zu Datenbanken, SOCKS-Proxys

  • Deployment — Ansible, Terraform, Capistrano, Deploy-Skripte

  • Cloud — AWS EC2, GCP, Azure, DigitalOcean, jeder VPS

ssh-mcp behebt dies. Es verwaltet den SSH-Agenten, lädt Keys, diagnostiziert Fehler mit umsetzbaren Korrekturbefehlen und bietet Remote-Operationen an – alles als MCP-Tools, die dein KI-Agent aufrufen kann.

Related MCP server: Scout MCP

Schnellstart

npm install -g @yawlabs/ssh-mcp

Füge dies zu deiner MCP-Client-Konfiguration hinzu:

{
  "mcpServers": {
    "ssh": {
      "command": "ssh-mcp"
    }
  }
}

Tools

Verwaltung der SSH-Umgebung

Tools, die deine lokale SSH-Einrichtung reparieren, damit alles andere – Git, Deploys, Tunnel – nicht mehr abbricht.

Tool

Beschreibung

ssh_agent_ensure

Stellt sicher, dass ssh-agent läuft. Startet einen bei Bedarf und setzt Umgebungsvariablen für die Sitzung.

ssh_key_list

Listet alle SSH-Keys in ~/.ssh/ mit Typ, Fingerabdruck und Agent-Status auf.

ssh_key_load

Lädt einen Key in den laufenden Agenten. Stellt sicher, dass der Agent zuerst gestartet wird.

ssh_config_lookup

Löst die effektive SSH-Konfiguration für einen Host auf (Hostname, Benutzer, Port, Proxy, Identitätsdateien).

ssh_known_hosts_fix

Entfernt einen veralteten Host-Key und führt einen erneuten Scan durch. Behebt "host key verification failed"-Fehler.

ssh_git_check

Testet die Git-über-SSH-Authentifizierung bei GitHub, GitLab, Bitbucket usw.

ssh_test

Schneller Konnektivitätstest mit Zeitmessung und umsetzbaren Fehlerdetails.

Diagnosen

Tool

Beschreibung

ssh_diagnose

Vollständige SSH-Umgebungsdiagnose. Prüft Agent, Keys, Konfiguration, known_hosts und Konnektivität. Gibt exakte Korrekturbefehle für jeden Fehler zurück.

Remote-Operationen

Tool

Beschreibung

ssh_exec

Führt einen Befehl auf einem Remote-Host aus. Gibt stdout, stderr und Exit-Code zurück.

ssh_read_file

Liest eine Datei von einem Remote-Host via SFTP.

ssh_write_file

Schreibt Inhalt in eine Datei auf einem Remote-Host via SFTP.

ssh_upload

Lädt eine lokale Datei auf einen Remote-Host via SFTP hoch.

ssh_download

Lädt eine Datei von einem Remote-Host auf das lokale Dateisystem herunter.

ssh_ls

Listet Dateien in einem Verzeichnis auf einem Remote-Host auf.

Operationen auf höherer Ebene

Tools, die gängige Muster kapseln, die Agenten mit ssh_exec erstellen – schneller und weniger fehleranfällig.

Tool

Beschreibung

ssh_multi_exec

Führt einen Befehl parallel auf mehreren Hosts aus. Gibt Ergebnisse pro Host zurück.

ssh_find

Sucht remote nach Dateien mit strukturierten Parametern (Name, Typ, Größe, Tiefe).

ssh_tail

Liest die letzten N Zeilen einer Datei, optional gefiltert durch ein Grep-Muster.

ssh_service_status

Prüft den Status eines systemd-Dienstes (aktiv, PID, Uptime, Beschreibung).

Automatische Diagnosen

Wenn eine Remote-Operation fehlschlägt, führt ssh-mcp automatisch Diagnosen durch und fügt die Ergebnisse in die Fehlerantwort ein. Dein Agent muss ssh_diagnose nicht separat aufrufen – er erfährt direkt in der Fehlermeldung, was falsch ist und wie es behoben werden kann.

Verbindungs-Pooling

Remote-Operationen verwenden SSH-Verbindungen automatisch wieder. Wenn dein Agent mehrere Aufrufe an denselben Host tätigt, öffnet der erste Aufruf eine Verbindung und nachfolgende Aufrufe nutzen diese wieder. Verbindungen werden nach der letzten Nutzung 60 Sekunden lang offen gehalten und dann automatisch geschlossen.

Unterstützung für SSH-Konfiguration

Alle Verbindungen respektieren deine ~/.ssh/config. Host-Aliase, benutzerdefinierte Ports, Benutzernamen, Identitätsdateien und ProxyJump-Einstellungen werden automatisch verwendet. Wenn du Host myserver in deiner SSH-Konfiguration konfiguriert hast, übergib einfach host: "myserver" – ssh-mcp löst alles auf.

ProxyJump / Bastion-Hosts werden automatisch unterstützt. Wenn deine SSH-Konfiguration ProxyJump bastion für einen Host enthält, verbindet sich ssh-mcp transparent über den Bastion-Host. Verkettete Proxys funktionieren ebenfalls.

Host-Key-Verifizierung

Alle Remote-Operationen verifizieren den Host-Key des Servers gegen ~/.ssh/known_hosts:

  • Bekannter Host, Key stimmt überein — akzeptieren.

  • Bekannter Host, Key hat sich geändert — ablehnen (MITM-Schutz).

  • Unbekannter Host — bei der ersten Verbindung akzeptieren (TOFU). Verwende ssh_known_hosts_fix, um den Key für zukünftige Abweichungserkennungen zu fixieren.

Für strengere Umgebungen setze SSH_MCP_STRICT_HOST_KEY=1, um unbekannte Hosts abzulehnen. Füge sie zuerst explizit mit ssh_known_hosts_fix hinzu.

Die Diagnose-Tools (ssh_test, ssh_diagnose) verwenden StrictHostKeyChecking=no für ihre Testbefehle. Diese Tests führen nur echo SSH_OK aus – es werden keine Anmeldedaten oder Daten übertragen –, daher ist die gelockerte Einstellung für Konnektivitätstests sicher. Echte Operationen laufen immer über den hostVerifier.

Windows-Unterstützung

Unter Windows erkennt ssh-mcp den OpenSSH Authentication Agent-Dienst automatisch (über die Named Pipe \\.\pipe\openssh-ssh-agent). Es ist kein SSH_AUTH_SOCK erforderlich – stelle nur sicher, dass der OpenSSH-Agent-Dienst läuft.

Authentifizierung

Alle Remote-Operationen akzeptieren Verbindungsparameter:

Parameter

Beschreibung

Standard

host

SSH-Hostname oder IP (erforderlich)

port

SSH-Port

Aus SSH-Konfiguration oder 22

username

SSH-Benutzername

Aus SSH-Konfiguration oder aktueller Benutzer

privateKeyPath

Pfad zum privaten SSH-Key

Automatische Erkennung

password

SSH-Passwort (Keys bevorzugen)

Reihenfolge der Auth-Auflösung: ssh-mcp wählt die erste Übereinstimmung aus dieser Liste und geht nicht zu späteren Einträgen über – dies macht die Auth-Methode deterministisch und vorhersehbar.

  1. Expliziter privateKeyPath

  2. Explizites password

  3. ssh-agent (SSH_AUTH_SOCK unter Unix, \\.\pipe\openssh-ssh-agent unter Windows)

  4. Identitätsdateien aus ~/.ssh/config für den Host

  5. Standard-Key-Pfade (~/.ssh/id_ed25519, id_rsa, id_ecdsa)

Beispiel-Workflows

Agent kann kein Git-Pull durchführen

Agent calls ssh_git_check → "Permission denied. Your SSH key is not registered with github.com."
Agent calls ssh_key_list → finds id_ed25519 exists but is not loaded
Agent calls ssh_key_load("~/.ssh/id_ed25519") → "Key loaded"
Agent calls ssh_git_check → "Git SSH authentication to github.com succeeded as username"
Agent runs git pull → works

Host-Key nach Instanz-Neuerstellung geändert

Agent calls ssh_exec on server → error: "Host key verification failed"
  (auto-diagnostics included in error: "Fix with ssh_known_hosts_fix")
Agent calls ssh_known_hosts_fix("my-server") → "Host key refreshed"
Agent calls ssh_exec → works

Erstmalige Verbindung zu einem neuen Server

Agent calls ssh_test("new-server") → "Connection refused at new-server:22"
Agent calls ssh_diagnose("new-server") → full report showing agent running, keys loaded, but host unreachable
Agent reports: "SSH server isn't running on new-server or port 22 is blocked"

Programmatische Nutzung

import { connect, exec, diagnose, ensureAgent, listSshKeys, checkGitSsh, ConnectionPool } from '@yawlabs/ssh-mcp';

// Fix SSH environment
const agent = ensureAgent();
console.log(agent.message);

// Check git access
const git = checkGitSsh('github.com');
console.log(git.message);

// List available keys
const keys = listSshKeys();
for (const key of keys) {
  console.log(`${key.name} (${key.type}) - ${key.loadedInAgent ? 'loaded' : 'not loaded'}`);
}

// Run a remote command (one-off)
const client = await connect({ host: 'my-server', username: 'deploy' });
const result = await exec(client, 'uptime');
console.log(result.stdout);
client.end();

// Run multiple commands with connection pooling
const pool = new ConnectionPool();
await pool.withConnection({ host: 'my-server' }, async (client) => {
  const r1 = await exec(client, 'uptime');
  console.log(r1.stdout);
});
// Connection stays open for 60s — next call reuses it
await pool.withConnection({ host: 'my-server' }, async (client) => {
  const r2 = await exec(client, 'df -h');
  console.log(r2.stdout);
});
pool.drain(); // close all connections when done

// Diagnose issues
const report = diagnose('my-server');
console.log(report.overall); // "ok" | "warning" | "error"
for (const check of report.checks) {
  console.log(`[${check.status}] ${check.name}: ${check.message}`);
}

Anforderungen

  • Node.js 18+

  • SSH-Client installiert (für Diagnosen und Umgebungsverwaltung)

Lizenz

MIT

Available Tools

21 tools
ssh_agent_ensureA

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description must carry the full burden of behavioral disclosure. It reveals that it starts a new agent if needed and sets environment variables, which is the core behavior. However, it does not elaborate on potential side effects (e.g., environment persistence, failure handling, or whether it modifies the current shell or system-wide settings). This is adequate but not fully 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 two sentences, front-loaded with the primary purpose ('Ensure ssh-agent is running and reachable'), followed by a concise explanation and usage trigger. No wasted words; every sentence adds necessary information.

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 tool with no parameters and no output schema, the description fully covers what it does and when to use it. It explains the action (starting agent, setting env vars) and the trigger condition. There are no missing details that an agent would need to correctly select and call this 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 tool has zero parameters, so the baseline is 4. The description adds no parameter-specific detail (none needed), and the schema already has full coverage with an empty properties object. No additional semantic clarification is 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?

The description clearly states the tool's purpose: ensuring ssh-agent is running and reachable, starting a new agent if needed, and setting environment variables. The verb 'ensure' and resource 'ssh-agent' are specific, and it distinguishes from sibling tools that focus on file operations, execution, or diagnostics.

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 an explicit trigger condition: 'Use this FIRST when SSH operations fail with agent-related errors.' This gives clear context for when to invoke the tool, though it does not explicitly mention when not to use it or suggest alternatives (e.g., other diagnostics).

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

ssh_config_lookupA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure. The verbs 'Resolve' and 'Shows' strongly imply a read-only operation with no side effects, and it specifies the data source (~/.ssh/config). It does not explicitly state that it avoids network connections or modifications, but the read-only nature is clear enough for an agent to infer safety.

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 concise sentences with no redundancy. The first sentence front-loads the primary function and output details, while the second gives direct usage guidance. Every word contributes to understanding the tool.

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 single-parameter lookup tool, the description covers the key aspects: what it does, what it returns (including the catch-all 'all other options'), and when to use it. No output schema exists, but the description's enumeration of output fields sufficiently informs the agent of expected results.

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?

The input schema already fully describes the single 'host' parameter as an SSH hostname or IP address (100% coverage). The description adds no additional semantic beyond what the schema provides, so the baseline of 3 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 uses a precise verb ('Resolve') and a specific resource ('effective SSH configuration for a host'), listing the exact output fields (hostname, user, port, identity files, proxy settings). This clearly differentiates it from sibling tools like ssh_exec (execution) and ssh_read_file (file access), leaving no ambiguity about its function.

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 explicitly states when to use it: 'Use this to understand how SSH will connect to a host.' It provides the context but does not explicitly mention exclusions or alternatives. However, by describing the tool's purpose as configuration resolution, it implicitly steers agents away from execution or file transfer tools.

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

ssh_deleteA

Delete a file or empty directory on a remote host via SFTP. Auto-detects the path type and calls the right SFTP op (unlink for files/symlinks, rmdir for empty dirs). Recursive directory delete is intentionally NOT supported -- for that, use ssh_exec with rm -rf explicitly so the destructive intent is visible in the tool trace. If the connection pool is full (SSH_MCP_MAX_POOL_SIZE, default 100), waits up to 30s for a free slot before starting. NOT gated by SSH_MCP_COMMAND_WHITELIST / SSH_MCP_COMMAND_BLACKLIST: command policy applies only to ssh_exec and ssh_multi_exec, so a blacklist such as ^rm does NOT block this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
pathYesAbsolute path of the file or empty directory to delete. Must start with /.
portNoSSH port (default: 22)
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

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 carries full burden. It discloses the exact SFTP operations (unlink for files/symlinks, rmdir for empty dirs), the lack of recursive support, connection-pool wait behavior (up to 30s), and exemption from command policy. This is comprehensive behavioral 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 opening sentence states the core purpose, then each subsequent sentence adds essential operational detail (SFTP ops, recursive limitation, pool wait, policy exemption). No redundant or filler content; it is appropriately dense.

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 tool's destructive scope, its limits, alternative usage, and runtime behavior. Even without an output schema, an agent can invoke it correctly with confidence.

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%, and all six parameters are documented in the schema with types and defaults; the description does not add further meaning to any specific parameter. Baseline of 3 is appropriate because the schema does the heavy lifting.

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 action and scope: 'Delete a file or empty directory on a remote host via SFTP.' It also differentiates itself from siblings by noting that recursive directory delete is unsupported and pointing to ssh_exec for that, making the tool's niche clear.

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?

Provides explicit usage guidance: for recursive deletes it says to use ssh_exec with `rm -rf`, and it clarifies that command whitelist/blacklist does not apply to this tool, only to ssh_exec/ssh_multi_exec. This tells the agent exactly when to prefer this tool and when not to.

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

ssh_diagnoseA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
portNoSSH port (default: 22)

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose the main behaviors—checking agent state, keys, known_hosts, config, and attempting a connection. However, it does not state whether the test connection or diagnostics have side effects, return values, or timeouts, which matters for an unannotated diagnostic 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?

Two sentences deliver purpose, key behaviors, and usage timing without wasted words. The primary purpose is front-loaded, making it easy for an agent to scan and understand quickly.

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 moderately complex diagnostic tool with no annotations and no output schema, the description covers purpose, checks performed, and usage timing. A small gap is the lack of any detail about results or next-step actions, but the core invocation context is sufficiently complete.

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 schema already documents both parameters (host and port) adequately. The description adds no additional parameter semantics beyond implying the connection target, so the baseline of 3 is appropriate.

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 states a specific verb ('Diagnose') and resource ('SSH connectivity issues'), and enumerates concrete checks: ssh-agent status, loaded keys, known_hosts, SSH config, and a test connection. This is clear enough to distinguish from most siblings, though it does not explicitly compare itself to the closely related ssh_test 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?

Provides explicit timing guidance: use it BEFORE SSH operations if issues are suspected, or AFTER a failed SSH operation to understand failure. This is clear context for when to choose the tool, though it does not name or exclude sibling tools like ssh_test or ssh_known_hosts_fix.

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

ssh_downloadA

Download a file from a remote host to local filesystem via SFTP. If the connection pool is full (SSH_MCP_MAX_POOL_SIZE, default 100), waits up to 30s for a free slot before starting.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
portNoSSH port (default: 22)
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
localPathYesLocal path to save the downloaded file
remotePathYesAbsolute path to the remote file. Must start with /.
privateKeyPathNoPath to SSH private key

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It usefully discloses connection pool behavior: waiting up to 30s when the pool is full and honoring SSH_MCP_MAX_POOL_SIZE. However, it does not disclose other important behavioral traits such as whether an existing local file is overwritten, authentication requirements beyond the schema, or failure/error 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?

The description is two sentences with no filler. The core purpose is front-loaded, and the operational detail about pool wait behavior is separated cleanly. Every sentence earns its place.

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?

Given no output schema and no annotations, the description should cover key operational behavior. It covers purpose and pool waiting, and the schema handles parameter semantics, but it omits what happens on local file conflicts, return values, and explicit guidance for choosing between download and read/upload alternatives. This leaves moderate gaps for an agent deciding how 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 description coverage is 100%, so the schema already documents all 7 parameters including defaults, required fields, the absolute path constraint for remotePath, and the password plaintext warning. The description adds no parameter-level detail beyond indicating the source and destination, so the baseline score of 3 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 states a precise action: 'Download a file from a remote host to local filesystem via SFTP.' It specifies both direction (remote to local) and transport (SFTP), which clearly distinguishes it from siblings like ssh_upload, ssh_read_file, and ssh_write_file.

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—whenever a file needs to be downloaded from a remote host—but provides no explicit guidance about alternatives or when not to use it. It does not mention that ssh_read_file or ssh_exec might be better for reading file contents without copying to local disk.

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

ssh_execA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoEnvironment variables to set for this command. Injected as a `KEY='value' ...` prefix; works on any sshd regardless of AcceptEnv config. VALUES are POSIX-single-quoted, so any byte is safe in a value. KEYS cannot be quoted (a shell assignment prefix requires a bare name), so each key must match /^[A-Za-z_][A-Za-z0-9_]*$/ (the POSIX name grammar) — a key outside that grammar is rejected and the call fails before anything is sent to a host. Command policy is checked against the PREFIXED command, so a `^`-anchored whitelist pattern stops matching once this is set.
hostYesSSH hostname or IP address
portNoSSH port (default: 22)
commandYesShell command to execute on the remote host (interpreted by the remote login shell)
timeoutNoCommand timeout in milliseconds (default: 30000). Also the longest the call waits for a free connection-pool slot (SSH_MCP_MAX_POOL_SIZE, default 100) before the command starts; the wait and the command are bounded separately.
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

A4.3/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 transparently explains that the command is interpreted by the remote login shell, metacharacters work as expected, returns stdout/stderr/exit code, applies whitelist/blacklist policy, and discloses that passwords pass as plaintext and may be logged. It also notes the timeout bounds the connection-pool wait. This is thorough and goes beyond what a schema could convey.

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 front-loaded, starting with the core purpose in the first sentence. Each subsequent sentence adds a distinct, necessary detail—shell interpretation, return values, env usage, and policy checking—without redundancy or fluff. The structure is logical and easy to scan.

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 complexity (8 parameters, nested env object, no output schema), the description covers all critical operational aspects: what the command does, how the shell interprets it, what is returned, policy enforcement, timeout behavior, and security warnings. The rich schema complements it well, and nothing essential for an agent to call this correctly is missing.

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?

The schema description coverage is 100%, so the schema already documents every parameter in detail (including env quoting, timeout semantics, and password warnings). The tool description adds minimal parameter-level value beyond a mention of `env` usage, which is already covered in the schema. Per the baseline rule for high coverage, a score of 3 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 'Execute a command on a remote host via SSH,' identifying a specific verb and resource. It also distinguishes itself from file-oriented siblings by explicitly covering generic shell execution, making its purpose unambiguous.

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 state when to use this tool versus alternatives. While it is obvious that this is the general-purpose execution tool among siblings like ssh_read_file and ssh_write_file, there is no explicit 'when to use' or 'when not to use' guidance. The only usage hint is the mention of `env` for setting environment variables, which is more parameter guidance than tool selection guidance.

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

ssh_findB

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
nameNoFilename pattern with wildcards (e.g. '*.log', 'config.*')
pathYesDirectory to search in (e.g. /var/log, /home/user)
portNoSSH port (default: 22)
typeNoFile type: f=file, d=directory, l=symlink
newerNoReference file path -- find matches files modified more recently than this file
maxsizeNoMaximum file size (e.g. '10M', '500k')
minsizeNoMinimum file size (e.g. '1M', '100k')
timeoutNoCommand timeout in milliseconds (default: 30000). Also the longest the call waits for a free connection-pool slot (SSH_MCP_MAX_POOL_SIZE, default 100) before the command starts; the wait and the command are bounded separately.
maxdepthNoMaximum directory depth to search
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries full burden. It does not disclose that the operation is read-only, nor does it mention authentication requirements, timeouts, or connection behaviors. The parameter descriptions cover some details (e.g., password plaintext risk, timeout), but the main description omits any 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 two sentences, concise, and front-loaded with the purpose. It is not overlong, though it sacrifices substantive guidance for brevity.

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

Completeness2/5

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

For a tool with 13 parameters, no output schema, and no annotations, the description is incomplete. It does not describe what the tool returns (e.g., list of file paths) nor any prerequisites like SSH connectivity or authentication setup, leaving the agent without essential context for correct 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?

Schema coverage is 100%, so each parameter has a description. The tool description adds little beyond 'structured parameters' and does not elaborate on parameter semantics beyond the schema. Baseline 3 is appropriate since the schema does the heavy lifting.

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 states 'Search for files on a remote host' with a specific verb and resource, and mentions wrapping the find command. It does not explicitly differentiate from sibling tools like ssh_ls or ssh_stat, but the core purpose 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 Guidelines3/5

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

The description implies usage for find-like searches ('Wraps the find command with structured parameters so you don't have to construct find syntax manually') but does not explicitly state when to prefer this over ssh_ls or ssh_exec, nor does it provide exclusion criteria.

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

ssh_git_checkA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoGit hosting hostname (default: "github.com"). Omit for the default; an empty string is rejected.
userNoSSH user for the git host (default: "git"). Omit for the default; an empty string is rejected.

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the behavioral disclosure burden. It accurately conveys that the tool performs a test/verification of SSH authentication, implying a non-destructive diagnostic. However, it does not explicitly state the absence of side effects, potential prerequisites (e.g., key loaded via ssh_agent_ensure), or failure modes. This is adequate but not comprehensive.

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 two sentences, both information-dense without redundancy. The primary action and purpose are front-loaded, followed by a concrete usage condition. No filler words; every phrase contributes to the agent's understanding. This is a model of conciseness.

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 simple tool with two optional parameters and no output schema, the description covers the purpose, when to use it, and what it verifies. The only gap is the lack of explicit return-value specification, but given the diagnostic nature, the outcome (success/failure) is implied. The description is complete enough for an agent to select and 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?

The input schema provides full descriptions for both parameters (host and user), including defaults and constraints. With 100% schema description coverage, the description adds no additional parameter detail, which is acceptable. The baseline of 3 applies because the schema sufficiently documents the parameters without needing extra elaboration.

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 ('Test Git-over-SSH authentication') and clearly identifies the resource (hosting providers like GitHub, GitLab, Bitbucket). It is unambiguous and distinct from generic SSH tools by focusing on Git-over-SSH. The mention of verifying the SSH key registration and working status adds actionable clarity.

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 an explicit trigger: 'Use this when git clone/pull/push fails with SSH errors.' This clearly indicates the intended scenario. It does not explicitly state when not to use it or name alternatives, but the specific use case distinguishes it from siblings like ssh_test without requiring further detail. A stronger exclusion clause would elevate this to 5.

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

ssh_key_listA

List all SSH private keys in ~/.ssh/ with their type, fingerprint, and whether they are loaded in the agent. Use this to find which keys are available and which ones need to be loaded. Reports isError only when ~/.ssh exists but could not be read -- an absent or empty ~/.ssh is a successful answer with a ssh-keygen hint.

ParametersJSON Schema
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, the description carries the full burden of behavioral disclosure. It clearly specifies the success/failure boundary: isError only when ~/.ssh exists but cannot be read, while absent or empty ~/.ssh is successful and returns an ssh-keygen hint. This is unusually precise.

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 tight sentences, each carrying useful information: what is listed, when to use it, and exact error semantics. It is front-loaded with the core behavior and has 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 having no output schema, the description states the returned key fields and the failure condition. For a zero-parameter listing tool, this is complete enough for an agent to call and interpret the result 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 tool has zero parameters, so the baseline is 4. The description adds relevant context by naming the target directory (~/.ssh/), which is all the parameter semantics needed here.

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 'List' with a clear resource ('all SSH private keys in ~/.ssh/') and states the output fields (type, fingerprint, loaded state). This distinguishes it from sibling tools like ssh_key_load or ssh_agent_ensure without requiring schema inspection.

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 explicitly says 'Use this to find which keys are available and which ones need to be loaded,' giving a concrete use case. It does not explicitly name alternatives or when-not-to-use conditions, but the use case is clear enough to route an agent.

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

ssh_key_loadA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
keyPathYesPath to the SSH private key to load (e.g. ~/.ssh/id_ed25519)

TDQS

A4/5.0
Behavior3/5

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

No annotations are present, so the description carries the behavioral burden. It adds useful context by noting 'Ensures the agent is running first', but it does not disclose error handling, idempotency, or permission needs. Minimum viable for a simple load 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?

Two sentences, both earning their place. The main action is front-loaded, the prerequisite and usage condition are stated succinctly, 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?

For a simple one-parameter tool with no output schema, this description provides enough to invoke correctly: what it does, a key prerequisite, and the condition for use. It is slightly incomplete in not mentioning return values or error scenarios, but these are minor for this operation.

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% for the single parameter keyPath, and the description does not add meaning beyond what the schema already provides. Baseline 3 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 the action ('Load an SSH private key'), the target ('into the running agent'), and differentiates from siblings by referencing ssh_key_list. It is specific and 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?

Explicitly provides a condition for use ('after ssh_key_list shows a key that is not loaded'), but does not mention when not to use it or compare with sibling ssh_agent_ensure, which also handles agent startup. Lacks explicit alternatives.

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

ssh_known_hosts_fixA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
portNoSSH port (default: 22)

TDQS

A4.2/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 burden and clearly discloses the mutating behavior: removal of a stale key followed by a re-scan to add the current key. It goes beyond the tool name by specifying the action sequence and trigger, although it doesn't mention the affected known_hosts path or side effects.

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 brief sentences: the first describes the action, the second the trigger. No waste and front-loaded with the primary behavior.

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?

Adequate for a two-parameter tool with no output schema: an agent knows what it does and when to invoke it. It could note that this modifies the local user's known_hosts file, but the action is clear from the phrase 'remove a stale host key from known_hosts'.

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%, with host and port each described. The description adds no extra parameter detail beyond the schema, so baseline 3 applies.

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 sequence (remove stale key, re-scan host) on a specific resource (known_hosts), and explicitly names the error condition it addresses. This differentiates it from sibling ssh tools that execute, read, or list remote files.

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?

Explicitly tells when to use: upon 'Host key verification failed' errors after server recreate/reprovision. Does not name alternatives or exclude cases such as using ssh_diagnose for broader connectivity checks, so one point off.

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

ssh_lsA

List files in a directory on a remote host via SFTP. If the connection pool is full (SSH_MCP_MAX_POOL_SIZE, default 100), waits up to 30s for a free slot before starting.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
pathYesAbsolute path to the remote directory. Must start with /.
portNoSSH port (default: 22)
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

A3.9/5.0
Behavior3/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 adds a useful detail about connection-pool waiting (SSH_MCP_MAX_POOL_SIZE, 30s wait), but it does not disclose the return format, whether only names are returned, or how errors such as missing directories or permission denials are surfaced.

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 sentences each carry distinct information: the operation and a resource-limit caveat. No redundancy, filler, or extraneous detail.

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?

For a simple listing tool, the description covers the operation and even a resource edge case, but the absence of an output schema means the agent must infer the return shape (filenames only? full paths? metadata?). It could also specify behavior on permission errors or nonexistent paths.

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?

The schema has 100% description coverage, so the baseline is 3 even without extra parameter information in the description. The description's mention of 'remote host' and 'directory' only repeats the schema's host/path definitions without adding new semantics.

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 ('List'), resource ('files in a directory on a remote host'), and transport ('via SFTP'), which clearly distinguishes it from sibling tools like ssh_read_file, ssh_upload, or ssh_exec. The scope is unambiguous and no tautology is present.

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: remote directory listing via SFTP. It does not explicitly name alternatives or exclusion cases, but the operation is specific enough that the intended usage is obvious.

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

ssh_mkdirA

Create a directory on a remote host via SFTP. Set recursive: true to create parent directories as needed (like mkdir -p). Existing intermediate dirs are tolerated; an existing leaf path is still an error. Unlike the other SFTP tools, the path may be relative. If the connection pool is full (SSH_MCP_MAX_POOL_SIZE, default 100), waits up to 30s for a free slot before starting. NOT gated by SSH_MCP_COMMAND_WHITELIST / SSH_MCP_COMMAND_BLACKLIST: command policy applies only to ssh_exec and ssh_multi_exec, so a blacklist such as ^rm does NOT block this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
pathYesPath of the directory to create. Absolute (starting with /) is recommended and unambiguous. A relative path is also accepted and resolves against the SFTP working directory, which is normally the remote user's home. ~ is NOT expanded — SFTP has no shell to expand it.
portNoSSH port (default: 22)
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
recursiveNoCreate parent directories as needed (default: false). Like `mkdir -p`.
privateKeyPathNoPath to SSH private key

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 does so richly. It documents error semantics ('existing leaf path is still an error'), waiting behavior ('waits up to 30s for a free slot'), and a major security/policy exception ('NOT gated by SSH_MCP_COMMAND_WHITELIST / BLACKLIST'). These exceed basic expectations and give the agent concrete expectations beyond just 'creates a directory.'

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 and front-loaded: it opens with the core purpose, then immediately covers recursive behavior, then path relativity, then connection pool, then command policy. Every sentence earns its place; there is no fluff or redundancy. It packs a lot of important detail into a compact paragraph without being verbose.

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 tool's simplicity (mkdir) and a fully documented schema, the description covers the key contextual gaps: error behavior, wait timeout, and command policy interplay. It does not explicitly state what happens after the 30s wait exceeds or what the success return value is, but these are minor for this operation. The description is largely complete for an agent to 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 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema, particularly for `recursive`: it explains the behavior of existing intermediate dirs vs. an existing leaf path, and the `~` expansion caveat for `path` (though that is also in the schema). This adds value beyond the raw property definitions, justifying 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 opens with a specific verb+resource: 'Create a directory on a remote host via SFTP.' This clearly states the tool's action and domain, and it distinguishes itself from siblings by noting 'Unlike the other SFTP tools, the path may be relative,' which helps an agent tell it apart from other SFTP operations like ssh_write_file or ssh_ls.

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 about when to use the tool, such as supporting relative paths and the recursive flag behavior, but it stops short of explicitly naming alternatives or saying 'use this instead of ssh_exec for mkdir.' It includes a relevant exclusion about command policy (not gated by whitelist/blacklist), which is an implicit usage condition, but no direct when-not statements.

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

ssh_multi_execA

Execute a command on multiple remote hosts in parallel. Runs at most SSH_MCP_MAX_POOL_SIZE hosts at once (default 100) and works through a longer list as slots free up. timeout is per host: it bounds each host's command, not the whole call. Each parallel slot works through its share of the list one host at a time, so with the pool to itself a call can take up to about ceil(hosts / SSH_MCP_MAX_POOL_SIZE) x (timeout + connect time). The connection pool is shared with every other tool; when it is full this call waits for slots instead of failing, and gives up only when none of its own hosts holds a slot and a full timeout has passed with none of them starting or finishing. The hosts waiting at that point (up to one per parallel slot) and every host still queued then report Connection pool is full; the queued ones are never attempted. Rerun those hosts once the other calls finish, or raise SSH_MCP_MAX_POOL_SIZE. Returns results per host. Use this instead of calling ssh_exec multiple times — it's faster and shows results side by side. Use env to set environment variables for this call without modifying the command string. Subject to SSH_MCP_COMMAND_WHITELIST / SSH_MCP_COMMAND_BLACKLIST if configured (policy is checked once, against the env-prefixed command, before fan-out).

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoEnvironment variables to set for this command. Injected as a `KEY='value' ...` prefix; works on any sshd regardless of AcceptEnv config. VALUES are POSIX-single-quoted, so any byte is safe in a value. KEYS cannot be quoted (a shell assignment prefix requires a bare name), so each key must match /^[A-Za-z_][A-Za-z0-9_]*$/ (the POSIX name grammar) — a key outside that grammar is rejected and the call fails before anything is sent to a host. Command policy is checked against the PREFIXED command, so a `^`-anchored whitelist pattern stops matching once this is set.
portNoSSH port (default: 22)
hostsYesList of SSH hostnames or IPs
commandYesShell command to execute on all hosts
timeoutNoPer-host command timeout in milliseconds (default: 30000): bounds each host's command, not the whole call. Also the call's no-progress budget on a full pool (see the tool description).
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations provided, the full burden falls on the description, and it delivers extensively: concurrency cap (SSH_MCP_MAX_POOL_SIZE, default 100), per-host timeout semantics, shared-pool waiting behavior, the exact give-up condition, the 'Connection pool is full' failure mode, and the policy check (checked once against the env-prefixed command before fan-out). This is unusually complete disclosure of scheduling, failure, and policy behavior.

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 long but every sentence carries real operational information needed to invoke this complex concurrent tool correctly; the purpose is front-loaded in the first sentence. It is structured as one dense paragraph, which hurts scannability — section breaks would improve it — but there is little waste given the genuine complexity being conveyed.

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 an 8-parameter concurrent tool with no annotations and no output schema, the description covers concurrency limits, pool contention, timeout semantics, env injection, and policy behavior remarkably well. The main gap is the return value: it only promises 'results per host' and the pool-full message, with no output schema to fill in the per-host result shape (exit code, stdout/stderr structure).

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% and the schema's own parameter descriptions are already rich (timeout is fully explained there, including its role as the no-progress budget; env is documented with quoting rules and key grammar). The tool description adds some value beyond the schema — notably that env lets you set variables 'without modifying the command string' and ties timeout into the concurrency model — but the schema already does most of the heavy lifting, so the baseline of 3 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 opening sentence, 'Execute a command on multiple remote hosts in parallel,' states a specific verb, resource, and execution mode. The description also distinguishes it from its sibling, explicitly telling the agent to use this 'instead of calling ssh_exec multiple times,' so an agent can select it correctly without inspecting either 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 description gives clear when-to-use guidance: 'Use this instead of calling ssh_exec multiple times — it's faster and shows results side by side,' and provides operational guidance for the pool-full failure case ('Rerun those hosts once the other calls finish, or raise SSH_MCP_MAX_POOL_SIZE'). However, it never states explicit when-not-to-use conditions or names other alternatives like ssh_diagnose, leaving a small gap.

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

ssh_read_fileB

Read a file from a remote host via SFTP. If the connection pool is full (SSH_MCP_MAX_POOL_SIZE, default 100), waits up to 30s for a free slot before starting.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
pathYesAbsolute path to the remote file. Must start with /.
portNoSSH port (default: 22)
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does add one meaningful behavioral detail: connection pool saturation behavior and the 30s wait. However, it does not mention return content format, file size limits, encoding handling, or error behavior, so transparency is only partial.

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 exactly two sentences: the first states the purpose, the second adds an important operational constraint. No filler or redundancy; every word contributes.

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 is adequate for a simple read operation, but since there is no output schema and no annotations, it leaves the return value implied rather than explicit. It also lacks any mention of when to prefer alternatives, making it only minimally complete.

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?

The input schema has 100% coverage, describing all parameters including defaults and the security warning on password. The description adds no parameter-specific meaning beyond the schema, meriting the baseline score of 3.

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 states a specific action ('Read a file') on a specific resource ('remote host via SFTP'). It does not explicitly distinguish itself from similar siblings like ssh_download or ssh_tail, but the core purpose 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 Guidelines2/5

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

No guidance is given about when to use this tool instead of alternatives such as ssh_download (transfer file to local) or ssh_tail (view file tail). There are no usage conditions, exclusions, or examples provided.

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

ssh_service_statusA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
portNoSSH port (default: 22)
serviceYesSystemd service name (e.g. nginx, sshd, docker)
timeoutNoCommand timeout in milliseconds (default: 30000). Also the longest the call waits for a free connection-pool slot (SSH_MCP_MAX_POOL_SIZE, default 100) before the command starts; the wait and the command are bounded separately.
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

A4.4/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 behavioral disclosure burden. 'Check' implies a read-only operation, and the description enumerates the returned fields (active state, PID, uptime, description), which is useful. It could additionally state explicitly that it does not modify the service or require elevated privileges, so a 4 is appropriate.

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 sentences with no filler. The core action is front-loaded, return values are summarized, and the sibling-tool guidance is delivered efficiently.

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?

There is no output schema, but the description compensates by listing the key return fields. Auth and timeout parameters are already well covered by the input schema. Slightly missing are edge-case behaviors like what happens when the service does not exist or permissions are insufficient, which prevents a 5.

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%, and the schema already documents all 7 parameters, including defaults and timeout/pool behavior. The description adds overall tool context but no additional parameter-specific semantics, so it stays at the baseline 3.

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 and resource ('Check the status of a systemd service on a remote host') and expands on what is returned (active/PID/uptime/description). It also explicitly separates this tool from ssh_exec, so an agent can distinguish it 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 Guidelines5/5

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

The description gives direct routing guidance: 'Use this instead of ssh_exec with systemctl.' This tells the agent exactly when to pick this tool over its most likely alternative, satisfying the usage-guidance requirement clearly.

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

ssh_statA

Get metadata for a file or directory on a remote host via SFTP. Returns size, permissions (octal), uid/gid, mtime/atime, and the path type. Symlinks are reported as symlink -> <target kind>: the type describes the link itself while size/mode/mtime describe its TARGET, and a dangling symlink is reported rather than erroring. Use this instead of parsing ls -la output. If the connection pool is full (SSH_MCP_MAX_POOL_SIZE, default 100), waits up to 30s for a free slot before starting.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
pathYesAbsolute path to the remote file or directory. Must start with /.
portNoSSH port (default: 22)
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations to rely on, the description carries the full burden and does so well. It discloses the subtle symlink behavior (link kind vs. target metadata, dangling symlink handling) and the connection-pool wait behavior with the exact environment variable and timeout. These are exactly the kind of non-obvious behavioral traits an agent needs to know.

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 not bloated. Core purpose and return values come first, followed by the critical symlink edge case, the usage recommendation, and the pool-wait behavior. Every sentence contributes meaningful information.

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?

Since there is no output schema, the description compensates by naming the exact returned fields and their format (octal permissions, uid/gid, mtime/atime, path type). It also covers edge cases and failure patterns (dangling symlink) and operational constraints (pool wait). Nothing essential is missing for safe 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?

Schema description coverage is 100%, so the schema already documents all six parameters. The description adds no extra parameter-level detail, which is acceptable at the baseline because the schema carries the load.

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 ('Get metadata'), a precise resource ('file or directory on a remote host via SFTP'), and enumerates the returned fields. It also implicitly differentiates from nearby siblings like ssh_ls and ssh_read_file by focusing on stat-like metadata.

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 explicitly tells the agent when to use this tool: whenever metadata is needed, and explicitly recommends it instead of parsing `ls -la` output. The guidance is direct and actionable, even though it does not enumerate every sibling alternative.

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

ssh_tailA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
grepNoCase-insensitive pattern to filter lines
hostYesSSH hostname or IP address
pathYesAbsolute path to the file to tail
portNoSSH port (default: 22)
linesNoNumber of lines to read from the end (default: 100). Must be a positive integer.
timeoutNoCommand timeout in milliseconds (default: 30000). Also the longest the call waits for a free connection-pool slot (SSH_MCP_MAX_POOL_SIZE, default 100) before the command starts; the wait and the command are bounded separately.
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description must carry the transparency burden. It conveys the operation is a read (tail) and involves a remote host, which implies the safety profile, but it doesn't explicitly mention that it does not modify the file, requires SSH authentication, or may block on a connection pool. Basic but adequate; missing operational details beyond the name.

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 two concise sentences with no filler. The core action is front-loaded and the usage guidance appears immediately after, making it easy for an agent to parse quickly.

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 rich schema covers all 9 parameters and security caveats, and the description supplies the key usage context. The only minor gap is that the return value (the tailed lines) is not explicitly stated, though it is strongly implied by the purpose. No output schema exists to fill this in, but the omission is easy to infer.

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?

The schema provides full 100% parameter descriptions, including defaults, password warnings, and pool behavior, so the description adds little beyond reinforcing the grep filter and lines count. Baseline 3 is appropriate because the schema does the heavy lifting.

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 ('Read the last N lines'), the resource ('a file on a remote host'), and the optional filter ('grep pattern'). It also explicitly calls out the intended use case (reading log files) and distinguishes itself from ssh_exec, making its purpose easy to grasp.

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 provides explicit guidance: 'Use this for reading log files instead of ssh_exec with manual tail/grep commands.' This directly tells the agent when to select this tool and which sibling to prefer it over, leaving no ambiguity.

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

ssh_testA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
portNoSSH port (default: 22)

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 of behavioral disclosure. It states the tool reports success/failure with timing and actionable error details, which informs the agent about the return type and content. It does not mention authentication or potential side effects, but 'test' implies a non-destructive operation. The description adds meaningful context beyond the bare name, so a 4 is appropriate.

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 extremely concise: two sentences that front-load the core purpose, then immediately state the differentiation and usage context. Every sentence earns its place, with no redundant phrasing 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?

Given the simple two-parameter schema and absence of an output schema, the description covers the essential aspects: what it does, what it returns (success/failure, timing, error details), and when to use it. It lacks precise output formatting details, but it provides enough for an agent to invoke it correctly and interpret the result. This is nearly complete for such a lightweight tool.

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?

The input schema already covers 100% of parameter descriptions (host and port). The description adds no additional meaning about parameters—it does not explain expected formats, defaults, or how the port is used beyond the schema's basic default of 22. Therefore, the baseline of 3 is appropriate; the description adds no extra value here.

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: a quick connectivity test to an SSH host, reporting success/failure with timing and error details. It explicitly distinguishes itself from the sibling ssh_diagnose by being lighter and faster, so an agent can easily tell them apart without examining schemas.

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 explicitly states when to use this tool ('use this for a quick check before running operations') and contrasts it with ssh_diagnose ('lighter and faster'). This gives clear context and implies when not to use it (when a deeper diagnostic is needed). The guidance is direct and actionable.

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

ssh_uploadA

Upload a local file to a remote host via SFTP. If the connection pool is full (SSH_MCP_MAX_POOL_SIZE, default 100), waits up to 30s for a free slot before starting. NOT gated by SSH_MCP_COMMAND_WHITELIST / SSH_MCP_COMMAND_BLACKLIST: command policy applies only to ssh_exec and ssh_multi_exec, so a blacklist such as ^rm does NOT block this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
portNoSSH port (default: 22)
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
localPathYesPath to the local file to upload
remotePathYesAbsolute path on the remote host. Must start with /.
privateKeyPathNoPath to SSH private key

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations present, the description carries the full burden. It does disclose meaningful behavior: SFTP transport, connection-pool waiting up to 30 seconds, and exemption from command policy. However, it does not mention whether the upload overwrites an existing remote file, what permissions are needed, or what the operation returns, which leaves side-effect ambiguity.

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 sentences, no filler. The main action is front-loaded, and the less obvious behavioral details about pool limits and command policy are packed into the second sentence without repetition.

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 tool has seven parameters, no annotations, and no output schema, so the description should supply additional operational context. It covers pool behavior and policy exemption, but it omits whether an existing remote destination is overwritten and what a successful result looks like, leaving the tool not fully self-contained.

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 parameters are already well documented. The description adds tool-level context but no parameter-specific semantics beyond what the schema provides, so the baseline of 3 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 opens with a specific verb and resource: 'Upload a local file to a remote host via SFTP'. This clearly identifies the operation, and the SFTP detail distinguishes it from exec-style tools and implies the counterpart download tool 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?

It gives clear operating context by stating this is a file upload operation and explicitly notes that command whitelist/blacklist policies do not apply to this tool, which is useful in environments that restrict commands. However, it does not explicitly route the agent to alternatives like ssh_write_file or ssh_download, so it stops short of 5.

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

ssh_write_fileA

Write content to a file on a remote host via SFTP. Creates or overwrites the file. If the connection pool is full (SSH_MCP_MAX_POOL_SIZE, default 100), waits up to 30s for a free slot before starting. NOT gated by SSH_MCP_COMMAND_WHITELIST / SSH_MCP_COMMAND_BLACKLIST: command policy applies only to ssh_exec and ssh_multi_exec, so a blacklist such as ^rm does NOT block this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesSSH hostname or IP address
pathYesAbsolute path to the remote file. Must start with /.
portNoSSH port (default: 22)
contentYesFile content to write
passwordNoSSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process.
usernameNoSSH username (default: current user)
privateKeyPathNoPath to SSH private key

TDQS

A4.2/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 disclosure burden, and it delivers: overwrite semantics are explicit, the 30s pool wait discloses blocking behavior, and the whitelist/blacklist exemption is a safety-relevant trait. It stops short of disclosing failure modes, parent-directory creation, or return behavior, but the critical destructive and latency behaviors are covered.

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: purpose/overwrite semantics front-loaded first, operational wait behavior second, and the safety-relevant policy exemption third. No filler, no repetition of schema content, and the most decision-relevant facts appear first.

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 7-parameter tool with no output schema and no annotations, the description covers the essential operational profile: what it does, that it overwrites, how long it may block, and its relationship to command policy. Minor gaps remain — return/error behavior and whether parent directories are created — but nothing an agent needs to invoke it safely is missing.

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 all 7 parameters are already documented in the schema and the baseline is 3. The description adds contextual value about connection pooling and policy but does not add meaning to any specific parameter, so it neither gains nor loses points.

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 first sentence names a specific verb and resource ('Write content to a file on a remote host via SFTP') and immediately adds 'Creates or overwrites the file.' The SFTP mechanism and the explicit reference to ssh_exec/ssh_multi_exec in the policy note clearly differentiate it from command-execution and read siblings, so an agent can tell it apart without opening schemas.

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 an explicit, useful when-not signal: it is NOT gated by SSH_MCP_COMMAND_WHITELIST/BLACKLIST, and it names the alternatives that are (ssh_exec, ssh_multi_exec). It provides clear operational context (pool-full wait) but does not explicitly route an agent between this tool and other file-related siblings like ssh_upload or ssh_read_file.

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. 13 tool updatesv0.17.0
    • Changedssh_delete1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path of the file or empty directory to delete"New value: +"Absolute path of the file or empty directory to delete. Must start with /."
    • Changedssh_download1 field changed
      • changedInput schema / properties / remotePath / description
        Previous value: -"Absolute path to the remote file"New value: +"Absolute path to the remote file. Must start with /."
    • Changedssh_exec2 fields changed
      • changedInput schema / properties / env / description
        Previous value: -"Environment variables to set for this command. Injected as a `KEY='value' ...` prefix; works on any sshd regardless of AcceptEnv config. Values are POSIX-single-quoted, so any byte is safe."New value: +"Environment variables to set for this command. Injected as a `KEY='value' ...` prefix; works on any sshd regardless of AcceptEnv config. VALUES are POSIX-single-quoted, so any byte is safe in a value. KEYS cannot be quoted (a shell assignment prefix requires a bare name), so each key must match /^[A-Za-z_][A-Za-z0-9_]*$/ (the POSIX name grammar) — a key outside that grammar is rejected and the call fails before anything is sent to a host. Command policy is checked against the PREFIXED command, so a `^`-anchored whitelist pattern stops matching once this is set."
      • changedInput schema / properties / timeout / description
        Previous value: -"Command timeout in milliseconds (default: 30000)"New value: +"Command timeout in milliseconds (default: 30000). Also the longest the call waits for a free connection-pool slot (SSH_MCP_MAX_POOL_SIZE, default 100) before the command starts; the wait and the command are bounded separately."
    • Changedssh_find1 field changed
      • changedInput schema / properties / timeout / description
        Previous value: -"Command timeout in milliseconds (default: 30000)"New value: +"Command timeout in milliseconds (default: 30000). Also the longest the call waits for a free connection-pool slot (SSH_MCP_MAX_POOL_SIZE, default 100) before the command starts; the wait and the command are bounded separately."
    • Changedssh_git_check4 fields changed
      • changedInput schema / properties / host / description
        Previous value: -"Git hosting hostname (default: \"github.com\")"New value: +"Git hosting hostname (default: \"github.com\"). Omit for the default; an empty string is rejected."
      • addedInput schema / properties / host / minLength
        Added value: +1
      • changedInput schema / properties / user / description
        Previous value: -"SSH user for the git host (default: \"git\")"New value: +"SSH user for the git host (default: \"git\"). Omit for the default; an empty string is rejected."
      • addedInput schema / properties / user / minLength
        Added value: +1
    • Changedssh_ls1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path to the remote directory"New value: +"Absolute path to the remote directory. Must start with /."
    • Changedssh_mkdir1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path of the directory to create"New value: +"Path of the directory to create. Absolute (starting with /) is recommended and unambiguous. A relative path is also accepted and resolves against the SFTP working directory, which is normally the remote user's home. ~ is NOT expanded — SFTP has no shell to expand it."
    • Changedssh_multi_exec2 fields changed
      • addedInput schema / properties / env
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Environment variables to set for this command. Injected as a `KEY='value' ...` prefix; works on any sshd regardless of AcceptEnv config. VALUES are POSIX-single-quoted, so any byte is safe in a value. KEYS cannot be quoted (a shell assignment prefix requires a bare name), so each key must match /^[A-Za-z_][A-Za-z0-9_]*$/ (the POSIX name grammar) — a key outside that grammar is rejected and the call fails before anything is sent to a host. Command policy is checked against the PREFIXED command, so a `^`-anchored whitelist pattern stops matching once this is set.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / timeout / description
        Previous value: -"Command timeout in milliseconds (default: 30000)"New value: +"Per-host command timeout in milliseconds (default: 30000): bounds each host's command, not the whole call. Also the call's no-progress budget on a full pool (see the tool description)."
    • Changedssh_service_status1 field changed
      • changedInput schema / properties / timeout / description
        Previous value: -"Command timeout in milliseconds (default: 30000)"New value: +"Command timeout in milliseconds (default: 30000). Also the longest the call waits for a free connection-pool slot (SSH_MCP_MAX_POOL_SIZE, default 100) before the command starts; the wait and the command are bounded separately."
    • Changedssh_stat1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path to the remote file or directory"New value: +"Absolute path to the remote file or directory. Must start with /."
    • Changedssh_tail1 field changed
      • changedInput schema / properties / timeout / description
        Previous value: -"Command timeout in milliseconds (default: 30000)"New value: +"Command timeout in milliseconds (default: 30000). Also the longest the call waits for a free connection-pool slot (SSH_MCP_MAX_POOL_SIZE, default 100) before the command starts; the wait and the command are bounded separately."
    • Changedssh_upload1 field changed
      • changedInput schema / properties / remotePath / description
        Previous value: -"Absolute path on the remote host"New value: +"Absolute path on the remote host. Must start with /."
    • Changedssh_write_file1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path to the remote file"New value: +"Absolute path to the remote file. Must start with /."
  2. 1 tool updatev0.11.7
    • Changedssh_read_file1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path to the remote file"New value: +"Absolute path to the remote file. Must start with /."
  3. 6 tool updatesv0.11.0
    • Addedssh_delete
    • Changedssh_exec1 field changed
      • addedInput schema / properties / env
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Environment variables to set for this command. Injected as a `KEY='value' ...` prefix; works on any sshd regardless of AcceptEnv config. Values are POSIX-single-quoted, so any byte is safe.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedssh_find1 field changed
      • addedInput schema / properties / newer
        Added value: +{
        +  "description": "Reference file path -- find matches files modified more recently than this file",
        +  "type": "string"
        +}
    • Addedssh_mkdir
    • Addedssh_stat
    • Changedssh_tail4 fields changed
      • changedInput schema / properties / lines / description
        Previous value: -"Number of lines to read from the end (default: 100)"New value: +"Number of lines to read from the end (default: 100). Must be a positive integer."
      • addedInput schema / properties / lines / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / lines / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / lines / type
        Previous value: -"number"New value: +"integer"
  4. 18 tool updatesv0.9.1
    • Addedssh_agent_ensure
    • Addedssh_config_lookup
    • Changedssh_diagnose4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / port / maximum
        Added value: +65535
      • addedInput schema / properties / port / minimum
        Added value: +1
      • changedInput schema / properties / port / type
        Previous value: -"number"New value: +"integer"
    • Changedssh_download5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / password / description
        Previous value: -"SSH password (prefer keys)"New value: +"SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process."
      • addedInput schema / properties / port / maximum
        Added value: +65535
      • addedInput schema / properties / port / minimum
        Added value: +1
      • changedInput schema / properties / port / type
        Previous value: -"number"New value: +"integer"
    • Changedssh_exec9 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / command / description
        Previous value: -"Shell command to execute on the remote host"New value: +"Shell command to execute on the remote host (interpreted by the remote login shell)"
      • changedInput schema / properties / password / description
        Previous value: -"SSH password (prefer keys)"New value: +"SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process."
      • addedInput schema / properties / port / maximum
        Added value: +65535
      • addedInput schema / properties / port / minimum
        Added value: +1
      • changedInput schema / properties / port / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / timeout / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / timeout / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / timeout / type
        Previous value: -"number"New value: +"integer"
    • Addedssh_find
    • Addedssh_git_check
    • Addedssh_key_list
    • Addedssh_key_load
    • Addedssh_known_hosts_fix
    • Changedssh_ls5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / password / description
        Previous value: -"SSH password (prefer keys)"New value: +"SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process."
      • addedInput schema / properties / port / maximum
        Added value: +65535
      • addedInput schema / properties / port / minimum
        Added value: +1
      • changedInput schema / properties / port / type
        Previous value: -"number"New value: +"integer"
    • Addedssh_multi_exec
    • Changedssh_read_file5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / password / description
        Previous value: -"SSH password (prefer keys)"New value: +"SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process."
      • addedInput schema / properties / port / maximum
        Added value: +65535
      • addedInput schema / properties / port / minimum
        Added value: +1
      • changedInput schema / properties / port / type
        Previous value: -"number"New value: +"integer"
    • Addedssh_service_status
    • Addedssh_tail
    • Addedssh_test
    • Changedssh_upload5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / password / description
        Previous value: -"SSH password (prefer keys)"New value: +"SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process."
      • addedInput schema / properties / port / maximum
        Added value: +65535
      • addedInput schema / properties / port / minimum
        Added value: +1
      • changedInput schema / properties / port / type
        Previous value: -"number"New value: +"integer"
    • Changedssh_write_file5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / password / description
        Previous value: -"SSH password (prefer keys)"New value: +"SSH password. STRONGLY prefer key-based auth (privateKeyPath or ssh-agent). Passwords pass through MCP protocol frames as plaintext and may be logged by the transport or host process."
      • addedInput schema / properties / port / maximum
        Added value: +65535
      • addedInput schema / properties / port / minimum
        Added value: +1
      • changedInput schema / properties / port / type
        Previous value: -"number"New value: +"integer"
  5. 7 tool updatesv0.2.0
    • First observedssh_diagnose
    • First observedssh_download
    • First observedssh_exec
    • First observedssh_ls
    • First observedssh_read_file
    • First observedssh_upload
    • First observedssh_write_file

TDQS

A3.6/5.0

Scored across 21 tools

Disambiguation4/5

Most tools have distinct purposes, but ssh_test and ssh_diagnose both probe connectivity, and ssh_read_file/ssh_download as well as ssh_write_file/ssh_upload share file-transfer boundaries. Descriptions clarify these differences well, so ambiguity is limited to a few near-overlaps.

Naming Consistency3/5

All tools share the ssh_ prefix and snake_case formatting, but the verb/noun ordering is inconsistent: some are verb-first (ssh_read_file, ssh_write_file), some are noun-first (ssh_key_load, ssh_config_lookup), and others are bare verbs (ssh_exec, ssh_find). The mixed pattern is readable but not predictable.

Tool Count3/5

With 21 tools, this sits at the heavy end of the borderline range. Each tool fills a niche, but the large count may make selection harder than necessary, especially given overlapping utilities like ssh_test, ssh_diagnose, and ssh_git_check.

Completeness4/5

The toolkit covers agent/key management, connectivity diagnostics, command execution, SFTP file operations, config lookup, and known_hosts repair. Minor gaps like key generation or port forwarding exist, but core SSH workflows are well supported.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables seamless SSH operations including secure connections, file transfers, interactive shell sessions, and Docker container management on remote servers. Supports both password and SSH key authentication with credential management and connection pooling.
    18
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables remote file operations and command execution across multiple machines via SSH. Supports reading files, listing directories, and running commands on any host configured in your SSH config.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Enables secure SSH connections to multiple remote servers with support for command execution, file transfers (SFTP), directory listing, and both password and key-based authentication.
    7
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables executing commands on remote SSH hosts, with full support for bastion/jump hosts and ~/.ssh/config, plus Slurm job management and rsync.
    3
    MIT