最近我把 BrowserUse 通过 MCP 协议接进了 302AI 的服务体系,简单说就是把一个能操作浏览器的 AI 自动化工具变成了标准的 MCP server,这样任何支持 MCP 的客户端(Dify、Trae、Claude Desktop 之类的)都可以直接调用。这篇文章不是官方文档的复述,是我在配置、调试、上线这个服务时踩过的一堆坑和最终跑通的完整路径。如果你正准备在 Windows 或者服务器上接一个浏览器自动化 MCP,或者搞不清楚 MCP、Agent Skill、Function Call 之间到底怎么选,这篇应该能帮到你。
1. 先从问题说起:为什么 AI 应用需要“长手”而不是只“长嘴”
1.1 大模型的边界:能写方案,但点不了按钮
用过 ChatGPT、Claude 这类对话模型的人应该都有一种感觉:模型很聪明,能写代码、能写文案、能分析数据,但你让它“帮我去网页上把某个商品的价格抓下来”,它就卡住了,因为它只活在文本世界里,没有操作浏览器的手脚。
早期想解决这个问题,常规做法是写 Python 脚本,用 Playwright 或 Selenium 去操作浏览器。但是这种方式有几个硬伤:第一,脚本写死了流程,页面结构一变就要重写;第二,对非程序员极度不友好,总不能每个需求都写一段脚本;第三,脚本和模型是割裂的,AI 只能“指导”脚本跑,不能动态观察页面结果再调整策略。
所以你会发现,真正缺的不是“能操作浏览器的工具”,而是“AI 和被操作的浏览器之间的标准接口”。这个接口要让模型能随时调用浏览器能力,能拿到页面反馈,能自己决定下一步点哪里、填什么。
1.2 BrowserUse 解决的是“让 AI 会操作浏览器”
BrowserUse 是最近两年在 AI Agent 圈子里很火的一个方案。它的核心思路很简单:把浏览器操作封装成一个一个的工具函数,比如“打开页面”“点击元素”“填写文本”“提取内容”“截图”,然后把这些工具开放给大模型调用。模型就像一个拿到遥控器的人,需要点哪里、填什么,就调对应的工具。
和传统 Playwright 脚本最大的区别是,BrowserUse 是事件驱动、模型驱动的。你不需要预先写死“先点登录,再输账号,再点确认”的流程,只需要给模型一个目标,比如“登录后台,把昨天的新增用户数找出来”,模型会自己规划步骤并逐步调用工具。中途遇到弹窗、加载、验证码,它还能根据页面返回的 DOM 信息临时调整策略。
BrowserUse 本身已经很强了,但在实际项目里,它还有两个问题:一是它主要是一个 Python 库,调用方式偏底层,团队里不同成员要各自封装一层才能用;二是它没有接入标准工具协议,和 Dify、Trae 这类现成的 Agent 平台对接很别扭。于是“把 BrowserUse 变成 MCP server”就成了一个很自然的需求。
1.3 MCP 在中间扮演什么角色
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 在 2024 年底推出的开放协议,解决的是“AI 模型怎么统一调用外部工具”的问题。你可以把 MCP 理解成 USB-C 接口:以前每个设备都有自己的充电口,现在统一成一个标准,只要是支持 MCP 的客户端,就能连接所有支持 MCP 的服务端。
具体到浏览器自动化这个场景,MCP 的价值有三个:
- 标准化:客户端不用关心对面是 BrowserUse、Playwright 还是别的什么框架,只要遵循 MCP 协议就能拿到工具列表和调用结果。
- 解耦:BrowserUse 跑在哪台机器上、用什么浏览器、什么网络环境,对调用方透明。本地跑还是远程跑都行。
- 生态复用:Dify、Trae、Claude Desktop、Codex 这些客户端原生支持 MCP,服务端做好之后直接就能接,不用每个平台单独开发插件。
所以我这次的落地思路很明确:把 BrowserUse 的操作能力封装成一个 MCP server,部署到 302AI 的服务上,对外提供标准 MCP 接口。这样无论我是在 Dify 里搭自动化流程,还是在本地 IDE 里调试 Agent,都能直接调用同一套浏览器能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 302AI BrowserUse MCP 服务结构:一个 MCP server 里到底打包了什么
2.1 服务端组件拆解
从架构上看,这个服务大致分三层。
第一层是协议层。这一层负责 MCP 握手、工具发现、调用请求转发。客户端发来 initialize 请求时,服务端返回协议版本、服务器能力、可用工具列表。之后客户端就可以通过 tools/call 发起调用。这一层属于标准实现,所有 MCP server 都一样,重点是下面两层。
第二层是浏览器控制层。这一层由 BrowserUse 核心库和 Playwright 浏览器实例组成。每次会话启动时,服务端会拉一个 Chromium 实例,并保持一条浏览器上下文通道。BrowserUse 负责把工具调用翻译成 Playwright 的具体操作,比如点击、输入、滚动、等待元素出现。
第三层是会话管理层。这一层处理多用户、多任务的隔离。每个调用方可以通过 session_id 区分自己的浏览器会话,避免不同任务之间互相干扰。比如你同时开三个任务,各自维护独立的浏览器标签页和登录状态,这层就是干这个的。
架构上最常被忽略的是会话管理,我一开始就吃过亏。最开始我没做会话隔离,所有请求共享一个浏览器实例,结果两个任务同时操作页面时互相踩踏,一个任务刚打开登录页,另一个任务就把它导航走了,返回结果完全错乱。后来加了基于 session_id 的隔离机制,每个任务独立上下文,问题才解决。
2.2 暴露出来的核心工具
这个 MCP server 对外暴露的工具比较常规,但每类工具在实现上都有些细节值得注意。列出服务里的核心工具:
| 工具名 | 功能 | 主要参数 |
|---|---|---|
| browser_navigate | 打开指定 URL | url、timeout、wait_until |
| browser_click | 点击页面元素 | selector、selector_type、timeout |
| browser_type | 在输入框填写文本 | selector、text、enter_submit |
| browser_select | 下拉框选择 | selector、value、label |
| browser_extract | 提取页面内容 | selector、attribute、multiple |
| browser_screenshot | 页面截图 | full_page、format、quality |
| browser_wait | 等待元素/网络状态 | condition、value、timeout |
| browser_run_script | 执行自定义 JS | script |
粗看这些工具和 Playwright 的 API 差不多,但实际使用中要注意几点。第一,browser_navigate 的 wait_until 参数很重要,我建议默认用 networkidle 而不是 load,因为现代网页大多有异步请求,load 事件触发时页面可能还没渲染完,结果提取出来的内容是空的。第二,browser_click 定位元素时,如果页面是 Vue 或 React 写的,class 名可能动态生成,用 CSS selector 容易失效,建议优先用 text 定位或 aria-label。第三,browser_extract 返回的是结构化 JSON,而不仅仅是文本,这一点后面会细说。
2.3 两种调用模式:stdio 和远程 HTTP
这个 MCP server 支持两种连接模式。
本地 stdio 模式适合开发调试。你在本地命令行启动服务进程,MCP 客户端通过标准输入输出和这个进程通信。优点是延迟低、配置简单、不需要网络,缺点是只能本机调用。我在本地调试时用的就是这种模式,启动命令类似于:
bash复制npx -y @302ai/browseruse-mcp
远程 HTTP 模式适合生产环境。服务部署在服务器上,客户端通过 URL 访问。这个模式又分两种子类型:SSE(Server-Sent Events)和 Streamable HTTP。SSE 是早期的 MCP 远程方案,服务端单向推送事件;较新的 Streamable HTTP 支持双向流式调用,更接近常规 REST 接口。如果你用的是 Dify 或较新的客户端,选 Streamable HTTP 会更稳定。我实际测试下来,SSE 在长时间无请求时容易断连,Streamable HTTP 的保持连接机制明显更好。
远程模式的核心参数就是服务地址和认证密钥。举个例子,如果我在 302AI 控制台开通服务后拿到一个接入地址,那么配置 URL 形如:
text复制https://your-endpoint.example.com/mcp/browseruse
认证方式用 Bearer Token,也就是在请求头里带上 Authorization 字段。这类密钥配置在客户端里通常叫 API Key,需要妥善保管,别写进前端代码或公开仓库。
3. 接入步骤全拆解:从零到第一个“打开页面”的任务
3.1 准备工作:环境要求和凭证获取
接这个服务前,建议先确认三件事。
第一,操作系统。本地调试的话,Windows、macOS、Linux 都可以。Windows 上唯一要注意的是 npx 或 Node.js 的安装路径,后面我会专门讲。如果你用的是远程模式,本地客户端不要求特定系统,只要能访问外网就行。
第二,运行环境。浏览器自动化依赖 Chromium,本地调试时需要系统里有可用的浏览器内核。如果你是用 npx 启动服务,首次运行通常会自动下载 Chromium,但国内网络环境下载比较慢,我建议手动安装 Playwright 的浏览器依赖,命令是:
bash复制npx playwright install chromium
这个步骤很多人会忽略,导致后面启动 MCP server 时报找不到浏览器的错误。
第三,接入凭证。在 302AI 控制台开通 BrowserUse MCP 服务,获取 API Key。这个 Key 在远程模式下是必填的,在本地 stdio 模式下一般也需要,因为服务端要校验用量。拿到 Key 后记录下来,后面配置里要用。
3.2 .mcp 文件到底怎么写
现在不少 MCP 客户端支持项目级配置文件,文件名通常是 .mcp.json。这个文件放在项目根目录,作用是声明这个项目需要的 MCP server 信息,团队成员拉下代码后只要安装了对应的客户端,就能自动识别并加载。
远程模式下的 .mcp.json 写法示例:
json复制{
"mcpServers": {
"browseruse": {
"url": "https://your-endpoint.example.com/mcp/browseruse",
"headers": {
"Authorization": "Bearer your-api-key-here"
},
"type": "streamable-http"
}
}
}
如果你用的是本地 stdio 模式,则不是填 URL,而是填启动命令:
json复制{
"mcpServers": {
"browseruse": {
"command": "npx",
"args": ["-y", "@302ai/browseruse-mcp"],
"env": {
"API_KEY": "your-api-key-here"
}
}
}
}
这里有个坑:本地模式下 Windows 的 command 字段要写 npx.cmd,直接写 npx 会报“命令未找到”或“无法加载”的错误。这是因为 Windows 的脚本执行机制和 Unix 不同,npm 全局命令在 Windows 下是 .cmd 文件。很多人在这一步卡很久,其实把 command 改成 npx.cmd 就好了。
3.3 Windows 上创建 MCP 配置的常见姿势
Windows 用户接入 MCP 服务通常有三种入口。
第一种是 Claude Desktop 客户端。它读取的是全局配置文件 claude_desktop_config.json,一般在 %APPDATA%\Claude\ 目录下。你需要在系统配置里加一段 mcpServers,写法跟上面的 .mcp.json 一样。
第二种是 VS Code 或 Cursor 这类编辑器。它们支持项目级配置文件,也就是在 .mcp.json 里配置。编辑器启动时会自动读取这个文件,在 AI 助手的工具面板里就能看到 browseruse 相关工具。
第三种是命令行工具或调试脚本。这种方式最常见,尤其适合程序员。你可以写一个简单的 Node.js 或 Python 脚本,用 MCP SDK 连接服务,然后直接发起调用。这种方式最灵活,也最容易定位问题。
Windows 下我建议先确认三个环境变量:PATH 里有没有 Node.js 路径、有没有 npm 全局包路径、有没有 Playwright 浏览器路径。很多人 MCP server 启动报错,排查到最后都是环境变量的问题。比如只装了 Node.js 没装 Playwright 浏览器,服务能启动但一调用浏览器工具就报错。
3.4 Dify 添加本地 MCP 服务:一步步配置
Dify 是目前比较流行的 LLM 应用开发平台,它原生支持 MCP 工具接入。在 Dify 里添加 BrowserUse MCP 服务,路径一般是:工具 → 添加工具 → MCP 服务。
进入后要选择连接类型。如果选“本地 SSE”或“Streamable HTTP”,需要填服务 URL 和认证信息。如果选“本地命令”,则需要填启动命令和参数。填完后点击“获取工具列表”,系统会调用 MCP 协议中的 tools/list 方法,把 BrowserUse 的八个工具拉进来。
这里有一个比较常见的现象:工具列表拉不到,或者部分工具显示异常。原因通常是服务端启用了鉴权,Dify 发送的请求头里没有带正确的 Token。解决办法是在 Dify 的 MCP 配置里找到“Headers”选项,手动加上:
json复制{
"Authorization": "Bearer your-api-key-here"
}
另外,Dify 配置 MCP 服务还有一个注意点:如果你用的是本地命令模式,Dify 后台服务需要和你本地浏览器环境在同一台机器上,否则它找不到浏览器。如果是远程模式就没有这个限制。
3.5 Trae 这类 IDE 客户端接入方式
Trae 是字节跳动推出的 AI IDE,它同样支持 MCP 配置。入口在设置或插件市场的 MCP 管理面板里。填法跟 VS Code 类似,可以填远程 URL,也可以填本地命令。
如果你在 Trae 里用 SSH 远程开发,MCP 服务也可以配置为“SSH 模式”。也就是说,MCP server 跑在远程服务器上,本地 IDE 通过 SSH 隧道调用远程的 MCP 服务。这种模式下 URL 一般是 http://localhost:XXXX/mcp,因为 SSH 隧道已经把远程端口映射到本地了。
但 SSH 模式有个坑:如果远程服务器上的 MCP server 是用 stdio 模式启动的,而 IDE 配置成了 HTTP URL,两边协议对不上,工具列表就拉不到。这时候要根据 MCP server 实际启动方式来选择连接类型。简单记一句话:MCP server 是 HTTP 启动,客户端就填 URL;MCP server 是进程启动,客户端就填 command。
4. 实战调用:浏览器自动化任务的完整流程和返回结果解析
4.1 一个典型任务:抓取页面标题和关键链接
配置好服务之后,最直接的验证方式是发起一个真实任务。我拿一个非常简单的需求来演示:打开 example.com 的一个二级页面,抓取页面标题和所有外链地址。
在 Dify 的对话界面里,我可以直接给 Agent 下达自然语言指令:“使用 browseruse 工具,打开 https://example.com/about ,提取页面标题和所有链接。”
Agent 收到指令后会调用 MCP 工具,按照规划执行:
- 调用
browser_navigate,参数 url 设为https://example.com/about - 等待页面加载,内部等待 DOMContentLoaded 和网络空闲
- 调用
browser_extract,使用一个 JS 表达式提取document.title和所有a标签的href - 把结果组合成结构化文本返回给我
这个过程看似简单,实际运行中有个容易忽视的点:Agent 不一定一次就能拿到完整结果。比如页面里有些链接是相对路径,比如 /team,需要 Agent 拼接成完整 URL。经验丰富的人会在 prompt 里加一句“链接需要拼接为绝对地址”,这样 Agent 就知道在提取时要处理相对路径。
4.2 返回结果的结构和解析
MCP 工具调用的返回结果一般是 JSON 格式。拿 browser_extract 举例,返回结构大致是这样:
json复制{
"success": true,
"data": [
{ "type": "title", "content": "About Us - Example" },
{ "type": "link", "content": "https://example.com/team" },
{ "type": "link", "content": "https://example.com/contact" }
],
"page_url": "https://example.com/about",
"timestamp": "2025-06-15T12:30:00Z"
}
注意,data 是数组,因为一条提取指令可能命中多个元素。前端接这个结果时,别只取 data[0],要遍历处理。另外 success 字段不一定是 true,当页面加载超时、元素不存在时会是 false,并且带一个 error 字段,里面是错误类型和描述。这是很基础的东西,但我见过不止一个同事写解析逻辑时忽略了 success 判断,导致拿到空结果还继续往下跑。
4.3 会话保持、状态隔离和浏览器复用
你可以把 MCP BrowserUse 服务和浏览器的关系想象成“两个人用同一个浏览器”。如果服务在 302AI 那边部署时是按会话隔离的,你每次调用都要传 session_id,才能保持登录状态和浏览器上下文。
实际场景中,比如要从某个后台系统抓取数据,任务流程一般是先登录,再导航到报表页,再提取数据。如果每个工具调用都用新会话,登录信息就丢了。所以要确保 Agent 的编排里,同一个任务的所有工具调用都复用同一个 session_id。
另外要理解的是,浏览器实例不是每次调用都从头启动的。服务端有实例池机制,冷启动一个浏览器需要 1 到 3 秒,但如果复用一个已经启动的浏览器,响应会快很多。因此在做批量任务时,尽量把任务合并到一个长会话里执行,而不是拆成几百个短会话,否则大部分时间都耗在启动浏览器上。
4.4 处理页面动态渲染和等待
很多页面是前端异步渲染的,比如点击“加载更多”按钮后,新内容要隔几秒才出现。直接用 browser_extract 提取时,很可能拿到旧内容或者空内容。解决办法是在提取前调用 browser_wait,等待某个元素出现或等待网络请求完成。
还有一种更复杂的情况:页面内容由 Canvas 渲染,DOM 里根本没有文本节点。这种情况用 BrowserUse 默认的提取方式是无解的,有两个应对思路:一是截屏后用视觉模型识别,二是调用 browser_run_script 去读取内部状态数据。我在处理一些数据大屏项目时,就用第二种方式,通过执行 JS 读取页面里的 JSON 数据源,绕开 Canvas 渲染层。
5. 排错实录:接入过程中我踩过的坑和解决办法
5.1 工具注册不上:从 Figma MCP 到 BrowserUse 的通病
“工具注册不上”是 MCP 接入时出现频率最高的错误。很多人在 Codex 里挂 Figma MCP 时总是注册失败,消息提示可能是“工具列表拉取超时”或“Failed to load tools”,这个问题的根源往往不在客户端,而在服务端。
我排查这类问题时的思路,按顺序来:
- 先看 MCP server 的启动日志。启动时有没有报错、是否正常输出监听信息。
- 再看网络。如果用的是远程模式,用 curl 直接请求一下 MCP endpoint,看是否能返回正常 JSON。
- 然后看工具列表的 schema 格式。有些客户端对工具参数的定义比较严格,如果你给某个工具加了不兼容的字段类型,或者
required数组里引用了不存在的字段,客户端会在注册阶段直接跳过。 - 最后看超时设置。工具数量多的时候,一次性拉取所有工具定义可能超过客户端的默认超时时间。
BrowserUse MCP 的服务端工具只有八个,理论上不存在数量导致超时的问题,但 Figma MCP 这类工具动辄二三十个工具,就很容易触发超时。如果你用的客户端有超时设置,调大一些能解决问题。
排查工具注册问题时还有一个实用技巧:直接进 MCP server 的调试页面或者通过命令行调 tools/list 方法,把返回的 JSON 保存下来,然后检查格式。很多客户端注册失败,其实是服务端返回的 openapi_schema 或 tool schema 不规范导致的。
5.2 SSH 连接 vs 本地进程连接:怎么选
我在配置 Trae 的时候,纠结过是用 SSH 连远程 MCP 还是本地起一个进程。后来两个都试了,结论比较明确。
如果你只是为了自己调试浏览器自动化,本地进程连接最省事。npx 直接启动,不需要配置 SSH,不需要担心端口冲突,调试心流不会被打断。
如果你要部署到团队共用或者生产环境,那远程 HTTP 模式更方便。把 MCP server 部署到一台机器上,通过 SSH 隧道或直接暴露 URL,团队所有人都能连同一个服务。但要注意的是,这种模式下的浏览器实例数量是有限的,最好在服务端做好排队和超时限制,否则多个任务同时请求时后面的请求会一直阻塞。
SSH 模式比较适合“开发机不在本地,但想用本地 IDE 调试”的场景。配置要点是保证本地能 ssh 通远程机器,然后把远程的端口映射到本地。使用 SSH 隧道时,我建议直接用 ssh -L 命令手动映射端口,而不是依赖 IDE 自动管理,这样出问题更好排查。
5.3 浏览器启动失败、元素找不到、超时这类运行时问题
这类问题是最常见的,也是最容易让人崩溃的。
浏览器启动失败通常是 Chromium 依赖缺失。在最小化的 Linux 服务器上,还缺一堆系统库,比如 libnss3、libatk、libgbm 等。解决办法是运行:
bash复制npx playwright install-deps chromium
这个命令会把这些系统依赖一次性装好。Windows 上很少遇到这种问题,但如果你用的是精简版系统,也可能缺 VC++ 运行库。
元素找不到的问题,十有八九是页面加载没完成。我的习惯是在关键操作前加一个 browser_wait,等待目标元素出现。另外一个经验是,能通过文本定位就尽量用文本定位,不要用复杂的选择器。比如定位一个按钮,直接写 text=提交 通常比写一长串 div.container > button.btn-primary 稳定得多。
超时问题要分两种情况。导航超时一般是目标网站响应太慢,可以调大 timeout 参数,或者考虑使用代理。元素操作超时通常是页面改了结构,选择器失效了。这时候去页面控制台确认一下目标元素当前是否有修改,或者在 prompt 里告诉 Agent 重新定位。
5.4 “免费联网 MCP”之类的限制和隐藏成本
百度热搜里有一类问题是“免费联网 MCP”,搜索引擎的热词也经常出现“免费联网”的梗。免费的东西不是没有,而是通常有隐性限制,我必须说清楚。
拿 BrowserUse MCP 这类服务来说,免费额度一般能让你跑几个简单任务,但生产环境里最好别依赖免费方案。浏览器自动化非常吃资源,一个 Chromium 实例占几百 MB 内存,长会话更要命。免费额度一般限制会话时长、并发数和单次调用次数。
其他常见限制还有:
- 只能访问公网,不能访问内网地址。
- 对某些高频网站可能被反爬,需要额外的反检测配置。
- 不能长时间维持登录态,会话有最大空闲时间。
如果你遇到“免费联网 MCP 经常断连”的问题,大概率不是服务商的问题,而是会话策略导致的资源回收。处理方式是在业务层做好重试和断线重连,别让单个长会话承担所有任务。
6. MCP、Agent Skill、Function Call:这三个东西别再混在一起
6.1 概念到底有什么区别
搜索引擎热词里频繁出现“agent skill 和 mcp 有什么区别”“MCP 是什么”,说明很多人容易搞混。我也会顺手把 Function Call 一起说清楚。
Function Call 是模型自身能力的一部分。大模型在训练时学习了一种叫“函数调用”的输出格式,当你给模型提供函数定义时,它可以把用户的自然语言映射到一个函数调用请求。它不是一个独立协议,就是模型输出的一种结构化格式。
MCP 是一个协议,是模型和外部工具之间的通信标准。它负责能力发现、身份认证、调用路由和结果返回。MCP server 可以内部使用 Function Call 来调用模型,但 MCP 本身不依赖某个特定模型。
Agent Skill 更偏业务封装层面。它通常指“某个 Agent 在特定场景下需要的一组能力和知识模块”。比如一个“客服 Agent Skill”可能包括:查订单的 API、查物流的 API、退换货的话术模板、售后政策文档。它是一个组合包,而 MCP 是包里面的连接标准。
用生活化的类比:
- Function Call 是“你会写字”
- MCP 是“你用的写字板和笔,以及标准的写信格式”
- Agent Skill 是“你写邮件时使用的整个邮件模板库”
6.2 什么时候该选哪个
我的选择逻辑很简单:
- 如果你只需要在单个模型对话里调用几个固定函数,直接上 Function Call,最简单。
- 如果你有多个不同技术栈的工具要统一暴露给 AI,比如浏览器自动化、数据库查询、内部 API,那给每个工具建一个 MCP server 是值得的。
- 如果你在做一套端到端的 Agent 业务,比如一个“自动处理客户投诉”的 Agent,那它内部一定同时用到 MCP 工具和 Skill。MCP 管工具连接,Skill 管业务流程和经验话术。
6.3 我踩过的选型坑
我第一次做浏览器自动化 Agent 时,纠结了很久要不要把 BrowserUse 封装成 MCP server。一开始直接用 BrowserUse 库和 Function Call 搭了个原型,跑了几天就发现问题:换了客户端之后,原来的 Function Call 逻辑不能复用,又要重新适配。后来改成 MCP server,一次封装,Dify、Trae、Claude Desktop 全都能用。这个决策回头来看是对的。
反而是在 Skill 层面走了一些弯路。早期我把 Prompt 模板、工具列表、业务规则全部混在一个“Skill”里,结果可维护性很差,改一个话术就要动整个 Skill。后来把 Skill 拆成可组合的模块:业务规则放记忆区,工具连接走 MCP,流程编排留在 Agent 配置里。这个思路,在实际跑批处理任务时明显更稳。
如果你刚开始做 Agent 项目,我的建议是:工具能力优先以 MCP 形式落地,业务经验再沉淀成 Skill。别一上来就把所有东西都揉成 Skill,不然工具升级时你会非常痛苦。
最后再分享一个我自己的操作习惯。每次接完一个新的 MCP server,我都会先用命令行工具跑一遍 tools/list,确认工具列表能正常拉取,再进客户端界面里配置。这一步耗时不到一分钟,但能帮你把“客户端配置问题”和“服务端问题”这两类故障彻底隔开。BrowserUse MCP 这个服务我用了几个月,最大的体会是:浏览器自动化的核心不是工具本身,而是你如何把工具标准化、可复用、可观测。希望这篇对你也有参考价值。
