Serial Web Terminal MCP
Serial Web Terminal 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
Инструмент | Описание |
| Список всех доступных устройств последовательного порта |
| Подключиться к последовательному порту и запустить веб-терминал (поддерживает автоматический вход) |
| Отправить команду оболочки и получить вывод устройства |
| Отправить сырые данные (например, Ctrl+C = |
| Ожидать конкретный вывод, затем немедленно отправить данные (для критических по времени операций) |
| Проверить текущий статус подключения |
| Получить логи операций с метками времени |
| Отключиться и остановить веб-терминал |
serial_connect
Подключиться к последовательному устройству с опциональным автоматическим входом.
Параметр | Тип | По умолчанию | Описание |
| str | (обязательно) | Имя последовательного устройства (например, |
| int |
| Скорость передачи данных (бод) |
| str |
| Имя пользователя для автоматического входа (пропустить, если пусто) |
| str |
| Пароль для автоматического входа |
| str |
| Команда для выполнения после входа (предотвращает тайм-аут сессии) |
| int |
| Порт веб-терминала |
serial_send
Отправить команду оболочки и захватить вывод.
Параметр | Тип | По умолчанию | Описание |
| str | (обязательно) | Команда оболочки для выполнения |
| int |
| Тайм-аут ответа в секундах |
serial_wait_send
Ожидать конкретную строку в выводе последовательного порта, затем немедленно отправить данные. Идеально подходит для:
Входа в uboot во время перезагрузки (3-секундное окно пароля)
Ответа на приглашения входа
Любой автоматизации «ожидать X, затем отправить Y»
Параметр | Тип | По умолчанию | Описание |
| str | (обязательно) | Целевая строка для ожидания |
| str | (обязательно) | Данные для отправки при обнаружении цели |
| int |
| Максимальное время ожидания в секундах |
| str |
| Опциональные данные для отправки перед ожиданием (например, |
🖥️ Автономное использование (без 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 --listHTTP 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"Аргументы командной строки
Аргумент | По умолчанию | Описание |
| (обязательно) | Имя последовательного устройства (COM3, /dev/ttyUSB0) |
|
| Скорость передачи данных (бод) |
|
| Порт веб-сервера |
| (нет) | Имя пользователя для автоматического входа |
| (нет) | Пароль для автоматического входа |
|
| Пост-логиновая команда (используйте |
| (авто) | Пользовательское регулярное выражение для обнаружения приглашения |
| — | Список доступных последовательных портов |
📝 Формат лога
Логи сохраняются в 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)
🌐 Автоматический вход
Процесс автоматического входа поддерживает многоязычные приглашения:
Язык | Приглашения входа | Приглашения пароля |
Английский |
|
|
Китайский |
|
|
Японский | — |
|
Процесс входа:
Отправить Enter для пробуждения терминала
Обнаружить приглашение
login:→ отправить имя пользователяОбнаружить приглашение
Password:→ отправить парольОжидать приглашение оболочки
Выполнить
stty cols 200(широкий терминал, предотвращает 80-колоночный перенос)Выполнить
--init-cmd(по умолчанию:unset TMOUT)
Если уже выполнен вход (приглашение входа не обнаружено), пропустить шаги со 2 по 4.
📄 Лицензия
This server cannot be deployed
Maintenance
Related MCP Connectors
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Connect AI assistants to explicitly paired computers, servers, and VMs for permitted remote actions.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables 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-
- AlicenseAqualityCmaintenanceEnables AI assistants to communicate with serial port devices, supporting port management, data transmission in text/binary modes, interactive terminal sessions, and automatic reconnection.1412MIT
- AlicenseAqualityBmaintenanceAllows 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.2752 PyPI24MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to communicate with UART/serial devices, offering tools for port management, data read/write, and protocol handling.MIT