Skip to main content
Glama
lightos

Interactive Shell MCP

by lightos

Interaktive Shell MCP

License: MIT Node.js MCP

MCP-Server für interaktive Shell-Sitzungen mit TUI-Unterstützung. Bietet KI-Agenten persistente Terminals, interaktive Prompt-Navigation, gerendertes Bildschirmlesen und Ausgabesuche.

Demo

Ohne MCP

Mit MCP

Ohne MCP

Mit MCP

"htop ist interaktiv und kann nicht ausgeführt werden"

Startet htop, liest den Bildschirm, extrahiert Prozessdaten (2x Geschwindigkeit)

Warum existiert dies?

Die meisten KI-Coding-Tools führen Shell-Befehle isoliert aus: Jeder Befehl startet eine neue Shell, interaktive Prompts sind unmöglich und TUI-Apps geben nur rohe Escape-Codes aus. Dieser MCP-Server bietet persistente PTY-Sitzungen mit einem virtuellen Terminal-Emulator (@xterm/headless), sodass Agenten den Shell-Zustand beibehalten, mit den Pfeiltasten durch interaktive Prompts navigieren und gerenderte Terminalbildschirme als sauberen Text lesen können.

Drei Ausgabemodi:

Modus

Am besten für

Was Sie erhalten

streaming

Reguläre Befehle (ls, git, npm)

Rohe sequentielle Ausgabe, wird nach dem Lesen gelöscht

snapshot

Live-aktualisierende Apps (top, htop)

Ende des aktuellen Terminal-Puffers

screen

TUI-Apps, Prompts, alles Visuelle

Gerendertes 2D-Textgitter (was ein Mensch sieht)

Schnellstart

git clone https://github.com/lightos/interactive-shell-mcp.git
cd interactive-shell-mcp
npm install && npm run build
claude mcp add interactive-shell node dist/src/server.js

Fragen Sie dann Claude: "Überwache htop und sag mir, was am meisten CPU verbraucht"

Funktionen

  • Gerendertes Bildschirmlesen von TUI-Apps via @xterm/headless

  • waitForIdle über alle Lesetools hinweg (kein Raten mehr mit sleep)

  • Bildschirmsuche mit Text- und Regex-Musterabgleich

  • Extraktion rechteckiger Bereiche mit Zeilen-/Spaltenkoordinaten

  • Shell-Allowlist: bash, zsh, fish, sh, dash, ksh, powershell.exe, pwsh, cmd.exe

  • Automatische Bereinigung nach 10 Minuten Leerlauf, Erkennung des Exit-Codes für 60 Sekunden nach Prozessbeendigung

  • Plattformübergreifend: Unix/Linux/macOS + Windows

Anwendungsfälle

  • Interaktives Scaffolding & Migrationen: npx create-next-app, drizzle-kit push, prisma migrate, npm init oder jede inquirer/clack-basierte CLI

  • Systemüberwachung: htop, btop, top, iftop, duf mit Prozesssuche und Bereichsextraktion

  • DevOps TUIs: lazydocker, lazygit, k9s, terraform console

  • Remote-Sitzungen: ssh auf Server, einschließlich verschachtelter TUI-Apps über SSH

  • Datenbank-CLIs: psql, mysql, redis-cli, mongosh im interaktiven Modus

  • Netzwerk-Tools: netcat/ncat, nmap, airodump-ng, tcpdump

  • REPLs & Debugger: python, node, irb, gdb/lldb

  • Texteditoren: vim, nano, emacs -nw

MCP-Konfiguration

Claude Code (CLI)

claude mcp add interactive-shell node /path/to/interactive-shell-mcp/dist/src/server.js

Claude Desktop

Hinzufügen zu ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) oder %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "interactive-shell": {
      "command": "node",
      "args": ["/path/to/interactive-shell-mcp/dist/src/server.js"]
    }
  }
}

VS Code / Cursor

Hinzufügen zu Ihren MCP-Einstellungen (.vscode/mcp.json oder ~/.cursor/mcp.json):

{
  "mcpServers": {
    "interactive-shell": {
      "command": "node",
      "args": ["/path/to/interactive-shell-mcp/dist/src/server.js"]
    }
  }
}

Tools-Referenz

start_shell_session

Startet eine neue PTY-Shell mit einem virtuellen Terminal-Emulator.

Parameter

Typ

Erforderlich

Beschreibung

cols

number

nein

Terminal-Spalten (Standard: 120, max: 500)

rows

number

nein

Terminal-Zeilen (Standard: 40, max: 200)

shell

string

nein

Zu verwendende Shell (Standard: $SHELL oder bash)

cwd

string

nein

Arbeitsverzeichnis (Standard: Server-cwd)

Gibt { sessionId, cols, rows } zurück

send_shell_input

Schreibt Eingaben in das PTY. Hängt standardmäßig einen Wagenrücklauf (Carriage Return) an.

Parameter

Typ

Erforderlich

Beschreibung

sessionId

string

ja

Sitzungs-ID

input

string

ja

Zu sendender Text. Raw-Modus: \x1b[A (hoch), \x1b[B (runter), \r (enter)

raw

boolean

nein

Senden ohne CR-Anhängung. Parsed Escape-Sequenzen. (Standard: false)

read_shell_output

Liest die Ausgabe vom PTY. Drei Modi: streaming (Standard), snapshot, screen.

Parameter

Typ

Erforderlich

Beschreibung

sessionId

string

ja

Sitzungs-ID

mode

string

nein

"streaming", "snapshot" oder "screen"

waitForIdle

number

nein

Warten auf N ms Stille vor dem Lesen (max: 5000ms)

maxBytes

number

nein

Max. Bytes für Streaming-Modus (Standard: 100KB)

snapshotSize

number

nein

Snapshot-Puffergröße (Standard: 50KB)

rows

number

nein

Screen-Modus: Startzeile (0-basiert)

rowEnd

number

nein

Screen-Modus: Endzeile (exklusiv)

includeEmpty

boolean

nein

Screen-Modus: Leere Zeilen am Ende einbeziehen (Standard: true)

trimWhitespace

boolean

nein

Screen-Modus: Leerzeichen am Zeilenende entfernen (Standard: false)

Der Screen-Modus gibt die Cursorposition, Terminalabmessungen und den Status des alternativen Puffers in den Metadaten zurück.

get_screen_region

Extrahiert Text aus einem rechteckigen Bereich des Bildschirms.

Parameter

Typ

Erforderlich

Beschreibung

sessionId

string

ja

Sitzungs-ID

startRow

number

ja

Startzeile (0-basiert, inklusiv)

startCol

number

ja

Startspalte (0-basiert, inklusiv)

endRow

number

ja

Endzeile (exklusiv)

endCol

number

ja

Endspalte (exklusiv)

trimWhitespace

boolean

nein

Leerzeichen am Zeilenende entfernen (Standard: false)

waitForIdle

number

nein

Warten auf N ms Stille vor dem Lesen (max: 5000ms)

get_screen_cursor

Ruft die Cursorposition und den Text der aktuellen Zeile ab.

Parameter

Typ

Erforderlich

Beschreibung

sessionId

string

ja

Sitzungs-ID

waitForIdle

number

nein

Warten auf N ms Stille vor dem Lesen (max: 5000ms)

Gibt { cursor: { x, y }, currentLine, isAlternateBuffer } zurück

search_screen

Durchsucht den Terminalbildschirm nach Text oder Regex. Gibt bis zu 50 Treffer zurück.

Parameter

Typ

Erforderlich

Beschreibung

sessionId

string

ja

Sitzungs-ID

pattern

string

ja

Text- oder Regex-Muster

regex

boolean

nein

Muster als Regex behandeln (Standard: false)

waitForIdle

number

nein

Warten auf N ms Stille vor dem Lesen (max: 5000ms)

Gibt { results: [{ row, col, text }], count } zurück

list_sessions

Listet alle aktiven Sitzungen mit Metadaten auf. Keine Parameter.

Gibt { sessions: [{ sessionId, shell, cols, rows, isAlternateBuffer, idleSeconds }] } zurück

resize_shell

Ändert die Größe des Terminals einer aktiven Sitzung.

Parameter

Typ

Erforderlich

Beschreibung

sessionId

string

ja

Sitzungs-ID

cols

number

ja

Neue Spalten (1-500)

rows

number

ja

Neue Zeilen (1-200)

end_shell_session

Schließt das PTY und bereinigt Ressourcen.

Parameter

Typ

Erforderlich

Beschreibung

sessionId

string

ja

Sitzungs-ID

Nutzungsbeispiele

Diese zeigen die MCP-Tool-Aufrufmuster für Entwickler, die Integrationen erstellen. Endbenutzer kommunizieren einfach natürlich mit ihrem KI-Agenten.

Lesen einer TUI-App

await send_shell_input(sessionId, "htop");
const { output, metadata } = await read_shell_output(sessionId, {
  mode: "screen",
  waitForIdle: 500
});
// output: rendered htop as clean text (CPU bars, process table, etc.)
// metadata.isAlternateBuffer: true (htop uses alternate screen)

// Extract just the process list (rows 6-30)
const processes = await get_screen_region(sessionId, {
  startRow: 6, startCol: 0, endRow: 30, endCol: 120,
  trimWhitespace: true
});

Navigieren durch interaktive Prompts

// Send arrow keys and enter in raw mode
await send_shell_input(sessionId, "\\x1b[B", { raw: true });  // down arrow
await send_shell_input(sessionId, " ", { raw: true });         // space to select
await send_shell_input(sessionId, "\\r", { raw: true });       // enter to confirm

// Read what the prompt looks like now
const screen = await read_shell_output(sessionId, {
  mode: "screen", waitForIdle: 300
});

Warten auf Befehlsausgabe

await send_shell_input(sessionId, "npm install");
const output = await read_shell_output(sessionId, {
  waitForIdle: 1000  // wait for 1s of silence
});

Suchen nach Inhalten

// Find all error lines
const errors = await search_screen(sessionId, {
  pattern: "error|Error|ERROR",
  regex: true,
  waitForIdle: 500
});
// [{ row: 12, col: 0, text: "Error" }, ...]

Sitzungsverhalten

  • Automatische Bereinigung: Sitzungen, die länger als 10 Minuten im Leerlauf sind, werden automatisch verworfen

  • Exit-Erkennung: Wenn eine Shell beendet wird, geben Tools für 60 Sekunden "Session exited with code N" zurück, anstatt eines generischen Fehlers für eine ungültige ID

  • Shell-Allowlist: Nur bekannte Shells können gestartet werden (bash, zsh, fish, sh, dash, ksh, powershell.exe, pwsh, cmd.exe). Unbekannte Werte fallen auf den Plattform-Standard zurück.

Lizenz

MIT

-
security - not tested
A
license - permissive license
-
quality - not tested

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/lightos/interactive-shell-mcp'

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