Skip to main content
Glama
WakkeWang

Serial Web Terminal MCP

by WakkeWang

Serial Web Terminal MCP

Python 3.11+ Лицензия: MIT Совместимость с MCP

Сервер Model Context Protocol, предоставляющий AI-ассистентам (Claude Code, Cursor, Windsurf и др.) возможность взаимодействовать с устройствами через последовательный порт.

AI-агенты могут подключаться к последовательным устройствам, отправлять команды и захватывать вывод — при этом пользователь наблюдает за всем процессом в реальном времени через браузерный терминал.

✨ Возможности

  • 🔌 Подключение по RS-232 — Подключайтесь к COM-портам, /dev/ttyUSB*, /dev/ttyS* и др. с автоматическим входом

  • 🖥️ Веб-терминал — Браузерный терминал xterm.js, показывающий последовательный ввод/вывод в реальном времени (как Xshell)

  • 🤖 MCP-сервер — Нативная интеграция инструментов; AI-агенты вызывают напрямую через протокол MCP

  • 📝 Логи с метками времени — Каждая строка логируется с меткой времени, ежедневная ротация, полное соответствие отображению в терминале

  • ⌨️ Двунаправленность — AI отправляет команды + пользователь может печатать вручную в браузерном терминале

  • 🌐 Многоязычный вход — Автоматически определяет приглашения входа/пароля на английском, китайском и японском

  • ⏱️ Ожидание и отправка — Ожидание конкретного вывода, затем немедленная отправка данных (например, окно пароля uboot)

  • 🛡️ Восстановление по тайм-ауту — Автоматический Ctrl+C при тайм-ауте, без зависших сессий

Related MCP server: UART MCP Server

📦 Установка

pip install mcp pyserial aiohttp

Или из зависимостей:

pip install -r requirements.txt

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

1. Настройте ваш AI-клиент

Claude Code (.mcp.json в корне проекта или ~/.claude/claude_config.json):

{
  "mcpServers": {
    "serial-terminal": {
      "command": "python",
      "args": ["/path/to/serial_mcp_server.py"]
    }
  }
}

Cursor (Настройки → MCP → Добавить сервер):

{
  "mcpServers": {
    "serial-terminal": {
      "command": "python",
      "args": ["/path/to/serial_mcp_server.py"]
    }
  }
}

См. examples/ для готовых файлов конфигурации.

2. Общайтесь с вашим AI-ассистентом

> List available serial ports
AI: [calls serial_list_ports] → Found COM3, COM4...

> Connect to COM3, username admin, password ****
AI: [calls serial_connect(port="COM3", login_user="admin", login_pass="****")]
    → Serial connected, Web terminal: http://localhost:8080

> Run uname -a
AI: [calls serial_send(command="uname -a")]
    → Linux device 4.19.246 aarch64 GNU/Linux

Откройте http://localhost:8080 в вашем браузере, чтобы наблюдать за операциями AI через последовательный порт в реальном времени.

🔧 Инструменты MCP

Инструмент

Описание

serial_list_ports

Список всех доступных устройств последовательного порта

serial_connect

Подключиться к последовательному порту и запустить веб-терминал (поддерживает автоматический вход)

serial_send

Отправить команду оболочки и получить вывод устройства

serial_raw

Отправить сырые данные (например, Ctrl+C = \x03)

serial_wait_send

Ожидать конкретный вывод, затем немедленно отправить данные (для критических по времени операций)

serial_status

Проверить текущий статус подключения

serial_log

Получить логи операций с метками времени

serial_disconnect

Отключиться и остановить веб-терминал

serial_connect

Подключиться к последовательному устройству с опциональным автоматическим входом.

Параметр

Тип

По умолчанию

Описание

port

str

(обязательно)

Имя последовательного устройства (например, COM3, /dev/ttyUSB0)

baudrate

int

115200

Скорость передачи данных (бод)

login_user

str

""

Имя пользователя для автоматического входа (пропустить, если пусто)

login_pass

str

""

Пароль для автоматического входа

init_cmd

str

unset TMOUT

Команда для выполнения после входа (предотвращает тайм-аут сессии)

web_port

int

8080

Порт веб-терминала

serial_send

Отправить команду оболочки и захватить вывод.

Параметр

Тип

По умолчанию

Описание

command

str

(обязательно)

Команда оболочки для выполнения

timeout

int

8

Тайм-аут ответа в секундах

serial_wait_send

Ожидать конкретную строку в выводе последовательного порта, затем немедленно отправить данные. Идеально подходит для:

  • Входа в uboot во время перезагрузки (3-секундное окно пароля)

  • Ответа на приглашения входа

  • Любой автоматизации «ожидать X, затем отправить Y»

Параметр

Тип

По умолчанию

Описание

wait_for

str

(обязательно)

Целевая строка для ожидания

send_data

str

(обязательно)

Данные для отправки при обнаружении цели

timeout

int

60

Максимальное время ожидания в секундах

trigger

str

""

Опциональные данные для отправки перед ожиданием (например, \r\n для повторного вызова статического приглашения)

🖥️ Автономное использование (без MCP)

serial_web.py может работать независимо через HTTP API:

# Start with auto-login
python serial_web.py --port COM3 --baud 115200 \
  --login-user admin --login-pass secret \
  --init-cmd "unset TMOUT"

# List available ports
python serial_web.py --list

HTTP API

# Send a command
curl -s -X POST http://localhost:8080/api/send \
     -H "Content-Type: application/json" \
     -d '{"command":"ls /","timeout":5}'

# Send raw data (Ctrl+C)
curl -s -X POST http://localhost:8080/api/raw \
     -H "Content-Type: application/json" \
     -d '{"data":"\x03"}'

# Wait-and-send
curl -s -X POST http://localhost:8080/api/wait-send \
     -H "Content-Type: application/json" \
     -d '{"wait_for":"login:","send_data":"admin","timeout":30}'

# Check status
curl -s http://localhost:8080/api/status

# Get logs
curl -s "http://localhost:8080/api/log?lines=50"

Аргументы командной строки

Аргумент

По умолчанию

Описание

--port

(обязательно)

Имя последовательного устройства (COM3, /dev/ttyUSB0)

--baud

115200

Скорость передачи данных (бод)

--web-port

8080

Порт веб-сервера

--login-user

(нет)

Имя пользователя для автоматического входа

--login-pass

(нет)

Пароль для автоматического входа

--init-cmd

unset TMOUT

Пост-логиновая команда (используйте ; для нескольких)

--prompt-regex

(авто)

Пользовательское регулярное выражение для обнаружения приглашения

--list

—

Список доступных последовательных портов

📝 Формат лога

Логи сохраняются в logs/serial_YYYYMMDD.log (ежедневная ротация):

2026-08-06 15:32:22  device # uname -a
2026-08-06 15:32:22  Linux device 4.19.246 aarch64 GNU/Linux
2026-08-06 15:32:23  device # cat /proc/cpuinfo | head -5
2026-08-06 15:32:23  processor	: 0
2026-08-06 15:32:23  >>> 自动登录流程完成
  • Вывод терминала: метка_времени содержимое (извлечено из буфера xterm.js — полностью соответствует отображению в браузере)

  • Системные события: метка_времени >>> сообщение (вход, запуск и т.д.)

Точность строк лога:

  • Нет разрывов переноса — строки, мягко перенесенные терминалом (80-колоночный перенос), объединяются обратно в одну логическую строку

  • Поддержка индикаторов прогресса — последовательности перезаписи \r (10%\r20%\r30%) сворачиваются в конечное видимое состояние (30%)

  • Поддержка Backspace — ручные правки с Backspace записываются как окончательная отредактированная строка

  • Каждая строка всегда имеет префикс с меткой времени

🏗️ Архитектура

AI Agent (Claude Code / Cursor / ...)
  └─ MCP Protocol (stdio)
      └─ serial_mcp_server.py
          └─ HTTP API
              └─ serial_web.py (aiohttp)
                  ├─ Serial Port (pyserial)
                  ├─ Web Terminal (xterm.js + WebSocket)
                  └─ Log Recording

Browser
  └─ http://localhost:8080
      ├─ xterm.js terminal (real-time serial data)
      └─ Log panel (timestamped logs)

📁 Структура проекта

serial-web-terminal/
├── serial_web.py              # Core: Web terminal + HTTP API
├── serial_mcp_server.py       # MCP Server (wraps HTTP API)
├── tests/
│   └── test_regression.py     # Regression test suite (68 tests)
├── examples/
│   ├── claude-code.json       # Claude Code MCP config
│   └── cursor.json            # Cursor MCP config
├── requirements.txt
├── LICENSE
└── README.md

🧪 Тестирование

Запустите набор регрессионных тестов (не требует физического последовательного устройства):

python tests/test_regression.py -v

Тесты охватывают:

  • Очистка вывода (удаление ANSI-кодов, удаление эха, удаление приглашений)

  • Обнаружение приглашений (приглашения оболочки, известные приглашения)

  • Буферизация строк логов (обработка Backspace, неполных строк, очистка ANSI)

  • Обнаружение ключевых слов автоматического входа (английский, китайский, японский)

  • Отправка/получение команд (мок-последовательный порт, тайм-аут, восстановление через Ctrl+C)

  • Ожидание и отправка (немедленное совпадение, динамическое совпадение, тайм-аут, триггер)

  • Структура HTML-страницы (без дублирующихся ID, обязательные элементы)

  • Регистрация инструментов MCP-сервера

  • Конечные точки HTTP API (статус, отправка, сырые данные, логи — обработка ошибок)

  • Безопасность (нет жестко закодированных учетных данных, покрытие .gitignore)

🌐 Автоматический вход

Процесс автоматического входа поддерживает многоязычные приглашения:

Язык

Приглашения входа

Приглашения пароля

Английский

login:

Password:

Китайский

登录: 用户名:

口令: 密码:

Японский

—

パスワード:

Процесс входа:

  1. Отправить Enter для пробуждения терминала

  2. Обнаружить приглашение login: → отправить имя пользователя

  3. Обнаружить приглашение Password: → отправить пароль

  4. Ожидать приглашение оболочки

  5. Выполнить stty cols 200 (широкий терминал, предотвращает 80-колоночный перенос)

  6. Выполнить --init-cmd (по умолчанию: unset TMOUT)

Если уже выполнен вход (приглашение входа не обнаружено), пропустить шаги со 2 по 4.

📄 Лицензия

MIT

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants to interact with physical serial port devices across platforms (Windows COM/Linux tty) with support for asynchronous communication, URC pattern recognition, and structured logging.
    1
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to communicate with serial port devices, supporting port management, data transmission in text/binary modes, interactive terminal sessions, and automatic reconnection.
    14
    12
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Allows AI agents to interact with serial devices via RS232/UART, enabling port listing, connection, read/write, control line manipulation, and protocol specification for automated debugging and testing.
    27
    52 PyPI
    24
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to communicate with UART/serial devices, offering tools for port management, data read/write, and protocol handling.
    MIT