双子座现场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_testcall--将操作系统输入+输出切换到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 [--say] ""--say使用macOSsay(离线,快速)- 没有
--say,使用类似的替代方案edge-tts(在线,更高质量)
成绩单合同
扩展模式: 倒像 window. 在屏幕外文档上——一个数组 { 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;
isConnected: boolean;
startSession?: () => void;
stopSession?: () => void;
sessionState?: string;
logs?: Array;
}将桥添加到React应用程序
useEffect(() => {
(window as any).__mcp = {
transcripts: transcriptHistory,
isConnected,
startSession: () => startSession(),
stopSession: () => stopSession(),
};
return () => { delete (window as any).__mcp; };
}, [transcriptHistory, isConnected, startSession, stopSession]);许可证
麻省理工学院
