Puppeteer Real Browser MCP Server
Supports handling Cloudflare Turnstile captchas through the solve_captcha tool.
Supports browsing Google websites and handling reCAPTCHA challenges through dedicated captcha solving capabilities.
Leverages Puppeteer for browser automation with enhanced stealth capabilities, including realClick and realCursor methods to avoid detection.
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., "@Puppeteer Real Browser MCP Servergo to amazon.com and search for wireless headphones under $100"
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.
Puppeteer Real Browser MCP Server
Give an MCP-compatible AI assistant a local Chrome browser that it can open, navigate, read, and control.
Under maintenance: This project is still changing. The
mainbranch may be newer than the package published on npm. The npm badge above shows the published version used by@latest.
What it does
This package runs as a local Model Context Protocol (MCP) server. Your MCP client starts the server, and the server starts one Chrome process for browser automation.
Main features:
Opens a visible browser by default, with optional headless mode
Navigates pages and reads HTML or text
Finds elements, clicks, types, waits, and scrolls
Uses
rebrowser-puppeteer-coreand a small set of anti-detection settingsDetects Chrome on Windows, macOS, and Linux
Supports a custom Chrome path, proxy, and dedicated automation profile
Tracks the exact Chrome process it starts and closes only that process
Enforces a content-first workflow before page interaction
No browser automation is invisible. Websites may still detect it or block it.
Related MCP server: Cloudflare Playwright MCP
Safety and current limits
Please read this before using the server:
Use it only on websites you are allowed to automate.
Review tool calls before approving logins, forms, purchases, downloads, or other sensitive actions.
The browser and file tools run with your normal user permissions.
The server supports one browser session at a time.
solve_captchais currently a placeholder. It does not use a CAPTCHA-solving service. Browser startup only makes a best-effort click on detected Turnstile widgets.save_content_as_markdownis listed by the server, but the current workflow validator blocks it. This is a known code issue.
Requirements
Node.js 18 or newer
npm and
npx(included with the normal Node.js installer)Google Chrome or Chromium
An MCP client that can start a local
stdioserver
Claude Desktop is available on macOS and Windows. Other MCP clients can use this server on Linux.
Quick start
You do not need to install this package globally. npx can download and run
the published package when your MCP client needs it.
The -y option prevents an npm install question from blocking the MCP server
while it starts.
Claude Desktop
Open Claude Desktop → Settings → Developer → Edit Config.
Add this server inside
mcpServers:
{
"mcpServers": {
"puppeteer-real-browser": {
"command": "npx",
"args": [
"-y",
"puppeteer-real-browser-mcp-server@latest"
]
}
}
}Save the file.
Fully quit Claude Desktop, then open it again.
Claude Desktop stores this file here:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
See the official local MCP server guide for the current Claude Desktop steps.
Claude Code
Run:
claude mcp add --transport stdio puppeteer-real-browser \
-- npx -y puppeteer-real-browser-mcp-server@latestThen check the connection:
claude mcp get puppeteer-real-browserInside Claude Code, /mcp also shows server status.
The default scope is local to the current project. Add --scope user before
the server name if you want the server in all your projects. See the official
Claude Code MCP guide for scope details.
Cursor
Create .cursor/mcp.json in one project, or ~/.cursor/mcp.json for all
projects:
{
"mcpServers": {
"puppeteer-real-browser": {
"command": "npx",
"args": [
"-y",
"puppeteer-real-browser-mcp-server@latest"
]
}
}
}Restart Cursor after saving the file. See the official Cursor MCP guide for current configuration locations and formats.
Other MCP clients
Use a local stdio server with this command and argument list:
command: npx
args: -y puppeteer-real-browser-mcp-server@latestThe server communicates through standard input and standard output. Your MCP client must keep the process open while it uses the tools.
Test the setup
Ask your AI assistant:
Start the browser, open https://example.com, read the page text, and then close the browser.
The expected tool order is:
browser_init → navigate → get_content → browser_closeAvailable tools
The server exposes 11 tools.
Tool | Purpose | Required input |
| Start or reuse the managed Chrome session | None |
| Open a URL |
|
| Read full-page or selected HTML/text | None |
| Find a CSS selector from element text |
|
| Click an element |
|
| Clear and type into an input |
|
| Wait for a selector, navigation, or time |
|
| Scroll with varied timing and distance | None |
| Return a placeholder attempt result |
|
| Save as |
|
| Close the managed browser and reset workflow state | None |
Content-first workflow
The server blocks blind interaction. Use this order:
browser_init → navigate → get_content → find_selector → click or typeAfter a new navigation, call get_content again before clicking or typing.
You can call wait after navigation when a page loads content slowly.
Browser configuration
Browser options are inputs to browser_init. They are not top-level MCP
server settings.
Option | Meaning |
| Set |
| Proxy URL such as |
| Dedicated automation profile path. |
| Set |
| Connection and setup timeout in ms. |
| Delay operations in ms. |
| Absolute path to a Chrome executable. |
| Custom flags; replaces the server flag list. |
| Content-priority suggestion settings. |
contentPriority is an object with prioritizeContent and
autoSuggestGetContent Boolean values. It changes suggestions, but it does not
remove the required content-first workflow.
Example request:
{
"headless": true,
"proxy": "http://proxy.example.com:8080",
"connectOption": {
"timeout": 60000,
"slowMo": 100
},
"customConfig": {
"chromePath": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
}
}Chrome path
The server first checks these environment variables:
CHROME_PATHPUPPETEER_EXECUTABLE_PATH
If neither points to a file, the server checks common Chrome and Chromium locations. On Windows, it also checks the registry and common portable paths.
You can set CHROME_PATH in the MCP client configuration:
{
"mcpServers": {
"puppeteer-real-browser": {
"command": "npx",
"args": [
"-y",
"puppeteer-real-browser-mcp-server@latest"
],
"env": {
"CHROME_PATH": "/absolute/path/to/chrome"
}
}
}
}PROXY_URL is not a supported environment variable. Pass a proxy to
browser_init instead.
Browser ownership protection
The server keeps the exact launcher handle and process ID for the Chrome process it starts. Normal close, startup failure, timeout, MCP disconnect, and signal shutdown all clean up through that handle. It does not search for or close Chrome by process name.
For safety, the server rejects settings that could attach to another browser or take ownership of a personal Chrome profile:
customConfig.userDataDircustomConfig.portcustomConfig.portStrictModecustomConfig.handleSIGINTconnectOption.browserURLconnectOption.browserWSEndpointconnectOption.transport--remote-debugging-port,--remote-debugging-pipe, and--user-data-dirinside custom Chrome flags
Use profilePath for persistent automation data. The directory must be
absolute and either empty or already marked as owned by this server.
Troubleshooting
The MCP server does not appear
Check the tools are installed:
node --version npm --version npx --versionCheck that Node.js is version 18 or newer.
Check the JSON file for missing commas or quotes.
Fully quit and reopen the MCP client.
If a desktop app cannot find
npx, use its absolute path ascommand. Runwhich npxon macOS/Linux orwhere npxon Windows to find it.
Claude Desktop logs are stored here:
macOS:
~/Library/Logs/ClaudeWindows:
%APPDATA%\Claude\logs
Chrome is not found
Find the real Chrome executable, then set CHROME_PATH in the MCP client
configuration. Common examples are:
Windows:
C:/Program Files/Google/Chrome/Application/chrome.exemacOS:
/Applications/Google Chrome.app/Contents/MacOS/Google ChromeLinux:
/usr/bin/google-chromeor/usr/bin/chromium
Do not run the MCP client as Administrator or use sudo npm install -g only to
solve a Chrome path problem.
The server looks stuck when run in a terminal
This can be normal. A stdio MCP server waits for protocol messages from an MCP
client. Use the MCP Inspector instead of typing into the process.
Test the published package:
npx -y @modelcontextprotocol/inspector \
npx puppeteer-real-browser-mcp-server@latestSee the official MCP Inspector guide for usage details.
A page action is blocked
Follow the required workflow:
browser_initnavigateget_contentfind_selectorwhen you need a selectorclickortype
If the page changed, call get_content again.
A browser connection times out
Check that the Chrome path exists.
Close the current managed browser with
browser_close, then start it again.Increase
connectOption.timeoutin thebrowser_initinput.Check whether security software is blocking the child Chrome process.
Include the full error message when reporting the problem.
Get help
Search or open a GitHub issue. Include:
Operating system
Node.js and npm versions
MCP client name and version
Chrome version and executable path
Full error message
Exact steps that reproduce the problem
Do not include passwords, cookies, tokens, or private page content.
Development
Run from source
git clone https://github.com/withLinda/puppeteer-real-browser-mcp-server.git
cd puppeteer-real-browser-mcp-server
npm ci
npm run buildTest the local build with the MCP Inspector:
npx -y @modelcontextprotocol/inspector node dist/index.jsTo use the local build in an MCP client, use an absolute path:
{
"mcpServers": {
"puppeteer-real-browser-local": {
"command": "node",
"args": [
"/absolute/path/to/puppeteer-real-browser-mcp-server/dist/index.js"
]
}
}
}Project structure
src/index.ts MCP stdio server and request handlers
src/tool-definitions.ts Tool names and input schemas
src/browser-manager.ts Browser state, detection, and configuration
src/managed-browser-session.ts Owned Chrome launch and cleanup
src/handlers/ Tool implementations
src/*.test.ts Unit and regression tests
test/integration/ MCP protocol integration tests
test/e2e/ Real-browser tests
test/safety/ Browser cleanup safety guard
scripts/check-packaged-server.ts Package smoke testTest workflow
Use TDD for behavior changes: write one failing test, make it pass, then clean up the code.
# Browser cleanup safety guard
npm run test:safety
# Fast source tests
npm run test:unit
# MCP protocol integration tests
npm run test:integration
# Build the package
npm run build
# Test the built npm package shape and stdio lifecycle
npm run test:package:smoke:built
# Real Chrome tests
npm run test:e2e
# Release-focused automated checks
npm run test:allDuring TDD, use npm run test:watch. Before running real-browser tests, note
the Chrome processes already open on your machine. After testing, verify that
only the Chrome process started by the test was closed.
Contributing
Issues and pull requests are welcome. For a code change:
Create a focused branch.
Add a failing test for one behavior.
Make the smallest code change that passes the test.
Refactor while tests stay green.
Run the safety, source, build, and package checks.
Explain the root cause, solution, prevention, and verification in the commit message.
License
This project uses the MIT License.
Acknowledgments
The original implementation and public API were based on
puppeteer-real-browser
by ZFC Digital. The current source replaces that end-of-life runtime dependency
with an internal managed launcher built from chrome-launcher,
rebrowser-puppeteer-core, and ghost-cursor.
Available Tools
11 toolsbrowser_closeA
Close the browser instance
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action without noting side effects like session termination, unsaved data loss, or irreversibility. This is minimal but not misleading.
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 is direct and front-loaded with the verb 'close'. There is no wasted content, making it highly concise.
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 simple close action, the description is adequate, but it could note that it permanently ends the browser session. The lack of behavioral caveats slightly reduces completeness, though no output schema exists to explain 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?
The tool accepts zero parameters, and the input schema confirms an empty object. Since there are no parameters, the description does not need to add parameter details, and the baseline for 0 params is 4.
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 'close' and resource 'browser instance', clearly distinguishing it from sibling tools like browser_init and navigate. It unambiguously states the tool's function.
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?
No guidance is provided on when to use this tool, such as as a cleanup step after automation completes. There is no mention of alternatives, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_initB
Initialize a new browser instance with anti-detection features and automatic Chrome path detection
| Name | Required | Description | Default |
|---|---|---|---|
| proxy | No | Proxy server URL (format: protocol://host:port) | |
| headless | No | Run browser in headless mode | |
| disableXvfb | No | Disable Xvfb (X Virtual Framebuffer) | |
| profilePath | No | Absolute path to a dedicated automation profile. New or empty directories receive an MCP ownership marker; personal Chrome profiles are rejected. | |
| customConfig | No | Custom configuration for Chrome launcher. Use chromePath to specify custom Chrome executable path | |
| connectOption | No | Additional connection options | |
| contentPriority | No | Configuration for content-first workflow enforcement |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral transparency burden. It mentions 'anti-detection features' and 'automatic Chrome path detection,' but does not disclose side effects, idempotency, resource cleanup, or what happens on repeated calls. This is insufficient for an initialization tool.
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 that front-loads the primary action and key differentiators. Every word earns its place with no redundancy.
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 complex tool with 7 parameters, nested objects, and no output schema, the description is thin. It does not explain return values, the need to call browser_close, or the lifecycle implications of initialization. The schema provides parameter details, but the description lacks broader context for a task-level agent.
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 100% with detailed parameter descriptions, so the baseline is 3. The description adds marginal context (auto path detection relates to chromePath), but does not substantively add meaning beyond the schema.
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 'Initialize' and resource 'browser instance', and distinguishes itself from sibling tools by highlighting anti-detection features and automatic Chrome path detection. This clearly states what the tool does and sets it apart from navigation and automation tools.
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 this is a setup step for browser automation, but does not explicitly state when to call it relative to other tools or provide exclusions/alternatives. The context suggests it should be used first, but the description itself lacks explicit usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickC
Click on an element
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector of element to click | |
| waitForNavigation | No | Wait for navigation after click |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full responsibility for disclosing behavioral traits. It only says 'Click on an element' and does not mention side effects, waiting behavior, error handling, or whether it clicks the first matching element. This is a significant gap for a state-changing action.
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, clear sentence with no redundant words. It is appropriately concise for the tool's simplicity, ensuring every word contributes to understanding the tool's purpose.
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?
Even though the tool is simple with well-documented parameters, the absence of annotations means the description must provide more context. It lacks any behavioral notes, error behavior, or usage guidance, making it incomplete for an agent that needs to invoke it correctly in varied scenarios.
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 schema already provides 100% coverage with descriptions for both 'selector' and 'waitForNavigation', so the baseline is 3. The description adds no additional meaning beyond the schema, making it neither better nor worse.
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 'Click on an element' clearly states the action and object, making it distinct from sibling tools like type or navigate. However, it lacks explicit mention of using a CSS selector or the option to wait for navigation, which are covered in the schema.
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?
No guidance is provided on when to use this tool versus alternatives such as type or navigate. The description does not indicate any exclusions or prerequisites, leaving the agent without direction on selecting this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_selectorB
Find CSS selector for element containing specific text
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text content to search for in elements | |
| exact | No | Whether to match exact text (true) or partial text (false) | |
| elementType | No | HTML element type to search within (e.g., "button", "a", "div"). Default is "*" for any element | * |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose the return format, what happens on no match or multiple matches, or whether it performs a read-only DOM search. The behavior is only vaguely implied.
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, compact sentence that efficiently conveys the core function without any redundant words. It earns its place by adding specific detail beyond the tool name.
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 no annotations, the description should clarify return values and edge-case behavior. It does not state whether it returns a string, an array, or throws on missing text, leaving significant gaps for autonomous use.
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 input schema covers 100% of the parameters with clear descriptions. The tool description adds no extra meaning beyond the schema, so it meets the baseline but does not enhance parameter understanding.
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 and resource ('Find CSS selector for element containing specific text'), making it clear what the tool does. It also distinguishes itself from sibling tools like click or navigate by focusing on selector discovery.
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 usage is implied by the purpose: use this tool when you need a CSS selector for an element by its text. However, there is no explicit guidance on when not to use it or how it compares to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contentA
Recommended method to get page content (HTML or text) - More reliable than screenshots for content analysis and navigation tasks
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Type of content to retrieve | html |
| selector | No | CSS selector to get content from specific element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It states that this method is 'more reliable than screenshots', which is a behavioral comparison, but it does not disclose limitations such as whether it waits for page load or what happens when a selector is not found. This leaves some behavioral uncertainty.
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 that immediately conveys the recommendation and purpose. Every word earns its place, with no redundant details.
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 low complexity (2 params, no output schema, no annotations), the description covers the core purpose and usage context adequately. However, it could briefly mention what the return format looks like (e.g., raw HTML or plain text) to be more complete, so a slight gap exists.
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 input schema fully describes both parameters (type with enum/default, selector with description), so schema coverage is 100%. The description adds no extra context about how these parameters affect the output, so it does not exceed the baseline.
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 explicitly states the tool retrieves page content (HTML or text), using a clear verb ('get') and resource ('page content'). It also distinguishes itself from screenshots, which are a common alternative for capturing page state, thereby clarifying its unique value.
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 marks itself as 'Recommended' and specifies that it is intended for 'content analysis and navigation tasks', giving clear when-to-use guidance. However, it does not mention sibling tools like save_content_as_markdown or find_selector as alternatives, so exclusions are not fully addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
random_scrollA
Perform random scrolling with natural timing
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for disclosing behavior. While 'natural timing' hints at human-like delays, it does not explain whether scrolling is continuous, random in direction, or how long it lasts. Key behavioral traits like potential side effects or interruptibility are absent.
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 with no filler. It is front-loaded with the action ('Perform random scrolling') and the qualifier ('with natural timing') adds value without bloat. Every word earns its place.
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 simple tool with no parameters and no output schema, the description covers the basic purpose but omits usage context and behavioral details. It is minimally viable but lacks the richness expected for a browser automation tool, especially with no annotations to fill gaps.
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, so the schema is fully covered trivially. The description does not need to add parameter details. A baseline of 4 is appropriate because there is nothing to clarify beyond the schema.
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 performs random scrolling with natural timing, using a specific verb and resource. It distinguishes itself from siblings like 'navigate' and 'click' by focusing on scroll behavior. The purpose is unambiguous in the browser automation context.
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?
No guidance is provided on when to use this tool versus alternatives. There is no mention of scenarios where random scrolling is beneficial, such as mimicking human behavior, nor any exclusions or alternatives. The description only states what it does without contextual use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_content_as_markdownB
Extract page content and save it as a formatted markdown file
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Absolute path where the markdown file should be saved (must end with .md) | |
| selector | No | Optional CSS selector to extract content from specific element | |
| contentType | No | Type of content to extract and convert | text |
| formatOptions | No | Options for markdown formatting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for disclosing behavioral traits. It states the tool saves content to a file, but it does not mention side effects such as overwriting existing files, permission requirements, or error behavior. The conversion to markdown is implied but not detailed, leaving significant gaps in transparency.
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, clear sentence that front-loads the primary purpose without any redundancy or extraneous words. Every word contributes meaning, making it highly concise.
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 has four parameters, a nested object, no output schema, and no annotations, the one-sentence description is insufficient. It fails to explain what happens after saving (e.g., return values, file overwrite behavior), any prerequisites, or potential side effects, leaving the agent without enough context to use the tool safely and effectively.
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 input schema provides 100% coverage with detailed descriptions for all four parameters, including nested formatOptions. The description adds no additional parameter semantics, so the baseline score of 3 applies as the schema already carries the explanatory burden.
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 specific verbs ('extract' and 'save') and identifies both the resource ('page content') and the output ('formatted markdown file'). It distinguishes itself from sibling tools like get_content, which focuses solely on retrieval without saving.
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 usage (when you need to save content as markdown), but it does not explicitly state when to use this tool versus alternatives like get_content, nor does it provide exclusions or alternative tool pointers. This leaves usage guidance to be inferred from the name and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_captchaC
Attempt to solve CAPTCHAs (if supported)
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Type of captcha to solve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It mentions 'if supported' but does not explain what unsupported types mean, whether the tool may fail, or any side effects. The hedged phrasing hints at uncertainty but offers no concrete details.
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 with no wasted words. It is appropriately brief, though it could sacrifice some brevity for more useful detail.
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?
The tool is simple with one enum parameter, but the description still leaves key questions unanswered: which CAPTCHA types are actually supported, what happens if a type is unsupported, and what the return value indicates. Without an output schema, the description should explain these aspects but does not.
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 100% with the 'type' parameter already having an enum and description. The description adds no additional semantic value, but since the schema handles parameter documentation fully, the baseline score of 3 is appropriate.
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 solves CAPTCHAs, which is a distinct resource from the sibling browser automation tools. However, the hedging word 'Attempt' and the vague 'if supported' qualify the action, making the purpose less definitive than it could be.
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 provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or context. The reader is left to infer that it should be used when encountering a CAPTCHA.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typeB
Type text into an input field
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type | |
| delay | No | Delay between keystrokes in ms | |
| selector | Yes | CSS selector of input element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It doesn't disclose whether it clears existing content, simulates individual keystrokes, or requires the element to be focused. The delay parameter is mentioned only in the schema, not in the description.
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 of six words, front-loading the core action and target. Every word contributes value, with no redundancy or filler.
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 mutation tool with no annotations and no output schema, the description is too thin. It doesn't address behavior like overwriting vs. appending, event triggering, or error conditions. The schema documents parameters but not the operational context.
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 description coverage is 100%, so the parameters are already well-documented. The description adds no additional meaning to selector, text, or delay beyond what the schema provides, so the baseline score of 3 applies.
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 'Type text into an input field' clearly identifies the action (type) and the resource (input field). It distinguishes from siblings like click, get_content, and navigate because it's the only tool for entering text.
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?
No guidance on when to use this tool versus alternatives. It doesn't mention that it's for filling form inputs or that it shouldn't be used for clicking or navigating. No exclusions or prerequisites are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
waitC
Wait for various conditions
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Type of wait condition | |
| value | Yes | Selector to wait for or timeout in ms | |
| timeout | No | Maximum wait time in ms |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the burden of disclosing behavior. It only says 'Wait' without explaining whether it blocks, how timeouts are handled, what happens on timeout, or whether it can wait for multiple condition types. The lack of any behavioral detail leaves the agent guessing about side effects and execution semantics.
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 vague sentence that is brief but not effective. It lacks front-loaded specifics and does not earn its place, as 'various conditions' adds minimal value. A concise description should still convey key details; this one is under-specified.
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 has 3 parameters, an enum type, and no output schema, the description is far from complete. It does not explain the meaning of the three wait types, expected return values, or error behavior. The sibling context suggests a browser automation tool but does not compensate for the missing information.
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 description coverage is 100%, with each parameter (type, value, timeout) having a clear description. The tool description adds no extra meaning beyond 'various conditions', so it neither improves nor harms parameter understanding. Baseline 3 is appropriate because the schema handles the semantics.
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 'Wait for various conditions' provides a clear verb and object but remains vague about what specific conditions are supported. It does not mention the selector, navigation, or timeout types defined in the schema, nor does it distinguish itself well from sibling tools. This is not a tautology but lacks the specificity expected for a useful purpose statement.
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 gives no guidance on when to use this tool versus alternatives like click or navigate. It does not specify scenarios, prerequisites, or any exclusions. With no context on usage, the agent is left to infer from the schema and sibling names.
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.
11 tool updates
v1.6.0- First observed
browser_close - First observed
browser_init - First observed
click - First observed
find_selector - First observed
get_content - First observed
navigate - First observed
random_scroll - First observed
save_content_as_markdown - First observed
solve_captcha - First observed
type - First observed
wait
TDQS
Each tool has a clearly distinct purpose: navigation, interaction, content retrieval, and browser lifecycle. Even get_content and save_content_as_markdown are differentiated by returning versus saving content. No two tools overlap in function.
Tool names mix bare verbs (click, type, wait), verb_noun pairs (get_content, find_selector), and a prefixed pair (browser_init, browser_close). While readable, the inconsistency in naming style is noticeable and lacks a single predictable pattern.
With 11 tools, the count is well within the ideal range for a browser automation server. Each tool covers a core aspect of browsing without redundancy or bloat.
The tool set covers basic navigation, interaction, waiting, content extraction, and even captcha solving. However, common browser automation features like taking screenshots, executing JavaScript, getting the current URL/title, or handling browser history are missing, leaving some gaps for general browser use.
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
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI assistants to control Chrome browsers through the Chrome DevTools Protocol, allowing for navigation, clicking, typing, and extracting page information.16548MIT
- FlicenseNot gradedqualityCmaintenanceA Model Control Protocol server that enables AI assistants to control a browser through tools for web automation tasks like navigation, typing, clicking, and taking screenshots.-
- FlicenseNot gradedqualityCmaintenanceA Model Control Protocol server that enables AI assistants to control a browser through tools for web automation tasks like navigation, typing, clicking, and taking screenshots.-
- FlicenseNot gradedqualityCmaintenanceA Model Control Protocol server that enables AI assistants to control a browser, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.-
Appeared in Searches
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/withLinda/puppeteer-real-browser-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server