Browser Link
Connects ChatGPT to selected Chrome tabs via MCP, enabling browser inspection, snapshots, clicks, fills, selections, scrolling, navigation, and screenshots within user-authorized tabs.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
Browser Link · personal preview
Connect selected Chrome tabs to ChatGPT through a private MCP connection. The server is Rust. Page inspection, element references, input handling, and command validation are Rust compiled to WebAssembly. A small JavaScript adapter connects Chrome's extension APIs to that core.
Status: the Rust server and Wasm core build successfully. Automated integration tests exercise the real MCP, OAuth, WebSocket, and Wasm components with DOM/Chrome API fixtures. Native Chrome verification is still required: the build workspace blocks the Unix sockets Chrome needs. This is a personal preview, not a verified production release.
What is included
Folder | Purpose |
| Loadable Chrome extension, including prebuilt Wasm |
| Rust MCP server, OAuth authorization, pairing and WebSocket bridge |
| Rust/Wasm validation, snapshots, clicks, fills and selections |
| Portable Agent Plugins manifest and browser-control skill |
| Static Linux x86_64 server in the packaged release |
| Integration suite and separate native Chrome suite |
| Results and limitations of the packaged build |
No separate AI API key is needed by this bridge; it makes no model API calls. ChatGPT uses the exposed tools within the user's account permissions and plan limits. Browser Link does not run autonomously after the ChatGPT task stops.
Related MCP server: tabgrant
1. Run the bridge
For a local extension test on Linux x86_64, extract the package, open a terminal in it, and run:
chmod +x bin/browser-link-server-linux-x86_64
./bin/browser-link-server-linux-x86_64The server binds to 127.0.0.1:7319. It creates a private setup key at data/admin.key. To display that key in your own terminal:
./bin/browser-link-server-linux-x86_64 --show-keyFor Windows/macOS, use Docker Desktop or build the Rust server on that machine. Docker also works on Linux:
docker compose up --build -d
docker compose exec bridge browser-link-server --show-keyKeep the setup key local. Enter it in the extension and the bridge's own OAuth page, never in ChatGPT messages. The extension stores a separate device token after pairing and discards the setup key.
2. Load the extension
Open
chrome://extensionsand enable Developer mode.Select Load unpacked, then select this package's
extensionfolder. For later updates, replace files in that same folder and click Reload on the existing Chrome extension. Removing and reinstalling it clears its saved pairing.Pin Browser Link to the toolbar and open it.
The server address defaults to
https://extension-chat.duckdns.orgfor the personal deployment. Change it tohttp://127.0.0.1:7319for a local test or to your own bridge origin, then enter that bridge's setup key once. The popup reuses a saved server and pairing token after reload; the setup key is not bundled or retained.Select Pair browser. Chrome requests access only to that bridge address.
Open the website you want to use. Click the toolbar extension and select Enable this tab.
Pairing grants no website access. Each enabled tab remains limited to its current origin. Navigating to another site or closing the tab revokes access. Stop all access disconnects and clears every enabled tab. Unpair this browser also revokes its device token at the reachable bridge.
3. Make the bridge reachable from ChatGPT
ChatGPT on the web cannot connect to the 127.0.0.1 address on your computer. For use here, run the bridge behind HTTPS on a server, or forward its entire origin through an HTTPS tunnel. Forward all routes, not just /mcp: OAuth discovery, sign-in, token exchange, pairing and /bridge WebSocket also need to work.
Set BROWSER_LINK_PUBLIC_URL to the real external origin before starting the bridge. For Docker, create a local .env file containing your actual address, for example:
BROWSER_LINK_PUBLIC_URL=https://browser.example.combrowser.example.com is an example; replace it with a domain you control. The Compose file exposes the bridge only on localhost. A reverse proxy on the same machine can provide TLS; see docs/Caddyfile.example. The server only accepts HTTP public URLs for loopback development. Keep the public URL stable so OAuth discovery and persisted connections remain consistent.
In the extension, pair with the real HTTPS origin. Then, in ChatGPT:
Open Plugins → + → Add custom MCP server.
Name it Browser Link and enter
https://YOUR-ACTUAL-HOST/mcp.Choose OAuth/automatic OAuth discovery and create the personal plugin.
In the bridge's authorization page, enter the setup key and approve the connection.
Start a new chat with Browser Link enabled. Ask it to inspect the tab you enabled.
Account/workspace policies still apply. Personal custom MCP setup does not submit the plugin to a public directory. No public listing has been created by this project.
The included personal skill guides tool use, but cannot establish the MCP connection itself. For a portable plugin package, run:
python3 scripts/configure-plugin.py https://YOUR-ACTUAL-HOST/mcpThis creates plugin/mcp.json with the real endpoint. plugin/mcp.example.json is documentation only. The plugin folder can then be used with a supported local/repo marketplace. Registering the custom MCP endpoint in ChatGPT remains a separate step.
Available tools
browser_status, browser_tabs, browser_snapshot, browser_click, browser_fill, browser_fill_form, browser_select, browser_scroll, browser_navigate, browser_screenshot.
Extension 0.2.2 adds per-action browser timing measurements, bounded command waits, and protection against late execution after a timeout. It works with the existing 0.2.0 source server; no VM rebuild is required. Update the installed extension files, reload the extension and the target pages, then inspect the next successful individual action's timing fields. See latency diagnostics and recovery for the measurements, limits and tests.
Server/extension 0.2.0 uses readable, Playwright-style control lines by default. It preserves all extracted controls (up to 250), field/toggle state, exact action references and omission notices. Control text is removed from the context section only when the same complete text is already its returned control label. Unrelated matching words and visible text differing from an ARIA name remain. Use format: "json" for the compatible structured response, query for focused reads, or detail: "full" for page-wide text and complete extracted values/options. Each snapshot replaces that tab's references. References remain scoped to the tab and are checked against the original Wasm element identity.
browser_fill_form edits 1–20 independent text fields or native selects in one MCP call, without clicking or pressing Enter. It stops on the first failure and reports completed edits. It is not atomic: inspect current values before continuing rather than resending a partially completed batch. Concurrent MCP reads cannot invalidate a batch's remaining references.
The updated Rust/Wasm extractor recognizes aria-labelledby, custom interactive roles and toggle states, and targets inside open shadow roots. Existing tab/origin grants and password/file restrictions remain. It does not provide Playwright's full automation engine, native keyboard/pointer events, cross-origin frame access, closed shadow roots or canvas controls. Screenshots capture the enabled tab's visible viewport. There is one paired, connected browser per bridge; page contents are not saved by the bridge.
See token measurements and deployment. The bundled static server is still v0.1.0: use the source-build Compose override for 0.2.0. Existing extensions can use the new server's readable snapshots and batch tool, but the new control extraction requires updating the installed extension/ files and reloading the extension and target pages.
Build from source
Install Rust and the pinned toolchain, then:
rustup target add wasm32-unknown-unknown --toolchain 1.99.1
cargo install wasm-bindgen-cli --version 0.2.229 --locked
python3 scripts/build.pyThis builds the server for your operating system and refreshes the loadable extension. The release already contains the extension's Wasm assets, so loading it does not require Rust on the browser machine.
Verify
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo clippy -p browser-link-core --target wasm32-unknown-unknown -- -D warnings
npm ci
npm test
npm run test:quality
npm run test:tokensFor the packaged static Linux binary, set BROWSER_LINK_TEST_BINARY to its absolute path before npm test; otherwise the suite uses target/release/browser-link-server.
On a normal computer, run the real Chrome suite:
npx playwright install chromium
npm run test:chromeIf using an existing Chrome for Testing/Chromium binary, set CHROME_PATH to its executable path. The test copy of the manifest pre-grants only its local fixture origins; the distributed manifest is unchanged. Actual toolbar permission prompting and viewport capture require this short manual check:
Load the original extension and pair it. Confirm that no tabs appear before enabling one.
Open the toolbar extension on a harmless form, enable the tab, then ask ChatGPT to fill it without submitting.
Ask for a screenshot; confirm it captures the enabled tab. Check the filled values yourself.
Navigate to another site; verify that access is removed until you enable that site.
Select Stop all access; verify that further actions fail. Reconnect and confirm previous tabs stay disabled.
Back up the private data directory or Docker volume if you want pairings and OAuth sessions to survive moving the bridge. Access tokens expire after one hour; rotating refresh tokens expire after 30 days. No page snapshots or screenshots are persisted by the server.
References
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Let AI agents observe and control Chrome tabs you explicitly share via Browse Bridge.
Connect AI agents to your own Chrome with scoped access, approvals, and verified task results.
Let AI agents use your real, signed-in Chrome: tabs, clicks, forms, screenshots and video.
Control your Chrome from chat: open websites, read what's on the page, click buttons, and fill in f…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceConnects AI agents to your Chrome browser via MCP, enabling real-time control of existing tabs, sessions, and application state for development workflows.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to request and receive user-granted, short-lived access to a single tab in the user's existing Chromium-based browser, then read, highlight, scroll, and navigate within that granted page without exposing other tabs or copying the browser profile.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables an AI agent to read and operate the Chrome or Edge tabs you are already using — titles, URLs, text, HTML, screenshots, clicks, typing, scrolling, and tab management — via a browser extension and native messaging, without restarting the browser, switching profiles, or opening a debug port. It exposes these capabilities as 19 MCP tools, with access limited to explicitly shared tabs and hardened by per-tab, origin-bound grants plus domain allow/deny lists.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP-compatible AI apps to read and control only the Microsoft Edge tabs a user explicitly shares, plus tabs it opens itself, using the user's real browser and logins. It provides tab listing, navigation, page snapshots, clicking, typing, dropdown selection, key presses, scrolling, screenshots, text extraction, waiting, and tab closing.MIT