context-attachment-manager
Codex and Claude Code plugin (works in Claude Desktop): choose which past images go to the model with your next message. Unchecked images become placeholders, the conversation goes on, and requests st
Drive the Chrome you already use from a local DSH agent: real clicks and typing over native messaging. No ports, no Connect button.
PluginsJavaScript · SwiftGitHub @OrderG-XOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
DSH (DeepSeek Harness) browser plugin: your agent drives the Chrome you already use. Native messaging + real CDP, no port, no Connect button, 11 browser_* tools, on the Chrome Web Store. · 让 DSH 在你正在用的 Chrome 里动手。
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Give your DSH agent hands inside the Chrome you are already using — your logins, your tabs, your session. Install once, no Connect button, ever.
What it is: a DeepSeek Harness (DSH) plugin that lets the model operate the Chrome you already use: open pages, click, type, fill in forms, read pages, take screenshots and work across tabs, with your existing logins.
Use it for: "fill in this web form", "check this admin page for me", "screenshot this site", or anything else the model has to do inside a browser.
Install: on the DSH Plugins page, click Add plugin and enter
dsh-chrome-bridge(an npm package), restart DSH, then add the DSH Bridge extension from the Chrome Web Store. Needs macOS, Windows or Linux, Chrome 116+ and Node.js 18+.
Every click flies a cursor to the target and labels what it is doing. It renders inside the page, so it lands in screenshots too — you and the model look at the same picture.
Every existing option makes you click something, every time:
| Option | What goes wrong |
|---|---|
chrome-devtools-mcp --autoConnect | Chrome asks "Allow remote debugging?" on every connection |
| Browser MCP (store extension) | You must click the extension icon → Connect on every tab |
| WebSocket-based bridges | Open a TCP port and trust anything that can reach it |
| dsh-chrome-bridge | Nothing to click. Nothing listening on a port. |
Three things make the difference:
0600 Unix socket guarded by a token. No TCP port to scan, no origin to spoof.chrome.debugger, not injected scripts. Clicks and keystrokes are dispatched as real CDP Input.* events, so they carry a user gesture — popups open, focus works, and sites that reject synthetic events behave normally. Screenshots, network, console and raw CDP come for free.DSH's agent (provided by the harness — this repo ships none)
├── browser_* tools (DSH plugin) ─┐
└── cb CLI (shell) ─┤
▼
Unix socket /tmp/dsh-bridge-<uid>/ (0700 dir + token)
▼
Node native host ←─ native messaging (stdio) ─→ Chrome extension (MV3)
│ chrome.debugger
▼
real CDP
This repo ships no agent — the agent above is DSH's own; we only give it hands.
The extension ID is fixed by the public key embedded in plugin/vendor/extension/manifest.json, so it is identical on every machine and the native-host registration never needs editing. The Web Store build has its own store-assigned ID; the host accepts both.
The host ships inside the plugin package. Adding the plugin copies the native host and the MV3 extension into place and registers native messaging for you — no git clone, no install.sh, no python3.
Requirements: macOS, Windows or Linux, Google Chrome 116+, Node.js 18+.
1. Sidebar → Plugins → Add plugin → enter this package name → Install → Enable → restart DSH:
dsh-chrome-bridge
It is an npm package. When DSH installs by package name and can't reach the official npm registry, it falls back to the npmmirror mirror in China, so GitHub is never needed. You can also paste the release tarball https://github.com/OrderG-X/dsh-chrome-bridge/releases/latest/download/dsh-chrome-bridge.tgz, which needs GitHub access.
2. The plugin installs the host on first load (~/.dsh/chrome-bridge, ~/dsh-bridge-extension, plus com.dsh.bridge.json in Chrome's NativeMessagingHosts). All that's left is getting the extension into Chrome — pick one:
Recommended: install from the Chrome Web Store — open the DSH Bridge store page → Add to Chrome. No Developer mode, and the extension updates itself.
Or: load it unpacked (to run the newest extension from the repo). Chrome 137+ removed --load-extension, so that click has to be yours; the plugin walks you to it:
browser_* tool finds nothing to talk to, it opens chrome://extensions in a background tab and puts ~/dsh-bridge-extension on your clipboard (once per session; the error text repeats the steps);Do it once, ever:
chrome://extensionsFrom a source checkout, ./bridge setup does exactly this in one command: installs the host, opens the page, copies the path, and waits until the extension connects — printing ✅ when it does.
3. Verify (the cb CLI is installed along the way):
cb status # host pid … | extension connected: ✅
cb tabs
Until step 2 is done the browser_* tools fail loudly with exactly these steps — never silently.
| Tool | What it does |
|---|---|
browser_tabs | list / find / open / close / activate tabs |
browser_read | numbered list of clickable / fillable elements (snapshot — same-origin iframes included, and their elements are clickable by number too), visible text, HTML, attributes, page info |
browser_click | click by element number (ref), selector, text, or coordinates |
browser_input | type, press keys, select, upload, hover, scroll |
browser_nav | go to a URL, back / forward / reload, and wait for load |
browser_screenshot | screenshot returned as an image (viewport / full / element) |
browser_eval | run JS in the page |
browser_wait | wait for an element, a piece of text, or a URL — or for it to go away (gone) |
browser_dialog | release alert / confirm / prompt |
browser_drag | drag by element number, selector, visible text or coordinates — HTML5 drag-and-drop and mouse-driven widgets (sliders, sortable lists) |
browser_download | download a file (invoices, reports, PDFs…) with your Chrome login, into Downloads or the session's working directory; never overwrites |
browser_devtools | console output + uncaught JS errors, network requests (status, timing), a request's response body |
A freshly installed bundle is not hot-loaded; DSH must be restarted once.
dsh plugin addfrom the CLI refuses the app-managed profile — use the sidebar there. Plugin updates are not automatic in DSH yet: to upgrade, uninstall and install again. A new version can be installed by package name about a day after release, because the pnpm that DSH uses skips brand-new versions by default; to get it right away, use the release tarball.
! = host down, ⏸ = paused).browser_* call without tab keeps using the tab that session opened or last named; if there is none it fails and says so. Acting on your current tab takes an explicit tab="active".cb detach, if the tab is closed, or if you press Cancel on Chrome's debugging banner.git clone https://github.com/OrderG-X/dsh-chrome-bridge.git
cd dsh-chrome-bridge
./install.sh # same layout as the plugin's auto-install, plus the manager CLI
./bridge status # repo / installed / running version + connection
Then point DSH at the checkout for the native tools: Plugins → Add plugin → /absolute/path/to/dsh-chrome-bridge/plugin (a link:, so a git pull is enough to update).
cb — from the shellcb status / cb version / cb reload # health, hot-reload the extension after edits
cb tabs # list tabs (* = active)
cb find <keyword> # filter by title/URL
cb info active # title, URL, viewport, pending dialog
cb text active [selector] # visible text (best first read)
cb html active [selector]
cb attr active <selector> <name>
cb wait-for active "<selector>" # wait until it exists and is visible
cb eval active "<js>" # run JS in the page
cb click-el active "<selector>" # real mouse event
cb click-text active "Sign in"
cb click active <x> <y>
cb type active "text" --into "<selector>"
cb key active Enter # combos: "meta+a"
cb focus / cb select / cb upload / cb hover / cb scroll
cb dialog active accept # release an alert/confirm — otherwise the page hangs
cb nav active https://example.com
cb shot active --out /tmp/x.png # --full whole page, --sel "<selector>" one element
cb console active / cb network active --reload
cb cursor active click 400 300 # drive the cursor by hand
cb cdp active Page.reload '{}' # raw CDP escape hatch
active can be replaced by a tab id. Add --json for raw output.
Clicks and typing move the visible cursor by default; pass --no-cursor to skip it.
dsh-chrome-bridge status # repo / installed / running version + connection
dsh-chrome-bridge update # sync code + hot-reload the extension (no Chrome clicking)
dsh-chrome-bridge test # end-to-end self test
dsh-chrome-bridge logs # extension log + host log
dsh-chrome-bridge uninstall
Be honest about what this is: the extension can read and control every page you are logged into.
0600 and additionally token-guarded. It opens no network listener of its own (the DSH settings card goes through DSH's built-in local web server; that route only accepts loopback, rejects cross-site requests, and cannot resume control).bash. That is what "native" buys you — and it means an unattended agent holds your browser. Disable the plugin in the sidebar if you want that gate back.cb detach <tab>.chrome:// pages are unreachable — Chrome forbids injection there. Use a normal tab.alert() blocks the page: cb info warns you, cb dialog accept releases it.alert() in background tabs until the tab is focused.--load-extension) needs one manual load through chrome://extensions.The DSH browser-plugin space is already busy — these are worth a look:
wc3_* toolsWhat is different here: no listening port (native messaging), real CDP input events via chrome.debugger, and an on-page cursor that shows up in screenshots.
Found a bug or want a feature? Open an issue. Including your DSH and plugin versions helps a lot.
Issues and PRs welcome.
docs/NOTES.zh.md is the running log of every pitfall hit while building this — read it before changing the extension or the plugin; it will save you a day. It also documents a way to verify the plugin without restarting your app (throwaway profile + headless).
MIT licensed.