使用说明
Selenium MCP服务器
一种模型上下文协议(MCP)服务器,通过Selenium Grid提供浏览器自动化功能。AI代理可以使用MCP工具逐步驱动web浏览器,而不是直接编写Selenium脚本。
建筑
内置于 FastMCP 2.0 使用 可流式HTTP传输 用于自托管部署。在您的基础设施上部署一次,并从任何MCP客户端远程连接。
- 可流式传输的HTTP -支持流媒体的原生HTTP传输
- Selenium网格后端 -将浏览器实例与MCP服务器分离,以实现独立扩展
- 集中式端点 -单个服务器为多个AI代理/客户端提供服务
特性
- 35+MCP工具 实现浏览器的完全自动化
- 会话管理 具有自动超时和清理功能
- 元素注册表 用于跨工具调用的稳定元素引用
- 域护栏 将导航限制到允许的域
- 结构化错误 为人工智能恢复提供有益的建议
- Docker支持 包含Selenium Grid
快速开始
从容器注册表部署(推荐)
直接部署,无需克隆存储库。创建一个 docker-compose.yml:
services:
selenium-mcp:
image: ghcr.io/mlamoure/selenium-mcp-server:latest
ports:
- "8000:8000"
environment:
- SELENIUM_MCP_SELENIUM_GRID_URL=http://selenium-hub:4444
depends_on:
selenium-hub:
condition: service_healthy
restart: unless-stopped
selenium-hub:
image: selenium/hub:4.25
ports:
- "4444:4444"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:4444/status"]
interval: 10s
timeout: 5s
retries: 5
chrome-node:
image: selenium/node-chrome:4.25
shm_size: 2g
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=4
depends_on:
selenium-hub:
condition: service_healthy
docker-compose up -d
# MCP server: http://localhost:8000/mcp/
# Selenium Grid UI: http://localhost:4444
使用Docker Compose(源代码)
git clone https://github.com/mlamoure/selenium-mcp-server.git
cd selenium-mcp-server
docker-compose up -d
# MCP server: http://localhost:8000/mcp/
# Selenium Grid UI: http://localhost:4444
手动安装
# Requires Python 3.12+ and a running Selenium Grid
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Set Grid URL and run
export SELENIUM_MCP_SELENIUM_GRID_URL=http://localhost:4444
python -m selenium_mcp
工具类别
会话管理
create_session-创建新的浏览器会话(可选视频录制)close_session-关闭浏览器会话get_session_info-获取详细的会话信息,包括录制状态list_sessions-列出所有活动会话ping-健康检查
导航
navigate-转到URLreload_page-刷新当前页面navigate_back/navigate_forward-浏览器历史记录get_page_info-获取当前URL、标题和就绪状态
观察
get_dom-获取页面HTML(可选脚本/样式剥离)get_visible_text-获取所有可见的文本内容query_elements-查找元素并获得稳定的IDget_screenshot-捕获页面截图get_console_logs-获取浏览器控制台日志
行动
click_element/click_selector-点击元素type_text-在输入字段中键入clear_element-明确输入内容set_checkbox_state-选中/取消选中复选框select_dropdown_option-从下拉菜单中选择scroll_to_element/scroll_by-滚动页面hover_element-鼠标悬停drag_drop-拖放send_keys-发送键盘按键upload_file-上传文件
等待
wait_for_selector-等待元素(存在/可见/可点击/隐藏)wait_for_url-等待URL与模式匹配wait_for_ready_state-等待文档就绪状态wait_for_text-等待文本出现
JavaScript
execute_script-运行同步JavaScriptexecute_async_script-运行异步JavaScript
配置
通过环境变量进行配置(前缀: SELENIUM_MCP_):
| 变量 | 描述 | 默认值 |
|---|---|---|
SELENIUM_GRID_URL |
Selenium网格端点 | http://localhost:4444 |
DEFAULT_BROWSER |
默认浏览器类型 | chrome |
MAX_CONCURRENT_SESSIONS |
最大并发会话数 | 10 |
SESSION_MAX_LIFETIME_SECONDS |
会话自动关闭超时 | 900 |
SESSION_MAX_IDLE_SECONDS |
空闲会话超时 | 300 |
RECORDING_DEFAULT |
默认视频录制状态 | true |
RECORDING_FORCE |
强制录制设置(忽略客户端) | false |
ALLOWED_DOMAINS |
逗号分隔的允许域 | (全部允许) |
DOM_MAX_CHARS |
get_dom的最大字符数 | 20000 |
DEFAULT_WAIT_TIMEOUT_MS |
默认等待超时 | 10000 |
HOST |
服务器绑定地址 | 0.0.0.0 |
PORT |
服务器端口 | 8000 |
视频录制
当使用带有视频录制Sidecar的Selenium Grid时,可以录制会话以进行调试和审查。通过以下方式控制录制 se:recordVideo 硒能力。
配置
RECORDING_DEFAULT-何时true(默认),除非明确禁用,否则会话会录制视频RECORDING_FORCE-何时true,忽略客户端首选项并使用RECORDING_DEFAULT对于所有会话
用法
# Create session with recording (uses server default if not specified)
result = await client.call_tool("create_session", {
"browser": "chrome",
"record_video": True # Optional: explicitly enable/disable
})
# Response includes recording info
# {
# "session_id": "sess_abc123",
# "record_video": true,
# "selenium_session_id": "abc123-def456-..." # Grid session ID for video retrieval
# }
视频检索
这 selenium_session_id 在响应中是Selenium Grid的内部会话ID。使用此ID在Grid的视频存储中查找录制的视频。确切的检索方法取决于您的网格配置。
示例用法
# Typical AI agent workflow:
# 1. Create a session (recording enabled by default)
result = await client.call_tool("create_session", {"browser": "chrome"})
session_id = result["session_id"]
# 2. Navigate to a page
await client.call_tool("navigate", {
"session_id": session_id,
"url": "https://example.com"
})
# 3. Find elements
elements = await client.call_tool("query_elements", {
"session_id": session_id,
"strategy": "css",
"selector": "button.submit"
})
# 4. Click an element
await client.call_tool("click_element", {
"session_id": session_id,
"element_id": elements["elements"][0]["element_id"]
})
# 5. Wait for navigation
await client.call_tool("wait_for_url", {
"session_id": session_id,
"pattern": "success"
})
# 6. Close session when done
await client.call_tool("close_session", {"session_id": session_id})
错误处理
所有工具返回结构化错误,包括:
error_code-机器可读代码(例如。,ELEMENT_NOT_FOUND)message-人类可读的描述suggestion-AI的恢复提示
示例错误:
{
"success": false,
"error": {
"code": "ELEMENT_NOT_FOUND",
"message": "Element not found: css=#missing",
"suggestion": "Verify the selector is correct. Use wait_for_selector before querying if the element loads dynamically."
}
}
发展
# Install dev dependencies
pip install -r requirements-dev.txt
# Run tests
pytest
# Lint
ruff check src/
许可证
麻省理工学院
