BrowserAgent
OfficialClick 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., "@BrowserAgentGo to example.com and list all the links on the page."
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.
✨ Highlights
One model, not two.
observereturns the a11y snapshot and the pixel overlay in a single call, so the model never reconciles text and images itself.Diffs, not dumps. The diff engine returns only what changed since the last observation, with fingerprint-based uid rebinding across navigation.
Events, not polling. Console, network, DOM, and navigation events are collected and pushed, so the model doesn't re-read the page every turn.
Strict TDD at 100/100. Every module lands at 100% coverage and 100% mutation score, enforced by CI.
TypeScript-only, zero tolerance. No
.js/.mjs/.cjsanywhere; noas,any,!, or@ts-ignorein the codebase.
Related MCP server: hermes-computer-use
The thesis
Most browser integrations treat "read the page" and "act on the page" as separate worlds, one returning text and the other returning pixels. That split forces the model to re-read the page every turn and to guess at the relationship between what it sees and what it can click.
BrowserAgent's core idea: build one unified, event-driven, visually-rich model where the semantic layer and the visual layer are the same object, a model that can both watch and explain.
Why another browser MCP server?
It's not a fork of chrome-devtools-mcp. It borrows that project's proven patterns (stable element uids keyed by loaderId_backendNodeId, a ContextPage abstraction that hides Puppeteer behind a narrow contract, an "act then wait for stable DOM/navigation" wrapper, and token-optimized formatters) and rebuilds them from scratch around a different product shape.
Unified observe, not split snapshot/screenshot. One call returns the a11y tree with the pixel overlay.
Diff, don't re-read. The diff engine (with fingerprint-based uid rebinding) means the model doesn't pay to re-read the whole page every turn.
Events, not polling. The server pushes changes instead of the model polling.
Fewer round trips over micro-optimization. The browser and the LLM are the bottlenecks, so performance comes from the diff engine and event-driven observation rather than shaving milliseconds.
Architecture
flowchart TB
Client[MCP Client / LLM]
subgraph Protocol["MCP Protocol Layer"]
Server[McpServer<br/>tools/list · tools/call · server/discover]
end
subgraph Framework["Tool Framework"]
Handler[ToolHandler<br/>defineTool · gating · write mutex]
end
subgraph Core["Core Model"]
direction LR
Observe[observe<br/>snapshot + overlay]
Diff[Diff engine<br/>changes + rebinding]
Events[Event layer<br/>buffer + collector]
Actions[Action layer<br/>log + act-then-wait]
end
Browser[ContextPage<br/>over Puppeteer / CDP]
Client <-->|MCP| Server
Server -->|registerTool| Handler
Handler -->|read| Observe
Handler -->|write| Actions
Observe --> Diff
Observe --> Events
Actions --> Events
Observe --> Browser
Actions --> BrowserThe layers are thin and testable: the protocol layer bridges our tools onto MCP, the ToolHandler enforces gating, and the ContextPage hides Puppeteer behind a narrow contract so nothing touches the raw page.
The product surface, in dependency order:
# | Piece | Milestone |
1 |
| M1 |
2 | Diff engine: changes since the last call, not the whole tree | M2 |
3 | Event / subscription layer: console, network, DOM, navigation | M4 |
4 | Semantic action log: | M3 |
5 | Action primitives: click, type, hover, scroll, select, press, navigate, with the act-then-wait wrapper | M3 |
6 | MCP protocol layer: | M5 |
7 | MCP Apps replay/annotation UI: scrubbable, animated replay | M7 |
8 | Tasks + MRTR: | M5-M6 |
9 | Intent tools: | M6 |
Getting started
Requirements
Tool | Version |
Node.js |
|
npm | bundled with Node |
TypeScript |
|
Install
git clone https://github.com/PremierStudio/BrowserAgent.git
cd BrowserAgent
npm installRun the full gate chain
This is exactly what CI enforces:
npm run ciIndividual gates
Command | What it does |
|
|
| ESLint (bans |
| Prettier check |
| dead code / unused deps (zero findings) |
| Vitest |
| 100% threshold (lines/branches/functions/statements) |
| Stryker, 100% threshold + survivor registry |
| coverage + JUnit XML into |
Software stack
Layer | Package | Version |
Protocol |
| |
Browser |
| |
Schemas |
| |
Language |
| |
Tests |
| |
Mutation |
| |
Lint |
| |
Dead-code |
| |
Format |
|
Engineering: strict TDD with a 100/100 gate
Every module is written test-first (RED → GREEN → refactor) and must clear a hard, CI-enforced gate before it is committed:
typecheck → lint → format → knip → unit tests → coverage (100%) → mutation (100%) → survivor registry100% coverage (lines/branches/functions/statements) via Vitest +
@vitest/coverage-v8.100% mutation score via Stryker. Coverage alone is a lie; mutation testing proves the tests actually catch real faults. The only escape from the mutation gate is a pre-approved, documented entry in
mutation-survivors.json(currently empty).No dead code. knip runs with zero findings. Unused files, exports, and dependencies are removed, not ignored.
TypeScript only, everywhere. No
.js/.mjs/.cjsanywhere, including source, configs (eslint.config.ts,stryker.config.ts,vitest.config.ts), and scripts (emitted todist-scripts/viatsconfig.scripts.json).No banned constructs.
ascasts,any,!non-null assertions,@ts-ignore/@ts-nocheck/@ts-expect-error, and.forEachare all lint errors.Deterministic tests. Clocks and timers are injected, so there are no sleeps and no flaky timing.
The full engineering spec lives in docs/mvp.md; every deviation and protocol decision is recorded in docs/decisions.md.
Repository layout
src/
actions/ ActionLog (replay seed), ActionRunner, StabilityWaiter (act-then-wait)
context/ ContextPage abstraction + CDP a11y-tree conversion (axTree)
diff/ diff engine, fingerprint-based uid rebinding, DiffTracker
events/ event types, bounded EventBuffer, normalizer, EventCollector
protocol/ MCP tool bridge to @modelcontextprotocol/server v2
snapshot/ a11y snapshot builder + uid→box overlay
tools/ tool framework: defineTool, ToolHandler, ToolMutex, Response, observe
uid.ts stable loaderId_backendNodeId uid generation
docs/
mvp.md the product plan and non-negotiable engineering requirements
decisions.md every amendment (supersedes mvp.md where they conflict)
scripts/ survivor-registry checker (TypeScript, emitted to dist-scripts/)
.github/workflows/ci.ymlRoadmap
gantt
title BrowserAgent milestones
dateFormat YYYY-MM-DD
axisFormat %d
section Foundation
M0 Tooling + test infra :done, m0, 2026-08-11, 1d
section Core model
M1 Page model (observe) :done, m1, 2026-08-11, 1d
M2 Diff engine :done, m2, 2026-08-11, 1d
M4 Event layer :done, m4, 2026-08-11, 1d
M3 Action primitives :done, m3, 2026-08-11, 1d
section Protocol
M5 MCP protocol layer :active, m5, 2026-08-12, 3d
section Intent & UI
M6 Intent tools :m6, after m5, 3d
M7 MCP Apps replay UI :m7, after m6, 3d
section Hardening
M8 Hardening :m8, after m7, 2dContributing
This repo follows the rules in AGENTS.md (binding for every agent) and the spec in docs/mvp.md. The short version:
Strict TDD. Write the failing test first (RED), confirm it fails for the right reason, then implement (GREEN), then refactor.
The 100/100 gate. No module merges unless it's at 100% coverage and 100% mutation score, with typecheck/lint/format/knip clean.
No survivor silencing. A surviving mutant is fixed by strengthening the test, never by weakening the code or adding ignore comments.
TypeScript only. No
.js/.mjs/.cjs, including configs and scripts.
License
Apache License 2.0 © Premier Studio. See LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityDmaintenanceAn advanced MCP server for browser automation using Puppeteer, specifically optimized for token efficiency through minimal data returns and progressive enhancement. It enables agents to navigate pages, capture LLM-optimized screenshots, extract structured content, and perform batch interactions.3
- Alicense-qualityCmaintenancePixel-level browser automation MCP server that drives a real Chrome browser using screenshots as vision input and OS-level mouse/keyboard as output, evading anti-bot detection.3MIT
- AlicenseAqualityDmaintenanceAn MCP server that uses headless Chromium (Puppeteer) to capture pixel-perfect screenshots and extract DOM from URLs, with LLM-friendly step-based workflows.2133MIT
- Flicense-qualityDmaintenanceMCP server for headless browser automation using Puppeteer, enabling AI to navigate, click, fill forms, take screenshots, and execute JavaScript on web pages.
Related MCP Connectors
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Headless-browser-as-JSON with memorymarket cache economics. Real Chromium, crypto settlement.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- 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/PremierStudio/BrowserAgent'
If you have feedback or need assistance with the MCP directory API, please join our Discord server