Token导航 LogoToken导航

Agent Skill · 研究检索

chrome-bridge(镀铬桥)

chrome-bridge 用于查找、检索和筛选相关信息,适合在 Local Agent 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

chrome-bridge 是研究检索类 Agent Skill,可用宿主为 Local Agent,通过unknown获取,权限为操作浏览器;许可证信息还不明确,暂无第三方扫描结果,按安装量在研究检索类的 73,675 个 Skill 里排第 70,176。

总安装 212周安装 9下载 74核验 2026-05-01
研究检索操作浏览器unknown未标认证来源可访问许可证需确认审计未展示Local Agent

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:chrome-bridge(镀铬桥)
来源仓库:https://cbskills.xcloudzen.com
仓库路径:chrome-bridge
安装命令:
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。当前暂无明确安装命令,请以来源页面说明为准。

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

通过 MCP API 暴露活跃 Chrome 配置文件,保留登录态与扩展。提供 37 个工具支持页面操作、网络请求与 DOM 交互。首次使用需手动连接扩展弹窗,后续自动维持会话。依赖本地服务运行,网络中断可能导致 503 错误重试。chrome-bridge 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:chrome-bridge

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Local Agent;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    没有现成安装命令,按unknown的说明从来源页面获取,仓库路径是 chrome-bridge。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要操作浏览器,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

chrome-bridge 怎么安装?

公开资料没有给出可以直接复制的命令,需要按来源页面说明手动安装,仓库内路径为 chrome-bridge。

chrome-bridge 支持哪些 AI 工具?

公开资料标注支持 Local Agent。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

chrome-bridge 需要什么权限?

权限级别是操作浏览器。该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

chrome-bridge 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

chrome-bridge 用的人多吗?

公开数据是累计安装 212 次,近一周安装 9 次,下载 74 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

chrome-bridge 安全吗?

没有查到第三方扫描结果,安全性无法从公开资料判断,安装前请自行审查源码、依赖和命令行为。

值得选的地方和要先想清楚的地方

值得选的地方

  • 专注 Local Agent 一种宿主,触发方式和使用习惯不用来回切换。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 没有第三方扫描结果,安全性只能靠自己读源码判断。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Local Agent,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 要求有安全扫描结论才肯安装的团队。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
chrome-bridge

镀铬桥 · 本页

212—操作浏览器未明确未收录

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Chrome Bridge — MCP API Overview

Chrome Bridge exposes a live Chrome profile (cookies, logins, extensions all intact) through 37 MCP tools. Every other skill in this folder composes these tools. Read the category that matches your task; don't read the whole file.

Connection check

Before any workflow: status() → {extension_connected: true, pending_requests: 0}. If extension_connected is false, stop and tell the user — the Chrome extension popup needs "Connect" clicked. If a call returns 503, the service worker restarted; wait 3–5 seconds and retry once.

Tools by category

Metadata (1)

  • status() — {extension_connected, pending_requests}. The only health check; if extension_connected: true, the extension is reachable.

Bridges — multi-instance overview & cleanup (2)

  • bridges_list() — every bridge in CB_PORTS with {port, extension_connected, tab_count, tabs}. Use when the user asks "how many browsers do I have" or before a cleanup so you can confirm what's about to close.
  • bridges_cleanup(keep_url="about:blank") — leaves each connected bridge with exactly one blank tab; closes everything else. Destructive — only call when the user has explicitly signalled session-end. Trigger phrases: "chrome-bridge done", "chrome bridge done", "we're done", "cleanup", "close all tabs", "reset the browsers". Do not infer cleanup from a task finishing — wait for the user's word.

Pinning to a specific bridge

By default the MCP picks any healthy bridge in CB_PORTS per call (re-probed every time). Every tool below also accepts an optional bridge_port=<port> kwarg to pin the call to a specific bridge — port must be in CB_PORTS. When pinned, the call does not fall back to another bridge if the pinned one is unreachable; it raises.

Use it when the user says "use bridge 9223" / "do this on 9224", or when you've opened tabs on one bridge with bridges_list() and want to keep follow-up calls on the same one. Most workflows don't need it — leave bridge_port unset to let auto-selection ride.

tabs_create(url='https://example.com', bridge_port=9223)
page_schema(tab_id=42, bridge_port=9223)

Tabs (6)

  • tabs_list() — all open tabs [{id, url, title, active}]
  • tabs_get(tab_id) — one tab's details
  • tabs_create(url, active=true) — open tab; capture the returned id for multi-tab workflows
  • tabs_close(tab_id) — close tab (bridge keeps at least one about:blank alive)
  • tabs_reload(tab_id) — force reload
  • tabs_duplicate(tab_id) — clone including history

Navigation (3)

  • navigate(url, tab_id?) — load a URL; omit tab_id to use the active tab
  • navigate_back(tab_id?) / navigate_forward(tab_id?) — history traversal

Page content — extraction (7)

Pick the smallest-payload tool that covers what you need. Order of preference for most tasks:

  1. page_schema(tab_id?) — JSON-LD + microdata. Try first. Products, articles, recipes, events, orgs usually have complete structured data here. Near zero parsing.
  2. page_article(tab_id?, max_wait=10000) — Mozilla Readability + SPA wait. Returns {title, author, date, image, content} as clean Markdown. Works on ~97% of news / blog / docs pages. Increase max_wait to 15000 for heavy SPAs (Anthropic docs, React dashboards).
  3. page_headings(tab_id?) — h1–h6 outline. Use to plan targeted extraction before dumping the whole page.
  4. page_markdown(tab_id?) — full page → Markdown via turndown. Includes nav/footer/sidebar. Last resort when page_article errors (dashboards, search results, listing pages).
  5. page_source(tab_id?) — cleaned HTML (scripts/styles/svg/iframes/inline handlers stripped). Use when you need raw DOM for grep-style work.
  6. page_text(tab_id?) — document.body.innerText. Fastest, least structured. Handy fallback when selectors fail or paywalls hide content via CSS only.
  7. page_snapshot(tab_id?, interactive=true, compact=true, depth?, urls?) — accessibility-tree snapshot with @eN refs (- button "Submit" [ref=e2]). For *navigation only* (which button to click) — pass refs to dom_click/dom_fill/dom_type as selector="@e2". ~85× smaller than page_source. See snapshot-navigation skill.

Need the current tab's URL or title? They're already on every entry of tabs_list() and tabs_get(tab_id). For the active tab without knowing its id: execute_script("(()=>({url:location.href, title:document.title}))()").

DOM interaction (4)

  • dom_query(selector, attribute?, tab_id?) — returns [{tag, text, href, src, value, attr}]. Use to enumerate candidates before clicking or filling.
  • dom_click(selector, tab_id?) — click first match.
  • dom_fill(selector, value, tab_id?) — set .value + dispatch input/change. Works on <input>, <textarea>, <select>.
  • dom_type(selector, text, tab_id?) — real keystroke simulation via CDP Input.dispatchKeyEvent. Required for ProseMirror, TipTap, Draft.js, Slack/LinkedIn/Threads comment editors, any site where dom_fill silently fails because the framework ignores .value assignments.

Scripting (1)

  • execute_script(code, tab_id?, args?, world='MAIN') — arbitrary JS. The code runs via Runtime.evaluate, so:

- Wrap in an IIFE: (function(){/*... */ return result;})(). Bare return at top level throws SyntaxError: Illegal return statement. - The return value must be JSON-serializable. Return plain objects, arrays, strings, numbers, booleans. - chrome.debugger is the transport, so CSP does not apply — this works on sites that block content-script injection. - world='MAIN' (default) runs in the page's JS context. Use world='ISOLATED' only if you need to hide from the page.

Screenshots (1)

  • screenshot(format='png', quality=90) — visible area of the active tab. To screenshot a background tab, make it active first: action('tabs.update', {tabId, active: true}), wait ~1s, then screenshot.

Cookies / history (2)

  • cookies_get(url?, domain?) — filtered cookie list
  • history_search(text='', max_results=20) — browser history search

Chrome DevTools Protocol (2)

Low-level Chrome control. Pattern: cdp_send("<Domain>.enable") → do stuff → cdp_events(domain="<Domain>") → cdp_send("<Domain>.disable").

  • cdp_send(method, params?, tab_id?) — any CDP command. Use it both for one-shots (cdp_send('Emulation.setDeviceMetricsOverride', {...}), cdp_send('Page.reload')) and for arm/disarm (cdp_send('Network.enable') / cdp_send('Network.disable')).
  • cdp_events(tab_id?, domain?, clear=true) — poll buffered events; clear=false to peek without draining. Common shortcuts:

- Network requests → cdp_events(domain='Network') (after cdp_send('Network.enable')). - Console output → cdp_events(domain='Runtime') and filter entries where method == 'Runtime.consoleAPICalled' (after cdp_send('Runtime.enable')).

Buffers hold 1000 events/domain/tab (extension-side) and 5000 (server-side). Enabling a CDP domain keeps the debugger attached past the 30s idle auto-detach. DOMStorage is not exposed via chrome.debugger — use execute_script with localStorage.getItem().

Generic escape hatch (1)

  • action(action, params?) — dispatch any extension action by name (e.g. action('tabs.update', {tabId: 123, active: true})). Use when no dedicated tool exists.

When to use which extractor

Reading an article, blog, docs page?       → page_article
Structured data (product, recipe, event)?  → page_schema
Need section outline?                      → page_headings
Non-article page (dashboard, listings)?    → page_markdown
Need to know what's clickable on the page? → page_snapshot
Specific elements by selector?             → dom_query
Custom logic over the DOM?                 → execute_script
Low-level capture (network, a11y tree)?    → cdp_*

Start with the smallest-payload tool. Escalate only when it returns empty or wrong data.

Multi-tab workflows

Requests to different tabs run in parallel. Requests to the same tab are queued by the extension — no collisions, but no parallelism either. Structure work so each tab is a stream.

id_a = tabs_create(url='https://site-a.com').id
id_b = tabs_create(url='https://site-b.com').id
id_c = tabs_create(url='https://site-c.com').id
# Wait ~3s for all to finish initial load

page_schema(tab_id=id_a)   # parallel
page_schema(tab_id=id_b)   # parallel
page_schema(tab_id=id_c)   # parallel

tabs_close(id_a); tabs_close(id_b); tabs_close(id_c)

Close tabs as soon as you're done. Leaving tabs open costs memory and slows every subsequent call.

Background tabs may not fully render. Tabs opened with active=false can end up with empty title/url and unrendered DOM. If DOM queries come back unexpectedly empty, activate the tab first:

action('tabs.update', { tabId, active: true })
# wait ~3s

Keep concurrent tabs at 3–5. Past that, Chrome starts swapping and latency climbs.

Waiting for pages to settle

No sleep-style tool exists — poll instead:

navigate(url='https://slow-spa.example.com/dashboard')
# Loop until ready:
#   execute_script(code="(function(){ return document.readyState; })()")
#   → stop when it returns "complete"
# Or poll execute_script("(()=>location.href)()") until it matches the expected destination.

Rough waits if you must: simple HTML 2–3s, typical SPA 5–6s, heavy SPA 8–10s.

Common failures

SignalCauseFix
SyntaxError: Illegal return statementBare return in execute_scriptWrap in (function(){...})()
SyntaxError: Unexpected end of inputTruncated or unmatched braces in JSCheck all { } ( ) " ' pairs
{"detail": [...], "ctx": {"error": "Invalid \\escape"}} from /executeBackslashes inside your JS string (regex like \d, \s, \w) weren't double-escaped for JSONDouble the backslashes (\\d, \\s) or avoid regex in strings passed this way — use indexOf() / includes() / startsWith(). Writing the JSON body to a temp file with a single-quoted heredoc also dodges shell-level escape issues.
HTTP 503 "extension not connected"Service worker restartedWait 3–5s, retry once
HTTP 504 "extension did not respond within 30s"Long-running or hanging JSShorten the script; paginate; don't fetch images in execute_script
dom_query / dom_click returns emptyPage still loading, or selector changedWait longer; fall back to dom_query with broader selector; use page_text to confirm content exists
page_schema returns {"schemas": []} on a page you expected schema onNot every site has JSON-LD. Disambiguation pages (Wikipedia), many SPAs (Instagram profiles, Google search results), and custom-built sites skip itFall through to page_article, then execute_script over meta tags (og:title, og:description, og:image), then page_markdown
Click "succeeds" but nothing visible changesFramework state not updatedTry dom_type instead of dom_fill; try the native-setter pattern in execute_script (see form-filling skill)
Screenshot captured wrong tabcaptureVisibleTab only captures the active tabaction('tabs.update', {tabId, active: true}), wait ~1s, then screenshot

Remote bridges via Cloudflare Zero Trust

When the bridge is behind port-9222.xcloudzen.com (or similar), the raw REST API requires CF-Access-Client-Id and CF-Access-Client-Secret headers (available as $CB_CLIENT_ID / $CB_CLIENT_SECRET). The MCP layer handles this transparently — the adapter (chrome_bridge_mcp.py) picks a healthy bridge from CB_PORTS on every call (or honours bridge_port=<port> if you pin it), so callers using MCP tools never set headers directly. Only matters when you hand-craft curl against the proxied domain.

Locally (127.0.0.1:9222/9223/9224/9225) no auth is needed.

Best practices

  1. Plan before you browse. Map the user's goal to a numbered sequence of MCP calls before making any. Reactive improvisation wastes turns.
  2. Schema first. page_schema is cheap and often complete. Don't write DOM scrapers before checking.
  3. page_article beats page_markdown for editorial content. The latter dumps nav/footer/sidebar.
  4. Activate tabs before reading. Background tabs can be half-rendered.
  5. Close tabs as you go. Don't batch cleanup at the end.
  6. Use dom_type for rich editors. LinkedIn, Threads, Notion, Slack all reject .value.
  7. Wrap execute_script in an IIFE. Every time.
  8. Return compact shapes. execute_script results traverse JSON — don't return DOM nodes, images, or megabytes of HTML. Extract the fields you need and return those.

平台分布

Local Agent

75.78%
按下载量换算56

安全审计

暂无安全审计结果可展示。

权限和风险

操作浏览器

该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills