浏览器使用 MCP 服务器
一个快速,轻量级的模型上下文协议(MCP)服务器,通过Puppeteer的结构化可访问性数据赋予LLMs以浏览器自动化的能力,其特点是可选的视觉模式,用于复杂的视觉理解和灵活的跨平台配置.
关键特性
- 快速和轻量级. 使用 Puppeteer 的标签索引,而不是基于像素的输入和访问 DOM 树.
- ++ 愿景模式支持. 在结构化数据不足时,可选择的视觉理解能力用于复杂的布局和视觉元素.
- * LLM优化. 不需要视觉模型,完全依靠结构化数据运作,减少上下文符号的使用.
- XQ 灵活运行时配置。自定义视图大小、协调系统因子,以及运行时通过HTTP头的用户代理.
- ++ 跨平面并可扩展。支持远程和本地浏览器,使用自定义浏览器引擎.
所需资源
- 节点.js 18或更新
- VS 代码、 光标、 Windsurf、 Claude 桌面或任何其他 MCP 客户端
开始
当地( Stdio)
首先,用客户端安装浏览器MCP服务器. 一个典型的配置是这样的:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
在 VS 代码中安装
您也可以使用 VS 代码 CLI 安装浏览器 MCP 服务器 :
# For VS Code
code --add-mcp '{"name":"browser","command":"npx","args":["@agent-infra/mcp-server-browser@latest"]}'
安装后, 浏览器 MCP 服务器将可用 VS 代码中的您的 GitHub 副驾驶代理 .
在光标中安装
转到 Cursor Settings - > (中文) MCP - > (中文) Add new MCP Server。您喜欢的名称,使用 command 带有命令的类型 npx @agent-infra/mcp-server-browser。也可以通过点击来校验配置或添加类似参数的命令 Edit。 。 。 .
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
在 Windsurf 安装
跟随Windsuff MCP 文档。使用以下配置:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
在 Claude 桌面中安装
跟随 MCP 安装 指南,使用以下配置:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
远程( SSE / 可流 HTTP)
同时使用 --port $your_port 启动浏览器mcp的参数可以被转换为SSE和可流式HTTP服务器.
# normal run remote mcp server
npx @agent-infra/mcp-server-browser --port 8089
# run with DISPLAY environment for VNC or other virtual display
DISPLAY=:0 npx @agent-infra/mcp-server-browser --port 8089
您可以使用两个 MCP 服务器远程端点中的一个 :
- 可流取的 HTTP( 建议):
http://127.0.0.1::8089/mcp - SSE : (英语)
http://127.0.0.1::8089/sse
然后在MCP客户端配置中设置 url 至SSE 端点 :
{
"mcpServers": {
"browser": {
"url": "http://127.0.0.1::8089/sse"
}
}
}
url 转到可流式 HTTP :
{
"mcpServers": {
"browser": {
"type": "streamable-http", // If there is MCP Client support
"url": "http://127.0.0.1::8089/mcp"
}
}
}
纪念电话
如果您的MCP客户端是基于JavaScript / TypeScript开发的,可以直接使用进程内调用来避免要求您的用户安装命令行界面来使用浏览器MCP.
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
// type: module project usage
import { createServer } from '@agent-infra/mcp-server-browser';
// commonjs project usage
// const { createServer } = await import('@agent-infra/mcp-server-browser')
const client = new Client(
{
name: 'test browser client',
version: '1.0',
},
{
capabilities: {},
},
);
const server = createServer();
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
await Promise.all([
client.connect(clientTransport),
server.connect(serverTransport),
]);
// list tools
const result = await client.listTools();
console.log(result);
// call tool
const toolResult = await client.callTool({
name: 'browser_navigate',
arguments: {
url: 'https://www.google.com',
},
});
console.log(toolResult);
配置
浏览器 MCP 服务器支持以下参数 。 可在上面的JSON配置中提供,作为 "args" 列表 :
> npx @agent-infra/mcp-server-browser@latest -h
-V, --version output the version number
--browser <browser> browser or chrome channel to use, possible values: chrome, edge, firefox.
--cdp-endpoint <endpoint> CDP endpoint to connect to, for example "http://127.0.0.1:9222/json/version"
--ws-endpoint <endpoint> WebSocket endpoint to connect to, for example "ws://127.0.0.1:9222/devtools/browser/{id}"
--executable-path <path> path to the browser executable.
--headless run browser in headless mode, headed by default
--host <host> host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.
--port <port> port to listen on for SSE and HTTP transport.
--proxy-bypass <bypass> comma-separated domains to bypass proxy, for example ".com,chromium.org,.domain.com"
--proxy-server <proxy> specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"
--user-agent <ua string> specify user agent string
--user-data-dir <path> path to the user data directory.
--viewport-size <size> specify browser viewport size in pixels, for example "1280, 720"
--output-dir <path> path to the directory for output files
--vision Run server that uses screenshots (Aria snapshots are used by default)
-h, --help display help for command
运行时配置
浏览器运行时间需要配置 Viewport Size, (中文(简体) ), Vision Model Coordinate Factors,以及 User Agent。这些可以通过相应的 HTTP 头来传递 :
| 页眉 | 说明 |
|---|---|
x-viewport-size | 浏览器视图大小, 格式 : width,height 用逗号分隔 |
x-vision-factors | 远景模型坐标系统因子,格式: x_factor,y_factor 用逗号分隔 |
x-user-agent | 用户代理字符串, 如果未指定, 默认为系统用户代理 |
说明: 标题为不区分大小写.
示例
x-viewport-size: 1920,1080
x-vision-factors: 1.0,1.0
x-user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
夹克
我们统一部署 VNC 和 MCP 在单一的 URL 端点下, Dockerfile 和 DockerHub 图像将一起发布! 视频
API 密码
工具
| 工具名称 | 说明 | 参数 |
|---|---|---|
browser_click | 在使用工具前单击页面上的元素 browser_get_clickable_elements 以获取元素索引,但不调用 browser_get_clickable_elements 多次数 | 指数 (数目,可选): 要点击的元素索引 |
browser_close | 任务完成后关闭浏览器, 不再需要浏览器 | |
browser_close_tab | 关闭当前标签 | |
browser_evaluate | 在浏览器控制台执行 JavaScript | 脚本 (字符串, 需要): JavaScript 代码执行, () {} / * 代码 */} |
browser_form_input_fill | 在使用工具前填入输入字段, 必须提供“ 索引” 或“ 选择器 ” | 选择器 (字符串,可选):用于输入字段的 CSS 选择器,优先使用索引,如果不提供索引,则使用选择器 指数 (数目,可选): 填充要素索引 价值 (字符串,要求): 要填充的值 清除 (布尔,可选): 在填充前是否清除已存在的文本 |
browser_get_clickable_elements | 在当前页面上获取可点击或可徘徊或可选择的元素,不要多次调用此工具 | |
browser_get_download_list | 获取已下载文件列表 | |
browser_get_markdown | 获取当前页面的下标内容 | |
browser_get_text | 获取当前页面的文本内容 | |
browser_go_back | 回到上一页 | |
browser_go_forward | 转到下一页 | |
browser_hover | 隐藏页面中的元素, 必须提供“ 索引” 或“ 选择器 ” | 指数 (数目,可选): 悬浮元素索引 选择器 (字符串,可选):用于元素徘徊的 CSS 选择器 |
browser_navigate | 导航到 URL | url 密码 (字符串,要求): |
browser_new_tab | 打开新标签 | url 密码 (字符串, 需要): 要打开新标签的 URL |
browser_press_key | 按键盘上的键 | 键 (字符串,要求): 要按键或生成的字符名称, 如 Enter, Tab, Escape, Backspace, 删除, 插入, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, ArrowLeft, ArrowRight, ArrowUp, ArrowDown, PageUp, PageDown, Home, End, ShiftLeft, ShiftRight, ControlLeft, ControlRight, AltLeft, AltRight, MetaLeft, MetaRight, CapsLock, PrintScreen, ScrollLock, Pause, CaseMenu |
browser_read_links | 获取当前页面上的所有链接 | |
browser_screenshot | 取当前页面的截图或特定元素 | 名称 (弦,可选): 截图名称 选择器 (字符串,可选):用于元素截取的 CSS 选择器 指数 (数字,可选):用于截图的元素索引 宽度 (数目,可选): 在像素中的宽度( 默认: 视图宽度) 高度 (数目,可选): 在像素中的高度( 默认: 视图高度) 全页 (布尔,可选): 全页截图( 默认: 假) 突出显示 (布尔,可选): 突出显示元素 |
browser_scroll | 滚动页面 | 金额 (数目,可选): 要滚动的像素( 正向下, 负向上), 如果不提供数量, 滚动到页面底端 |
browser_select | 在页面上选择一个带有索引的元素, 必须提供“ 索引” 或“ 选择器 ” | 指数 (数目,可选): 要选择的元素索引 选择器 (字符串,可选):用于选择元素的 CSS 选择器 价值 (字符串,要求): 要选择的值 |
browser_switch_tab | 切换到特定标签 | 指数 (数量,需要):要切换到的标签索引 |
browser_tab_list | 获取标签列表 | |
browser_vision_screen_capture | 查看当前页面的视图模式 | |
browser_vision_screen_click | 点击页面上带有视觉和快照的鼠标左键,在调用此工具前,您应该调用 browser_vision_screen_capture 仅一次,倒向 browser_click 如果失败 | 因素 (阵列,可选):用于协调空间正常化的远景模型坐标系统缩放因子[width factor,high factor]. 变换公式: x = (x model * 屏幕 width * 宽度 factor) / 宽度 factory y = (y model * 屏幕 高度 factor) / 高度 factor 其中x model,y model是常态化的模型输出坐标(0-1),screen width/高度是屏幕维度,宽度 因素/高度 factor是量化因子,如果因子未知,请留入空. 大多数模型不需要这个参数. 页:1 (数量,需要): X 像素坐标 尔 (数目,需要):Y像素坐标 |
资源
| 资源名称 | URI 模式 | 说明 | MIME 类型 |
|---|---|---|---|
| 浏览器控制台日志 | console://logs | 文本/说明 | |
| 浏览器下载 | download://{name} | 基于文件扩展名的自动标识 | |
| 浏览器屏幕截图 | screenshot://{name} | 基于文件扩展名的自动标识 |
发展
查阅 http://127.0.0.1:6274/:
npm run dev
扩展 CLI 条目
#!/usr/bin/env node
const {
BaseLogger,
setConfig,
addMiddleware,
} = require('@agent-infra/mcp-server-browser/request-context');
class CustomLogger extends BaseLogger {
info(...args) {
console.log('custom');
console.log(...args);
}
}
addMiddleware((req, res, next) => {
console.log('req', req.headers);
next();
});
setConfig({
logger: new CustomLogger(),
});
// start server
require('@agent-infra/mcp-server-browser/index');