Skip to main content
Glama

pty-mcp

pty-mcp MCP server

Ein MCP-Server (Model Context Protocol), der KI-Agenten interaktive Terminal-Sitzungen ermöglicht – lokale Shells, SSH, serielle Schnittstellen und persistente Remote-Sitzungen, die Verbindungsabbrüche überstehen.

Entwickelt für Systemadministratoren und Netzwerktechniker, die möchten, dass KI bei der echten Server- und Geräteverwaltung hilft, nicht nur bei der Codegenerierung.

KI-Agent interagiert mit Telehack BBS über pty-mcp

Warum

KI-Agenten führen Befehle in nicht-interaktiven Shells aus. Sie können nicht:

  • Sich per SSH auf einem Server anmelden und mit laufenden Prozessen interagieren

  • Sich über eine serielle Konsole mit Routern oder Switches verbinden

  • Protokolle überwachen und reagieren, wenn ein bestimmtes Ereignis eintritt

  • Sitzungsstatus über mehrere Befehle hinweg beibehalten

  • Auf einen Neustart des Servers warten und erkennen, wann er wieder verfügbar ist

pty-mcp löst all dies durch die Bereitstellung echter PTY-Sitzungen über MCP.

Ohne pty-mcp greifen KI-Agenten auf sleep 30 && check_status-Schleifen zurück – was CPU-Zyklen und API-Aufrufe verschwendet, während sie auf Ereignisse warten. Mit wait_for blockiert der Agent serverseitig, bis das Ereignis eintritt. Weniger Polling, weniger Energie, besser für Eisbären. 🐻❄️

Related MCP server: Interactive Terminal MCP Server

Anwendungsfälle

Serveradministration

# Reboot a server and wait until it's back online
create_local_session("ping myserver")
read_output(wait_for: "bytes from", timeout: 300)
→ blocks until server responds after reboot (~80s, one tool call)

Netzwerkgeräteverwaltung

# Connect to a router via serial console
create_serial_session(port: "/dev/ttyUSB0", baud: 9600)
send_input("show interfaces status")
read_output(wait_for: "\\$")

Protokollüberwachung und Alarmierung

# Watch logs and act when something happens
create_ssh_session(host: "prod", user: "admin")
send_input("tail -f /var/log/app.log")
read_output(wait_for: "ERROR|CRITICAL", timeout: 3600)
→ returns the error line + context when it appears

Lang laufende Aufgaben, die Verbindungsabbrüche überstehen

create_ssh_session(host: "server", user: "admin", persistent: true)
send_input("apt upgrade -y")
detach_session()          → close Claude Code, task continues
# Reconnect later to check result

Funktionen

Funktion

Beschreibung

Lokales Terminal

Interaktive bash/python/node-Sitzungen auf dem lokalen Rechner

SSH-Sitzungen

Verbindung zu Remote-Hosts mit Schlüssel-/Passwort-Authentifizierung, Unterstützung für SSH-Konfiguration

Serielle Schnittstelle

Verbindung zu Geräten über seriell (IoT, Embedded, Netzwerk-Hardware)

Persistente Sitzungen

Sitzungen überstehen SSH-Verbindungsabbrüche via ai-tmux-Daemon

An-/Abkoppeln

Von einer laufenden Sitzung abkoppeln und später wieder verbinden

Steuerungstasten

Senden von ctrl+c, ctrl+d, Pfeiltasten, Tab, Escape

Erkennung der Stabilisierung

Wartet auf die Stabilisierung der Ausgabe vor der Rückgabe (intelligentes Timeout)

Musterabgleich

wait_for blockiert, bis ein Regex-Muster in der Ausgabe erscheint (v0.2.0)

Begrenzter Speicher

Ringpuffer verhindert OOM bei lang laufenden Sitzungen (v0.2.0)

Audit-Protokoll

Optionales freiwilliges Betriebsprotokoll – Aufzeichnung von send_input-Befehlen an einen Kollektor zur Überprüfung und Rückverfolgbarkeit (v0.8.0)

Architektur

┌─────────────────────────────────────────────────────┐
│ AI Agent (Claude Code, etc.)                        │
│                                                     │
│  MCP Tools: create_local_session, send_input,       │
│             send_control, read_output, close_session │
└──────────────────────┬──────────────────────────────┘
                       │ JSON-RPC stdio
┌──────────────────────┴──────────────────────────────┐
│ pty-mcp (MCP Server)                                │
│                                                     │
│  Session Manager                                    │
│  ├── LocalSession  (local PTY via creack/pty)       │
│  ├── SSHSession    (remote PTY via x/crypto/ssh)    │
│  ├── SerialSession (serial port via go.bug.st)      │
│  └── RemoteSession (persistent via ai-tmux)         │
└─────────────────────────────────────────────────────┘

Persistent mode (ai-tmux):

  pty-mcp ──SSH──▶ ai-tmux client ──Unix socket──▶ ai-tmux server (daemon)
                                                     ├── PTY: bash
                                                     ├── PTY: ssh admin@router
                                                     └── PTY: tail -f /var/log/syslog

Schnellstart

Claude Code Plugin (empfohlen)

Installiert die Binärdatei automatisch und registriert den MCP-Server:

claude plugin marketplace add raychao-oao/pty-mcp
claude plugin install pty-mcp@pty-mcp

Starten Sie Claude Code neu – die Binärdatei wird beim Sitzungsstart automatisch heruntergeladen, starten Sie dann ein weiteres Mal neu, um sie zu aktivieren. Kein manuelles claude mcp add erforderlich.

Aktualisierung:

claude plugin marketplace update pty-mcp
claude plugin update pty-mcp@pty-mcp

Starten Sie Claude Code neu – die neue Binärdatei wird beim Sitzungsstart automatisch heruntergeladen, starten Sie dann ein weiteres Mal neu, um das Update anzuwenden.

Manuelle Installation

Einzeilige Installation + Registrierung (macOS / Linux / WSL2):

curl -fsSL https://raw.githubusercontent.com/raychao-oao/pty-mcp/main/install.sh | sh
claude mcp add pty-mcp -- /usr/local/bin/pty-mcp

Starten Sie Claude Code neu und die Tools sind verfügbar.

Download von GitHub Releases:

Gehen Sie zu Releases, laden Sie die Binärdatei für Ihre Plattform herunter und machen Sie sie ausführbar:

Plattform

Binärdatei

macOS (Apple Silicon)

pty-mcp-darwin-arm64

macOS (Intel)

pty-mcp-darwin-amd64

Linux (x86_64) / WSL2

pty-mcp-linux-amd64

Linux (ARM64)

pty-mcp-linux-arm64

chmod +x pty-mcp-*
sudo mv pty-mcp-* /usr/local/bin/pty-mcp
claude mcp add pty-mcp -- /usr/local/bin/pty-mcp

Aus Quellcode bauen (erfordert Go 1.25+):

go install github.com/raychao-oao/pty-mcp@latest
claude mcp add pty-mcp -- $(go env GOPATH)/bin/pty-mcp

WSL2-Hinweise

pty-mcp funktioniert unter WSL2 sofort. Verwenden Sie die Linux-Binärdatei:

# Inside WSL2
curl -fsSL https://raw.githubusercontent.com/raychao-oao/pty-mcp/main/install.sh | sh
claude mcp add pty-mcp -- /usr/local/bin/pty-mcp

Optional: Installieren Sie ai-tmux auf Remote-Servern

Für persistente Sitzungen, die SSH-Verbindungsabbrüche überstehen, installieren Sie ai-tmux auf Ihrem Remote-Server:

# Download for your server's architecture
curl -fsSL https://raw.githubusercontent.com/raychao-oao/pty-mcp/main/install.sh | sh
# Or just copy the binary:
scp /usr/local/bin/ai-tmux your-server:/usr/local/bin/ai-tmux

Anwendungsbeispiele

Sobald registriert, kann der KI-Agent diese MCP-Tools verwenden:

Lokale interaktive Shell:

create_local_session()                    → {session_id, type: "local"}
send_input(session_id, "cd /tmp && ls")   → {output: "...", is_complete: true}
send_input(session_id, "python3")         → start Python REPL
send_input(session_id, "print('hello')")  → {output: "hello\n>>>"}
send_control(session_id, "ctrl+d")        → exit Python
close_session(session_id)

SSH zu Remote-Server:

create_ssh_session(host: "myserver", user: "admin")
send_input(session_id, "top")
send_control(session_id, "ctrl+c")        → stop top

Auf Muster warten (v0.2.0):

create_local_session("ping myserver")
read_output(session_id, wait_for: "bytes from", timeout: 300)
→ blocks until server responds or 5 min timeout

send_input(session_id, "docker-compose up")
read_output(session_id, wait_for: "ready|error", timeout: 60, context_lines: 3)
→ returns matched line + 3 lines of context

Geheimnis / Passwort senden (v0.3.0):

# AI detects a password prompt, calls send_secret instead of handling the password itself
create_ssh_session(host: "router", user: "admin")
read_output(session_id, wait_for: "Password:")   → session is waiting for input

send_secret(session_id, prompt: "Router admin password:")
→ native GUI dialog appears on the operator's screen (macOS: system dialog,
   WSL2: Windows Get-Credential, Linux: zenity/kdialog)
→ operator types password — it is sent directly to the PTY session
→ AI only sees: {success: true, length: 12}
→ password never appears in AI context or logs

Persistente Sitzung (übersteht SSH-Verbindungsabbruch):

create_ssh_session(host: "server", user: "admin", persistent: true)
send_input(session_id, "make build")      → start long build
detach_session(session_id)                → disconnect, build continues

# Later (even after restart):
list_remote_sessions(host: "server", user: "admin")  → see running sessions
create_ssh_session(host: "server", user: "admin", session_id: "abc123")  → reattach
send_input(session_id, "echo $?")         → check build result

MCP-Tools

Tool

Beschreibung

create_local_session

Startet ein lokales interaktives Terminal (bash, python3, node, etc.)

create_ssh_session

SSH zu einem Remote-Host (unterstützt SSH-Konfigurations-Aliase)

create_serial_session

Verbindung zu einem seriellen Port-Gerät

send_input

Sendet einen Befehl und wartet auf die Stabilisierung der Ausgabe

read_output

Liest Ausgabe, wartet optional auf ein Muster (wait_for, timeout, context_lines, tail_lines)

send_control

Sendet Steuerungstasten (ctrl+c, ctrl+d, Pfeile, Tab, etc.)

send_secret

Fordert den menschlichen Bediener über einen GUI-Dialog zur Eingabe eines Geheimnisses auf; sendet es an die PTY-Sitzung, ohne es dem KI-Kontext oder den Protokollen preiszugeben ¹

list_sessions

Listet alle aktiven Sitzungen auf

close_session

Schließt eine Sitzung (beendet Remote-PTY)

detach_session

Trennt die Verbindung, lässt aber das Remote-PTY weiterlaufen

list_remote_sessions

Listet persistente Sitzungen auf einem Remote-Host auf

¹ send_secret Plattformunterstützung: macOS verwendet einen nativen Passwort-Dialog (osascript). WSL2 verwendet powershell.exe Get-Credential (Windows GUI-Dialog). Linux mit einem Display-Server verwendet zenity oder kdialog. Headless Linux greift auf /dev/tty zurück.

Audit-Protokoll

pty-mcp enthält eine optionale Audit-Protokoll-Funktion, die jeden send_input-Befehl an einen zentralen Kollektor aufzeichnet. Dies ermöglicht es Teams, zu überprüfen und nachzuvollziehen, was KI-Agenten während einer Sitzung getan haben.

Wichtig: Dies ist ein freiwilliges, selbstberichtendes Betriebsprotokoll. Es beruht darauf, dass die Bediener sich entscheiden, es zu aktivieren und den Kollektor auszuführen. Da pty-mcp auf dem eigenen Rechner des Bedieners läuft, gibt es keinen technischen Mechanismus, um die Protokollierung zu erzwingen – ein nicht konformer Bediener könnte pty-mcp einfach ohne aktiviertes Audit ausführen. Diese Funktion bietet Rückverfolgbarkeit für Teams, die dies wünschen, aber sie ist kein Ersatz für systemweite Audit-Tools (z. B. auditd, syslog-Weiterleitung, SSH-Sitzungsaufzeichnung) in Umgebungen, in denen Audit-Compliance erforderlich ist.

Was aufgezeichnet wird

  • Zeitstempel, Bedieneridentität, Sitzungs-ID, Sitzungstyp (lokal/ssh/seriell), Ziel-Host

  • Die exakte Eingabe, die über send_input gesendet wurde (einschließlich raw=true-Eingaben wie Menüauswahlen)

  • Ausgabeschnipsel (erste 2 KB) nach jedem Befehl

  • Eine cmd_id, die den Befehl mit seiner Ausgabe verknüpft

send_secret wird niemals protokolliert – Geheimnisse, die über den GUI-Dialog eingegeben werden, erscheinen nicht im Audit-Protokoll.

Einrichtung

Jeder Bediener führt dies einmal aus, um seine Konfiguration zu erstellen und ein Token zu generieren:

pty-mcp audit init

Dies erstellt ~/.config/pty-mcp/config (chmod 600) mit einem zufällig generierten Token und gibt das Token aus, um es mit dem Kollektor-Administrator zu teilen.

Der Kollektor-Administrator startet den Server (unter Verwendung des Tokens aus der Init-Ausgabe):

PTY_MCP_AUDIT_TOKEN=<token-from-init> \
  pty-mcp audit serve --port 9099 --log /var/log/pty-mcp-audit.jsonl

Audit aktivieren, nachdem die Kollektor-URL in der Konfiguration festgelegt wurde:

# Edit config and set: audit-url=http://your-collector:9099
pty-mcp audit enable
# Restart Claude Code to apply

Um die Protokollierung vorübergehend zu stoppen, ohne die Konfiguration zu verlieren:

pty-mcp audit disable

Bediener ohne Konfigurationsdatei sind nicht betroffen – Audit ist standardmäßig deaktiviert.

Audit-Modi

Modus

Verhalten

best-effort (Standard)

Befehle werden ausgeführt, unabhängig davon, ob das Protokoll geschrieben wurde; Einträge werden in die Warteschlange gestellt und im Hintergrund erneut versucht

strict

send_input wird abgelehnt, wenn der Audit-Eintrag nicht zugestellt werden kann; verwenden, wenn Protokollierung eine Team-Richtlinie ist

Protokolle überprüfen

Protokolle werden als JSONL gespeichert (ein JSON-Objekt pro Zeile), lesbar mit Standard-Tools:

# All commands by operator ray
grep '"user":"ray"' /var/log/pty-mcp-audit.jsonl | jq .

# Commands sent to a specific host
jq 'select(.target == "root@prod01")' /var/log/pty-mcp-audit.jsonl

ai-tmux: Persistenter Terminal-Daemon

ai-tmux ist ein leichtgewichtiger Daemon, der auf Remote-Servern läuft und PTY-Sitzungen über SSH-Verbindungsabbrüche hinweg am Leben erhält. Betrachten Sie es als ein für KI-Agenten entwickeltes tmux.

Auf Remote-Server installieren

# Cross-compile for Linux
GOOS=linux GOARCH=amd64 go build -o ai-tmux-linux ./cmd/ai-tmux/

# Copy to server
scp ai-tmux-linux server:~/ai-tmux
ssh server "chmod +x ~/ai-tmux && sudo mv ~/ai-tmux /usr/local/bin/ai-tmux"

Funktionsweise

  • ai-tmux server – Daemon-Modus, lauscht auf Unix-Socket, verwaltet PTY-Sitzungen

  • ai-tmux client – Bridge-Modus, leitet JSON-Protokoll über stdin/stdout weiter (wird von pty-mcp über SSH verwendet)

  • ai-tmux list – listet aktive Sitzungen auf

Der Daemon startet automatisch, wenn pty-mcp mit persistent: true verbindet. Sitzungen werden nach 30 Minuten Inaktivität beendet.

Unterstützung für SSH-Konfiguration

pty-mcp liest ~/.ssh/config, um Host-Aliase aufzulösen:

# ~/.ssh/config
Host myserver
    HostName 192.168.1.100
    User admin
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
create_ssh_session(host: "myserver", user: "admin")
# Automatically resolves hostname, port, and identity file

Anforderungen

  • Go 1.25+

  • Für seriell: entsprechende Geräteberechtigungen

  • Für persistente Sitzungen: ai-tmux-Binärdatei auf dem Remote-Server

Changelog

Siehe CHANGELOG.md für die Versionshistorie.

Lizenz

MIT

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
5dRelease cycle
27Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides a pseudo-terminal (PTY) interface that allows AI agents to interact with command-line tools requiring interactive prompts. It enables agents to autonomously spawn processes, read output, and send inputs for workflows like database migrations and project scaffolding.
    19
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides AI agents with fully interactive terminal sessions, including TUI support, keyboard control, and screen capture across Windows, Linux, and Mac.
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Remote-first tmux co-pilot that lets LLMs operate inside real tmux sessions with SSH-aware discovery, deterministic window/pane control, and pull-based state snapshots for grounded terminal assistance.
    40
    79
    AGPL 3.0

View all related MCP servers

Related MCP Connectors

  • Multi-tenant Telegram gateway for AI agents — HTTP+stdio, 8 tools, MTProto User API

  • Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.

  • Run AI customer support from your terminal: conversations, knowledge base, and chat widget.

View all MCP Connectors

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/raychao-oao/pty-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server