Skip to main content
Glama

MCP Virtual User

Un humano sintético en un contenedor de Docker. Tiene oídos, boca, ojos y manos.

¿Qué es esto?

Un entorno completamente autónomo que simula la interacción de un usuario real con aplicaciones web mediante voz y navegador. Incluye:

  • Micrófono virtual — MCP puede inyectar audio (TTS o crudo) que cualquier aplicación cree que proviene de un micrófono físico

  • Altavoces virtuales — MCP puede capturar y transcribir cualquier audio que reproduzca el sistema operativo

  • Navegador real — Chromium con Playwright y sesiones de inicio de sesión persistentes

  • Pantalla real — Xvfb + VNC para depurar (observa lo que ocurre en tiempo real)

  • Interfaz MCP — Todo se expone como herramientas a través de Streamable HTTP

Related MCP server: Lotus MCP

Casos de uso

  • Probar el modo de voz de ChatGPT — inyecta "¿Qué tiempo hace?" en el micrófono, captura la respuesta hablada de ChatGPT, transcríbela y haz una aserción sobre ella

  • Probar Gemini Live — es el mismo flujo contra la IA de voz de Google

  • Probar nuestra Mobile Mesh UI — pruebas completas de conversación por voz de extremo a extremo contra nuestra propia aplicación

  • Cualquier aplicación web con voz — si usa el micrófono o los altavoces del navegador, podemos probarla

Arquitectura

┌─────────────────────────────────────────────────────────────┐
│  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        │    │
│  └─────────────────────┘  └───────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

Inicio rápido

# 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

Configuración inicial (una sola vez)

# 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.

Ejecución de pruebas

# 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

Ejemplo: Probar el modo de voz de 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

Gestión de sesiones

Las sesiones de inicio de sesión se conservan en ./data/browser-profile/ (volumen montado).

Para los tokens de autenticación de ChatGPT/Gemini, usa DragonsKeep:

  1. Guarda las cookies en DragonsKeep como chatgpt-session / gemini-session

  2. Al iniciar el contenedor, inyéctalas en el perfil del navegador

O bien: inicia sesión manualmente una vez a través de VNC (http://localhost:6080), y la sesión se conserva.

Puertos

Puerto

Servicio

8360

Servidor MCP (Streamable HTTP)

6080

noVNC (visor VNC basado en navegador)

5900

VNC directo

Herramientas MCP

Audio

Herramienta

Descripción

tts_to_mic

Sintetizar texto → inyectarlo como entrada de micrófono

transcribe_speakers

Capturar la salida de los altavoces → transcribirla a texto

inject_audio

Enviar bytes de audio crudo al micrófono virtual

capture_audio

Grabar audio crudo de los altavoces virtuales

wait_for_speech

Detectar voz en los altavoces, esperar a que termine y transcribir

Navegador

Herramienta

Descripción

browser_navigate

Ir a una URL

browser_click

Hacer clic en un elemento

browser_type

Escribir en un campo de entrada

browser_press_key

Pulsar una tecla

browser_screenshot

Tomar una captura de pantalla de la página

browser_get_text

Obtener el contenido de texto de la página

browser_evaluate

Ejecutar JavaScript

browser_wait_for_text

Esperar a que aparezca un texto

browser_url

Obtener la dirección actual

browser_grant_mic_permission

Permitir el acceso al micrófono para un origen

Pantalla

Herramienta

Descripción

screen_screenshot

Captura de la pantalla completa

screen_size

Obtener la resolución de la pantalla

vnc_url

Obtener la URL del visor VNC en directo

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