OpenHands / OpenHands/software-agent-sdk
Unlocked installs resolve browser-use 0.11.13 with mcp 2.x — browser tools silently disappear
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 1.1k
- Forks
- 539
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 137
Description
Is there an existing issue for the same bug?
- I have searched existing issues and this is not a duplicate.
Bug Description
Any install of the SDK that resolves dependencies without uv.lock — uvx, pip install openhands-agent-server, Agent Canvas's npm run dev:minimal — gets browser-use 0.11.13 together with mcp 2.x. browser-use 0.11.13 predates mcp 2, so its MCP server raises at import/startup and the agent ends up with no browser tools, reported only as a log warning.
Locked installs (the Docker image, CI, uv sync) are unaffected: uv.lock holds fastmcp 3.2.0 → mcp 1.28.1.
Expected Behavior
An unlocked install of openhands-agent-server / openhands-tools resolves a dependency set where browser_tool_set actually starts, or fails loudly if it cannot.
Actual Behavior
The resolver picks a combination that cannot work:
printf 'openhands-agent-server==1.49.1\nopenhands-tools==1.49.1\n' > req.txt
uv pip compile --python-version 3.12 req.txt | grep -E '^(browser-use|mcp|fastmcp)=='
# browser-use==0.11.13
# fastmcp==4.0.5
# mcp==2.2.0
In that environment the browser executor cannot start:
uv run --python 3.12 --with openhands-agent-server==1.49.1 --with openhands-tools==1.49.1 \
python -c "from openhands.tools.browser_use.impl import BrowserToolExecutor; BrowserToolExecutor()"
# AttributeError: 'Server' object has no attribute 'list_tools'
# browser_use/mcp/server.py:215 -> @self.server.list_tools()
BrowserToolSet.create() catches it and returns no tools with WARNING Browser tools are unavailable: the browser executor failed to start. Because chromium is installed, is_tool_usable("browser_tool_set") stays True, so the agent-server still injects the tool set on a profile launch and the agent silently runs without browser tools.
Steps to Reproduce
- Run the
uv pip compileabove, or start Agent Canvas withnpm run dev:minimal. - Launch a conversation with an OpenHands profile that has
tools: null. - The resolved agent lists
browser_tool_set, but nobrowser_*tool reaches the LLM.
Root cause
Two unbounded ranges of ours, plus browser-use's habit of pinning its dependencies exactly:
-
openhands-sdkdeclaresfastmcp>=3.2.0with no upper bound. fastmcp 4.0 (2026-08-31) restructured intofastmcp-slim, which requiresmcp>=2.0.0,<3.0.0, so an unlocked resolve now installs mcp 2.x. -
openhands-toolsdeclaresbrowser-use>=0.8.0with no upper bound, butopenhands-agent-serverrequiresopenai>=2.33.0,<3(added in #3545). Every browser-use from 0.12 on pins an older exactopenai, so all of them are excluded:browser-use openai mcp 0.11.13 (2026-02-25) >=2.7.2,<3>=1.10.10.12.0 – 0.13.8 ==2.16.0==1.26.00.13.9 ==2.26.0==1.28.10.13.10 (2026-09-04) ==2.26.0==2.1.1Forcing the newest says so directly: "Because browser-use==0.13.10 depends on openai==2.26.0 and openhands-agent-server depends on openai>=2.33.0,<3 …"
So the newest browser-use our openai floor allows is too old for the mcp major that fastmcp 4 forces. Before fastmcp 4.0 an unlocked install got mcp 1.x and 0.11.13 was fine.
Acceptance Criteria
- An unlocked resolve of
openhands-agent-server+openhands-toolsproduces a dependency set whoseBrowserToolExecutor()constructs successfully. -
uv.lockstill resolves and the existing browser tests pass. - A failure to start the browser is visible to a user or client, not only in server logs (today
is_tool_usablereportsTruewhile the tool set resolves to zero tools). - CI catches this class of drift: a check that resolves the published dependencies without the lockfile and imports the browser executor.
Installation Method
Other
If you selected "Other", please specify
uvx / pip (unlocked resolution), including Agent Canvas npm run dev:minimal
SDK Version
1.49.1
Version Confirmation
- I have confirmed this bug exists on the LATEST version of OpenHands SDK
Python Version
3.12
Operating System
macOS (resolution is platform-independent)
Logs and Error Messages
WARNING Browser tools are unavailable: the browser executor failed to start. Continuing without them.
File ".../browser_use/mcp/server.py", line 215, in _setup_handlers
@self.server.list_tools()
AttributeError: 'Server' object has no attribute 'list_tools'
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the unlocked resolution with the provided uv pip compile command, then run the BrowserToolExecutor import shown in the issue. Inspect the dependency declarations for openhands-sdk and openhands-tools, along with BrowserToolSet.create() and is_tool_usable(). Done means unlocked and locked resolutions work, browser startup failures are visible, and CI checks an unlocked published dependency set.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend, build-system, testing-qa
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100