zhaopw5/dsh-browser-bridge ↗★ 0
dsh-browser-bridge
接 Chrome / Edge 采集器抓来的页面,让 agent 读你正在看的那一页。
同名套件的其他儲存庫
安裝
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zhaopw5/dsh-browser-bridge說明文件
閱讀完整 README ↗dsh-browser-bridge
English | 中文
把你在浏览器里已经登录的页面,交给跑在本机的 AI agent(DeepSeek Harness)读。
一个仓库,两个部分:
collector/ 浏览器采集端(Chrome / Edge 扩展,MV3)
lib/ locale/ docs/ 接入端(DSH 插件本身)
采集端读页面,接入端把它送进模型的上下文。两边只靠一条 HTTP 协议握手,没有代码依赖。
为什么需要它
agent 读网页通常只有两条路,都不够用:
web_fetch:进不了要登录的内网页面(401),也看不到 JS 渲染后的 DOM- 截图:只有像素,没有结构,还要人肉翻页
扩展跑在你已经登录的那个会话里,点一下就把渲染后的 DOM 交出去——不用改 Chrome 配置、不用 --remote-debugging-port(Chrome 136+ 对默认 profile 已禁用)、不用重新登录。
装
1. 装插件
dsh plugin add zhaopw5/dsh-browser-bridge
或者本地开发时,把仓库放到 ~/.dsh/plugins/dsh-browser-bridge,在 profile 的 package.json 里加:
"dsh-browser-bridge": "link:C:/Users//.dsh/plugins/dsh-browser-bridge"
并在 dsh.profile.bundles 里加一行 "dsh-browser-bridge"。
2. 装采集器
插件启动后,~/ dsh/plugins/dsh-browser-bridge/collector 就是扩展目录(唯一一份,不另存副本)。
chrome://extensions或edge://extensions- 打开 开发者模式 / 开发人员模式
- 加载未打包的扩展程序 → 选
collector目录 - 固定到工具栏
Chrome 和 Edge 用同一份代码:扩展在运行时判断自己在哪个浏览器(userAgentData → Edg/ 兜底),上报的 browser 字段就是 chrome 或 edge。
3. 用
- 抓一页:停在目标页 → 点图标 → 「抓取这一页」
- 整站自动:点图标 → 打开「本站自动抓取」→ 浏览器弹一次授权 → 之后该域名页面加载完自动落盘
- 快捷键:
Ctrl+Shift+Y不弹面板直接抓
插件配置页只有两个开关:Chrome 采集器、Edge 采集器。
抓到的页面落在 ~/.dsh/browser-bridge/inbox/:
| 文件 | 内容 |
|---|---|
时间-域名.md | 正文(取 article/main,没有才退回 body),带 url/title 头 |
latest.md | 最近一次抓取的正文,内容同上——给别的 agent 的稳定入口,不用记文件名 |
时间-域名.html | 渲染后的原始 HTML |
时间-域名.json | 元信息 |
last.json | 最近一次抓取 |
模型侧
插件注册三样东西:
- 一段固定提示:说明采集器存在、什么时候该用、不要拿工作区里的同名旧文件替代
- 一条运行时上下文(每轮重算):
浏览器桥:最近一次抓取是「…」(https://…),12 秒前,来自 chrome。文件:… browser_page工具:直接取正文,不用整份文件读进上下文
抓取归属到最近一次装配 prompt 的会话,所以 A 项目里抓的页,A 会话优先用。
协议
采集端 POST /ingest,头里带 X-DSH-Token:
{
"url": "https://example.com/page",
"title": "Page title",
"at": "2026-11-11T03:11:02.764Z",
"browser": "chrome",
"text": "正文……",
"html": "……"
}
GET /ping 探活,返回连接器和采集器路径。
MCP:把页面给别的 agent
mcp/server.mjs 是一个零依赖的 stdio MCP 服务端,直接读同一个 inbox/,暴露两个工具:
browser_page—— 取正文(最近一次,或指定 id)browser_list—— 列最近的抓取,用来定位
协议:JSON-RPC 2.0、换行分隔、stdin/stdout,日志全走 stderr(stdout 不能有杂音)。
Codex CLI
~/.codex/config.toml:
[mcp_servers.browser-bridge]
command = 'C:\Program Files\Volta\node.exe'
args = ['C:\Users\zpw\.dsh\plugins\dsh-browser-bridge\mcp\server.mjs']
startup_timeout_sec = 20
Claude Code
claude mcp add browser-bridge -- node "C:\Users\zpw\.dsh\plugins\dsh-browser-bridge\mcp\server.mjs"
Cursor
~/.cursor/mcp.json:
{
"mcpServers": {
"browser-bridge": {
"command": "node",
"args": ["C:\\Users\\zpw\\.dsh\\plugins\\dsh-browser-bridge\\mcp\\server.mjs"]
}
}
}
换目录用环境变量 DSH_BROWSER_BRIDGE_INBOX 覆盖。
权限与边界
采集端只申请 activeTab + scripting + storage,外加按站点的可选授权:
- 只在你点图标那一下读当前标签页
- 不读 cookie、密码、`` 里输入的值
- 不监听浏览历史,不往外网发任何东西
- 只听
127.0.0.1:38999
已知限制:
- 只抓顶层文档,
iframe/ shadow DOM 拿不到 - 需要交互才出现的内容得先手动点到那个状态
- 单页上限 400k 字符正文 / 4 MB HTML
chrome://、扩展页、file://不支持
License
MIT