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 при тайм-ауте, без зависших сессий
📦 Установка
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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
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 your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/WakkeWang/serial-terminal-mcp-tool'
If you have feedback or need assistance with the MCP directory API, please join our Discord server