gemini-web-mcp

gemini-web-mcp

An MCP server for automated interaction with Gemini's web interface using Playwright and LangGraph, enabling task execution, deep research, file uploads, chat management, and dynamic selector verification via MCP tools.

Category
访问服务器

README

<!-- trunk-ignore-all(prettier) -->

Gemini Web MCP Agent

Un agente automatizado que interactúa con la interfaz web de Gemini usando Playwright y LangGraph, diseñado para ser controlado por un LLM a través de MCP.

📋 Requisitos

  • Docker y Docker Compose
  • Python 3.11+ (solo para configuración inicial de autenticación)
  • Cuenta de Google con acceso a Gemini
  • Servidor Redis (incluido en docker-compose) para persistencia de respuestas

🚀 Inicio Rápido

1. Configurar Autenticación Automatizada

El sistema ahora soporta autenticación automatizada y persistencia de sesión robusta.

  1. Configurar Credenciales (Opcional): Crea o edita el archivo .env en la raíz del proyecto y añade tus credenciales de Google si deseas que el login sea automático.

    GOOGLE_EMAIL=tu_email@gmail.com
    GOOGLE_PASSWORD=tu_password
    REDIS_URL=redis://localhost:6379/0  # Opcional, por defecto localhost para local, 'redis' para docker
    
  2. Iniciar Sesión Inicial: Ejecuta el script de configuración. Esto abrirá un navegador (automáticamente si configuraste el .env, o esperando tu input si no).

    # Instalar dependencias
    pip install -r requirements.txt
    python -m playwright install chromium
    
    # Ejecutar setup
    python auth_setup.py
    

    El navegador se abrirá usando un perfil persistente guardado en profiles/default.

    • Si configuraste el .env, el script intentará loguearse por ti.
    • Si no, inicia sesión manualmente.
    • Una vez veas el chat de Gemini, cierra el navegador. El perfil se guardará automáticamente.
  3. Configuración en Servidor Remoto (SSH/Headless): Si estás instalando esto en un servidor sin entorno gráfico, tienes dos opciones:

    • Opción A (Recomendada - Virtual Display): Usa el script run_auth_remote.sh que utiliza xvfb-run.

      sudo apt-get update && sudo apt-get install -y xvfb
      ./run_auth_remote.sh
      

      El script tomará capturas de pantalla periódicas en el directorio screenshots/ para que puedas ver el progreso y si se requiere interacción manual (ej. 2FA).

    • Opción B (Headless): Ejecuta el script con el flag --headless.

      python auth_setup.py --headless
      

      Nota: Esto requiere que GOOGLE_EMAIL y GOOGLE_PASSWORD estén configurados en el .env.

2. Ejecutar el Servidor MCP

# Construir y ejecutar el contenedor en segundo plano
docker compose up -d --build

# Ver los logs para confirmar que está funcionando
docker compose logs -f gemini-agent

El servidor estará disponible en http://localhost:8000.

Herramientas Disponibles

El agente expone varias herramientas para interactuar con Gemini. Para una guía detallada, consulta la Referencia de Herramientas.

1. Ejecución de Tareas: execute_gemini_tasks

Permite realizar consultas simples o invocar herramientas especiales de Gemini.

{
  "tool": "execute_gemini_tasks",
  "arguments": {
    "tasks": ["Crea un resumen de las noticias de hoy"],
    "tool": "deep_research"
  }
}

2. Control Visual: take_gemini_screenshot

Captura una imagen visual de la sesión actual para depuración o verificación.

3. Gestión de Archivos: upload_file_to_gemini

Sube archivos locales directamente al prompt de Gemini. Ideal para análisis de logs, imágenes o documentos.

4. Navegación: list_gemini_chats y switch_gemini_chat

Lista y cambia entre conversaciones existentes en tu historial.

5. Monitoreo: get_gemini_task_status y get_gemini_session_status

Consulta el progreso de tareas largas o verifica si la sesión sigue activa.

6. Gestión de Selectores: verify_gemini_selectors y update_gemini_selector

Permite verificar si los selectores CSS siguen funcionando (detectando cambios en la UI de Gemini) y actualizarlos dinámicamente sin reiniciar el servidor.

[!IMPORTANT] Al usar new_chat: false en execute_gemini_tasks, el agente NO resetea la sesión. Esto es fundamental para monitorear el progreso de deep_research o para mantener el contexto de una conversación fluida. Por defecto, new_chat es true.


🌐 Uso Alternativo: API HTTP (curl)

También puedes interactuar con el agente directamente a través de HTTP.

Ejecutar una Tarea

curl -X POST http://localhost:8000/tasks \
  -H "Content-Type: application/json" \
  -d '{
    "tasks": ["¿Cuáles son las últimas tendencias en IA?"]
  }'

Usar una Herramienta (ej. deep_research)

curl -X POST http://localhost:8000/tasks \
  -H "Content-Type: application/json" \
  -d '{
    "tasks": ["Investiga el impacto de la IA en la educación"],
    "tool": "deep_research"
  }'

🏗️ Arquitectura y Flujo Asíncrono

El agente está diseñado para manejar tareas de larga duración (como Deep Research de ~30min) sin bloquear al cliente MCP mediante un sistema de Polling Asíncrono:

  1. Ejecución: Al llamar a execute_gemini_tasks, el servidor devuelve un request_id inmediato y procesa la tarea en segundo plano.
  2. Persistencia: El estado y los resultados se guardan en Redis.
  3. Recuperación: El cliente debe usar get_gemini_task_status periódicamente para obtener la respuesta final.

Para más detalles, consulta:

Gestión Dinámica de Selectores

El sistema incluye un módulo de Verificación de Selectores que:

  1. Fuente de Verdad: Usa Redis para almacenar la configuración de selectores. Si Redis está vacío, carga desde config/selectors.json.
  2. Validación: Un script (scripts/check_selectors.py) y una herramienta MCP (verify_gemini_selectors) pueden lanzar un navegador para comprobar si los elementos críticos (tools_button, send_button, etc.) son visibles.
  3. Actualización en Caliente: Si un selector falla, se puede actualizar usando update_gemini_selector y el cambio se aplica inmediatamente en todas las sesiones activas, persistiendo en Redis.
  4. Automatización: Un cron job diario (8:00 AM) verifica automáticamente el estado de los selectores.

🔧 Solución de Problemas

Error: "No puedes acceder"

Si ves este error durante auth_setup.py, el script ya incluye configuraciones anti-detección. Asegúrate de:

  • Usar la última versión de Chrome.
  • Tener una conexión a internet estable.
  • Intentar desde una red diferente si el problema persiste.

Error: TimeoutError o el agente no funciona

Si el agente se queda esperando, especialmente después de una actualización de la web de Gemini:

  1. Verifica el Perfil: Asegúrate de que la carpeta profiles/default existe. Si tienes dudas, borra la carpeta profiles y ejecuta python auth_setup.py de nuevo.
  2. Revisa los Selectores: El problema más común son los selectores de CSS desactualizados. La interfaz de Gemini puede cambiar, invalidando los selectores en config/selectors.json.
    • Abre la web de Gemini en tu navegador.
    • Usa las herramientas de desarrollador (F12) para inspeccionar los elementos que fallan (ej. el botón "Deep Research", el indicador de plan, etc.).
    • Actualiza los selectores correspondientes en config/selectors.json con valores únicos y estables.
    • Reinicia el contenedor: docker compose up -d --build.

Error Común de Selector: Ambigüedad

Un error frecuente es cuando un selector coincide con múltiples elementos (violación de "strict mode"). Por ejemplo, si text="Razonamiento" coincide tanto con el botón que abre el menú como con la opción dentro del menú.

Solución: Haz el selector más específico.

  • Mal (Ambiguo): [role='menuitemradio']:has-text('Razonamiento')
  • Bien (Específico): menu [role='menuitemradio']:has-text('Razonamiento')

Al añadir menu como ancestro, te aseguras de que solo se seleccione el elemento dentro del menú emergente.

📁 Estructura del Proyecto

.
├── src/
│   ├── mcp_server.py           # Servidor MCP y API HTTP
│   ├── mcp_controller/
│   │   ├── actions.py          # Lógica de interacción con Playwright (POM)
│   │   ├── selectors.py        # Gestión de selectores (Redis + File)
│   │   └── selector_validator.py # Lógica de validación de elementos UI
│   └── orchestrator/
│       ├── graph.py            # Orquestación del workflow con LangGraph
│       └── state.py            # Definición del estado del agente
├── doc/
│   ├── TOOLS.md                # Referencia detallada de herramientas
│   ├── ARCHITECTURE.md         # Resumen de arquitectura y flujo
│   ├── OPTIMIZATION.md         # Mejores prácticas y optimización
│   └── NATURAL_LANGUAGE.md     # Guía de uso con lenguaje natural
├── config/
│   └── selectors.json          # Selectores CSS (la parte más frágil)
├── .env.example                # Plantilla de variables de entorno
├── scripts/
│   └── check_selectors.py      # Script de verificación para cron/manual
├── cron_setup.sh               # Instalador del cron job diario
├── auth_setup.py               # Script para generar auth_state.json
├── auth_state.json             # Sesión guardada (ignorado por Git)
├── Dockerfile                  # Definición de la imagen del contenedor
├── docker-compose.yml          # Orquestación de servicios Docker
└── requirements.txt            # Dependencias de Python

🔐 Seguridad

  • auth_state.json y el directorio profiles/ contienen cookies de sesión de Google. Quien tenga esos archivos puede acceder a tu cuenta. Ambos están en .gitignorenunca los subas al repositorio ni los compartas.
  • Las credenciales (GOOGLE_EMAIL, GOOGLE_PASSWORD) van únicamente en .env (también ignorado por git). Usa .env.example como plantilla.
  • Para mayor seguridad, borra profiles/ y auth_state.json y regenera la autenticación periódicamente.
  • Si alguna vez commiteaste uno de estos archivos por accidente, no basta con borrarlo: reescribe el historial (p. ej. con git filter-repo) y cierra las sesiones de tu cuenta de Google (myaccount.google.com → Seguridad → Administrar dispositivos) o cambia tu contraseña para invalidar las cookies filtradas.

📄 Licencia

Este proyecto está bajo la licencia MIT — puedes usarlo, modificarlo y redistribuirlo libremente.

🛠️ Desarrollo

Ejecutar localmente (sin Docker)

# Instalar dependencias
pip install -r requirements.txt
python -m playwright install chromium

# Es necesario tener auth_state.json generado
# Ejecutar el servidor directamente
python src/mcp_server.py

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选