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 가져오기

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

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

View all related MCP servers

Related MCP Connectors

  • Simulation, evaluation and monitoring for voice agents.

  • Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.

  • AI QA tester — real browsers scan sites for bugs, SEO, perf, and accessibility issues via chat.

View all MCP Connectors

Latest Blog Posts

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/macbeth76/mcp-virtual-user'

If you have feedback or need assistance with the MCP directory API, please join our Discord server