haden-browser
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., "@haden-browserOpen example.com and summarize what it's about"
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.
haden-browser
haden-browser is a fast, AI-first web browser exposed as a local Model Context Protocol server. It gives an AI the smallest useful page representation for its current goal instead of sending screenshots and raw page source on every turn.
Benchmark: 33% less AI browser context
Primary result: Haden used 7,822 reference tokens for the core browsing session—32.7% fewer than Playwright MCP and 32.5% fewer than Chrome DevTools MCP full mode. Among the tested browser MCPs that returned semantic action refs and image-alt coverage, Haden had the lowest token footprint.
Five-run median | Haden | Playwright MCP | Chrome Slim† | Chrome Full |
Core context tokens | 7,822 | 11,627 | 4,638 | 11,596 |
Tool-schema tokens | 727 | 3,999 | 221 | 4,974 |
Article workflow tokens | 2,732 | 4,640 | 2,497 | 4,388 |
First useful article | 1,044 ms | 2,714 ms | 3,005 ms | 3,133 ms |
Article origin transfer | 16.7 KB / 1 request | 95.0 KB / 10 | 95.0 KB / 10 | 95.0 KB / 10 |
Semantic action refs | 15 | 172 | 0 | 143 |
Image-alt coverage | 8/8 | 8/8 | 0/8 | 8/8 |
† Chrome Slim is the absolute token minimum, but it is a low-level JavaScript control baseline: the model must author page scripts, and the tested path returned no semantic action refs or image alt text. It is therefore shown transparently but is not treated as a semantic-browser equivalent.
Core context includes one complete tool-schema load plus the serialized MCP tool calls and results for article reading, form submission, and computed-style inspection. Counts use the o200k_base tokenizer. Image pixels, user/system prompts, and model reasoning or prose are excluded, so actual billed usage depends on the MCP host and model.
See the full benchmark report, raw per-run data, and reproduction instructions.
Related MCP server: Charlotte
Why it is different
Goal-based views — use compact semantic text for research, sanitized DOM for structure, or bounded computed styles for visual work.
Images stay lazy — an image is represented as its alt text or
[image img1]. Pixel data is returned only when the AI explicitly callshaden_image.Low round-trip control — every interaction returns a fresh snapshot, so most click/type flows need one tool call per step.
Stable action references — visible controls become
e1,e2, and so on, which are cheaper and more reliable than asking a model to invent CSS selectors.Fast by default — image, media, and font requests are blocked during ordinary browsing. CSS remains available for the visual view.
Safer local execution — non-HTTP schemes, credential-bearing URLs, and private-network targets are blocked unless the user explicitly opts in.
flowchart LR
AI[AI / MCP host] -->|stdio tools| MCP[haden-browser]
MCP --> PW[Playwright Chromium]
PW --> PAGE[Web page]
PAGE -->|semantic text / DOM / computed CSS| MCP
MCP -.->|only haden_image imgN| PIXELS[Image bytes]
PIXELS -.-> AIViews
View | Best for | Returned data |
| Search, reading, form flows | Headings, visible text, links and controls with |
| HTML structure and attributes | Sanitized HTML; scripts and embedded content removed; |
| Layout and CSS reasoning | Visible meaningful elements with boxes and a bounded set of computed CSS properties |
text is the default and should be preferred unless the task truly needs structure or presentation details.
MCP tools
Tool | Purpose |
| Open an HTTP(S) URL and return its first snapshot |
| Read the current page, optionally within a CSS selector |
| Click, fill, select, press, scroll, navigate history, reload, or wait; then return the updated snapshot |
| Return actual image pixels for one |
| Report the active page without starting Chromium |
Example text output:
# Example Domain
URL: https://example.com/
View: text
Interactive elements: 1
Images: 1 (use haden_image with an img ref only when visual inspection is needed)
# Example Domain
This domain is for use in illustrative examples.
[e1] link "More information" -> https://iana.org/domains/example
[image img1: "Example diagram"]References are scoped to the latest snapshot. Read again after substantial page changes before reusing an old e or img ref.
Requirements
Node.js 20 or newer
Chromium installed through Playwright
Install from this repository
git clone https://github.com/Haden-Min/haden-browser.git
cd haden-browser
npm ci
npm run setup-browser
npm run buildThen configure an MCP host to launch the built stdio server. Use an absolute path in real configuration:
{
"mcpServers": {
"haden-browser": {
"command": "node",
"args": ["/absolute/path/to/haden-browser/dist/index.js"]
}
}
}During development, a host can launch npx tsx /absolute/path/to/haden-browser/src/index.ts instead.
After the package is published to npm, the intended configuration is:
{
"mcpServers": {
"haden-browser": {
"command": "npx",
"args": ["-y", "haden-browser"]
}
}
}Run npx playwright install chromium once on that machine before the first browser call.
Configuration
Environment variable | Default | Meaning |
|
| Run Chromium without a visible window |
|
| Block images, media, and fonts during normal browsing |
|
| Allow localhost and private-network destinations |
|
| Navigation and image-fetch timeout |
|
| Click, fill, and locator timeout |
|
| Default snapshot character limit |
|
| Maximum bytes returned by |
Boolean variables accept true/false, 1/0, yes/no, and on/off.
Local development pages
Private hosts are blocked by default to reduce SSRF risk. To browse an application on localhost, opt in for that MCP process only:
{
"mcpServers": {
"haden-browser-local": {
"command": "node",
"args": ["/absolute/path/to/haden-browser/dist/index.js"],
"env": { "HADEN_ALLOW_PRIVATE_HOSTS": "true" }
}
}
}Development
npm install
npm run setup-browser
npm run check
npm run buildThe test suite covers network policy, text shaping, real Chromium extraction, ref-based interactions, lazy image retrieval, and an in-memory MCP client/server connection.
Current limitations
One active browser context is maintained per stdio MCP connection.
Image refs currently cover visible HTML
<img>elements, not CSS background images, canvases, video frames, or iframe contents.The visual view reports computed properties; it does not dump every stylesheet rule.
Downloads, file uploads, browser extensions, persistent profiles, and CAPTCHA solving are outside the MVP.
Private-host filtering reduces SSRF exposure but is not a substitute for OS/container-level network isolation in hostile multi-tenant environments.
See CONTRIBUTING.md for development guidance and SECURITY.md for vulnerability reporting.
License
MIT
Available Tools
5 toolshaden_imageInspect imageARead-only
Return the actual pixels for one img ref from the latest snapshot. Use only after alt text/placeholders are insufficient for the goal.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, covering safety. The description adds context about the data source ('latest snapshot') and output nature ('actual pixels'), but doesn't detail return format or potential edge cases, which is acceptable given annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the primary action and followed by a usage condition. Every word is purposeful, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one param, no nested objects) and rich annotations (readOnly, openWorld, destructive), the description sufficiently covers what the tool does and when to use it. The absence of an output schema reduces the need to document return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter (ref) and schema description coverage of 0%, the description does not explicitly explain the parameter format. However, the schema pattern (^img\d+$) and the phrase 'one img ref' provide some meaning. The description adds minimal semantic value beyond what the schema already implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Return the actual pixels for one img ref from the latest snapshot.' This distinguishes it from sibling tools like haden_read or haden_open by focusing on image pixel retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance on when to use the tool: 'Use only after alt text/placeholders are insufficient for the goal.' This implies alternatives (alt text/placeholders) and sets a clear condition, though it does not name specific sibling tools or list when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
haden_interactInteract with pageADestructive
Perform one browser action and immediately return the updated snapshot, avoiding an extra read call. click/fill/select need a current e ref; press can target a ref or the page.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| ref | No | ||
| mode | No | text | |
| value | No | ||
| action | Yes | ||
| amount | No | ||
| waitMs | No | ||
| maxChars | No | ||
| direction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the immediate return of the updated snapshot, adding value beyond the destructiveHint annotation. Does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff, well-structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Explains core behavior and return, but lacks detail on parameter usage and edge cases, which is somewhat expected given the 9 parameters and 3 enums.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only partially explains parameters (action, ref), leaving many (key, value, amount, waitMs, maxChars) undocumented. Schema enums help but description does not compensate sufficiently.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it performs a browser action and returns an updated snapshot, distinguishing it from read-only siblings like read and status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on when to use (to avoid extra read calls) and which actions require a current ref, but does not explicitly contrast with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
haden_openOpen web pageARead-only
Open an HTTP(S) URL and return an AI-optimized snapshot. text is fastest; dom returns sanitized HTML; visual adds computed layout/CSS.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| mode | No | text | |
| maxChars | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, so the safety profile is clear. The description adds valuable behavioral details: returning an AI-optimized snapshot and specifying sanitized HTML for dom mode. It does not contradict annotations and offers meaningful context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core action and then efficiently outlines mode differences. Every clause adds value; there is no fluff or redundancy. It is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters, no output schema, and moderate complexity, the description covers purpose and mode meanings but omits maxChars explanation and does not clarify what 'snapshot' encompasses beyond the modes. It is adequate but leaves room for improvement, especially since schema coverage is zero.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 0% of parameters, so the description must compensate. It effectively explains the mode parameter (text/dom/visual semantics), but fails to describe maxChars, leaving its purpose and constraints solely to the schema. Url is self-evident from its format but still lacks narrative. Given the low coverage, this is insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the primary action (open an HTTP(S) URL) and the result (AI-optimized snapshot), making the purpose clear. It doesn't explicitly compare with sibling tools, but the resource and verb are specific enough to differentiate from likely 'read' or 'interact' functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on choosing output modes (text, dom, visual) with performance/reliability trade-offs, but lacks explicit direction on when to use this tool versus sibling tools like haden_read or haden_interact. The description implies usage for fetching web pages but does not state alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
haden_readRead current pageARead-only
Read the current page again, optionally limited to a CSS selector. Returns stable e refs for actions and img refs for optional image retrieval.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | text | |
| maxChars | No | ||
| selector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds value by disclosing that refs are stable and that image retrieval is optional. It does not contradict annotations, and the additional behavioral context (stable refs) goes beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence followed by a clarifying clause. It front-loads the core purpose and adds only high-value return info. No fluff, every word contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 3 parameters lacking schema descriptions, the description is incomplete. It covers the selector's purpose but ignores mode and maxChars, which are essential for understanding output types and limits. The refs info helps but does not bridge the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains 'selector' via 'optionally limited to a CSS selector', but gives no meaning for 'mode' (text/dom/visual) or 'maxChars'. This is a significant gap for effective tool invocation, as agents cannot infer the purpose of these parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads the current page, optionally limited by a CSS selector, and mentions it returns stable refs for actions and images. This specific verb+resource+scope distinguishes it from siblings like haden_interact or haden_open.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it ('Read the current page again') and mentions optional selector, which suggests targeted reading. However, it does not explicitly state when NOT to use it or compare with alternatives like haden_image for visual capture, though the context is reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
haden_statusBrowser statusARead-only
Report whether the browser is running and which page is active.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the annotations (readOnlyHint=true, destructiveHint=false) and adds a small behavioral detail: it reports the active page, not just a running flag. However, it does not disclose what happens if the browser is not running, what 'active page' means in practice, or whether the tool returns a simple boolean, a URL, or both. With annotations already signaling safety, the description adds only modest context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word earns its place: it names the action, the target resource, and the exact two pieces of information reported.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only status tool with no output schema, the description is sufficiently complete. It clearly states what the tool reports, and no additional input or prerequisite detail is needed. The absence of an output schema is compensated by specifying that the tool reports both browser-running state and active page.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema contains no properties, so the description does not need to explain parameter meaning. The baseline for a parameterless tool is 4, and the description correctly focuses on behavior rather than inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and a clear resource ('whether the browser is running and which page is active'), making the tool's purpose immediately obvious. It is also clearly differentiated from sibling tools like haden_open, haden_read, haden_interact, and haden_image, which describe actions rather than state inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance about when to use this tool versus alternatives, nor any when-not-to-use conditions. The context is implied by the name and siblings, but the description does not state that this should be used before acting on the browser or how it relates to the other browser tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
haden_image - First observed
haden_interact - First observed
haden_open - First observed
haden_read - First observed
haden_status
TDQS
Each tool has a unique, non-overlapping purpose: open, read, interact, image, and status. No ambiguity between them.
All tools follow the consistent 'haden_' prefix with clear action verbs (open, read, interact, image, status). The pattern is uniform.
Five tools provide a well-scoped set for browser automation—covering navigation, reading, interaction, visual capture, and state checking—without excess or deficiency.
The set covers core browser operations, but lacks explicit navigation controls (e.g., back, forward, refresh) and waiting mechanisms. These can be worked around via interact/open, but are minor gaps.
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 Connectors
Reliable web access for AI agents: smart HTTP, rotating proxies, and full-browser rendering.
Agent-native search engine with live web research optimized for AI agents.
E2LLM gives your AI eyes and hands in a real browser: structured perception (SiFR) plus action.
Save and organize web finds in persistent, user-controlled collections for AI assistants.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA token-efficient browser automation server that enables LLMs to navigate websites, click elements, and extract content using accessibility trees and markdown conversion. It provides eight tools for lightweight browser interaction optimized for performance with local LLM endpoints.MIT
- AlicenseAqualityAmaintenanceA token-efficient MCP server that gives AI agents structured access to the web, returning compact page summaries and targeted queries instead of full accessibility dumps.23463178MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with web applications through DOM inspection, user interaction simulation, and application state management.MIT
- AlicenseNot gradedqualityBmaintenanceOptimizes browser automation for AI agents by reducing token usage and latency through smart element extraction and caching.MIT
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/Haden-Min/haden-browser'
If you have feedback or need assistance with the MCP directory API, please join our Discord server