Skip to main content
Glama

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 인증 토큰은 암호 관리자를 사용하세요:

  1. 쿠키를 암호 관리자에 chatgpt-session / gemini-session으로 저장합니다.

  2. 컨테이너 시작 시 이 쿠키를 브라우저 프로필에 주입합니다.

또는: VNC(http://localhost:6080)에서 한 번 직접 로그인하면 세션이 유지됩니다.

포트

포트

서비스

8360

MCP 서버(Streamable HTTP)

6080

noVNC(브라우저 기반 VNC 뷰어)

5900

VNC 직접 연결

MCP 도구

오디오

도구

설명

tts_to_mic

텍스트를 합성하여 마이크 입력으로 주입

transcribe_speakers

스피커 출력을 캡처하여 텍스트로 변환

inject_audio

원본 오디오 바이트를 가상 마이크에 주입

capture_audio

가상 스피커에서 원본 오디오를 녹음

wait_for_speech

스피커에서 음성을 감지하고 끝날 때까지 대기한 후 변환

브라우저

도구

설명

browser_navigate

URL로 이동

browser_click

요소 클릭

browser_type

입력란에 텍스트 입력

browser_press_key

키보드 키 누르기

browser_screenshot

페이지 스크린샷 캡처

browser_get_text

페이지 텍스트 내용 가져오기

browser_evaluate

JavaScript 실행

browser_wait_for_text

텍스트가 나타날 때까지 대기

browser_url

현재 URL 가져오기

browser_grant_mic_permission

특정 출처에 마이크 접근 권한 부여

화면

도구

설명

screen_screenshot

전체 데스크톱 스크린샷

screen_size

디스플레이 해상도 가져오기

vnc_url

실시간 VNC 뷰어 URL 가져오기

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    7
    ISC
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables 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.
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables automated end-to-end testing and verification of web applications through natural language, with self-healing selectors and dual-mode execution.
    15
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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 npm
    3
    Apache 2.0