Gemini Live MCP服务器

一个通用的MCP服务器,用于通过MCP兼容的AI代理(如Claude Code、Cursor或自定义代理)与Gemini Live Chrome扩展和Web应用交互,提供会话管理、语音工具和转录捕获功能。

  • by hayesraffle
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 hayesraffle/gemini-live-mcp

使用说明

双子座现场mcp

通用 主控程序 用于交互的服务器 Gemini Live 来自任何兼容MCP的AI代理的Chrome扩展程序和web应用程序-- 克劳德代码, 光标,或者你自己的。

它通过以下方式连接到Chrome Chrome DevTools协议 并公开了启动/停止语音会话、说出话语、捕获转录、检查状态和运行端到端语音测试的工具——所有这些都是以编程方式进行的。

运作原理

┌─────────────────────────────────────────────────────────────────┐
│  MCP Client (Claude Code, Cursor, custom agent, etc.)           │
│                                                                 │
│  Calls MCP tools: start_session, speak, listen, run_voice_test  │
└──────────────────────────┬──────────────────────────────────────┘
                           │ MCP protocol (stdio)
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│  gemini-live-mcp.py                                             │
│                                                                 │
│  ┌─────────────┐  ┌──────────────┐  ┌────────────────────────┐ │
│  │ Session mgmt │  │ Voice tools  │  │ Transcript capture     │ │
│  │ (CDP clicks, │  │ (TTS → Black │  │ (poll window prop via  │ │
│  │  navigation) │  │  Hole → mic) │  │  CDP Runtime.evaluate) │ │
│  └──────┬───────┘  └──────┬───────┘  └───────────┬────────────┘ │
└─────────┼─────────────────┼──────────────────────┼──────────────┘
          │ CDP              │ audio                │ CDP
          ▼                  ▼                      ▼
┌─────────────────────────────────────────────────────────────────┐
│  Chrome (--remote-debugging-port=9222)                          │
│                                                                 │
│  ┌─────────────────┐    ┌────────────────────────────────────┐  │
│  │  Page            │◄──►│  Extension / Web App               │  │
│  │  (content script │    │  ┌──────────────────────────────┐  │  │
│  │   or __mcp       │    │  │  Offscreen doc / session hub  │  │  │
│  │   bridge)        │    │  │  - Gemini Live WebSocket      │  │  │
│  │                  │    │  │  - Mic capture (BlackHole)     │  │  │
│  │                  │    │  │  - Audio playback              │  │  │
│  │                  │    │  │  - Transcript accumulation     │  │  │
│  └─────────────────┘    │  └──────────────────────────────┘  │  │
│                          └────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
                                    │
                                    │ WebSocket
                                    ▼
                          ┌───────────────────┐
                          │  Gemini Live API   │
                          │  (Google AI or     │
                          │   Vertex AI)       │
                          └───────────────────┘

语音测试流程

Agent calls run_voice_test("what is this page about")
    │
    ├─► Navigate to URL
    ├─► Click FAB button (starts Gemini Live session)
    ├─► Wait for offscreen doc / session to connect
    ├─► Route OS audio: input + output → BlackHole
    ├─► TTS "what is this page about" → BlackHole → Chrome mic
    ├─► Poll offscreen doc for new transcript entries
    ├─► Capture user + model transcripts
    ├─► Assert model response contains expected text
    └─► Return results + latency metrics

两种模式

  • 扩展模式 (默认):适用于带有Shadow DOM覆盖+屏幕外文档的Chrome扩展程序。所有特定于扩展的详细信息(选择器、扩展名、转录属性)都是通过环境变量配置的。
  • Webapp模式:对于暴露一个应用程序的web应用程序(React等) window.__mcp 桥梁物体。不需要特定于扩展的配置。

需求

  • Python 3.10+
  • 运行Chrome --remote-debugging-port=9222
  • Python包: websockets, mcp
  • 用于语音工具 (macOS):
    • 黑洞 --用于将TTS路由到Chrome麦克风的虚拟音频设备
    • 切换音频源 --用于切换音频设备的CLI工具
    • TTS脚本(指向 GLMCP_VOICE_SCRIPT)
# Python deps
pip install websockets mcp

# macOS audio deps (for voice tools)
brew install blackhole-16ch switchaudio-osx

非macOS: 如果出现以下情况,则会自动跳过音频路由 SwitchAudioSource 不在PATH上。手动配置虚拟音频路由。

配置

扩展模式(默认)

添加到您的 .mcp.json (例如,在Claude Code的项目根目录中):

{
  "mcpServers": {
    "gemini-live": {
      "command": "/path/to/.venv/bin/python",
      "args": ["/path/to/gemini-live-mcp.py"],
      "env": {
        "GLMCP_SHADOW_HOST": "#my-ext-root",
        "GLMCP_FAB_SELECTOR": ".start-btn",
        "GLMCP_CLOSE_SELECTOR": ".stop-btn",
        "GLMCP_EXTENSION_NAME": "My Extension"
      }
    }
  }
}

Webapp模式

{
  "mcpServers": {
    "gemini-live": {
      "command": "/path/to/.venv/bin/python",
      "args": ["/path/to/gemini-live-mcp.py"],
      "env": {
        "GLMCP_MODE": "webapp",
        "GLMCP_DEFAULT_URL": "http://localhost:5173"
      }
    }
  }
}

环境变量

变量 必填 默认 描述
GLMCP_MODE 没有 extension extension 或 webapp
GLMCP_SHADOW_HOST 仅扩展 -- 影子DOM主机选择器(例如。 #my-ext-root)
GLMCP_FAB_SELECTOR 仅扩展 -- CSS选择器,用于阴影根内的start/FAB按钮
GLMCP_CLOSE_SELECTOR 仅扩展 -- CSS选择器,用于阴影根内的关闭/停止按钮
GLMCP_EXTENSION_NAME 仅限扩展名 -- 扩展名,如所示 chrome://extensions
GLMCP_CDP_URL 没有 http://127.0.0.1:9222 Chrome DevTools协议URL
GLMCP_TRANSCRIPT_PROP 没有 __tcTranscripts window 转录数组的属性名称(扩展模式)
GLMCP_SW_URL_SUFFIX 没有 /background.js 用于扩展检测的服务工作者URL后缀
GLMCP_SW_URL_EXCLUDE 没有 /build/ 从SW URL匹配中删除子字符串
GLMCP_OFFSCREEN_URL 没有 offscreen.html 子字符串以匹配屏幕外文档URL
GLMCP_DEFAULT_URL 否 维基百科霸王龙页面 默认URL start_session 和 run_voice_test
GLMCP_VOICE_SCRIPT 否 -- TTS脚本的路径 speak 和 run_voice_test 工具

工具

工具 说明
start_session 导航到URL并启动Gemini Live会话
stop_session 干净地结束当前会话
speak 生成TTS音频并将其播放到虚拟麦克风中(需要 GLMCP_VOICE_SCRIPT)
listen 轮询新用户+模型转录对,超时
run_voice_test 完整的E2E测试:导航→ 开始→ 说→ 捕捉→ 断言(带延迟)
get_session_state 页面URL、会话状态、转录计数、音频路由
get_transcripts 返回最后N个成绩单条目
get_logs 从屏幕外文档或页面返回最近的控制台日志
eval_page 在主页上下文中评估JavaScript
eval_offscreen 在屏幕外/中心文档上下文中评估JavaScript
navigate 将主页导航到URL
reload_extension 通过以下方式重新加载扩展 chrome://extensions (仅限扩展模式)

音频路由(macOS)

这 speak 和 run_voice_test 这些工具通过BlackHole路由音频,以便TTS输出馈送到Chrome的麦克风输入。

  • 自动路线 首先 speak 或 run_voice_test call--将操作系统输入+输出切换到BlackHole
  • 自动恢复 关闭原始音频设备(通过 atexit +SIGTERM/SIGINT信号处理器)
  • 懒惰 --在您实际使用语音工具之前,音频不会改变

检查当前状态 get_session_state --它报告活动输入设备以及路由是否处于活动状态。

重要提示: Chrome保留了自己的麦克风偏好,与操作系统默认设置分开(chrome://settings/content/microphone).这 stop_session 该工具会自动将其重置为“系统默认值”。

Chrome设置

首先完全退出Chrome(macOS上为Cmd+Q),然后使用调试端口启动:

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
  --remote-debugging-port=9222 \
  --user-data-dir=/tmp/gemini-live-mcp-test \
  --no-first-run \
  --no-default-browser-check \
  "about:blank"
  • 扩展模式:在以下位置加载未打包的扩展名 chrome://extensions (开发人员模式)。
  • Webapp模式:打开您的web应用程序URL(例如。 http://localhost:5173).

语音测试

这 speak 和 run_voice_test 工具需要 GLMCP_VOICE_SCRIPT 设置为生成TTS音频并通过BlackHole播放的脚本。

该脚本名为:

python <VOICE_SCRIPT> [--say] "<text>"
  • --say 使用macOS say (离线,快速)
  • 没有 --say,使用类似的替代方案 edge-tts (在线,更高质量)

成绩单合同

扩展模式: 倒像 window.<GLMCP_TRANSCRIPT_PROP> 在屏幕外文档上——一个数组 { role: 'user' | 'model', text: string }.默认为 __tcTranscripts.

Webapp模式: 倒像 window.__mcp.transcripts 在页面上--格式相同。

这 listen 和 run_voice_test 工具处理导航后的转录数组重置(当屏幕外文档重新启动时,数组重置为空——工具会检测到这一点并自动调整其基线)。

window.__mcp 桥接合同(Webapp模式)

Web应用程序通过设置向MCP服务器公开状态 window.__mcp:

interface MCPBridge {
  transcripts: Array<{ role: 'user' | 'model'; text: string }>;
  isConnected: boolean;
  startSession?: () => void;
  stopSession?: () => void;
  sessionState?: string;
  logs?: Array<{ source: string; text: string }>;
}

将桥添加到React应用程序

useEffect(() => {
  (window as any).__mcp = {
    transcripts: transcriptHistory,
    isConnected,
    startSession: () => startSession(),
    stopSession: () => stopSession(),
  };
  return () => { delete (window as any).__mcp; };
}, [transcriptHistory, isConnected, startSession, stopSession]);

许可证

麻省理工学院