使用说明
浏览器使用MCP服务器
一个快速、轻量级的模型上下文协议(MCP)服务器,它通过Puppeteer的结构化无障碍数据,为大型语言模型(LLMs)提供浏览器自动化能力,具备可选的视觉模式以实现复杂视觉理解,并支持灵活、跨平台的配置。
主要特点
- ⚡ 快速且轻量使用Puppeteer的标签索引,而非基于像素的输入和无障碍性DOM树。
- 👁️ 视觉模式支持当结构化数据不足时,可选的复杂布局和视觉元素的视觉理解能力。
- **🤖 优化后的大型语言模型(LLM)**无需视觉模型,仅基于结构化数据运行,减少上下文令牌的使用,上下文需求较低。
- 🧩 灵活的运行时配置在运行时通过HTTP头自定义视口大小、坐标系因子和用户代理。
- 🌐 跨平台且可扩展支持远程和本地浏览器,使用自定义浏览器引擎。
要求
- Node.js 18 或更高版本
- VS Code、Cursor、Windsurf、Claude Desktop 或任何其他MCP客户端
开始入门
本地(工作室)
首先,将浏览器MCP服务器与您的客户端进行安装。一个典型的配置如下:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
Install in VS Code
您也可以使用 VS Code 命令行界面 (CLI) 安装 Browser MCP 服务器:
# For VS Code
code --add-mcp '{"name":"browser","command":"npx","args":["@agent-infra/mcp-server-browser@latest"]}'
安装完成后,您可以在VS Code中使用您的GitHub Copilot代理来访问浏览器MCP服务器。
Install in Cursor
首选 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"
]
}
}
}
Install in Windsurf
关注Windsuff MCP 文件、文档使用以下配置:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
Install in Claude Desktop
按照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 - 上海证券交易所
http://127.0.0.1::8089/sse
然后在MCP客户端配置中,设置 url 到SSE终端点:
{
"mcpServers": {
"browser": {
"url": "http://127.0.0.1::8089/sse"
}
}
}
url 到Streamable HTTP:
{
"mcpServers": {
"browser": {
"type": "streamable-http", // If there is MCP Client support
"url": "http://127.0.0.1::8089/mcp"
}
}
}
内存中调用
如果您的MCP客户端是基于JavaScript/TypeScript开发的,您可以直接使用进程内调用来避免用户需要安装命令行界面以使用Browser 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
Docker
我们已将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 在使用工具之前,请填写输入框,必须提供“index”或“selector”中的一个 选择器 (字符串,可选):输入字段的CSS选择器,优先使用索引,如果未提供索引,则使用选择器索引 (数字,可选):要填充的元素的索引 价值 (字符串,必需): 要填充的值 清晰;清楚 (布尔值,可选):在填充前是否清除现有文本 |
||
browser_get_clickable_elements |
获取当前页面上可点击、悬停或选择的元素,不要多次调用此工具 | |
browser_get_download_list |
获取已下载文件的列表 | |
browser_get_markdown |
获取当前页面的Markdown内容 | |
browser_get_text |
获取当前页面的文本内容 | |
browser_go_back |
返回上一页 | |
browser_go_forward |
转到下一页 | |
browser_hover |
将鼠标悬停在页面上的某个元素上,必须提供“index”或“selector” | 索引 (数字,可选):要悬停的元素的索引 选择器 (字符串,可选):用于悬停的元素的CSS选择器 |
browser_navigate |
导航到URL | 网址 (字符串,必填): |
browser_new_tab |
打开一个新标签页 | 网址 (字符串,必填):要在新标签页中打开的URL |
browser_press_key |
按下键盘上的一个键 | 关键 (字符串,必填):要按下的键名或要生成的字符,例如 Enter(回车)、Tab(制表)、Escape(退出)、Backspace(退格)、Delete(删除)、Insert(插入)、F1、F2、F3、F4、F5、F6、F7、F8、F9、F10、F11、F12、ArrowLeft(左箭头)、ArrowRight(右箭头)、ArrowUp(上箭头)、ArrowDown(下箭头)、PageUp(翻页上)、PageDown(翻页下)、Home(首页)、End(末尾)、ShiftLeft(左Shift)、ShiftRight(右Shift)、ControlLeft(左Ctrl)、ControlRight(右Ctrl)、AltLeft(左Alt)、AltRight(右Alt)、MetaLeft(左Meta)、MetaRight(右Meta)、CapsLock(大写锁定)、PrintScreen(打印屏幕)、ScrollLock(滚动锁定)、Pause(暂停)、ContextMenu(上下文菜单) |
browser_read_links |
获取当前页面上的所有链接 | |
browser_screenshot |
对当前页面或特定元素进行截图 | 名字 (字符串,可选):截图的名称 选择器 (字符串,可选):用于截图元素的CSS选择器 索引 (数字,可选):要截图的元素的索引 宽度 (数字,可选):以像素为单位的宽度(默认:视口宽度) 高度 (数字,可选):高度(以像素为单位)(默认:视口高度) fullPage(在中文中,这个短语通常不直接翻译,而是根据上下文理解为“全屏”或“全页面”的意思,但在这里为了保持原文的格式,我们直接保留“fullPage”) (布尔值,可选):是否截取全页面截图(默认:false) 突出;强调 (布尔值,可选):突出显示该元素 |
browser_scroll |
滚动页面 | 金额;数量 (数字,可选):要滚动的像素数(正数表示向下,负数表示向上),如果未提供数量,则滚动到页面底部 |
browser_select |
选择页面上的一个元素,使用索引,必须提供“index”或“selector” | 索引 (数字,可选):要选择的元素的索引 选择器 (字符串,可选):用于选择元素的CSS选择器 价值 (字符串,必填): 要选择的值 |
browser_switch_tab |
切换到特定标签页 | 索引 (数字,必填):用于切换的制表符索引 |
browser_tab_list |
获取标签页列表 | |
browser_vision_screen_capture |
为视觉模式截取当前页面的截图 | |
browser_vision_screen_click 在包含视觉和快照的页面上点击鼠标左键,在调用此工具之前,您应该先调用 browser_vision_screen_capture 首先仅尝试一次,若失败则回退到 browser_click 如果失败 |
因素 (数组,可选):视觉模型坐标系的缩放因子[宽度因子,高度因子],用于坐标空间归一化。转换公式:x = (x_model * 屏幕宽度 * 宽度因子) / 宽度因子;y = (y_model * 屏幕高度 * 高度因子) / 高度因子,其中x_model、y_model为归一化后的模型输出坐标(0-1),屏幕宽度/高度为屏幕尺寸,宽度因子/高度因子为量化因子。如果因子未知,则留空。大多数模型不需要此参数。 x (数字,必填):X像素坐标 y (数字,必填):Y 像素坐标 |
资源
| 资源名称 | URI 模式 | 描述 | MIME 类型 |
|---|---|---|---|
| (无对应中文) | (无对应中文) | (无对应中文) | (无对应中文) |
| text/plain(纯文本) | download://{name} |
浏览器下载 | |
| 基于文件扩展名的自动识别 | screenshot://{name} |
浏览器截图 |
| | 基于文件扩展名的自动识别 |
发展
npm run dev
访问 http://127.0.0.1:6274/
#!/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');
