Chrome 插件开发指南
当你开发 apps/chrome-extension 里的应用时,使用这页。
这个模块负责什么
Chrome 插件应用负责:
- background service worker 生命周期
- Chrome 能力注册
- content script 和 main-world bridge 行为
- popup 和 options UI
构建与校验
先跑 app 级命令:
pnpm --filter @modeldriveprotocol/chrome-extension typecheck
pnpm --filter @modeldriveprotocol/chrome-extension test
pnpm --filter @modeldriveprotocol/chrome-extension buildunpacked extension 产物位于:
apps/chrome-extension/dist/chrome-mv3本地启动回路
先按你想要的调试方式选一条回路:
dev:让 WXT 自动拉起一个专用 Chromedev:manual:继续用你自己的 Chrome,WXT 只负责监听和重建build:只产出一次生产式 unpacked buildpaths:打印手动加载和持久化 profile 的本地目录
本地迭代时,先启动 WXT dev mode:
pnpm --filter @modeldriveprotocol/chrome-extension dev如果你希望只保留 WXT 的构建/监听能力,而继续使用自己常用的 Chrome 手动加载插件,可以改用:
pnpm --filter @modeldriveprotocol/chrome-extension dev:manual仓库根目录现在也带了:
.vscode/tasks.json里的mdp:chrome-extension dev.vscode/tasks.json里的mdp:chrome-extension dev (manual load).vscode/tasks.json里的mdp:chrome-extension paths.vscode/launch.json里的MDP Chrome Extension (WXT Dev).vscode/launch.json里的MDP Chrome Extension (Manual Load)
当前仓库里的 WXT 配置还会把持久化 Chromium profile 放在 apps/chrome-extension/.wxt/chrome-data,这样登录态和浏览器侧调试设置在重启后还能保留。
如果你需要只影响自己机器的 runner 配置,可以新建 apps/chrome-extension/web-ext.config.ts。这个文件已经被 gitignore 忽略,适合放个人的浏览器启动覆盖配置。 仓库里也提供了一个现成模板: apps/chrome-extension/web-ext.config.example.ts。
常见回路是:
- 运行
pnpm --filter @modeldriveprotocol/chrome-extension dev - 等 WXT 自动拉起一个已加载插件的 Chrome
- 直接在这个开发浏览器里验证 popup、options、content script 或 background 行为
如果你需要手动加载 unpacked build,而不是用 WXT 自带的开发浏览器,就运行 pnpm --filter @modeldriveprotocol/chrome-extension build,然后在 chrome://extensions 里加载 apps/chrome-extension/dist/chrome-mv3。 如果你想保留 dev watcher,但浏览器仍然自己开,就运行 pnpm --filter @modeldriveprotocol/chrome-extension dev:manual,然后手动加载 apps/chrome-extension/dist/chrome-mv3-dev。 如果你想直接看自己机器上的绝对路径,就运行 pnpm --filter @modeldriveprotocol/chrome-extension paths。
连接本地 server
在 options 页面里设置 MDP Server URL,通常使用:
ws://127.0.0.1:47372同时配置需要注入的目标 match patterns。
真实端到端验证
如果改动必须通过“真实浏览器 + 真实 MCP 调用方”来证明,不要只停在单测或 build 通过。
推荐回路:
MDP_WXT_MANUAL=1 pnpm --filter @modeldriveprotocol/chrome-extension dev -- --port 3001
node packages/server/dist/cli.js --port 47372然后用带 DevTools Protocol 的真实 Chrome 会话挂到持久化 WXT profile。这个环境里稳定可用的命令是:
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary \
--user-data-dir=/Users/bytedance/projects/mdp/apps/chrome-extension/.wxt/chrome-data \
--remote-debugging-port=9227 \
--enable-unsafe-extension-debugging \
--unsafely-disable-devtools-self-xss-warnings \
about:blank在插件 options 页面里把 MDP Server URL 指到:
ws://127.0.0.1:47372场景驱动要走真实 MCP consumer,例如用 @ai-sdk/mcp、StdioClientTransport、listClients 和 callPath 的 Node 脚本,而不是直接改存储或调用内部 helper。
重要运行时规则:
- workspace 管理类写操作可能触发插件 runtime refresh
- 在这个窗口里,
mdp-chrome-workspace会短暂从listClients里消失 - 这种断开要按“可重试的重连窗口”处理,不要立刻判失败
做视觉确认时,不要只看 DevTools target 或页面 title。 先确认真实扩展页面的 DOM 文本不是空的,再截图。 如果页面是空白,先检查页面 HTML 里引用的是哪个 localhost:<port>,再确保 WXT 正在同一个端口提供 dev 资源。
跑完之后:
- 删除临时创建的 route client、background client 和 route rule
- 回读
chrome.storage.local确认清理已经落盘 - 停掉本地 server、WXT watcher 和临时浏览器进程
- 截图只作为一次性证据,统一放在
apps/chrome-extension/.artifacts/
调试方式
把 chrome://extensions 当作主调试入口:
- 需要手动验证生产式构建产物时,加载
dist/chrome-mv3 - 调试 background 生命周期或连接问题时,inspect service worker
- 调试 content script 或 DOM 自动化行为时,inspect 当前页面
如果改动同时涉及共享 packages,重跑更宽的构建链路再验证:
pnpm build