Playwright MCP 让 Cursor 真的去点浏览器:browser_click 点按钮、browser_snapshot 抓页面结构、browser_take_screenshot 留证据。这套组合好用在“模型能看见页面”,也费在“模型得反复看页面”——一个长会话里连着调几十次 MCP 工具,上下文一轮轮累积,Token 是肉眼可见地往下掉。我把模型通道换成了 TaoToken,注册、建 Key、查模型 ID 都在一处完成:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=playwright_mcp 。这篇按“装依赖 → 挂 MCP → 切通道 → 启动 → 认工具 → 跑一遍 → 排错”的顺序,把 Cursor + Playwright MCP + TaoToken 这条链路走通,中间该复制的 JSON、该填的 Base URL、该看的报错都写清楚。
1. Cursor 长会话里连着调 browser_click,Token 到底耗在哪
1.1 Playwright MCP 干的是“手和眼”的活
浏览器自动化 MCP 本质上是模型和真实浏览器之间的一层适配:模型不直接操作 DOM,而是通过一组被描述好的工具去动作。Playwright MCP Server 基于 Playwright 提供这套能力,常见工具包括 browser_navigate 打开地址、browser_snapshot 取页面快照、browser_click 点元素、browser_type 输入文本、browser_take_screenshot 截图,以及标签页、文件上传、PDF 导出这些周边能力。它跟 chrome-devtools mcp 属于同类思路,差别在于底层驱动和暴露出来的工具集。
关键在于:模型看不到浏览器界面,它“看见”的只有工具返回的文本。你让它点一个按钮,它得先拿 browser_snapshot 换回一份页面结构,从里面找到那个可点击的 ref,再发起 browser_click。点完页面变了,还得再取一次快照确认结果。所以一次“打开页面并点搜索”的动作,背后往往是三到五轮工具调用。
1.2 工具返回值会被反复塞回上下文
单次调用其实不贵,贵在累积。每一轮对话,模型都要带上历史消息;而 MCP 工具的返回结果是历史消息的一部分。browser_snapshot 返回的页面结构通常不短,一个搜索结果页的节点描述轻松上千字符,browser_take_screenshot 即使只回一句状态,前面那些快照也还挂在上下文里。
于是长会话的形态就变成了:第 5 轮比第 1 轮重,第 30 轮比第 5 轮重得多。你感觉自己在让它干同一件事,计费输入却在台阶式往上爬。这跟普通聊天不一样——聊天里上下文增长是线性的、可控的;连续调 MCP 工具时,增长更像滚雪球,因为每次新的页面状态都会挤进来一份。
1.3 该换的不是 MCP,是模型这条通道
看到这里容易误判,以为是 Playwright MCP 太费,干脆不用。其实 MCP Server 本身没变,它还是npx @playwright/mcp@latest,命令、参数、工具名都不动。真正需要换的是模型调用走的那条链路:Cursor 默认走官方通道,长会话下的额度消耗节奏你控制不了;换成 TaoToken 的统一 API 后,Key、额度、模型 ID 都在一个控制台里管,跑自动化时想换模型也不用改 MCP 配置。
这就是这篇的主线:Playwright MCP 负责“动手”,TaoToken 负责“动脑”那条通道。两者用不同的配置项接,互不干扰,所以切换成本很低。
2. 装 @playwright/mcp 之前,先把依赖和 Key 备齐
2.1 Node 与 npx 环境确认
Playwright MCP 通过 npx 启动,前提是本机能跑 Node。先在终端确认:
node -v npm -v版本别太旧,Node 18 以上比较稳。确认完可以直接全局装一份,也可以完全依赖 npx 按需拉取。原文里让装@executeautomation/playwright-mcp-server,如果你走的是官方那个包,其实不需要额外装它,npx 会自己去取@playwright/mcp。要装就装官方这个:
npm install -g @playwright/mcp@latest想复现性更强,可以把@latest换成具体版本号,比如@playwright/mcp@0.0.18,配置文件和启动命令里保持同一个版本,避免今天能跑明天拉到了新版本行为变了。
2.2 打开 TaoToken 官网注册并创建 API Key
这一步跟 MCP 没关系,纯粹是给模型通道准备凭证。打开 TaoToken 官网,完成注册登录,进控制台后找到 API Keys 相关页面,创建一把新 Key。创建完立刻复制,页面关掉之后就不一定能再看全了。
本文所有配置里这把 Key 都写成占位符YOUR_API_KEY,你替换成自己那把即可。顺便提醒一句:Key 只填在 Cursor 的模型设置里,不要塞进 MCP 的 JSON 配置,Playwright MCP Server 本身不需要任何模型凭证,它只是被调用的工具服务。
2.3 Base URL 与模型 ID 分别记在哪
两个值要分清:
- Base URL:填进工具的是
https://taotoken.net/api,末尾不带/v1。这是接口地址,只在 Cursor 的模型设置里出现。 - 模型 ID:以官网模型广场当时列出的为准。别照抄任何博客里的旧 ID,也别自己拼日期后缀,模型上下架会变,填错了报的是模型不存在,而不是 Key 的问题。
把这两个值先记在便签上,下一步配置时直接粘,能省掉不少来回。
3. Cursor 的 mcp.json 与模型设置:一次挂上 Playwright MCP
3.1 mcpServers 配置块照写 npx @playwright/mcp@latest
Cursor 的 MCP 配置放在~/.cursor/mcp.json(全局)或项目目录下的.cursor/mcp.json(仅当前项目)。内容就是原文那段结构,照写即可:
{ "mcpServers": { "playwright": { "command": "npx", "args": ["@playwright/mcp@latest"] } } }这里没有任何 URL、没有任何 Key,就是让 Cursor 用 npx 起一个叫 playwright 的 MCP 服务。如果你已经在 2.1 里全局装好了固定版本,把@latest换成那个版本号,保证 MCP 面板里跑的就是你装的那份。
3.2 Cursor 模型设置里把 Base URL 填成 https://taotoken.net/api
MCP 挂好之后,回到 Cursor 的设置里找模型相关的那一栏(Settings → Models 一带)。你要做两件事:把 API Key 填成刚创建的YOUR_API_KEY,把 API Base URL 覆盖项填成https://taotoken.net/api。注意末尾别手写/v1,工具或平台可能会自己拼接路径,你多写一段就会变成重复路径。
如果你在 Cursor 里用的是另一条通道(比如 Anthropic 风格的那栏),就在对应位置覆盖它的 Base URL,值同样是https://taotoken.net/api,Key 用同一把。填完保存,不要急着开新会话,先把 Cursor 重启一遍让配置生效。
3.3 重启后确认两侧都亮灯
重启 Cursor 之后看两处。第一处是 MCP 面板,playwright这一项应该显示已连接或绿色状态;如果是灰色或者报错,先别管模型,去看第 6 章的排查顺序。第二处是模型下拉框,选一个你从模型广场确认过的 ID,随便发一句“你好”试探模型通道。这一句能回,说明 Base URL 和 Key 都对;回不来,说明问题在模型通道,与 MCP 无关。
两侧都通了再往下走,能避免把“MCP 起不来”和“Key 不对”两个问题混在一起查。
4. 启动 Playwright MCP Server,以及 browser_* 工具怎么分工
4.1 npx 直启与版本锁定的差别
除了让 Cursor 拉起 MCP,你也可以在终端手动起一次,好处是能直接看到日志:
npx @playwright/mcp@latest想看当前版本支持哪些开关,加--help看一眼,不同版本参数会有差异,别硬套别人的命令行。手动起过一遍、确认不报错,再回到 Cursor 里用配置启动,心里会踏实很多。
4.2 browser_install 与浏览器内核
首次运行时,如果本机缺少对应浏览器内核,工具会提示你安装,调用browser_install即可。也可以让它复用本机已经装好的 Chrome 或 Chromium。这一步常见坑是:服务起来了,但一导航就报找不到可执行文件,八成就是内核没装。
4.3 browser_* 工具按用途分组
原文列了一长串工具名,按用途归类更好记。不同版本的 @playwright/mcp 命名会有出入,最终以 Cursor 里 MCP 面板实际列出的为准:
| 分组 | 工具 | 用途 |
|---|---|---|
| 页面交互 | browser_click、browser_hover、browser_drag、browser_type、browser_select_option | 基于元素引用的点击、悬停、拖拽、输入、下拉选择 |
| 视觉操作 | browser_screen_move_mouse、browser_screen_click、browser_screen_drag、browser_screen_type | 按坐标操作,适合快照难以定位的元素 |
| 快照截图 | browser_snapshot、browser_take_screenshot、browser_screen_capture | 取页面结构用于后续动作、截当前视口、整页截图 |
| 键盘 | browser_press_key | 模拟按键,比如回车、Tab |
| 文件导出 | browser_file_upload、browser_pdf_save | 上传本地文件、把当前页存成 PDF |
| 标签页 | browser_tab_list、browser_tab_new、browser_tab_select、browser_tab_close | 列出、新建、切换、关闭标签页 |
| 导航 | browser_navigate、browser_navigate_back、browser_navigate_forward | 跳转、后退、前进 |
| 其他 | browser_wait、browser_close、browser_install | 等待(有上限)、关闭页面、安装内核 |
需要分清楚的是:browser_snapshot 是给模型读的,browser_take_screenshot 是给人看的。前者返回结构,模型据此决定点哪里;后者是一张图,用来验证页面确实长这样。两个都调,不等于浪费,用途不同。
5. 跑一遍:打开百度搜索 csdn用户vbirdbest
5.1 提示词写成有停止条件的步骤
提示词别只写“帮我搜一下”。给它明确的起点、动作和终点:
用 playwright 打开 https://www.baidu.com 在搜索框输入:csdn用户vbirdbest 点击搜索按钮 对结果页做一次 browser_snapshot 再截一张整页截图 最后把第一条结果的标题和链接读给我停止条件越清楚,模型越不容易在“点完搜索之后再点一次”这种循环里打转,而每一次多余的工具调用都是实打实的 Token。
还有一条安全边界值得说:这个浏览器是受模型指挥的,别拿它登录生产后台去执行不可逆操作,比如真实下单、删除数据、改线上配置。测试就用测试账号、测试环境,把 Playwright MCP 当成一个能开的浏览器窗口。
5.2 期望看到的 snapshot 与截图
正常跑起来,Cursor 里会依次出现一串工具调用:browser_navigate 打开百度,browser_snapshot 取结构,browser_type 往搜索框写词,browser_click 点搜索,再来一次 browser_snapshot,最后 browser_take_screenshot。快照返回的文本里应该能看到搜索结果相关的节点,截图打开之后是完整的结果页,而不是一张白图。
如果返回的 snapshot 里没有搜索框对应的节点,模型就会开始猜坐标,后面容易乱点。这种时候让它重新取一次快照,比硬点更划算。整套跑完,说明MCP 通道和模型通道都已经配通:MCP 真的驱动了浏览器,模型真的通过 TaoToken 接收和回传了这些工具结果。
5.3 回控制台对一下这次调用
跑完别急着关窗口,回 TaoToken 控制台 看这次会话的调用记录:条数对不对、Token 量是不是符合你的预期、模型 ID 是不是你在 Cursor 里选的那个。如果记录里一条都没有,说明请求根本没走到这条通道上,回头检查 Base URL 是不是被写成了别的地址。
这一步还有个附带好处:你能直观看到“一次浏览器自动化”到底花掉多少,下一次写提示词时就知道该不该缩减快照次数。
6. 连不上、截图为空、404:按顺序排查
6.1 MCP 面板里 playwright 一直不亮
先看 JSON 有没有语法问题,多一个逗号都会让整份配置失效。再看command能不能在终端里直接跑通——很多情况是 npx 第一次拉包太慢或没拉下来,手动跑一次就暴露了。Windows 上偶尔需要把命令写成npx.cmd或给出绝对路径,本质是环境变量里找不到可执行文件。还有一种是端口或进程占用,重启 Cursor 能解决大部分偶发情况。
6.2 401 与 404 分别代表什么
401 基本是 Key 的问题:复制时带了空格、用了旧 Key、或者根本没填进模型设置里。重新去 创建一把新的 API Key 替换即可。
404 更常见的是路径写错。Base URL 应该是https://taotoken.net/api,末尾不带/v1。如果你写成https://taotoken.net/api/v1,工具再自己拼一次,就变成/v1/v1/...,自然找不到。把这段改回去,重启 Cursor 再试。
6.3 截图空白或元素点不到
截图空白通常是页面还没加载完就截了,中间加一次 browser_wait,或者先 browser_snapshot 确认关键节点出现再截图。元素点不到,优先排查是不是缺少可访问名称——用 browser_snapshot 拿到准确 ref 再点,比凭感觉点坐标稳定得多。整页截图用 browser_screen_capture 这类整页工具,browser_take_screenshot 更偏向当前视口。
6.4 下一步:模型对话、Coding Plan 与文档
如果这套链路你打算长期用来跑自动化脚本,先在 TaoToken 模型对话 里用同一把 Key 发一条消息,确认模型 ID 与 Base URL 在对话场景下也正常;跑批任务多的话,去 Coding Plan 看套餐是否够用;Key 不够就回 控制台 API Keys 再建一把专门给自动化用;如果你还想在终端里让模型直接改代码,环境变量对照可以看 Claude Code 接入文档。
配到这里,Cursor 负责想,Playwright MCP 负责点,TaoToken 负责把这两者之间的模型请求接住。真正常用的其实是那条排错路径:MCP 不亮先看 npx,模型报错先看 Base URL 末尾有没有多写/v1,截图不对先补一次 browser_snapshot。把这三句记住,比记住任何一段配置都省时间。