Serial Web Terminal MCP
Serial Web Terminal MCP
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, 세션 중단 없음
📦 설치
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 도구
도구 | 설명 |
| 사용 가능한 모든 시리얼 포트 장치 나열 |
| 시리얼 포트에 연결하고 웹 터미널 시작(자동 로그인 지원) |
| 셸 명령을 보내고 장치 출력 반환 |
| 원시 데이터 전송(예: 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"CLI 인수
인수 | 기본값 | 설명 |
| (필수) | 시리얼 장치 이름(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 >>> 自动登录流程完成터미널 출력:
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 적용)
🌐 자동 로그인
자동 로그인 흐름은 다국어 프롬프트를 지원합니다:
언어 | 로그인 프롬프트 | 비밀번호 프롬프트 |
영어 |
|
|
중국어 |
|
|
일본어 | — |
|
로그인 흐름:
Enter를 보내 터미널 깨우기
login:프롬프트 감지 → 사용자 이름 전송Password:프롬프트 감지 → 비밀번호 전송셸 프롬프트 대기
stty cols 200실행(넓은 터미널, 80열 래핑 방지)--init-cmd실행(기본값:unset TMOUT)
이미 로그인된 경우(로그인 프롬프트가 감지되지 않음), 5단계로 건너뜁니다.
📄 라이선스
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