OpenCode 能通过项目配置里的本地 MCP 服务使用 Playwright。先做一个只读任务,打开网页并核对页面标题。列表显示 connected 证明 MCP 握手成功。模型仍要生成正确的调用和参数,Playwright 也需要启动浏览器并访问目标。
本次实测是 OpenCode 1.18.16 与 Playwright MCP 0.0.84。本文使用 1.x 的配置格式。OpenCode V2 文档把服务器名称放在 mcp.servers 下。复制配置前先运行 opencode --version。
注册本地 Playwright MCP 服务
在项目根目录新增或编辑 opencode.json。如果已有 mcp 对象,把 playwright 加进去,保留其他配置。OpenCode 1.x MCP 指南定义了命令数组、启用状态及超时时间。
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"playwright": {
"type": "local",
"command": [
"npx", "-y", "@playwright/mcp@0.0.84",
"--browser", "firefox", "--headless", "--isolated"
],
"enabled": true,
"timeout": 45000
}
}
}使用与 MCP 服务内 Playwright 版本匹配的 Firefox。测试用 npm 包的 Playwright 版本是 1.65.0-alpha-2026-10-30,可安装对应的 Firefox:
npx -y --package playwright@1.65.0-alpha-2026-10-30 playwright install firefox
opencode mcp list如果使用单独的浏览器缓存,让 MCP 子进程也能读到该缓存。隔离实测中我们直接指定了匹配的浏览器可执行文件。升级时注意包版本和浏览器修订版对应。旧工具留下的浏览器即使名字相同,也可能使用不同协议。
在项目根目录运行 opencode mcp list,再开一个新会话查看浏览器工具。OpenCode 会合并多个来源的配置。排障时用空项目与独立配置和数据目录,减少旧条目干扰。覆盖顺序见 OpenCode 配置文档。
做一次只读导航
用有可见答案的公开网页,例如不用登录的 Selenium 测试表单。
只用 playwright_browser_navigate 打开以下地址:
{"url":"https://www.selenium.dev/selenium/web/web-form.html"}
参数只有一个 url,值是字符串网址。
从返回结果读出页面标题。
不要点击、输入、提交或调用其他工具。检查轨迹中的工具名、参数对象和返回的页面标题。实测中 OpenCode 1.x 把 playwright 的导航工具显示成 playwright_browser_navigate。独立 MCP 客户端看到的是服务器的 browser_navigate。微软 Playwright MCP 仓库说明了无障碍快照和浏览器选项。
比较模型时,保持网址、提示、MCP 服务和浏览器一致。用当前供应商适配器支持结构化工具调用的模型。我们在临时项目按 OpenAI 兼容供应商配置接入本机 Ollama。没有使用外部模型账户。即使最终回答为空或 CLI 退出码为 0,也要看结构化事件里的实际调用。
两个模型实际发出了什么
第一次运行用了旧缓存里的 Firefox。两个模型都传了目标网址,但导航失败。独立 MCP 客户端传入同一个有效值,也收到 Firefox 协议错误。改用匹配的 Firefox 158(修订版 1569)后,独立探针读到 Web form。在这个环境传入数字 url 会收到输入校验错误。
之后在匹配的环境里开新会话,把同一个明确的 JSON 参数对象交给两个模型。工具回执和最终输出分别记录。
| 本地模型 | 导航调用 | 工具回执 | 最终输出 |
|---|---|---|---|
qwen3:0.6b | 精确的字符串网址 | Web form | 未复述标题 |
qwen3.5:0.8b | 精确的字符串网址 | Web form | 无包含标题的文字事件 |
第二个模型还额外调用了两次快照,超过了只调用一次的要求。先前在匹配版本上用自然语言描述参数,两组都没有准确复现网址。把完整 JSON 写出后,两组在本次运行里导航成功。这只是两种本地模型的小样本。独立客户端发现了 25 个工具,核实 browser_navigate.url 是字符串,然后关闭浏览器。测试没有提交表单。

定位最先失败的一层
| 你看到什么 | 先查哪里 | 下一步 |
|---|---|---|
opencode mcp list 中没有服务或连接失败 | 项目配置及 MCP 进程 | 核对版本、工作目录、命令数组、可执行文件和超时 |
| 已连接,但模型只返回文字,没有工具事件 | 模型、供应商或当前工具列表 | 查看 Agent 可用工具,再用另一个支持工具调用的模型做同一单步请求 |
| 参数键名或值类型不符 | 工具输入 schema | 用 tools/list 对照实际参数对象 |
| 参数正确,模型和独立探针都失败 | 浏览器启动、协议或网络 | 核对浏览器修订版,用匹配版本重跑同一公开网址 |
| 回执已包含正确标题,最终回答没写出来 | 模型读取结果 | 以工具回执为证据,要求模型只返回答案 |
一份 MCP 参数故障报告里,文件系统服务需要 path,收到的是 filePath,适合用来理解 schema 层的错误。另一条 OpenCode 浏览器讨论说浏览器操作表现不稳定,但没有隔离其配置变量。排障时先核对自己会话中的工具名、请求和回执。
这个例子使用干净的浏览器上下文。任务确实需要登录态时,参考接入现有浏览器。其他接入见 Playwright 浏览器自动化、Claude Code 配置 Playwright MCP、Codex 配置 Playwright MCP和开源编码 Agent。如果还在判断是否需要打开标签页,可以看联网搜索与浏览器控制及浏览器 Agent 工作原理。也可以下载 Tabbit,用同一个公开标题任务对照另一条连接。
常见问题
OpenCode 能使用 Playwright MCP 吗?
可以。在 OpenCode 1.x 的项目 opencode.json 里把本地服务写进 mcp,然后在该项目运行 opencode mcp list。使用 V2 时按它的独立格式配置。
换模型后浏览器工具还能用吗?
MCP 配置可以保持不变。让两个模型做同一项小任务,检查是否都发出符合 schema 的调用并正确读取结果。
为什么显示 connected,导航却失败?
服务可以在启动浏览器前完成 MCP 握手。检查工具回执中的浏览器启动、可执行文件、协议和网络错误。
browser_navigate 要传什么参数?
本次验证的 Playwright MCP 版本声明 url 为字符串。可以用 tools/list 核对,再使用客户端实际显示的工具名。
这个配置能接管现有浏览器标签页吗?
示例启动隔离浏览器。如果任务确实需要已打开的标签页或登录状态,要另外配置连接方式。