termdesk
TermDesk
Ein plattformübergreifender SSH + SFTP + VNC + RDP-Desktop-Client – Multi-Tab-Terminals, Streaming-Dateiübertragungen und Remote-Desktops (VNC über SSH, plus natives RDP) in einem Fenster.
Status: ausgeliefert – SSH-Terminal, SFTP, VNC über SSH, natives RDP, MCP-Agentenzugriff, SSH-Tunnel-Manager, Flottenautomatisierung, lokale Terminals mit wählbarem Terminalprogramm (Login-Shell / tmux / Zellij / screen / alternative Shells), Prompt Book + geplante Routinen, Einstellungen, Befehls-Palette und Paketierung.
✨ Funktionen
🖥️ Flexible Hosts – SSH-only, VNC-only oder kombinierte Hosts bereits bei der Erstellung. SSH und VNC sind unabhängig voneinander optional. Reine VNC-Hosts unterstützen direkte TCP- oder SSH-getunnelte Verbindungen (mit klarer Fehlermeldung, wenn Sie ohne SSH-Zugangsdaten tunneln möchten). UI-Aktionen, Befehls-Palette und Test-Schaltflächen passen sich dem Host-Typ an.
🖥️ Multi-Tab-SSH-Terminal – xterm.js (WebGL) mit Suche, Kopieren/Einfügen, Größenänderung; viele parallele Sitzungen zum selben oder zu verschiedenen Hosts. Frühe Ausgabe wird gepuffert, bis sich das Terminal verbindet, sodass MOTD/Banner nicht verloren gehen.
📁 SFTP mit Streaming-Übertragungswarteschlange – Remote-Dateibrowser, Drag & Drop (rekursiver Ordner-Upload), Chunk-für-Chunk-Streaming mit konstantem Speicher, Abbrechen/Wiederholen, In-Place-Bearbeitung mit Auto-Upload beim Speichern.
🔒 VNC über SSH – noVNC wird in der App gerendert, über eine Loopback-WebSocket-Bridge geführt, die durch Einmal-Tokens mit 30 s Gültigkeit geschützt ist; Standardtransport ist ein SSH-
forwardOut-Tunnel, sodass Port 5900 nie exponiert wird. Direktmodus wird ebenfalls für VNC-only-Hosts unterstützt.🖥️ RDP – Verbindung zu Windows/RDP-Hosts in der App über einen IronRDP-WASM-Client, der über einen In-Process-RDCleanPath-Proxy geführt wird (gleiche Form wie die VNC-Bridge: Einmal-Token, 30 s Gültigkeit, Origin-Prüfung, TLS-Terminierung), mit Trust-on-first-use-Serverzertifikat-Pinning.
🔐 Verschlüsselte Tresor – Hosts, Gruppen, Snippets und bekannte Hosts in SQLite; Passwörter/Passphrasen werden mit OS-Keychain-gestütztem
safeStorageverschlüsselt, sobald sie im Hauptprozess ankommen.🛡️ Host-Key-Verifizierung – SHA256-Fingerprint-Bestätigungsdialog bei der ersten Verbindung, harte Sperre bei Änderung eines gleichartigen Schlüssels, und eine deutliche laute „möglicher Man-in-the-Middle“-Warnung, wenn ein bekannter Host einen Schlüssel/Typ präsentiert, dem nie vertraut wurde.
🪜 ProxyJump – Multi-Hop-Ketten (
user@jump:port,next) über verketteteforwardOut.🔌 SSH-Tunnel-Manager – lokale (
-L)-Portweiterleitungen und dynamische SOCKS5 (-D)-Proxys aus einem Seitenleisten-Panel definieren, speichern und starten/stoppen, mit Live-Statuspunkt + Durchsatz. Nutzt nach Möglichkeit die Verbindung eines offenen Terminals; zerstörungsfrei, eigentümerbezogen, protokolliert. Siehedocs/TUNNELS.md.🪟 Geteilte Panels – zwei Sitzungen nebeneinander oder übereinander anzeigen (Alt-Klick auf einen Tab oder die Split-Symbolleiste), mit ziehbarem Trenner. Ideal in Kombination mit Multi-Host-Automatisierung für ein Live-Überwachungsraster.
💻 Lokale Terminals –
node-pty-Shell-Tabs auf dem eigenen Rechner, mit gespeicherten Arbeitsverzeichnissen – kein SSH erforderlich. Der pro Host festgelegte Standard-Remote-Pfad wird bei der Verbindung berücksichtigt.🧩 Terminalprogramm wählen – legen Sie fest, was beim Öffnen eines Terminals läuft (Einstellungen → Allgemein): Ihre Standard-Login-Shell, ein Multiplexer (tmux, Zellij, GNU Screen – überleben Neustarts/Trennungen) oder eine alternative Shell (bash, zsh, fish, PowerShell, Nushell). Nur Programme, die auf Ihrem Rechner erkannt werden, sind auswählbar; die Wahl gilt sowohl für lokale Terminals als auch für SSH-Sitzungen (auf dem Remote ausgeführt, falls vorhanden, sonst eine einfache Shell).
🚀 In externem Terminal öffnen – das aktuelle Verzeichnis an Ihr bevorzugtes GUI-Terminal übergeben – Ghostty, Warp, iTerm2, kitty, Alacritty, WezTerm, GNOME Terminal, Konsole, Windows Terminal – auf Ihrem Rechner erkannt, mit gespeichertem Standard (Einstellungen → Allgemein), über ⌘K oder eine Ein-Klick-Schaltfläche auf jedem lokalen Terminal-Tab.
⚡ Flottenautomatisierung – ein Snippet oder einen Befehl gleichzeitig auf einer ganzen Gruppe von SSH-Hosts ausführen, mit Live-Streaming-Ausgabe pro Host.
🕘 Aktivitätsprotokoll – eine lokale Zeitleiste von Verbindungen/Trennungen, SFTP/VNC-Öffnungen und Automatisierungsläufen. Nur Metadaten: Token mit Geheimnissen werden geschwärzt, Einträge werden nach 90 Tagen gelöscht.
🎨 Terminal-Farbschemata – integrierte Dracula, Solarized Dark, Gruvbox, One Dark, Nord (plus das Standard-Schema), je nach Präferenz.
🧱 Anpassbare Seitenleiste – jede Sektion der linken Seitenleiste (Hosts, Lokale Terminals, Arbeitsbereiche, Tunnel, Snippets, Prompt Book, Routinen) ein- oder ausblenden, über Einstellungen → Allgemein oder die Schaltfläche Anpassen der Seitenleiste. Ihre Wahl bleibt erhalten; standardmäßig ist alles sichtbar.
🧩 Prompt Book – wiederverwendbare, vorlagenbasierte Prompts für KI-Agenten. Prompts sind reiner Text mit
{{variable}}-Platzhaltern (optional{{name:default}}/{{name|description}}); beim Ausführen werden die Werte abgefragt, eine Live-Vorschau angezeigt, und der gerenderte Text wird entweder an das aktive Terminal (SSH oder lokal) gesendet oder in einem KI-Agenten gestartet – Claude Code, Aider, OpenCode, Codex oder Gemini – in einem von Ihnen gewählten Verzeichnis. Die Vorlagenverarbeitung ist reine Substitution (kein eval), und der Prompt wird als einzelnes, in Anführungszeichen gesetztes Argument übergeben, sodass Shell-Metazeichen darin inert sind.🔁 Routinen – gespeicherte „führe diesen Prompt durch diesen Agenten in diesem Verzeichnis aus“-Jobs, auf Abruf oder nach Zeitplan (Intervall / täglich / cron), jeweils mit eigener Ausführungs-Historie. Routinen laufen, solange TermDesk geöffnet ist; ein während der geschlossenen App verpasster Lauf wird beim nächsten Start einmal nachgeholt, statt jeden verpassten Slot zu überrennen. Unbeaufsichtigte Autonomie ist Opt-in und standardmäßig deaktiviert; gespeicherte Ausführungszusammenfassungen sind geheimnisgeschwärzt.
📋 Snippets – gespeicherte Befehle, die an die aktive Sitzung gesendet werden.
⌨️ Befehls-Palette –
⌘/Strg+KFuzzy-Host-Suche + jeder Befehl (Terminals, SFTP, VNC, Automatisierung, Protokolle); drücken Sie?für das Tastenkürzel-Spickzettel.⚙️ Einstellungen – Design (dunkel / hell / System, folgt dem Betriebssystem), Terminal-Schriftart + Farbschema, Rechtsklick-Einfügen-Verhalten, SSH-Keepalive; reines JSON, niemals Geheimnisse.
🤖 KI-Agentenzugriff (MCP) – lassen Sie Claude, Cursor, Grok oder einen beliebigen MCP-Client TermDesk nutzen: Hosts auflisten, Befehle ausführen, über eine Flotte ausrollen. Der Agent bekommt Hände, keine Schlüssel – Zugangsdaten bleiben im Hauptprozess, jede Aktion ist pro Host Opt-in + genehmigungspflichtig + live in einem KI-Aktivitäts-Protokoll sichtbar. Standardmäßig deaktiviert. Siehe
docs/MCP-INTEGRATION.md.🏠 Lokal zuerst – Ihre Hosts, Schlüssel und Verlauf verlassen nie Ihren Rechner; kein Pflicht-Cloud-Konto, keine Telemetrie.
Related MCP server: SentryFrogg MCP Server
🏗 Architektur
Die gesamte SSH/SFTP/VNC-Logik befindet sich im Hauptprozess. Der Renderer ist vollständig sandboxed (contextIsolation: true, nodeIntegration: false, sandbox: true) und kommuniziert nur über einen typisierten, Zod-validierten IPC-Vertrag (src/shared/ipc.ts) mit ihm.
flowchart LR
subgraph R["Renderer (sandboxed, no Node)"]
UI["React 19 UI<br/>zustand stores"]
XT["xterm.js<br/>terminal"]
NV["noVNC<br/>RFB client"]
end
subgraph M["Main process"]
IPC["Typed IPC<br/>Zod-validated contracts"]
SM["SessionManager<br/>(ssh2: shell, agent,<br/>keys, ProxyJump)"]
SF["SftpManager +<br/>TransferManager<br/>(streaming queue)"]
WB["ws-bridge<br/>127.0.0.1, random port,<br/>single-use 30s tokens"]
VA[("Vault<br/>better-sqlite3 + Drizzle<br/>secrets via safeStorage")]
end
RH[("Remote host<br/>sshd · sftp · vncserver")]
UI <-->|"invoke/handle"| IPC
XT <-->|"ssh:data:#lt;sessionId#gt; stream"| IPC
IPC <--> SM
IPC <--> SF
SM --- VA
SF --- SM
NV -->|"ws://127.0.0.1:#lt;port#gt;/#lt;token#gt;"| WB
WB -->|"variant B (default):<br/>ssh2 forwardOut → :5900"| SM
WB -.->|"variant A (opt-in):<br/>direct TCP → :5900"| RH
SM <-->|"SSH"| RHZwei bewusste Ausnahmen von „Geheimnisse bleiben im Hauptprozess“: das gespeicherte VNC-Passwort (für den RFB-Zugangsdaten-Handshake) und das gespeicherte RDP-Passwort (für den IronRDP-Client) werden im Hauptprozess entschlüsselt und an den Renderer zurückgegeben. Keines von beiden ist derzeit an einen offenen Tab gebunden oder ratenbegrenzt – siehe Bekannte Einschränkungen.
🚀 Schnellstart
npm install # also applies the better-sqlite3 patch + rebuilds native deps
npm run dev # electron-vite dev server + Electron window, HMRErster Start:
npm install && npm run devöffnet eine nutzbare App – es gibt keine Lizenzprüfung, keinen Sitz und kein Konto. SieheCONTRIBUTING.mdfür das vollständige Entwicklungssetup, einschließlich desbetter-sqlite3-ABI-Schritts, den Sie benötigen, bevornpm testausgeführt werden kann.
Skript | Was es tut |
| electron-vite-Entwicklungsserver + Electron-Fenster |
| Typprüfung (TS strict) + Produktions-Build nach |
| biome-Check (Format + Lint) |
| vitest (Unit + Integration) |
| vitest mit v8-Abdeckung |
| Build + electron-builder (dmg / NSIS / AppImage) |
npm run dist erzeugt dist/TermDesk-<version>-arm64.dmg auf Apple-Silicon-macOS (verifiziert, dass es startet). Siehe INSTALL.md für Download- und Installationsanweisungen pro Betriebssystem.
🧪 Dev-Testumgebung
Ein einzelner Docker-Container bietet SSH + TigerVNC für lokale Tests – keine echten Server nötig:
npm run test:keys # throwaway SSH keys (untracked)
docker compose -f docker-compose.test.yml up -dDienst | Endpunkt | Zugangsdaten |
SSH |
|
|
VNC |
|
|
E2E-Smoke-Test-Harnesses
Fünf eigenständige End-to-End-Suiten laufen in der echten Electron-App (die ersten vier gegen den Docker-Container; die MCP-Suite benötigt keine externen Dienste). Jede gibt bei Erfolg einen *_OK-Marker aus:
Befehl | Beweist | Verifiziertes Ergebnis |
| Geheimnisse werden vor dem Speichern mit |
|
| Echte Logins mit Passwort, Schlüssel und Schlüssel + verschlüsselter Passphrase |
|
| 1-GB-Upload + Download mit RSS-Überwachung (Spitze 259 MB – unter dem 300-MB-Budget) und 500-Dateien-Ordner-Upload |
|
| RFB-Handshake sowohl direkt als auch über den SSH-Tunnel; gefälschte Token-Verbindungen abgelehnt; Token sind Einmal-Token |
|
| Token-geschützter MCP-Server startet auf Loopback; ein gefälschtes Bearer-Token wird abgelehnt |
|
✅ Tests
npm test # 637 unit/integration tests across 69 files — all green
npm run test:coverage # v8 line coverage: 36.82% (2340/6355 lines)Vitest führt Renderer-Tests unter jsdom (Testing Library) und alles andere unter node aus. Die Abdeckung konzentriert sich auf das, was zählt – reine Logik ist hoch, während Prozess-Kleber und UI-Shells von den fünf E2E-Smokes statt von Unit-Tests abgedeckt werden.
Hoch (Zeilen):
shared97,1 % — der Zod-IPC-Vertrag, von dem jeder Prozess abhängt —renderer/lib97,5 %,main/store81,4 % (db, hosts-repo, settings und snippets-repo bei oder nahe 100 %),ssh-util100 %, der~/.ssh/config-Parser und seinInclude-Auflöser im hohen 90er-Bereich.Niedrig und stattdessen durch die Smokes abgedeckt:
main/ipc-Handler-Kleber 9,8 %,session-managerundsftp-manager/transfer-manager0 %,vnc-managerund die UI-Hüllen (SftpTab,TerminalView,VncTab, Layout und die Seitenleisten-Panels) niedrig oder null. Dabei handelt es sich um Prozess-Kleber und Electron/DOM-Hüllen; dieTERMDESK_SMOKE-Harnesse üben sie Ende-zu-Ende gegen einen echten Server aus. Einstiegspunkte und*-smoke.ts-Dateien sind per Konfiguration von der Abdeckung ausgeschlossen.
Build + Typecheck + Lint sind sauber, und ein gestarteter Dev-Lauf protokolliert null Fehlerzeilen.
⌨️ Tastaturkürzel
Kürzel | Aktion |
| Befehlspalette (Fuzzy-Hostsuche + Befehle) |
| Neue Sitzung (öffnet die Palette) |
| Aktiven Tab schließen |
| Im Terminal suchen |
| Kopieren/Einfügen im Terminal |
⚙️ Einstellungen
Design (dunkel, hell oder System — folgt der prefers-color-scheme des Betriebssystems), Terminal-Schriftgröße/-familie, SSH-Keepalive-Intervall — gespeichert als einfaches JSON in userData/settings.json (niemals Geheimnisse).
📡 Funktionsdetails
SSH-Terminal
Die gesamte ssh2-Logik läuft im Hauptprozess (
src/main/ssh/session-manager.ts); der Renderer sieht nur eine typisierte Stream-API. Ausgabeströme aufssh:data:<sessionId>; frühe Ausgabe wird gepuffert, bis sich das Terminal anhängt.Authentifizierung: Tresor-Passwort (mit keyboard-interactive-Fallback), privater Schlüssel (+ verschlüsselte Passphrase) oder SSH-Agent (
SSH_AUTH_SOCK, Windows-OpenSSH-Pipe). Geheimnisse werden nur zum Verbindungszeitpunkt entschlüsselt.Hostschlüssel: Beim ersten Verbinden wird ein SHA256-Fingerabdruck-Genehmigungsdialog angezeigt und in der
known_hosts-Tabelle gespeichert; eine Abweichung blockiert die Verbindung hart.ProxyJump-Ketten (
user@jump:port,next) über verketteteforwardOut; Keepalive 15 s.
SFTP
SFTP-Sitzungen nutzen die aktive SSH-Verbindung eines offenen Terminals zum selben Host wieder (kein zweiter Login) und fallen auf eine dedizierte Verbindung ohne Shell zurück.
Übertragungen streamen Stück für Stück (konstanter Speicher — 1 GB unter 300 MB RSS verifiziert) und sind abbrechbar/wiederholbar; Ordner-Drops laden rekursiv mit erhaltener Struktur hoch.
Bearbeiten an Ort und Stelle lädt in eine temporäre Datei herunter, öffnet den Betriebssystem-Editor und lädt beim Speichern automatisch hoch.
VNC
noVNC rendert im Renderer; es spricht WebSocket zu einer Brücke im Hauptprozess, die an
127.0.0.1auf einem zufälligen Port gebunden ist. Jede Verbindung erfordert ein Einmal-Token mit 30 s Gültigkeit — andere lokale Prozesse können die Brücke nicht mitbenutzen (daherws://127.0.0.1:*in der CSP).Standardtransport ist ein SSH-
forwardOut-Kanal (Variante B — Port 5900 wird nie exponiert), der eine aktive Terminalverbindung zum Host wiederverwendet, wenn eine vorhanden ist; einfaches TCP (Variante A) ist pro Host optional.Die gespeicherten VNC- und RDP-Passwörter werden im Hauptprozess entschlüsselt und für die jeweiligen Clients an den Renderer zurückgegeben — die beiden dokumentierten Ausnahmen von „Geheimnisse bleiben im Hauptprozess".
Symbolleiste: lokale Skalierung / Remote-Größenänderung umschalten, Zwischenablage einfügen, Strg+Alt+Entf, Vollbild, Neuverbinden (jedes Neuverbinden stellt ein frisches Token + Tunnel bereit).
Tresor
Hosts, Gruppen, Snippets und known_hosts liegen in SQLite (better-sqlite3 + Drizzle) im
userData-Verzeichnis der App.Passwörter/Passphrasen werden mit
safeStorage(Betriebssystem-Schlüsselbundschlüssel) im Hauptprozess verschlüsselt, sobald sie eintreffen; nur Chiffrat-Blobs berühren die Datenbank, und Geheimnisse werden nie an den Renderer zurückgesendet.Der
~/.ssh/config-Import parst Host/HostName/Port/User/IdentityFile/ProxyJump, löstInclude-Direktiven auf (Tilde-/relative/absolute Pfade und Globs, mit Zyklus-/Tiefen-/Größen-Schutz) und führtHost */Wildcard-Standardwerte mit OpenSSH-Erste-gewonnene-gewinnt-Reihenfolge zu konkreten Hosts zusammen.
🔐 Sicherheits-Checkliste
contextIsolation: true,nodeIntegration: false,sandbox: true— der Renderer und Preload berühren nie Node.Strenge CSP über Meta-Tag:
script-src 'self', keinunsafe-eval, kein Remote-Modul;connect-srcerlaubt nur'self'und Loopback-WebSockets (die token-gesteuerte VNC-Brücke). Nur-Entwicklung-Lockerung erfolgt über ein Vite-Plugin, das bei Abweichung laut scheitert.webSecurity: true; Navigation ursprungsgeprüft;window.openverweigert (externeshttps:→ Systembrowser);<webview>blockiert; Berechtigungsanfragen standardmäßig verweigert.Jede IPC-Nutzlast wird mit Zod validiert (
src/shared/ipc.tsist der einzige Vertrag); Aufrufergebnisse sind Ende-zu-Ende überIpcInvokeMaptypisiert.Geheimnisse (SSH-/VNC-Passwörter, Schlüssel-Passphrasen) werden mit
safeStorageim Hauptprozess verschlüsselt, sobald sie eintreffen; nur Chiffrat wird persistiert; Entschlüsselung erfolgt zum Verbindungszeitpunkt und Referenzen werden sofort verworfen. Verifiziert durchTERMDESK_SMOKE=vault. Zwei dokumentierte Ausnahmen: Die VNC- und RDP-Passwörter gelangen für ihre Protokoll-Clients in den Renderer (siehe Bekannte Einschränkungen).Fehler, die IPC überqueren, werden bereinigt (nur erste Zeile, keine Stacks/Pfade); Geheimnisse werden nie protokolliert.
Sitzungen, SFTP-Handles, Übertragungen und Hostschlüssel-Aufforderungen sind auf die WebContents beschränkt, die sie erstellt haben, und werden abgeräumt, wenn diese zerstört wird.
Hostschlüssel: SHA256-Fingerabdruck-Genehmigung beim ersten Verbinden, harte Blockierung bei Abweichung — für das endgültige Ziel und jeden ProxyJump-Hop.
Aktivitätsprotokoll ist nur Metadaten: Betriebssystem-Benutzername, geheimnistragende Befehls-Tokens redigiert, 90-Tage-Bereinigung.
Optionales Master-Passwort (Argon2id-abgeleitete zweite Verschlüsselungsebene) — verschoben, als zukünftige Erweiterung erfasst.
Siehe SECURITY.md für das vollständige Sicherheitsmodell, die bekannten Einschränkungen und die Richtlinie zur Offenlegung von Schwachstellen.
📂 Projektstruktur
src/
main/ # Electron main process — all SSH/SFTP/VNC logic lives here
ipc/ # IPC handlers per domain (ssh, sftp, vnc, hosts, …)
ssh/ # session-manager, ssh-config-parser, ssh-util (+ smoke)
sftp/ # sftp-manager, transfer-manager, edit-watch (+ smoke)
vnc/ # ws-bridge, vnc-manager (+ smoke)
store/ # Drizzle + better-sqlite3, secrets (safeStorage), settings
preload/ # contextBridge — typed, minimal API surface (window.api)
renderer/ # React UI (no Node access)
components/{layout,hosts,terminal,sftp,vnc,snippets,ui}/
hooks/ stores/ lib/
shared/ # IPC channel contracts + Zod schemas shared by all processes🗺 Bekannte Einschränkungen / Roadmap
Master-Passwort — optionale Argon2id-abgeleitete zweite Verschlüsselungsebene über dem Tresor; verschoben.
Playwright-Smoke-Test (App starten → Host hinzufügen → Mock-Verbindung) — verschoben; die fünf
TERMDESK_SMOKE-Harnesse decken e2e heute ab.~/.ssh/config-Import —Match-Blöcke und Token-Expansion (%h/%p) werden noch übersprungen; Cloud-Provider-Inventarimport (AWS/GCP) ist nicht implementiert.
Siehe SECURITY.md für die Härtungs-Roadmap.
🔧 Hinweise zu nativen Modulen
better-sqlite3 benötigt einen Quell-Patch, um gegen Electrons V8 zu kompilieren (noch keine Upstream-Prebuilds) — wird automatisch über
patch-packagebeinpm installangewendet (patches/better-sqlite3+12.10.0.patch).cpu-features (optionale native ssh2-Abhängigkeit) wird in
package.jsonaufnoop2überschrieben, um einen unnötigen nativen Build zu vermeiden; ssh2 fällt auf seinen reinen JS-Pfad zurück.
🤝 Mitwirken
Issues und Pull Requests sind willkommen. CONTRIBUTING.md enthält das Entwicklungssetup
— einschließlich der beiden nativen Modul-Fallen, die dir sonst einen Nachmittag kosten — die Invarianten, die neuer
Code einhalten muss, und die Pre-PR-Checkliste. Beiträge sind inbound=outbound MIT: kein CLA, keine
Urheberrechtsabtretung.
Die Teilnahme unterliegt dem Code of Conduct. Sicherheitsprobleme laufen über
den privaten Kanal in SECURITY.md, niemals über ein öffentliches Issue.
📄 Lizenz
Der Quellcode in diesem Repository ist unter der MIT-Lizenz veröffentlicht — siehe
LICENSE. Du darfst ihn verwenden, modifizieren und weiterverbreiten, auch
kommerziell, solange der Urheberrechtshinweis und der Lizenztext mitgeführt werden.
Die vorgebauten Installer auf der Releases-Seite sind zusätzlich durch
EULA.txt abgedeckt, das diese Binärdateien regelt; ein Build, den du
selbst aus diesem Quellcode erstellst, unterliegt ausschließlich LICENSE.
Es gibt keine Lizenzprüfung, Sitzungsaktivierung oder Konto in diesem Client: das kommerzielle Lizenzierungssubsystem wurde entfernt, als der Quellcode veröffentlicht wurde, sodass das, was du aus diesem Repository baust, die gesamte Anwendung ist.
Diese Grenze wird im Code durchgesetzt, nicht nur hier beschrieben: die EULA-Aufforderung
beim ersten Start wird nur in die eigenen Release-Builds des Projekts kompiliert, sodass ein
npm run dist eines Forks, ein Distro-Paket oder dein eigener Installer sie nie anzeigt.
Drittanbieter-Abhängigkeiten behalten ihre eigenen Lizenzen, aufgelistet in
THIRD-PARTY-NOTICES.md. Eine davon trägt eine Verpflichtung,
die erwähnenswert ist: @novnc/novnc ist MPL-2.0 und dieses Repository patcht es
(patches/@novnc+novnc+1.7.0.patch), sodass diese Modifikation hier unter
MPL-2.0 zusammen mit dem restlichen Quellcode veröffentlicht wird.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Scoped, audited SSH exec, sessions, and SFTP on your saved servers without exposing credentials
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
Authenticated MCP server for ClearPolicy policy and compliance workflows.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables SSH interactive session management through MCP, supporting commands, menus, and session lifecycle operations.1
- AlicenseAqualityDmaintenanceProvides a governed command plane for MCP agents to manage PostgreSQL databases, SSH sessions, and HTTP APIs with encrypted credential storage and prescriptive workflows.3MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that provides SSH tools (read-only probes and arbitrary exec) to a fleet of hosts outside Kubernetes, with an inventory-based allowlist and key-based authentication.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to securely execute remote commands and transfer files over SSH through standardized MCP tools, with multi-host management, flexible authentication, and an admin console.ISC
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/konraddzbik/termdesk'
If you have feedback or need assistance with the MCP directory API, please join our Discord server