apex-browser-mcp
Allows controlling real Safari.app via WebDriver for browser automation.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@apex-browser-mcpNavigate to https://example.com and take a screenshot."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
apex-browser-mcp
Own, local, multi-session browser MCP. One tool surface drives real Chrome, Chromium, WebKit (Safari engine), and real Safari.app — plus attach to an already-running Chrome and drive many isolated sessions on it concurrently. No API keys, no cloud, runs on your machine.
Built because leapfrog / browser-use are Chromium-only (and browser-use needs a per-step LLM key). This spans engines and keeps everything local.
Engines
| Backend | Sessions | Use |
| Playwright chromium, | N | real Chrome |
| Playwright chromium (bundled) | N | headless/CI |
| Playwright webkit | N | Safari-engine cross-browser testing |
| safaridriver (WebDriver) | 1 (OS limit) | real Safari.app |
(attach) | CDP | N | drive your already-running logged-in Chrome |
Related MCP server: selenium-mcp
Tools
browser_new_session · browser_attach · browser_navigate · browser_snapshot (indexed refs e1,e2…) · browser_click · browser_type · browser_evaluate · browser_screenshot · browser_list_sessions · browser_close_session
Run
As a daemon (multi-client, non-blocking — recommended):
npm install && npx playwright install chromium webkit
APEX_BROWSER_TRANSPORT=http node src/index.js # http://127.0.0.1:3010/mcpOn macOS a LaunchAgent (com.apex.browser-mcp) keeps it running across reboots.
As stdio (single client): node src/index.js
Register in an MCP client
{ "mcpServers": { "apex-browser": { "type": "http", "url": "http://127.0.0.1:3010/mcp" } } }Env
APEX_BROWSER_TRANSPORT (stdio|http) · APEX_BROWSER_PORT (3010) · APEX_BROWSER_MAX_SESSIONS (15) · APEX_BROWSER_HEADLESS (1=headless) · APEX_BROWSER_SHOTS (/tmp)
Auto-attach (opt-in): APEX_BROWSER_AUTOATTACH=1 makes the daemon poll APEX_BROWSER_CDP (default http://127.0.0.1:9222) and adopt a session the moment a debug Chrome appears — surviving boot-ordering and self-healing if that Chrome closes/reopens. Tune with APEX_BROWSER_AUTOATTACH_MODE (default|isolated) and APEX_BROWSER_AUTOATTACH_INTERVAL (ms, 5000).
Attach to your real Chrome
bin/chrome-debug.sh real # quit Chrome first; relaunches your profile with a debug port
# then: browser_attach { mode: "default" } → your logged-in session
# browser_attach { mode: "isolated" } → fresh stealthed context on the same Chromebin/chrome-debug.sh (no arg) uses a safe dedicated automation profile instead.
Safety invariant: attached browsers are never closed by us — sessions detach, your Chrome keeps running.
Test
node test/extensive.js # 29 checks: engines, concurrency, isolation, errors, interaction, daemon
node test/attach-concurrent.js # 5 sessions driving ONE attached Chrome simultaneouslyOps
restart:
launchctl kickstart -k gui/$(id -u)/com.apex.browser-mcphealth:
curl localhost:3010/health· logs:/tmp/abm-daemon.log
Notes
Real Safari.app is single-session (Apple
safaridriverlimit) and runs an automation window that does not inherit your everyday Safari logins. For real logins usechrome+browser_attach.Node resolved via the mise shim so a version bump won't break the daemon.
MIT © Apex Radius
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/apexradius/browser-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server