Drission页面优化MCP
更好的DrissionPage MCP服务器——涵盖了原始库的大部分功能、255个单元测试、100%的服务覆盖率、AI优化的工具调用和描述。
英语| 中文
______________________________________________________________________
为什么选择BetterMCP
| 更好的MCP | 注意 | ||
|---|---|---|---|
| 55工具 | 涵盖浏览器、标签、导航、元素、表单、屏幕截图、网络、Cookie、存储、iframe、文件等 | 原始库的大部分功能,开箱即用 | |
| 255个单元测试 | 17个测试模块+6个集成测试套件 | 100%的服务覆盖率,每次提交都可验证 | |
| AI友好 | 清晰的工具描述、明确的参数语义、统一的响应结构 | LLM在第一次调用时就能理解——更少的重试,更少的令牌浪费 | |
| 元素缓存 | element_find 返回a element_id 用于后续调用中的直接重用 | 无重复查找,更高效的交互 | |
| 本机定位器语法 | #id .class @attr text: css: xpath: @@AND `@\ | OR` | 完整的DrissionPage语法支持 |
| 双重运输 | stdio + streamable-http | 适用于所有主要的AI编码工具 |
快速开始
先决条件
- Python>=3.10
- 紫外线
- Chrome/Chromium浏览器
安装
git clone https://github.com/pureTrue/DrissionPage-BetterMCP.git
cd DrissionPage-BetterMCP
uv sync配置您的AI工具
克劳德代码
项目根目录 .mcp.json:
{
"mcpServers": {
"drissionpage": {
"command": "uv",
"args": ["run", "--directory", "/path/to/DrissionPage-BetterMCP", "dp-mcp"]
}
}
}或者通过CLI:
claude mcp add drissionpage -- uv run --directory /path/to/DrissionPage-BetterMCP dp-mcp光标
.cursor/mcp.json (项目层面)或 ~/.cursor/mcp.json (全球):
{
"mcpServers": {
"drissionpage": {
"command": "uv",
"args": ["run", "--directory", "/path/to/DrissionPage-BetterMCP", "dp-mcp"]
}
}
}VS代码(副本)
.vscode/mcp.json:
{
"servers": {
"drissionpage": {
"command": "uv",
"args": ["run", "--directory", "/path/to/DrissionPage-BetterMCP", "dp-mcp"]
}
}
}注:VS代码使用servers作为顶级密钥,不是mcpServers.
法典
.codex/config.toml (项目层面)或 ~/.codex/config.toml (全球):
[mcp_servers.drissionpage]
command = "uv"
args = ["run", "--directory", "/path/to/DrissionPage-BetterMCP", "dp-mcp"]或者通过CLI:
codex mcp add drissionpage -- uv run --directory /path/to/DrissionPage-BetterMCP dp-mcp替换 /path/to/DrissionPage-BetterMCP 与实际项目路径。
环境变量
可选,前缀为 DP_MCP_:
| 变量 | 默认值 | 描述 |
|---|---|---|
DP_MCP_DEFAULT_TIMEOUT | 15.0 | 默认工具超时(秒) |
DP_MCP_LOG_LEVEL | INFO | 日志记录级别 |
DP_MCP_NETWORK_CAPTURE_SIZE | 200 | 要捕获的最大网络数据包数 |
复制 .env.example 到 .env 并根据需要进行定制。
刀具清单
浏览器管理
| 工具 | 说明 |
|---|---|
browser_connect | 连接到现有的Chrome或启动新实例;支持无头、代理、user_agent |
browser_info | 获取浏览器状态:地址、标签计数、进程ID |
browser_quit | 关闭浏览器并释放所有资源 |
选项卡管理
| 工具 | 说明 |
|---|---|
tab_new | 打开一个新选项卡,可选择导航到URL |
tab_close | 关闭选项卡;默认为当前选项卡 |
tab_switch | 切换到特定选项卡 |
tab_list | 列出所有打开的选项卡 |
tab_find | 按标题和/或URL搜索选项卡 |
tab_info | 获取选项卡详细信息 |
页面导航
| 工具 | 说明 |
|---|---|
page_navigate | 导航到URL;返回最终URL和页面标题 |
page_back / page_forward | 在历史中前进或后退 |
page_refresh | 刷新页面;可选择忽略缓存 |
page_stop | 停止页面加载 |
元素交互
| 工具 | 说明 |
|---|---|
element_find | 找到一个元素;返回缓存的 element_id |
element_find_all | 查找所有匹配的元素 |
element_wait | 等待元素状态(存在/可见/隐藏/删除) |
element_click | 单击一个元素;支持左/右/中/双击 |
element_input | 在输入中键入文本;可选择先清除 |
element_clear | 清除输入字段 |
element_hover | 将鼠标悬停在元素上 |
element_drag | 拖动到目标元素或像素偏移处 |
element_get_text | 获取可见文本内容 |
element_get_attr | 获取HTML属性值 |
element_get_info | 获取完整详细信息:标签、文本、rect、attrs、HTML、状态 |
element_select | 在中选择一个选项 `` 元素 |
element_get_options | 获取a的所有选项 `` 元素 |
element_scroll_into_view | 滚动直到元素可见 |
截图
| 工具 | 说明 |
|---|---|
page_screenshot | 页面截图;支持全页面捕获 |
element_screenshot | 特定元素的截图 |
页面内容
| 工具 | 说明 |
|---|---|
page_get_text | 获取页面的纯文本 |
page_get_html | 获取HTML源代码 |
page_wait_load | 等待页面加载/URL更改/标题更改 |
page_scroll | 沿某个方向滚动页面 |
内嵌框架
| 工具 | 说明 |
|---|---|
frame_list | 列出所有iframe |
frame_switch | 切换到iframe |
frame_parent | 返回父帧 |
frame_main | 返回顶级页面 |
网络捕获
| 工具 | 说明 |
|---|---|
network_listen_start | 开始监听与URL模式匹配的请求 |
network_listen_wait | 等待并检索捕获的网络数据包 |
Cookie和存储
| 工具 | 说明 |
|---|---|
cookie_get_all | 获取所有Cookie;可选择按域筛选 |
cookie_set | 设置cookie |
cookie_remove | 删除cookie或全部清除 |
storage_get | 从本地存储/会话存储读取 |
storage_set | 写入本地存储/会话存储 |
键盘和对话框
| 工具 | 说明 |
|---|---|
keyboard_press | 按一个键或组合键(Enter、Ctrl+a等) |
keyboard_type | 连续键入文本 |
dialog_handle | 处理警报/确认/提示对话框 |
dialog_auto | 启用或禁用自动对话框处理 |
高级
| 工具 | 说明 |
|---|---|
action_chain | 执行动作序列:移动、单击、拖动、键入、等待 |
js_execute | 在页面上执行JavaScript |
cdp_execute | 执行原始Chrome DevTools协议命令 |
文件操作
| 工具 | 说明 |
|---|---|
file_upload | 上传文件;支持隐藏输入 |
file_download | 通过URL下载文件或点击触发器 |
page_save | 将页面另存为PDF或MHTML |
开发者指南
项目结构
src/dp_mcp/
├── server.py # MCP server — 55 tool definitions
├── config.py # Settings (pydantic-settings)
├── models.py # ToolResult, BrowserInfo, TabInfo, etc.
├── core/ # Core services
│ ├── browser.py # Browser lifecycle
│ ├── tab.py # Multi-tab management
│ ├── navigation.py # Page navigation
│ └── element.py # Element finding & interaction
├── services/ # Domain services
│ ├── screenshot.py # Screenshots
│ ├── frame.py # Iframes
│ ├── scroll.py # Scrolling
│ ├── network.py # Network capture
│ ├── cookie.py # Cookies
│ ├── action.py # Action chains
│ ├── dialog.py # Dialogs
│ ├── cdp.py # CDP
│ └── file.py # File operations
└── utils/
└── locator.py # Locator parser + element cache运行测试
# Unit tests (no browser needed)
uv run pytest tests/unit -v
# Integration tests (requires Chrome)
uv run pytest tests/integration -v -m integration
# All tests
uv run pytest -v定位器语法
支持完整的DrissionPage定位器语法:
| 语法 | 示例 | 描述 | ||||
|---|---|---|---|---|---|---|
#id | #login-btn | 按ID | ||||
.class | .submit | 按类名 | ||||
@attr=val | @name=email | 按属性 | ||||
text:str | text:Login | 按可见文本 | ||||
tag:name | tag:input | 按标签名称 | ||||
css:selector | css:div.card>h2 | CSS选择器 | ||||
xpath:expr | xpath://div[@id='app'] | XPath | ||||
@@a@@b | @@class=btn@@text()=OK | 和条件 | ||||
| `@\ | a@\ | b` | `@\ | class=btn@\ | class=link` | OR条件 |
使用可选 by 要消除歧义的参数: css, xpath, text, id, class, attr.
贡献
欢迎提交请求和问题。
- 复刻此仓库
- 创建要素分支:
git checkout -b feature/my-feature - 提交您的更改:
git commit -m "feat: add my feature" - 按下分支:
git push origin feature/my-feature - 打开拉取请求
请确保在提交之前通过所有测试:
uv run pytest tests/unit -v许可证
此项目的代码已获得许可 BSD 3-条款.
备注:该项目取决于 驱动页面,它使用禁止未经授权的商业使用的自定义非商业许可。用户必须独立遵守DrissionPage的许可条款。
