MCP Virtual User
MCP Virtual User
Docker 容器中的一个合成人类。它有耳朵、嘴巴、眼睛和双手。
这是什么?
一个完全自包含的环境,模拟真实用户通过语音和浏览器与 Web 应用交互。它具有:
虚拟麦克风 — MCP 可以注入音频(TTS 或原始音频),任何应用都会认为声音来自硬件麦克风
虚拟扬声器 — MCP 可以捕获并转写操作系统播放的任何音频
真实浏览器 — 由 Playwright 控制的 Chromium,带有持久的登录会话
真实显示器 — Xvfb + VNC,用于调试(实时观察正在发生的情况)
MCP 接口 — 所有功能通过 Streamable HTTP 以工具的形式暴露
Related MCP server: Lotus MCP
使用场景
测试 ChatGPT 语音模式 — 将“今天天气怎么样?”注入麦克风,捕获 ChatGPT 的语音回复,转写文本并断言
测试 Gemini Live — 对 Google 的语音 AI 执行同样的流程
测试我们的 Mobile Mesh UI — 针对我们自己的应用进行完整的端到端语音对话测试
任何支持语音的 Web 应用 — 只要它使用浏览器的麦克风/扬声器,我们就能测试
Architecture
┌─────────────────────────────────────────────────────────────┐
│ 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. 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 的认证令牌,请使用 DragonsKeep:
在 DragonsKeep 中将 Cookie 以
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