bronom

bronom

Exposes a persistent, visible multi-tab Electron browser to AI clients through MCP, enabling tab management, navigation, interaction, screenshots, and JavaScript evaluation.

Category
访问服务器

README

Bronom

Bronom is a visible, multi-tab Electron browser that exposes its live tabs to AI clients through MCP. It is deliberately not headless and is not tied to the lifetime of an AI session.

Project website: https://netroforge.github.io/bronom/

What it keeps

  • Cookies, local storage, IndexedDB, service workers, cache, and login sessions use Electron's persistent persist:bronom partition.
  • Open tabs and the active tab are restored from tabs.json in Electron's user-data directory.
  • Appearance settings are restored from settings.json in the same profile.
  • Allowed and blocked website permissions are restored from site-permissions.json in the same profile.
  • Window position, size, monitor, maximized state, and fullscreen state are restored. If that monitor is disconnected, the window is centered on the current primary display.
  • Closing the window hides it by default. The Electron process and MCP endpoint keep running; click the tray icon to open its menu and choose Show Bronom or Quit. Disable Hide in tray when closing in Settings to make the window close button quit Bronom instead.
  • A second launch focuses the existing instance instead of starting a competing browser profile.

Appearance

Open Settings from the gear button at the right of the address bar. Bronom includes three application themes:

  • Light for a bright, neutral browser shell.
  • Dark for a low-glare browser shell.
  • Cyberpunk for a neon cyan and magenta browser shell.

The selected theme is applied immediately and survives application restarts. It changes Bronom's controls and native color preference without injecting styles into websites. The same dialog includes separate MCP security, Site permissions, and Updates sections.

Site permissions

When a website requests access such as location, notifications, clipboard, camera, or microphone, Bronom asks before granting it and remembers the Allow or Deny decision for that exact website origin. Open Settings → Site permissions to change a saved decision, forget one so Bronom asks again, or reset the section to clear all saved decisions.

Updates

Automatic update checks are disabled by default. Packaged builds check the public GitHub release feed shortly after startup only after you enable both Enable auto update and Check for updates on startup. Bronom never downloads an update silently: an in-app notification shows the available version and release notes, then asks you to Download update and Install and restart.

You can also check manually from Settings, the Bronom application menu, or the tray menu. Update preferences are stored in the persistent profile. Development builds do not contact the release feed; set BRONOM_DISABLE_AUTO_UPDATE=1 to disable checks for a packaged launch as well.

Bronom Home

The compact B button before the first regular tab opens Bronom Home, an internal dashboard that stays inside the persistent browser partition. Bronom keeps Home as a singleton: clicking the button focuses the existing Home page or recreates it if needed. Regular new tabs remain blank. Home provides:

  • Copy-ready setup instructions for Codex, Claude Code, Cursor, VS Code/GitHub Copilot, and generic Streamable HTTP clients.
  • A live list of active requests and recently seen MCP clients.
  • The current 25-tool browser catalog, grouped by session, navigation, interaction, and inspection.
  • The local MCP endpoint and authentication guidance.

Regular websites, including https://google.com, can be opened from the address bar, a new-tab request with a URL, or browser_navigate.

Run

Requirements: Node.js 22+ and a graphical Linux, macOS, or Windows session.

npm install
npm run dev

Development runs use a persistent bronom-dev profile. This keeps development cookies, tabs, storage, and window state across restarts while avoiding the single-instance lock and profile of an installed Bronom build. If an older window appears after upgrading the source, quit it from Bronom → Quit once instead of only closing the window.

For the built application:

npm run build
npm start

To ask an already running development instance to flush its profile and quit cleanly:

node_modules/.bin/electron . --quit

The MCP endpoint is available while the app is running:

http://127.0.0.1:47812/mcp

Health check:

export BRONOM_MCP_TOKEN="$(cat ~/.config/Bronom/mcp-token)"
curl -H "Authorization: Bearer $BRONOM_MCP_TOKEN" http://127.0.0.1:47812/healthz

The exact profile path is shown on Bronom Home. On Linux, the packaged default is ~/.config/Bronom/mcp-token; development builds use ~/.config/bronom-dev/mcp-token. Bronom creates one random token per profile and restricts the token file to the profile owner.

Connect an MCP client

Use a Streamable HTTP MCP configuration and start Bronom before the client connects. A generic JSON configuration looks like:

{
  "mcpServers": {
    "bronom": {
      "url": "http://127.0.0.1:47812/mcp",
      "headers": {
        "Authorization": "Bearer <paste the token shown by Bronom Home>"
      }
    }
  }
}

The exact schema depends on the MCP client; Bronom Home includes separate current instructions for the major coding agents. Disconnecting or closing that client does not close Bronom.

Optional environment variables:

  • BRONOM_MCP_PORT: listen port, default 47812.
  • BRONOM_MCP_HOST: loopback listen host, default 127.0.0.1. Non-loopback values are rejected.
  • BRONOM_MCP_TOKEN: override the generated per-profile token with at least 32 URL-safe characters. While authentication is enabled, every MCP and health request must send Authorization: Bearer <token>.
  • BRONOM_DISABLE_MCP_AUTH: start the current launch with MCP authentication disabled. The same setting can be changed immediately under Settings → MCP security. Bronom remains loopback-only, but every local process can then control the profile; use this only on a trusted single-user machine.
  • BRONOM_USER_DATA_DIR: use an alternate profile directory instead of the packaged or bronom-dev default. This is primarily useful for isolated integration tests.
  • BRONOM_DISABLE_AUTO_UPDATE: set to 1 to disable update checks for the current launch.
  • BRONOM_DOWNLOAD_DIR: save website downloads in this directory instead of the operating system's Downloads directory.

MCP tools

  • browser_status, browser_show, browser_tabs
  • browser_new_tab, browser_select_tab, browser_close_tab
  • browser_navigate, browser_history, browser_wait
  • browser_snapshot, browser_click, browser_type, browser_fill_form, browser_press
  • browser_select, browser_hover, browser_drag, browser_scroll, browser_file_upload
  • browser_resize, browser_screenshot, browser_console, browser_network, browser_downloads, browser_evaluate

The preferred interaction loop is browser_snapshot → semantic element ref (e1, e2, ...) → browser_click or browser_type. Take a fresh snapshot after navigation or large DOM changes.

browser_screenshot can capture either the visible viewport or the full page. Console and network histories are bounded to the 500 most recent entries per tab, and network results intentionally omit headers and bodies. Website downloads are tracked through MCP, use collision-safe filenames, and never silently overwrite an existing file.

browser_resize applies a per-tab viewport override for responsive testing and can reset it without resizing the desktop window. browser_fill_form updates several inputs, text areas, selects, checkboxes, radios, or editable elements in one call.

Support Bronom

Bronom is free and open source. The current funding goal is Windows code signing and Apple notarization so new users see fewer security warnings when installing it. Support is always optional; Bronom has no locked features or donation popups.

Ko-fi Open Collective Patreon

Security model

  • The MCP server binds to loopback by default and rejects non-local browser origins.
  • By default, every MCP and health request requires a strong bearer token. Bronom generates and reuses an owner-only token for each browser profile unless a valid BRONOM_MCP_TOKEN override is supplied. Authentication can be explicitly disabled in Settings → MCP security or for launch with BRONOM_DISABLE_MCP_AUTH=1.
  • Website tabs have Node.js disabled, context isolation enabled, Chromium sandboxing enabled, and web security enabled.
  • New browser windows become managed tabs.
  • Unknown site permission requests require explicit confirmation. Bronom remembers each decision per website origin and permission type, and lets you review or revoke it later in Settings.
  • Camera, microphone, and file-system grants are never reused: Bronom shows the requested scope and asks again each time.
  • browser_evaluate is intentionally powerful: only connect trusted AI clients to this browser profile.
  • browser_file_upload can attach any absolute local file path supplied by a connected client. Only connect clients you trust with local file access.

Testing

Unit tests live in tests/*.test.ts and use Vitest. Real-application integration tests live in tests/integration/*.e2e.ts and use Playwright's Electron API with reusable fixtures from tests/integration/fixtures.ts. Every integration test launches Bronom with an isolated temporary profile and cleans it up afterward. The suite covers the visible shell, tabs, MCP, Home, themes, site permissions, restart persistence, and updater settings without contacting the live release feed. Application, test, preload, website, and build configuration source is TypeScript.

npm test
npm run test:integration
npm run typecheck
npm run build
npm run build:website
npm run build:unpack

On a headless Linux machine, run the already-built integration suite under Xvfb:

xvfb-run --auto-servernum npm run test:integration:run

The CI workflow runs unit tests, the production build, the real Electron integration suite, and the production dependency audit. Pull requests whose branch name contains release- additionally build the complete Linux, macOS, and Windows package sets in a hosted matrix before merge.

GitHub Pages

The English product website is authored in website/ with TypeScript behavior and built by Vite. The dedicated Pages workflow builds it from main, uploads the generated docs/ artifact, and deploys it through GitHub Pages. It resolves platform-specific downloads from the latest public GitHub release only after a user clicks a download card.

Preview the exact production output locally:

npm run build:website
npm run preview:website

Releases

GitHub Actions validates every pull request and every push to main. When package.json changes to a new version on main, the auto-tag workflow creates an annotated v<version> tag and dispatches the release workflow. The initial repository commit is intentionally not auto-tagged.

The release workflow creates one draft release, builds Linux, macOS, and Windows artifacts in parallel from the immutable tag commit, uploads the updater manifests and a hashes.txt SHA-256 manifest, and publishes only after every platform job succeeds. Packaged Bronom builds use those manifests through electron-updater. The workflow can also be dispatched manually for an existing version tag.

Current releases are unsigned community builds: the binaries are not platform code-signed and macOS packages are not Apple-notarized. macOS Gatekeeper and Windows SmartScreen may therefore warn before first launch. Build jobs never receive release-write credentials; the final job publishes the completed set and generates GitHub artifact attestations. Verify a downloaded asset with gh attestation verify <asset> -R Netroforge/bronom, then compare it with hashes.txt.

Dependabot checks npm packages and GitHub Actions weekly and groups related Electron, Vue/Vite, MCP, and TypeScript updates. GitHub Pages deploys independently from the desktop release workflow.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选