A native macOS browser built on WKWebView that exposes itself as an MCP server over local HTTP. Instead of headless automation or cloud browsers, this gives LLMs control of a real Safari-engine browser window on your Mac. It ships 40+ tools for navigation, DOM manipulation (click, fill, submit), content extraction (read_text, screenshot, accessibility_tree), cookie and storage management, plus network and console capture. Bearer token auth and DNS rebinding protection keep it local-only. Useful when you want agents to interact with pages using your logged-in sessions and cookies, or when you need to see exactly what the LLM is doing in a real browser UI rather than a headless context.
A native macOS web browser that exposes itself as a Model Context Protocol server, so AI agents can drive a real WKWebView the same way a person would — navigate, click, fill forms, read the DOM, take screenshots, run JavaScript, and capture network and console activity.
Built with SwiftUI + WKWebView. The MCP server runs in-process over local HTTP with bearer-token authentication and DNS-rebinding defense.
⬇ Download the latest macOS build — signed, notarised .dmg for Apple Silicon.
After downloading, open the DMG and drag MCP Browser to your Applications folder.


Most "browser-as-a-tool" stories for agents fall into two camps:
MCP Browser is the third option: a real browser window on your Mac that you log into, navigate, and use yourself — and that an LLM can drive through MCP when you ask it to. Cookies, history, bookmarks, and downloads stay local. The agent sees the same page you do.
8833 (configurable) — POST /mcp for JSON-RPC, GET /mcp for SSE-style statusHost header validated against 127.0.0.1 / localhostMCPRegistrarnavigate, back, forward, reload, current_url, current_titlelist_tabs, new_tab, switch_tab, close_tabclick, fill, submit, hover, press_key, type_text, scroll, find_in_page, get_element, accessibility_treeread_text, read_page, page_metadata, screenshot, pdf_export, render_html, eval_js, find, list_links, list_formsget_cookies, set_cookie, storage, clear_sessionlist_bookmarks, open_bookmark_folderconsole_logs, network_log, dialogdownload, upload_file (gated by user permission)wait_for, emulate, resizeSee MCP Browser/MCP/MCPToolCatalog.swift for the authoritative list.
401 Unauthorizeddialog interactions127.0.0.1, never the public network/Applications and launch it.MCP Browser.xcodeproj in Xcode.MCP Browser scheme.CLI build:
xcodebuild -project "MCP Browser.xcodeproj" -scheme "MCP Browser" -configuration Debug build
The project ships with the original author's signing settings. If you're forking to build and ship your own copy:
MCP Browser target in Xcode → Signing & Capabilities → pick your own team. This rewrites DEVELOPMENT_TEAM in MCP Browser.xcodeproj/project.pbxproj.PRODUCT_BUNDLE_IDENTIFIER from com.moosia.mcp-browser to something you own.Most MCP clients accept an HTTP transport block. Example for claude_desktop_config.json:
{
"mcpServers": {
"mcp-browser": {
"transport": "http",
"url": "http://127.0.0.1:8833/mcp",
"headers": {
"Authorization": "Bearer <token-from-settings>"
}
}
}
}
The bundled MCP Clients settings tab can write this for you for the clients it knows about (Claude Desktop, Codex, etc.) — pick the client, hit Add MCP Browser, and it'll patch the file in place.
The token rotates each time you click Regenerate token in Settings → Connection. Re-patch your clients after rotating.
PersistentStore (file-backed) and SwiftData where appropriate.UserDefaults. It's regenerated from Settings → Connection whenever you want to revoke existing clients.MCP Browser/
├── Browser/ WKWebView wrapper, tab model, presenter, scripts, PiP
├── MCP/ MCP server, JSON-RPC, host protocol, tool catalog
│ ├── Registrar/ Auto-config patcher for Claude Desktop / Codex / etc.
│ └── Tools/ Tool implementations (navigation, DOM, content, etc.)
├── Settings/ Settings tabs (general, privacy, connection, recorder, etc.)
├── Storage/ Bookmarks, history, downloads, favicons, action log
├── Views/ Bookmarks bar, bookmarks manager, history, downloads popover
├── ContentView.swift Top-level window layout, tab strip, URL bar
├── AppCommands.swift Menu bar commands and keyboard shortcuts
└── MCP_BrowserApp.swift App entry point and environment wiring
Key files
MCP/MCPServer.swift — NWListener-based HTTP/JSON-RPC server, auth, rebind defenseMCP/MCPCoordinator.swift — routes tool calls to the focused window's active tabMCP/MCPToolCatalog.swift — registry of every exposed toolMCP/MCPSecret.swift — Keychain-backed bearer tokenBrowser/BrowserTab.swift — per-tab @Observable model wrapping WKWebViewBrowser/WebViewHost.swift — NSViewRepresentable bridgeMCP Browser deliberately runs un-sandboxed so it can:
~/Library/Application Support / ~/.configIt does not:
127.0.0.1)Host header doesn't match 127.0.0.1 or localhost (DNS-rebinding defense)If you're audit-minded, the entire HTTP surface is in MCP Browser/MCP/MCPServer.swift and is roughly 400 lines.
See CONTRIBUTING.md for how to file bugs, request features, and submit pull requests.
therealtimex/browser-use
jae-jae/fetcher-mcp
merajmehrabi/puppeteer-mcp-server
com.thenextgennexus/playwright-mcp-server
saik0s/mcp-browser-use