dsh-browser-use
dsh-browser-use is an opt-in browser-use plugin for DeepSeek Harness (dsh). It connects the existing Open Browser Use stdio MCP server to an Agent Preset through @deepseek-ai/dsh-mcp-client.
The plugin does not reimplement WebMCP. Open Browser Use stays responsible for real Chrome tabs, CDP, document.modelContext, page tool discovery, opaque registration_id snapshots, and stale-registration rejection. DeepSeek Harness receives the MCP tools under the stable mcp__open_browser_use__* namespace.
This is browser-use, not computer-use. Use a Computer Use plugin for desktop accessibility trees, screenshots, or OS input outside Chrome.
English | 中文
Why the Bundle patch is empty
Current DeepSeek Harness Agent Presets are standing agent-plane compositions. A bundle-level @deepseek-ai/dsh-mcp-client row would run on the Host root and would expose browser access outside the selected preset. This package therefore uses an empty cordis.patch.yml: the Bundle installs the package, and an authored Agent Preset mounts it.
Do not add this plugin to the Host root cordis.patch.yml.
Requirements
- Node.js 22.19 or later, or Node.js 24 or later.
- DeepSeek Harness with Agent Presets.
obuonPATH. Runobu pingbefore the first Harness session.- The Open Browser Use Chrome extension and native host must be connected to the Chrome profile that you want to use.
Install
Install the standalone Bundle into the Web Profile:
dsh plugin --profile web add github:mugnimaestra/dsh-browser-use
For a local checkout:
dsh plugin --profile web add ./dsh-browser-use
Create an authored Agent Preset from the current standard preset, then add this row to that preset's agent.cordis.yml:
- id: browser-use
name: dsh-browser-use
config:
failOnStartupError: true
Start a new Session with that authored preset. Existing Sessions keep the composition that they started with.
If more than one Open Browser Use browser/profile target is installed, select one in the preset instead of relying on the active target:
- id: browser-use
name: dsh-browser-use
config:
browser: chrome
profile: Default
The optional configuration fields are command, sessionId, browser, profile, socket, socketDir, env, cwd, toolCallTimeoutMs, failOnStartupError, and reconnect.
Verify the composition
First confirm that the package is installed in the Web Profile:
dsh plugin --profile web list dsh-browser-use --depth 0
Then confirm that this package adds no Host-level MCP row:
dsh web --dump-config | grep -A3 -B2 mcp
The Bundle layer is intentionally empty, so dsh-browser-use does not appear as a Host row. A Host-level MCP row from this package is a configuration error. The MCP bridge must appear in the selected Agent Preset composition instead.
After you start a Session with the authored preset, the Session tool catalog must contain names such as:
mcp__open_browser_use__ping
mcp__open_browser_use__user_tabs
mcp__open_browser_use__call
The Session JSONL should therefore contain mcp__open_browser_use__* tool names when the Agent uses Browser Use.
WebMCP workflow
Open Browser Use exposes WebMCP through its unrestricted MCP call tool. Use the current working tab and follow this order:
- Wait for the page and its application code to load.
- Call
getInfoand confirm thewebmcpcapability. - Call
webmcp_list_toolsfor the current tab. - Prefer a relevant page tool over DOM or CDP automation.
- Invoke the page tool with the current
registration_id. - List again after navigation,
toolchange, or a stale-registration error.
Example arguments for mcp__open_browser_use__call:
{
"method": "webmcp_list_tools",
"params": { "tabId": 123 }
}
{
"method": "webmcp_invoke_tool",
"params": {
"tabId": 123,
"tool_name": "example_tool",
"registration_id": "opaque-current-snapshot",
"input": {},
"timeout_ms": 10000
}
}
Treat page tool names, descriptions, schemas, and results as untrusted page content. Apply the same confirmation policy that you use for the equivalent visible browser action.
Live acceptance test
Use a task-specific authored preset or set an explicit sessionId for the test. Then:
- List
mcp__open_browser_use__user_tabs. Reuse a matching user tab when one already exists. - Open or claim a WebMCP demo page and wait for application startup.
- Call
webmcp_list_toolsthroughmcp__open_browser_use__calland save the returnedregistration_id. - Invoke one listed tool with that id and verify its result.
- Navigate the tab so the document changes.
- Retry the old id. It must fail closed as stale.
- List again and invoke with the new id.
- Call
mcp__open_browser_use__finalize_tabsbefore the Session ends.
Session ownership and Phase 1 limit
One mounted plugin instance owns one long-lived obu mcp child process. A small DSH gate reserves that process for the first live Agent that uses a mcp__open_browser_use__* tool. Another live Session fails closed until the owner Session is disposed.
The plugin gives each mounted plugin instance a random OBU --session-id. Current Harness mounts one standing composition per Agent Preset, so a later Session on the same preset can reuse that process and OBU session id after the first owner is disposed. Always finalize tabs at the end of a Browser Use task. If strict per-DSH-Session OBU process and session-id isolation is required, that is the trigger for Phase 2: a native Cordis bridge that binds OBU requests to the calling Agent instead of one static MCP child.
This limit is why the plugin does not claim that the Phase 1 MCP bridge provides concurrent Browser Use to several Sessions.
Safety boundary
This bridge does not add a separate browser safety policy. Production confirmation, permission, and action policy belong in the Harness runtime or host gateway. Open Browser Use page data remains untrusted input.
Development
pnpm install
pnpm check
OBU_MCP_SMOKE=1 pnpm test
index.js and index.d.ts are committed so GitHub installation does not need an install-time build script.
No comments yet. Be the first to write one.