@yawlabs/ssh-mcp
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
Paketmanager —
npm install,pip install,go get,cargo,composeraus privaten ReposServerzugriff — 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.
Schnellstart
npm install -g @yawlabs/ssh-mcpFü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 |
| Stellt sicher, dass ssh-agent läuft. Startet einen bei Bedarf und setzt Umgebungsvariablen für die Sitzung. |
| Listet alle SSH-Keys in ~/.ssh/ mit Typ, Fingerabdruck und Agent-Status auf. |
| Lädt einen Key in den laufenden Agenten. Stellt sicher, dass der Agent zuerst gestartet wird. |
| Löst die effektive SSH-Konfiguration für einen Host auf (Hostname, Benutzer, Port, Proxy, Identitätsdateien). |
| Entfernt einen veralteten Host-Key und führt einen erneuten Scan durch. Behebt "host key verification failed"-Fehler. |
| Testet die Git-über-SSH-Authentifizierung bei GitHub, GitLab, Bitbucket usw. |
| Schneller Konnektivitätstest mit Zeitmessung und umsetzbaren Fehlerdetails. |
Diagnosen
Tool | Beschreibung |
| 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 |
| Führt einen Befehl auf einem Remote-Host aus. Gibt stdout, stderr und Exit-Code zurück. |
| Liest eine Datei von einem Remote-Host via SFTP. |
| Schreibt Inhalt in eine Datei auf einem Remote-Host via SFTP. |
| Lädt eine lokale Datei auf einen Remote-Host via SFTP hoch. |
| Lädt eine Datei von einem Remote-Host auf das lokale Dateisystem herunter. |
| 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 |
| Führt einen Befehl parallel auf mehreren Hosts aus. Gibt Ergebnisse pro Host zurück. |
| Sucht remote nach Dateien mit strukturierten Parametern (Name, Typ, Größe, Tiefe). |
| Liest die letzten N Zeilen einer Datei, optional gefiltert durch ein Grep-Muster. |
| 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 |
| SSH-Hostname oder IP (erforderlich) | — |
| SSH-Port | Aus SSH-Konfiguration oder |
| SSH-Benutzername | Aus SSH-Konfiguration oder aktueller Benutzer |
| Pfad zum privaten SSH-Key | Automatische Erkennung |
| 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.
Expliziter
privateKeyPathExplizites
passwordssh-agent (
SSH_AUTH_SOCKunter Unix,\\.\pipe\openssh-ssh-agentunter Windows)Identitätsdateien aus
~/.ssh/configfür den HostStandard-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 → worksHost-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 → worksErstmalige 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
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/YawLabs/ssh-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
