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* 등에 자동 로그인으로 연결

  • 🖥️ 웹 터미널 — 실시간 시리얼 I/O를 보여주는 xterm.js 브라우저 터미널(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  >>> 自动登录流程完成
  • 터미널 출력: timestamp content (xterm.js 버퍼에서 추출 — 브라우저 표시와 정확히 일치)

  • 시스템 이벤트: timestamp >>> message (로그인, 시작 등)

로그 줄 충실도:

  • 줄 바꿈 분할 없음 — 터미널에서 소프트 래핑된 줄(80열 래핑)은 단일 논리 줄로 병합

  • 진행률 표시 인식 — \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 엔드포인트(상태, 전송, 원시, 로그 — 오류 처리)

  • 보안(하드코딩된 자격 증명 없음, .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