MCP Virtual User
MCP Virtual User
Docker 컨테이너 속의 가상 인간입니다. 귀, 입, 눈, 손이 있습니다.
이것은 무엇인가요?
음성과 브라우저를 통해 웹 앱과 상호작용하는 실제 사용자를 시뮬레이션하는 완전한 독립형 환경입니다. 다음을 갖추고 있습니다:
가상 마이크 — MCP가 어떤 앱이든 하드웨어 마이크에서 오는 것으로 인식하는 오디오(TTS 또는 원본)를 주입할 수 있습니다.
가상 스피커 — MCP가 OS에서 재생하는 모든 오디오를 캡처하여 텍스트로 변환할 수 있습니다.
실제 브라우저 — Playwright로 조작 가능한 Chromium, 영구 로그인 세션 유지.
실제 디스플레이 — 디버깅용 Xvfb + VNC (실시간으로 상황을 지켜볼 수 있습니다).
MCP 인터페이스 — 모든 기능이 Streamable HTTP를 통해 도구로 노출됩니다.
Related MCP server: Lotus MCP
사용 사례
ChatGPT 음성 모드 테스트 — 마이크에 "What's the weather?"를 주입하고, ChatGPT의 음성 응답을 캡처한 다음 텍스트로 변환하여 검증합니다.
Gemini Live 테스트 — Google의 음성 AI를 대상으로 동일한 흐름을 실행합니다.
자사 Mobile Mesh UI 테스트 — 자체 앱을 대상으로 종단 간(end-to-end) 음성 대화 테스트를 수행합니다.
모든 음성 지원 웹 앱 — 브라우저의 마이크/스피커를 사용하는 앱이라면 무엇이든 테스트할 수 있습니다.
아키텍처
┌─────────────────────────────────────────────────────────────┐
│ Docker Container │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ MCP Server (port 8360) │ │
│ │ │ │
│ │ Audio Tools: │ │
│ │ tts_to_mic(text) → Piper TTS → virtual mic │ │
│ │ transcribe_speakers() → parec → Whisper STT │ │
│ │ inject_audio(b64) → raw audio → virtual mic │ │
│ │ capture_audio(secs) → raw audio from speakers │ │
│ │ wait_for_speech() → detect + transcribe │ │
│ │ │ │
│ │ Browser Tools: │ │
│ │ browser_navigate, click, type, screenshot, etc. │ │
│ │ browser_grant_mic_permission(origin) │ │
│ │ │ │
│ │ Screen Tools: │ │
│ │ screen_screenshot, screen_size, vnc_url │ │
│ └──────────┬──────────────────────────┬───────────────┘ │
│ │ │ │
│ ┌──────────▼──────────┐ ┌───────────▼───────────────┐ │
│ │ PulseAudio │ │ Playwright + Chromium │ │
│ │ │ │ │ │
│ │ virtual_mic ◀──────│──│── browser reads as mic │ │
│ │ (pipe-source) │ │ │ │
│ │ │ │ browser plays audio ──▶ │ │
│ │ virtual_speaker ───│──│── captured via .monitor │ │
│ │ (null-sink) │ │ │ │
│ └─────────────────────┘ └───────────────────────────┘ │
│ │
│ ┌─────────────────────┐ ┌───────────────────────────┐ │
│ │ Xvfb :99 │ │ x11vnc + noVNC │ │
│ │ 1920x1080x24 │ │ port 5900 / 6080 │ │
│ └─────────────────────┘ └───────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘빠른 시작
# Build and start
docker compose up -d --build
# Watch the virtual display (open in your browser)
open http://localhost:6080/vnc.html?autoconnect=true
# Test the MCP server
curl http://localhost:8360/mcp -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"health","arguments":{}}}'
# Run smoke tests
bash test-smoke.sh첫 설정(1회만)
# 1. Build and start
docker compose up -d --build
# 2. Open VNC in your browser to see the desktop
open http://localhost:6080/vnc.html?autoconnect=true
# 3. In the VNC window, Chromium is running. Log into:
# - https://chat.openai.com (ChatGPT)
# - https://gemini.google.com (Gemini)
# 4. Export cookies to DragonsKeep so they persist
bash scripts/export-browser-cookies.sh
# 5. Done! Future container starts auto-inject the stored sessions.테스트 실행
# Infrastructure tests (no login required)
cd tests && pip install -r requirements.txt
pytest test_audio_roundtrip.py test_browser.py -v
# ChatGPT conversation tests (requires login)
pytest test_conversations.py -v -m chatgpt --timeout=120
# Gemini conversation tests
pytest test_conversations.py -v -m gemini --timeout=120
# Our Mesh UI conversation tests
pytest test_conversations.py -v -m meshui --timeout=120
# All conversation tests
pytest test_conversations.py -v --timeout=120예제: ChatGPT 음성 모드 테스트
# From any MCP client (Kiro, our mesh agent, etc.)
# 1. Navigate to ChatGPT
browser_navigate("https://chat.openai.com")
# 2. Grant mic permission
browser_grant_mic_permission("https://chat.openai.com")
# 3. Click the voice mode button
browser_click("[data-testid='voice-mode-button']")
# 4. Speak a question (injected into the virtual mic)
tts_to_mic("What is the capital of France?")
# 5. Wait for ChatGPT to respond and transcribe what it says
response = wait_for_speech(timeout_seconds=15)
# response == "The capital of France is Paris."
# 6. Assert
assert "Paris" in response세션 관리
로그인 세션은 ./data/browser-profile/(마운트된 볼륨)에 유지됩니다.
ChatGPT/Gemini 인증 토큰은 암호 관리자를 사용하세요:
쿠키를 암호 관리자에
chatgpt-session/gemini-session으로 저장합니다.컨테이너 시작 시 이 쿠키를 브라우저 프로필에 주입합니다.
또는: VNC(http://localhost:6080)에서 한 번 직접 로그인하면 세션이 유지됩니다.
포트
포트 | 서비스 |
8360 | MCP 서버(Streamable HTTP) |
6080 | noVNC(브라우저 기반 VNC 뷰어) |
5900 | VNC 직접 연결 |
MCP 도구
오디오
도구 | 설명 |
| 텍스트를 합성하여 마이크 입력으로 주입 |
| 스피커 출력을 캡처하여 텍스트로 변환 |
| 원본 오디오 바이트를 가상 마이크에 주입 |
| 가상 스피커에서 원본 오디오를 녹음 |
| 스피커에서 음성을 감지하고 끝날 때까지 대기한 후 변환 |
브라우저
도구 | 설명 |
| URL로 이동 |
| 요소 클릭 |
| 입력란에 텍스트 입력 |
| 키보드 키 누르기 |
| 페이지 스크린샷 캡처 |
| 페이지 텍스트 내용 가져오기 |
| JavaScript 실행 |
| 텍스트가 나타날 때까지 대기 |
| 현재 URL 가져오기 |
| 특정 출처에 마이크 접근 권한 부여 |
화면
도구 | 설명 |
| 전체 데스크톱 스크린샷 |
| 디스플레이 해상도 가져오기 |
| 실시간 VNC 뷰어 URL 가져오기 |
This server cannot be deployed
Maintenance
Related MCP Connectors
Test the voice agents you run: scored transcripts, pass/fail verdicts, latency and WER metrics.
- OkareoOAuthcom.okareo
Simulation, evaluation and monitoring for voice agents.
Run multi-step tasks in a real Chrome browser: persistent environments, live view, human takeover.
- TabfleetOAuthcom.tabfleet
Launch, inspect, control, and share isolated cloud browsers for your agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to perform automated web testing by controlling a Chrome browser to navigate, interact with pages, capture screenshots, extract console logs, and simulate mobile devices for responsive design testing.7ISC
- AlicenseNot gradedqualityFmaintenanceEnables creation of reusable browser automation skills through demonstration by recording user actions in a browser while narrating, then converting those workflows into executable skills that can be invoked through natural language.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables automated end-to-end testing and verification of web applications through natural language, with self-healing selectors and dual-mode execution.15MIT
- AlicenseNot gradedqualityCmaintenanceEnables plain-English browser automation via an MCP server, allowing agents to run objectives or test suites in a real browser without selectors or scripts.98 npm3Apache 2.0