Skip to main content

MCP服务器提供浏览器自动化功能,支持stdio、SSE和Streamable HTTP传输协议

Project description

MCP Browser Tools

Python 3.12+ License: MIT PyPI version Build with uv

MCP (Model Context Protocol) 浏览器自动化工具包,提供网页信息获取和浏览器操作功能,帮助AI模型与网页进行交互。

支持三种传输协议:stdio、SSE (Server-Sent Events) 和 Streamable HTTP。

功能特性

  • 🌐 网页导航:导航到任意URL并等待页面加载完成
  • 📄 内容提取:获取页面HTML、文本内容和元信息
  • 🎯 元素操作:点击、填写表单等页面交互操作
  • ⏱️ 智能等待:等待特定元素出现
  • 🔍 信息提取:提取页面中的链接、图片等结构化信息
  • 📸 截图功能:截取页面截图
  • 💻 JavaScript执行:在页面中执行JavaScript代码
  • 🔄 多协议支持:支持 stdio、SSE 和 Streamable HTTP 三种传输协议
  • 实时通信:通过 SSE 和 HTTP Stream 实现服务器推送和双向通信
  • 🛡️ 安全验证:输入验证和错误处理
  • 📊 性能监控:工具执行时间监控和日志记录

安装

从 PyPI 安装

pip install mcp-browser-tools

从源码构建安装

使用 uv 构建和安装:

# 克隆仓库
git clone https://github.com/K-Summer/mcp-browser-tools.git
cd mcp-browser-tools

# 使用 uv 构建
uv build

# 安装构建的包
uv pip install dist/mcp_browser_tools-*.whl

开发安装

# 克隆仓库
git clone https://github.com/K-Summer/mcp-browser-tools.git
cd mcp_browser_tools

# 创建虚拟环境并安装
uv venv
source .venv/bin/activate  # Linux/macOS
# 或 .venv\Scripts\activate  # Windows

# 安装开发依赖
uv pip install -e .
uv pip install -e ".[dev]"  # 安装开发依赖

🚀 快速开始

1. 安装 Playwright 浏览器

playwright install

2. 验证安装

# 检查版本
mcp-browser-tools --version

# 查看帮助
mcp-browser-tools --help

# 列出支持的传输协议
mcp-browser-tools --list-transports

3. 选择传输协议并启动服务器

传输协议选择指南

协议 适用场景 优点 缺点
stdio CLI工具、本地开发 简单、稳定、功能完整 不支持远程连接
SSE Web应用、实时通信 支持服务器推送、HTTP兼容 单向通信(服务器→客户端)
HTTP Stream 流式API、长连接 双向通信、灵活 配置复杂

启动服务器

# 使用 stdio 协议(推荐用于本地开发)
mcp-browser-tools --transport stdio

# 使用 SSE 协议(推荐用于Web应用)
mcp-browser-tools --transport sse --host 127.0.0.1 --port 8000

# 使用 HTTP Stream 协议
mcp-browser-tools --transport http_stream --host 0.0.0.0 --port 8080

# 自定义配置
mcp-browser-tools --transport sse --host localhost --port 9000 --log-level DEBUG --server-name "my-browser-tools"

环境变量方式

# 使用 stdio 协议
export MCP_TRANSPORT_MODE=stdio
mcp-browser-tools

# 使用 SSE 协议
export MCP_TRANSPORT_MODE=sse
export MCP_HOST=127.0.0.1
export MCP_PORT=8000
mcp-browser-tools

# 使用 HTTP Stream 协议
export MCP_TRANSPORT_MODE=http_stream
export MCP_HOST=0.0.0.0
export MCP_PORT=8080
mcp-browser-tools

Python 模块方式

# 直接运行模块
python -m mcp_browser_tools --transport stdio

# 使用不同的传输协议
python -m mcp_browser_tools --transport sse --port 9000
python -m mcp_browser_tools --transport http_stream --host localhost

4. 测试服务器连接

测试 SSE 服务器连接

启动 SSE 服务器后,可以使用以下方法测试连接:

# 使用 curl 测试
curl -N http://localhost:8000/sse

# 使用 Python 测试
python -c "
import aiohttp
import asyncio

async def test():
    async with aiohttp.ClientSession() as session:
        async with session.get('http://localhost:8000/sse') as response:
            print(f'状态码: {response.status}')
            async for line in response.content:
                print(line.decode().strip())
                break

asyncio.run(test())
"

验证 MCP over SSE 端点

# 测试 MCP 端点
curl -N http://localhost:8000/mcp-sse

使用测试脚本

项目包含测试脚本:

# 快速测试连接
python quick_test.py

# 完整测试
python test_sse_connection.py

# 检查服务器状态
python check_server.py

### 3. 使用示例

```python
import asyncio
import json
from mcp.server.stdio import stdio_server
from mcp_browser_tools.server import main

async def main():
    # MCP服务器会自动连接到stdio
    await stdio_server(main)

if __name__ == "__main__":
    asyncio.run(main())

🛠️ 可用工具

MCP Browser Tools 提供以下浏览器自动化工具:

导航和页面操作

1. navigate_to_url

导航到指定URL

参数:

  • url (string, 必需): 要导航到的URL

示例:

{
  "name": "navigate_to_url",
  "arguments": {
    "url": "https://example.com"
  }
}

2. go_back

返回上一页

参数:

示例:

{
  "name": "go_back",
  "arguments": {}
}

3. go_forward

前进到下一页

参数:

示例:

{
  "name": "go_forward",
  "arguments": {}
}

4. refresh_page

刷新当前页面

参数:

示例:

{
  "name": "refresh_page",
  "arguments": {}
}

2. get_page_content

获取当前页面内容

{
  "name": "get_page_content",
  "arguments": {}
}

3. get_page_title

获取页面标题

{
  "name": "get_page_title",
  "arguments": {}
}

4. click_element

点击页面元素

{
  "name": "click_element",
  "arguments": {
    "selector": "#submit-button"
  }
}

5. fill_input

填充输入框

{
  "name": "fill_input",
  "arguments": {
    "selector": "#username",
    "text": "myusername"
  }
}

6. wait_for_element

等待元素出现

{
  "name": "wait_for_element",
  "arguments": {
    "selector": ".result-item",
    "timeout": 30
  }
}

7. execute_javascript

执行 JavaScript 代码

{
  "name": "execute_javascript",
  "arguments": {
    "script": "return document.title"
  }
}

8. take_screenshot

截取页面截图

{
  "name": "take_screenshot",
  "arguments": {
    "path": "screenshot.png"
  }
}

高级功能

直接使用 BrowserTools 类

from mcp_browser_tools.browser_tools import BrowserTools
import asyncio

async def main():
    async with BrowserTools() as tools:
        # 导航到网站
        await tools.navigate_to_url("https://example.com")

        # 获取页面内容
        content = await tools.get_page_content()
        print(content["title"])

        # 点击按钮
        await tools.click_element("#submit")

        # 填写表单
        await tools.fill_input("#name", "John Doe")

        # 等待结果
        await tools.wait_for_element(".success-message")

asyncio.run(main())

SSE 客户端连接

import aiohttp
import asyncio

async def connect_sse():
    # 连接到 SSE 端点
    async with aiohttp.ClientSession() as session:
        async with session.get("http://localhost:8000/mcp-sse") as response:
            async for line in response.content:
                line = line.decode('utf-8').strip()
                if line.startswith("data: "):
                    data = json.loads(line[6:])
                    print(f"服务器事件: {data}")

asyncio.run(connect_sse())

使用 SSE 双向通信

import asyncio
from sse_client_example import MCPClient

async def main():
    client = MCPClient("http://localhost:8000")

    await client.connect()

    # 获取工具列表
    await client.list_tools()

    # 调用工具
    await client.call_tool("navigate_to_url", {
        "url": "https://example.com"
    })

    await client.disconnect()

asyncio.run(main())

配置传输模式

from mcp_browser_tools.config import ServerConfig

# 创建 SSE 配置
config = ServerConfig(
    transport_mode="sse",
    sse_host="0.0.0.0",
    sse_port=8000
)

# 运行 SSE 服务器
# await main()

执行 JavaScript

result = await tools.execute_javascript("return window.location.href")
print(result)

截图功能

await tools.take_screenshot("page.png")

配置

服务器配置

服务器启动时会输出完整的配置信息,方便下次启动时使用相同的配置。

环境变量配置

支持通过环境变量配置服务器参数:

# 服务器基本信息
export MCP_SERVER_NAME="mcp-browser-tools"
export MCP_SERVER_VERSION="0.2.3"
export MCP_LOG_LEVEL="INFO"

# 传输模式配置
export MCP_TRANSPORT_MODE="sse"  # 或 "stdio"

# SSE 服务器配置
export MCP_SSE_HOST="localhost"
export MCP_SSE_PORT="8000"

配置文件方式

from mcp_browser_tools.config import ServerConfig

# 使用 SSE(默认)
config = ServerConfig(
    transport_mode="sse",
    sse_host="localhost",
    sse_port=8000
)

# 使用 stdio
config = ServerConfig(
    transport_mode="stdio"
)

自定义浏览器启动参数

from mcp_browser_tools.browser_tools import BrowserTools
from playwright.async_api import async_playwright

async with BrowserTools() as tools:
    tools.browser = await tools.playwright.chromium.launch(
        headless=True,
        args=[
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-dev-shm-usage'
        ]
    )

设置用户代理

tools.context = await tools.browser.new_context(
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)

使用场景

1. 网页信息爬取

[
  {
    "name": "navigate_to_url",
    "arguments": { "url": "https://news.ycombinator.com" }
  },
  { "name": "get_page_content", "arguments": {} },
  { "name": "get_page_title", "arguments": {} }
]

2. 自动化表单填写

[
  {
    "name": "navigate_to_url",
    "arguments": { "url": "https://example.com/login" }
  },
  {
    "name": "fill_input",
    "arguments": { "selector": "#username", "text": "user" }
  },
  {
    "name": "fill_input",
    "arguments": { "selector": "#password", "text": "pass" }
  },
  { "name": "click_element", "arguments": { "selector": "#login-button" } }
]

3. 等待动态内容

[
  {
    "name": "navigate_to_url",
    "arguments": { "url": "https://dynamic-site.com" }
  },
  {
    "name": "wait_for_element",
    "arguments": { "selector": ".dynamic-content", "timeout": 60 }
  },
  { "name": "get_page_content", "arguments": {} }
]

开发

安装开发依赖

uv add --dev pytest pytest-asyncio black isort mypy

运行测试

pytest

代码格式化

black mcp_browser_tools/
isort mcp_browser_tools/

类型检查

mypy mcp_browser_tools/

许可证

MIT License

贡献

欢迎提交 Issue 和 Pull Request!

更新日志

v0.2.3

  • 版本号升级:从 0.2.2 升级到 0.2.3
  • 配置输出功能:服务器启动时输出完整的配置信息
  • 环境变量支持:支持通过环境变量配置服务器参数
  • SSE 服务器基础功能:提供基本的 SSE 服务器功能
  • 文档完善:更新所有文档中的版本信息
  • 注意:SSE 模式目前提供基础功能,推荐使用 stdio 模式获得完整功能

v0.2.2

  • 默认使用 SSE (Server-Sent Events) 传输协议
  • 修复了 SSE 服务器启动问题,确保服务器能正确启动
  • 修复了 HTTP 方法错误,SSE 端点现在使用正确的 GET 方法
  • 改进了 SSE 服务器线程管理,避免阻塞主事件循环
  • 更新了所有相关文档和示例代码

v0.2.1

  • 添加了 SSE (Server-Sent Events) 传输协议支持
  • 实现了双协议架构:stdio 和 SSE 两种传输模式
  • 默认使用 SSE 传输协议,提供更好的实时通信体验
  • 新增 SSE 服务器端点和 WebSocket 双向通信
  • 提供了完整的 SSE 客户端示例
  • 修复了入口点配置问题,解决了 uvx 命令的协程警告
  • 更新了依赖配置,将已弃用的 tool.uv.dev-dependencies 替换为 dependency-groups.dev
  • 改进了 UTF-8 编码支持,确保所有文件正确使用 UTF-8 编码

v0.2.0

  • 添加了完整的错误处理和重试机制
  • 改进了页面内容提取功能,支持自定义提取规则
  • 优化了浏览器性能和内存使用
  • 增加了详细的日志记录和调试信息
  • 完善了配置管理,支持自定义浏览器设置

v0.1.0

  • 初始版本发布
  • 支持基本的浏览器操作功能
  • MCP 服务器实现

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcp_browser_tools-0.3.1.tar.gz (26.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_browser_tools-0.3.1-py3-none-any.whl (34.1 kB view details)

Uploaded Python 3

File details

Details for the file mcp_browser_tools-0.3.1.tar.gz.

File metadata

  • Download URL: mcp_browser_tools-0.3.1.tar.gz
  • Upload date:
  • Size: 26.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mcp_browser_tools-0.3.1.tar.gz
Algorithm Hash digest
SHA256 61f9398ae160898bfd8142c0d4cbb564acecf0d0f2fe38352542832fd2729432
MD5 94337284c84ae44c3b630558d60aacbc
BLAKE2b-256 11aab515ece74433be40a32ae26adc6ecd9ac78a02298560f1c0f87d7da8927e

See more details on using hashes here.

File details

Details for the file mcp_browser_tools-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: mcp_browser_tools-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 34.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mcp_browser_tools-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 dd303c5e92fe99898cf2acb52bfc033d0bd9fd6b9cb3b37321ef212ddf2b39c7
MD5 8e90a3480a6466f338cb4583bb7d803c
BLAKE2b-256 2257eec89525f4ced6345b3ff3cd75f5ef8bb843cb467e2a6147121c9b7c83c8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page