Skip to main content
Glama
lightos

Interactive Shell MCP

by lightos

Interactive Shell MCP

License: MIT Node.js MCP

MCP-сервер для интерактивных сеансов оболочки с поддержкой TUI. Предоставляет ИИ-агентам постоянные терминалы, интерактивную навигацию по подсказкам, чтение отрисованного экрана и поиск по выводу.

Демонстрация

Без MCP

С MCP

Без MCP

С MCP

"htop интерактивен и не может быть запущен"

Запускает htop, считывает экран, извлекает данные о процессах (в 2 раза быстрее)

Зачем это нужно

Большинство инструментов для кодинга с ИИ запускают команды оболочки изолированно: каждая команда начинает новую оболочку, интерактивные подсказки невозможны, а TUI-приложения просто выводят «сырые» escape-коды. Этот MCP-сервер предоставляет постоянные PTY-сеансы с эмулятором виртуального терминала (@xterm/headless), чтобы агенты могли сохранять состояние оболочки, перемещаться по интерактивным подсказкам с помощью клавиш со стрелками и читать отрисованные экраны терминала как обычный текст.

Три режима вывода:

Режим

Лучше всего подходит для

Что вы получаете

streaming

Обычные команды (ls, git, npm)

«Сырой» последовательный вывод, очищается после чтения

snapshot

Обновляемые в реальном времени приложения (top, htop)

Текущий буфер терминала

screen

TUI-приложения, подсказки, визуальный контент

Отрисованная 2D-сетка текста (то, что видит человек)

Быстрый старт

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

Затем спросите Claude: "отслеживай htop и скажи, что потребляет больше всего CPU"

Функции

  • Чтение отрисованного экрана из TUI-приложений через @xterm/headless

  • waitForIdle для всех инструментов чтения (больше не нужно угадывать с sleep)

  • Поиск по экрану с использованием текста и регулярных выражений

  • Извлечение прямоугольных областей с координатами строк/столбцов

  • Белый список оболочек: bash, zsh, fish, sh, dash, ksh, powershell.exe, pwsh, cmd.exe

  • Автоматическая очистка после 10 минут простоя, обнаружение кода выхода в течение 60 секунд после завершения процесса

  • Кроссплатформенность: Unix/Linux/macOS + Windows

Варианты использования

  • Интерактивное создание каркасов и миграции: npx create-next-app, drizzle-kit push, prisma migrate, npm init или любой CLI на базе inquirer/clack

  • Мониторинг системы: htop, btop, top, iftop, duf с поиском процессов и извлечением областей

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

  • Удаленные сеансы: ssh на серверы, включая вложенные TUI-приложения через SSH

  • CLI баз данных: psql, mysql, redis-cli, mongosh в интерактивном режиме

  • Сетевые инструменты: netcat/ncat, nmap, airodump-ng, tcpdump

  • REPL и отладчики: python, node, irb, gdb/lldb

  • Текстовые редакторы: vim, nano, emacs -nw

Конфигурация MCP

Claude Code (CLI)

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

Claude Desktop

Добавьте в ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) или %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

Добавьте в настройки MCP (.vscode/mcp.json или ~/.cursor/mcp.json):

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

Справочник инструментов

start_shell_session

Запуск новой PTY-оболочки с эмулятором виртуального терминала.

Параметр

Тип

Обязателен

Описание

cols

number

нет

Столбцы терминала (по умолчанию: 120, макс: 500)

rows

number

нет

Строки терминала (по умолчанию: 40, макс: 200)

shell

string

нет

Используемая оболочка (по умолчанию: $SHELL или bash)

cwd

string

нет

Рабочая директория (по умолчанию: рабочая директория сервера)

Возвращает { sessionId, cols, rows }

send_shell_input

Запись ввода в PTY. По умолчанию добавляет возврат каретки.

Параметр

Тип

Обязателен

Описание

sessionId

string

да

ID сеанса

input

string

да

Текст для отправки. Raw-режим: \x1b[A (вверх), \x1b[B (вниз), \r (enter)

raw

boolean

нет

Отправка без добавления CR. Парсит escape-последовательности. (по умолчанию: false)

read_shell_output

Чтение вывода из PTY. Три режима: streaming (по умолчанию), snapshot, screen.

Параметр

Тип

Обязателен

Описание

sessionId

string

да

ID сеанса

mode

string

нет

"streaming", "snapshot" или "screen"

waitForIdle

number

нет

Ожидание N мс тишины перед чтением (макс: 5000 мс)

maxBytes

number

нет

Макс. байт для режима streaming (по умолчанию: 100 КБ)

snapshotSize

number

нет

Размер буфера снимка (по умолчанию: 50 КБ)

rows

number

нет

Режим screen: начальная строка (с 0)

rowEnd

number

нет

Режим screen: конечная строка (исключая)

includeEmpty

boolean

нет

Режим screen: включать пустые строки в конце (по умолчанию: true)

trimWhitespace

boolean

нет

Режим screen: обрезать пробелы в конце каждой строки (по умолчанию: false)

Режим screen возвращает позицию курсора, размеры терминала и состояние альтернативного буфера в метаданных.

get_screen_region

Извлечение текста из прямоугольной области экрана.

Параметр

Тип

Обязателен

Описание

sessionId

string

да

ID сеанса

startRow

number

да

Начальная строка (с 0, включая)

startCol

number

да

Начальный столбец (с 0, включая)

endRow

number

да

Конечная строка (исключая)

endCol

number

да

Конечный столбец (исключая)

trimWhitespace

boolean

нет

Обрезать пробелы в конце каждой строки (по умолчанию: false)

waitForIdle

number

нет

Ожидание N мс тишины перед чтением (макс: 5000 мс)

get_screen_cursor

Получение позиции курсора и текста текущей строки.

Параметр

Тип

Обязателен

Описание

sessionId

string

да

ID сеанса

waitForIdle

number

нет

Ожидание N мс тишины перед чтением (макс: 5000 мс)

Возвращает { cursor: { x, y }, currentLine, isAlternateBuffer }

search_screen

Поиск текста или регулярного выражения на экране терминала. Возвращает до 50 совпадений.

Параметр

Тип

Обязателен

Описание

sessionId

string

да

ID сеанса

pattern

string

да

Текст или шаблон регулярного выражения

regex

boolean

нет

Обрабатывать шаблон как регулярное выражение (по умолчанию: false)

waitForIdle

number

нет

Ожидание N мс тишины перед чтением (макс: 5000 мс)

Возвращает { results: [{ row, col, text }], count }

list_sessions

Список всех активных сеансов с метаданными. Без параметров.

Возвращает { sessions: [{ sessionId, shell, cols, rows, isAlternateBuffer, idleSeconds }] }

resize_shell

Изменение размера терминала активного сеанса.

Параметр

Тип

Обязателен

Описание

sessionId

string

да

ID сеанса

cols

number

да

Новые столбцы (1-500)

rows

number

да

Новые строки (1-200)

end_shell_session

Закрытие PTY и очистка ресурсов.

Параметр

Тип

Обязателен

Описание

sessionId

string

да

ID сеанса

Примеры использования

Здесь показаны шаблоны вызовов инструментов MCP для разработчиков, создающих интеграции. Конечные пользователи просто общаются со своим ИИ-агентом естественным образом.

Чтение TUI-приложения

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
});

Навигация по интерактивным подсказкам

// 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
});

Ожидание вывода команды

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

Поиск контента

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

Поведение сеанса

  • Автоматическая очистка: Сеансы, простаивающие более 10 минут, автоматически удаляются

  • Обнаружение выхода: Когда оболочка завершается, инструменты возвращают "Session exited with code N" в течение 60 секунд вместо общей ошибки о неверном ID

  • Белый список оболочек: Можно запускать только известные оболочки (bash, zsh, fish, sh, dash, ksh, powershell.exe, pwsh, cmd.exe). Неизвестные значения возвращаются к платформе по умолчанию.

Лицензия

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