Skip to main content
Glama
WakkeWang

Serial Web Terminal MCP

by WakkeWang

Serial Web Terminal MCP

Python 3.11+ License: MIT MCP Compatible

Model Context Protocol サーバーで、AIコーディングアシスタント(Claude Code、Cursor、Windsurfなど)にシリアルポートデバイスとの対話機能を提供します。

AIエージェントはシリアルデバイスに接続し、コマンドを送信し、出力を取得できます。ユーザーはブラウザベースのターミナルを通じてプロセス全体をリアルタイムで監視できます。

✨ 機能

  • 🔌 シリアル接続 — COMポート、/dev/ttyUSB*、/dev/ttyS*などに接続し、自動ログイン対応

  • 🖥️ ウェブターミナル — xterm.js ブラウザターミナルでリアルタイムシリアルI/Oを表示(Xshellのような)

  • 🤖 MCPサーバー — ネイティブツール統合。AIエージェントがMCPプロトコル経由で直接呼び出し

  • 📝 タイムスタンプ付きログ — すべての行にタイムスタンプ付きで記録、日次ローテーション、ターミナル表示と完全一致

  • ⌨️ 双方向 — AIがコマンド送信+ユーザーがブラウザターミナルで手動入力可能

  • 🌐 多言語ログイン — 英語、中国語、日本語のログイン/パスワードプロンプトを自動検出

  • ⏱️ 待機&送信 — 特定の出力を待ってから即座にデータを送信(例:ubootパスワードウィンドウ)

  • 🛡️ タイムアウト回復 — タイムアウト時に自動Ctrl+C、セッションがハングしない

Related MCP server: UART MCP Server

📦 インストール

pip install mcp pyserial aiohttp

または requirements から:

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"

CLI引数

引数

デフォルト

説明

--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桁折り返し)は、1つの論理行にマージ

  • プログレスバー対応 — \r 上書きシーケンス(10%\r20%\r30%)は最終表示状態(30%)に整理

  • バックスペース対応 — バックスペースによる手動編集は、最終編集行として記録

  • すべての行には常にタイムスタンププレフィックスが付きます

🏗️ アーキテクチャ

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除去、エコー除去、プロンプト除去)

  • プロンプト検出(シェルプロンプト、既知のプロンプト)

  • ログ行バッファリング(バックスペース処理、部分行、ANSIクリーニング)

  • 自動ログインキーワード検出(英語、中国語、日本語)

  • コマンド送信/受信(モックシリアル、タイムアウト、Ctrl+C回復)

  • 待機&送信(即時マッチ、動的マッチ、タイムアウト、トリガー)

  • HTMLページ構造(重複IDなし、必須要素)

  • MCPサーバーツール登録

  • HTTP APIエンドポイント(status、send、raw、log — エラーハンドリング)

  • セキュリティ(ハードコードされた認証情報なし、.gitignoreのカバレッジ)

🌐 自動ログイン

自動ログインフローは多言語プロンプトに対応:

言語

ログインプロンプト

パスワードプロンプト

英語

login:

Password:

中国語

登录: 用户名:

口令: 密码:

日本語

—

パスワード:

ログインフロー:

  1. Enterキーを送信してターミナルを起動

  2. login: プロンプトを検出 → ユーザー名を送信

  3. Password: プロンプトを検出 → パスワードを送信

  4. シェルプロンプトを待機

  5. stty cols 200 を実行(ワイドターミナル、80桁折り返し防止)

  6. --init-cmd を実行(デフォルト: unset TMOUT)

既にログインしている場合(ログインプロンプトが検出されない場合)、ステップ5にスキップします。

📄 ライセンス

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