abrasio-mcp
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., "@abrasio-mcpnavigate to example.com and take a screenshot"
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.
abrasio-mcp
MCP server that exposes Abrasio as an agentic browser for AI models.
Allows Claude, Cursor, and any MCP-compatible AI to control a real web browser with full anti-detection fingerprinting — the same stealth infrastructure used for web scraping, now driven by AI.
How it works
AI Model (Claude, Cursor, etc.)
│ MCP tool calls
▼
abrasio-mcp server
│ Abrasio SDK
▼
Patchright (undetected Playwright fork)
│ CDP WebSocket
▼
Chrome (local stealth) OR Abrasio cloud worker (fingerprinted, residential IP)The MCP server holds a single persistent browser session. The AI calls tools to navigate, observe, and interact — no configuration needed between steps.
Related MCP server: Scout
Installation
pip install abrasio-mcpOr install from source:
cd abrasio-mcp
pip install -e .Modes
Local mode (free)
No API key required. Launches Chrome on your machine with Patchright stealth patches.
abrasio-mcpBest for: development, testing, scraping sites that don't require real residential IPs.
Cloud mode (paid)
Requires an Abrasio API key. The browser runs on Abrasio cloud infrastructure with:
Real collected browser fingerprints (not spoofed)
Residential or datacenter IP in the target region
Persistent profiles that accumulate browser history
ABRASIO_API_KEY=sk_live_xxx abrasio-mcpBest for: production agents, geo-targeted tasks, heavily protected sites.
Configuration
All configuration is done via environment variables. No config files required.
Variable | Default | Description |
| (none) | Cloud API key. If set, enables cloud mode. If unset, uses local mode. |
|
| Run browser headless. Set |
| (none) | Target region for geo-configuration, e.g. |
|
| Set |
|
| MCP transport: |
|
| Bind host when using |
|
| Bind port when using |
Integrations
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"abrasio": {
"command": "abrasio-mcp",
"env": {
"ABRASIO_API_KEY": "sk_live_xxx",
"ABRASIO_REGION": "BR"
}
}
}
}For local mode (no API key):
{
"mcpServers": {
"abrasio": {
"command": "abrasio-mcp",
"env": {
"ABRASIO_HEADLESS": "false"
}
}
}
}Claude Code
claude mcp add abrasio -- abrasio-mcpWith environment variables:
claude mcp add abrasio -e ABRASIO_API_KEY=sk_live_xxx -e ABRASIO_REGION=BR -- abrasio-mcpCursor
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"abrasio": {
"command": "abrasio-mcp",
"env": {
"ABRASIO_API_KEY": "sk_live_xxx"
}
}
}
}Streamable HTTP (production / remote)
Start the server:
ABRASIO_TRANSPORT=streamable-http \
ABRASIO_HOST=0.0.0.0 \
ABRASIO_PORT=8931 \
ABRASIO_API_KEY=sk_live_xxx \
abrasio-mcpConfigure the client to connect to http://your-server:8931/mcp.
Tools reference
The MCP server exposes 15 tools, organized in four groups.
Navigation
browser_navigate
Navigate to a URL and wait for the page to load.
Parameter | Type | Description |
|
| Full URL including scheme, e.g. |
Returns: JSON object with url (final URL after redirects), title, and status (HTTP status code).
{ "url": "https://example.com/home", "title": "Home — Example", "status": 200 }browser_go_back
Go back to the previous page in browser history.
Returns: JSON object with url and title of the page navigated to.
browser_go_forward
Go forward to the next page in browser history.
Returns: JSON object with url and title.
browser_reload
Reload the current page.
Returns: JSON object with url and title.
browser_get_url
Get the current page URL.
Returns: String with the current URL.
Observation
browser_screenshot
Take a screenshot of the current page.
Returns: PNG image. Claude can see this image and use it to understand the visual state of the browser before deciding what to interact with.
Use this at the start of a task and after each major interaction to confirm the expected result.
browser_get_text
Extract all visible text from the current page body.
Returns: Plain text string. Useful for reading articles, prices, search results, or any text-based content without parsing HTML.
browser_get_html
Get the inner HTML of an element.
Parameter | Type | Default | Description |
|
|
| CSS selector for the target element |
Returns: HTML string of the matched element.
browser_find_elements
Find all interactive elements on the page.
Returns: JSON array. Each item represents a clickable, fillable, or otherwise interactive element:
[
{
"tag": "button",
"type": "submit",
"text": "Sign in",
"href": null,
"selector": "button.login-btn",
"x": 720,
"y": 412,
"visible": true
},
{
"tag": "input",
"type": "email",
"text": "",
"href": null,
"selector": "input[name=\"email\"]",
"x": 720,
"y": 340,
"visible": true
}
]Field | Description |
| HTML tag name |
| Input type ( |
| Visible text, value, placeholder, or aria-label (up to 120 chars) |
| Link URL for anchor elements |
| CSS selector hint — use this with |
| Center coordinates in the viewport |
| Whether the element is within the current viewport |
Call
browser_find_elementsbefore interacting to get the correct selector forbrowser_clickandbrowser_fill.
browser_wait_for
Wait for an element to appear in the DOM.
Parameter | Type | Default | Description |
|
| (required) | CSS selector to wait for |
|
|
| Maximum wait time in milliseconds |
Returns: JSON object with found: true, the selector, and the element's text content.
Use this after triggering actions that cause loading states (form submissions, route changes, AJAX updates).
Interaction
All interaction tools use the Abrasio human simulation layer:
Clicks use WindMouse — a physics-based cursor movement algorithm that mimics real hand movement with gravity, wind perturbations, and velocity management.
Typing uses character-level timing with realistic delays, burst typing, and occasional typos followed by backspace correction.
Scrolling uses a 3-phase easing curve (acceleration → constant → deceleration).
browser_click
Click an element by CSS selector.
Parameter | Type | Description |
|
| CSS selector for the element to click |
Returns: Confirmation string.
Clicked: button#submitbrowser_fill
Click a form input and fill it with text.
Parameter | Type | Description |
|
| CSS selector for the input element |
|
| Value to type into the field |
Clears any existing value, clicks the field, then types with human-like timing.
Returns: Confirmation string with character count.
Prefer
browser_filloverbrowser_typewhen targeting a specific input. Usebrowser_typeonly when the input is already focused.
browser_type
Type text at the current cursor position.
Parameter | Type | Description |
|
| Text to type |
Types into whichever element currently has focus. Useful for keyboard shortcuts, search boxes that open on click, or multi-step typing flows.
Returns: Confirmation string with character count.
browser_scroll
Scroll the page vertically.
Parameter | Type | Default | Description |
|
|
| Pixels to scroll. Positive = down, negative = up. |
Returns: Confirmation string indicating direction and distance.
browser_hover
Move the mouse over an element without clicking.
Parameter | Type | Description |
|
| CSS selector for the element to hover |
Uses WindMouse movement to reach the element. Useful for revealing dropdown menus, tooltips, or hover-triggered UI elements.
Returns: Confirmation string.
browser_press
Press a keyboard key or key combination.
Parameter | Type | Description |
|
| Key name or combination |
Common values:
Key string | Action |
| Submit form / confirm |
| Move focus to next field |
| Close modal / cancel |
| Navigate dropdowns |
| Select all |
| Copy |
| Submit (macOS) |
Returns: Confirmation string.
Evaluation
browser_evaluate
Execute JavaScript in the current page context.
Parameter | Type | Description |
|
| JavaScript expression or function |
The script can be a simple expression or a function that returns a value:
// Expression
document.title
// Arrow function
() => document.querySelectorAll('h2').length
// Function with logic
() => {
const el = document.querySelector('#price');
return el ? el.innerText.trim() : null;
}
// Read localStorage
() => ({ token: localStorage.getItem('auth_token') })Returns: JSON-serialized result of the script execution.
Use this for data extraction that
browser_get_textandbrowser_get_htmlcannot handle — structured data, counts, computed values, or interacting with the page's JavaScript environment.
Patterns and best practices
Starting a task
Always begin with a screenshot to understand the current state:
1. browser_navigate("https://target.com")
2. browser_screenshot() ← see what loaded
3. browser_find_elements() ← discover available interactionsFilling a login form
1. browser_navigate("https://site.com/login")
2. browser_screenshot()
3. browser_find_elements() ← get selectors for email/password fields
4. browser_fill("input[name='email']", "user@example.com")
5. browser_fill("input[name='password']", "secret")
6. browser_click("button[type='submit']")
7. browser_wait_for(".dashboard") ← wait for redirect
8. browser_screenshot() ← confirm login succeededHandling dynamic content
1. browser_click(".load-more-btn")
2. browser_wait_for(".new-items-loaded") ← wait for content
3. browser_get_text() ← extract updated contentExtracting structured data
1. browser_navigate("https://shop.com/product/123")
2. browser_evaluate("() => ({ name: document.querySelector('h1').innerText, price: document.querySelector('.price').innerText })")Navigating paginated results
1. browser_navigate("https://site.com/results?page=1")
2. browser_get_text()
3. browser_click("a[aria-label='Next page']")
4. browser_wait_for(".results")
5. browser_get_text()Architecture
abrasio-mcp/
├── pyproject.toml
└── abrasio_mcp/
├── __init__.py
├── server.py # FastMCP server, tool registration, entry point
├── browser.py # AbrasioBrowserAgent — wraps Abrasio SDK + Page
└── tools/
├── __init__.py
├── navigate.py # browser_navigate, go_back, go_forward, reload, get_url
├── observe.py # browser_screenshot, get_text, get_html, find_elements, wait_for
├── interact.py # browser_click, fill, type, scroll, hover, press
└── evaluate.py # browser_evaluateSession lifecycle
The browser session is lazy-started: the MCP server process starts immediately, and the browser only opens when the first tool is called. The session persists for the lifetime of the server process — navigation history, cookies, and localStorage are preserved across all tool calls.
On SIGTERM or SIGINT, the server calls Abrasio.close() which signals the worker to stop (in cloud mode) before dropping the CDP connection, ensuring proper billing finalization.
Browser agent (browser.py)
AbrasioBrowserAgent wraps Abrasio (the SDK's unified class) and holds a single Page object. All tools delegate to this agent. The asyncio.Lock on ensure_started prevents concurrent initialization if two tools are called in rapid succession before the browser is ready.
All interaction methods use the human/actions.py primitives from the Abrasio SDK directly — no custom mouse or keyboard simulation is implemented in abrasio-mcp.
Requirements
Python 3.10+
mcp >= 1.0.0abrasio >= 0.1.2(installspatchrightautomatically)For cloud mode: an Abrasio API key (
sk_live_...)
License
MIT — Scrape Technology
Available Tools
17 toolsbrowser_clickA
Click an element using a CSS selector. Uses human-like WindMouse movement and realistic click timing. Examples: 'button#submit', '.login-btn', 'a[href="/checkout"]'
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of disclosing behavioral traits. It mentions human-like WindMouse movement and realistic click timing, which are useful for the agent.
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 concise with three sentences front-loading purpose, behavior, and examples. No redundant information.
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 one parameter and an output schema, the description covers purpose, behavior, and examples. It does not explain return values, but the output schema likely addresses that.
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 description provides CSS selector examples, adding meaning beyond the schema's type definition. However, it does not explain selector syntax or valid formats.
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 'Click an element using a CSS selector,' specifying the action and resource. It distinguishes from sibling tools like browser_hover and browser_fill.
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 examples but does not explicitly state when to use this tool over alternatives or exclude inappropriate contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evaluateA
Execute JavaScript in the current page context and return the result. The script should be a JS expression or a function body that returns a value. Examples:
'document.title'
'window.location.href'
'() => document.querySelectorAll("h2").length'
'() => { const el = document.querySelector("#price"); return el ? el.innerText : null; }' Returns the serialized result as JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It discloses that JavaScript is executed in the page context and returns JSON, and provides examples. It does not warn about security risks or limitations (e.g., cross-origin restrictions), but the core behavior is adequately described.
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 very concise: two sentences plus examples. It front-loads the purpose, then explains the parameter format, and ends with output type. Every sentence earns its place without 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?
Given the single parameter and output schema existence, the description is mostly complete. It explains input (script type) and output (JSON). It lacks mention of error handling (e.g., script syntax errors or exceptions), but the output schema likely covers return types.
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 only defines 'script' as a string with no description. The description adds significant value by explaining it must be a JS expression or function body returning a value, and provides clear examples. This fully compensates for the 0% schema description coverage.
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 verb 'Execute JavaScript', the resource 'current page context', and the outcome 'return the result'. It distinguishes itself from sibling tools (e.g., click, navigate) by focusing on arbitrary script execution.
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 does not explicitly state when to use this tool versus alternatives. While the nature of JavaScript execution implies custom logic, no guidance is given on when not to use it (e.g., for simple selection which other tools handle). Implicit understanding is reasonable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fillA
Click a form field and fill it with text using human-like typing. Clears any existing value, then types with realistic delays and occasional typos. selector: CSS selector for the input element. text: the value to type.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | ||
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that it clears existing values, types with realistic delays and occasional typos, but does not mention waiting for element visibility or error handling, which are relevant for a form fill 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 three sentences, front-loading the main action and explaining parameters without wasted words, achieving a high level of conciseness.
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 presence of an output schema, the description doesn't need to explain return values. However, it omits prerequisites like element visibility or error scenarios, which would make it more complete for a complex tool like form filling.
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 0%, so the description adds meaning beyond the schema by explicitly stating that 'selector' is a CSS selector and 'text' is the value to type, providing necessary context for the agent.
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 it clicks a form field and fills it with text using human-like typing, distinguishing it from siblings like browser_type by noting it clears existing values and uses realistic delays and occasional typos.
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 for filling form fields with human-like behavior, but does not explicitly state when not to use it or contrast with alternatives like browser_type, though the context of sibling tools provides some guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_find_elementsA
Find all interactive elements on the page (links, buttons, inputs, etc.). Returns a JSON list with each element's tag, text, type, href, selector hint, center coordinates (x, y), and whether it's visible in the viewport. Use this to discover what you can click or fill before interacting.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 mentions returning data and checking visibility, but does not explicitly state that the tool is read-only and has no side effects. This leaves some ambiguity for the agent.
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 two concise sentences, front-loaded with the core action. Every word adds value without 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 no-parameter tool, the description covers purpose, output format, and usage hint. However, it could more precisely define what counts as 'interactive elements' (e.g., buttons, links, inputs) and note any limitations (e.g., only visible elements).
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 baseline is 4. The description does not need to add parameter information, and it correctly clarifies the output format beyond the input 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 finds all interactive elements on the page and lists what it returns. It distinguishes from sibling tools like browser_click and browser_fill.
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 explicitly tells when to use it: 'Use this to discover what you can click or fill before interacting.' This provides clear context, though it doesn't mention when not to use it or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_htmlA
Get the inner HTML of an element. Defaults to the full page body. Use a CSS selector to target a specific element (e.g. '#main', '.content').
| Name | Required | Description | Default |
|---|---|---|---|
| selector | No | body |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. Describes read operation but does not disclose error handling or behavior when element not found.
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 with no extraneous information. Front-loaded with 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?
Adequate for a simple getter with output schema available. Lacks mention of return format or error cases, but overall sufficient.
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?
Single parameter 'selector' has no schema description. Description adds usage examples ('#main', '.content') and clarifies default, compensating for schema coverage.
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 verb 'Get', resource 'inner HTML', and defaults to full page body. Distinguishes from siblings like browser_get_text and browser_get_url.
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 example CSS selectors and notes default behavior. Lacks explicit when-not-to-use or alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_textA
Extract all visible text from the current page body. Useful for reading content, prices, articles, or any text-based information.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. States 'visible text', implying non-hidden content, but lacks details on character limits, formatting, or behavior with dynamic content.
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 core action. Every phrase adds value 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?
Adequate for a simple read tool with an output schema (not shown). Covers purpose and typical use, though no error handling or restrictions mentioned.
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?
No parameters; schema is fully described (100% coverage). Description adds no param info, but baseline is 4 for zero 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?
Clearly states 'Extract all visible text from the current page body', providing a specific verb and resource. Distinguishes well from siblings like browser_get_html (HTML source) and browser_screenshot (image).
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?
Includes use cases like reading content, prices, articles. Does not explicitly state when not to use, but context is sufficient given sibling diversity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_urlA
Return the current page URL.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description accurately reflects a read-only operation with no destructive or side effects. For a simple getter, this is adequate.
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 with no extraneous words. It is perfectly concise and front-loaded.
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 simplicity of the tool (no parameters, no annotations needed, output schema exists), the description is complete and sufficient for correct usage.
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 no parameters, so the baseline score of 4 is applied. The description adds no parameter-specific information, which is unnecessary.
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 'Return the current page URL' uses a specific verb ('Return') and resource ('current page URL'), clearly distinguishing it from sibling tools like 'browser_get_html' or 'browser_get_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?
The description implicitly states when to use this tool (to get the current URL). No explicit exclusions or alternatives are given, but for a simple getter, the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_go_backA
Go back to the previous page in browser history.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It lacks important details such as behavior when there is no previous page, effects on scroll position, or error handling.
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?
Single, front-loaded sentence with zero waste. 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 an output schema, description is adequate but lacks edge case behavior (e.g., empty history). Could be more complete.
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?
No parameters exist, and schema coverage is 100% (vacuous). Description adds no parameter info, but none is needed.
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?
Description clearly states the verb 'Go back' and the resource 'previous page in browser history'. It effectively distinguishes from siblings like browser_go_forward and browser_navigate.
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 explicit guidance on when to use this tool versus alternatives like browser_go_forward or browser_navigate. Usage is implied but not clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_go_forwardA
Go forward to the next page in browser history.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It states the basic action but does not cover edge cases such as what happens if there is no forward history (e.g., does nothing or errors), nor does it mention any side effects. For a zero-parameter tool, this is minimally sufficient but lacks depth.
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 succinct sentence of 8 words, front-loading the action and resource. Every word contributes meaning, and no unnecessary information is present.
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 (no parameters, output schema exists), the description adequately conveys the core function. However, it could be more complete by mentioning that the operation requires a browser context and that nothing happens if there is no forward history. Still, it is largely sufficient.
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 no parameters, and the input schema is empty with 100% coverage. The description does not need to add parameter detail. Baseline for zero parameters is 4, and the description meets that.
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: 'Go forward to the next page in browser history.' It uses a specific verb ('go forward') and resource ('browser history'), and the distinction from the sibling tool 'browser_go_back' is evident from the name and description.
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 use when wanting to navigate forward, but it does not explicitly specify when to use this tool versus alternatives like 'browser_go_back' or conditions when it should not be used (e.g., when no forward history exists).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hoverA
Move the mouse over an element using human-like WindMouse movement. Useful for triggering dropdown menus or tooltips before clicking. selector: CSS selector for the target element.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses human-like WindMouse movement, adding behavioral context beyond the schema. However, it does not mention potential side effects, prerequisites (e.g., element visibility), or return behavior.
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 concise, using three short sentences. It front-loads the action and includes the parameter explanation efficiently without wasted words.
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 a single parameter, no annotations, and an existing output schema, the description covers purpose, usage context, and parameter semantics adequately. It could be slightly more complete with error or timing details, but it is sufficient.
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 description explicitly explains the only parameter 'selector' as a CSS selector for the target element, providing meaning absent from the schema (0% coverage).
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 it moves the mouse over an element using human-like movement, and distinguishes from siblings like browser_click by specifying its purpose (hovering).
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 mentions it is useful for triggering dropdowns or tooltips before clicking, giving a specific use case, but does not explicitly state when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_pressA
Press a keyboard key or key combination. Examples: 'Enter', 'Tab', 'Escape', 'ArrowDown', 'Control+a', 'Meta+Return'.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behaviors such as whether the browser must be focused, if key combinations work globally, or if there are side effects. It only gives examples, omitting details like handling of modifiers or system-level key press limitations.
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 extremely concise with two sentences and a list of examples. Every word is useful, and the structure is clear.
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 a single parameter and an output schema (not shown), the description is largely sufficient for the tool's simplicity. It could mention that it simulates a keyboard press in the active browser context, but the examples cover usage 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?
Although schema coverage is 0%, the description provides concrete examples for the 'key' parameter (e.g., 'Enter', 'Control+a'), adding meaning beyond a plain string type. This helps the agent understand valid formats, though more comprehensive documentation would be needed.
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 'Press a keyboard key or key combination' and provides specific examples like 'Enter', 'Tab', 'Control+a'. It effectively distinguishes from sibling tools such as browser_click (mouse) and browser_type (text input).
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 like browser_type or browser_fill. Sibling tools exist for keyboard actions, but the description does not specify contexts where press is appropriate (e.g., pressing Tab to navigate) or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_reloadB
Reload the current page.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits like page state changes or wait behavior, but it only repeats the tool name without adding 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 extremely concise (4 words) and front-loaded, with zero wasted words.
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?
Despite having no parameters, the tool lacks an output schema and annotations; the description fails to specify whether reload waits for completion or returns a result, leaving 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?
There are no parameters, so per the rule baseline 4 is appropriate; the description adds no parameter info, but none is needed.
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 'Reload the current page' uses a specific verb (reload) and resource (current page), clearly distinguishing it from siblings like browser_navigate or browser_go_back.
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 any context for when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screenshotA
Take a screenshot of the current page. Returns a PNG image. Use this to visually understand the current state of the browser before deciding what to interact with.
| 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. It correctly states the output (PNG image) but does not mention viewport boundaries, potential scroll behavior, or any side effects. For a read-only capture tool, this is adequate but not detailed.
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: the first states the action and output, the second provides usage context. Every word contributes value 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?
Given no parameters, no output schema, and no annotations, the description covers the essential aspects: purpose, output format, and usage context. It could mention that it captures the visible viewport, but overall it is complete for its simplicity.
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 schema coverage is 100%. According to guidelines, baseline is 4 when no parameters exist. The description adds no parameter info (none needed), so the score 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 action ('Take a screenshot'), the resource ('current page'), and the output ('Returns a PNG image'). It distinguishes from siblings by emphasizing visual understanding of browser state, which is unique among browser 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 explicitly advises using the tool 'to visually understand the current state of the browser before deciding what to interact with,' providing clear context for when to employ it. While it doesn't specify when not to use it, the purpose is well-defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_scrollA
Scroll the page vertically with human-like easing. pixels: positive = scroll down, negative = scroll up (default: 800).
| Name | Required | Description | Default |
|---|---|---|---|
| pixels | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes human-like easing and pixel sign/direction. Adds behavioral context beyond the bare schema, especially with no annotations provided.
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 lines: first sentence states behavior, second explains parameter. No filler, front-loaded key info.
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 one parameter and no required params, the description covers everything needed: what it does, how to use the parameter, and behavioral traits.
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 description fully explains the pixel parameter: positive scrolls down, negative scrolls up, with a default of 800. This compensates for 0% schema description coverage.
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 scrolls the page vertically with human-like easing, distinguishing it from sibling tools like browser_click, browser_navigate, etc.
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?
Usage is clear: it scrolls vertically with pixel parameter. No explicit when-not or alternatives, but context implies it's the only scrolling tool among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeA
Type text at the current cursor position (no element targeting). Use this after clicking an input to type into it, or to send keyboard input to the focused element. Uses human-like timing and occasional typos.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It adds useful traits: 'Uses human-like timing and occasional typos' and 'no element targeting'. However, it does not disclose potential failure modes (e.g., if no element is focused) or detailed side effects.
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?
Extremely concise: two sentences with no redundancy. The first sentence front-loads the core purpose, and every word adds value.
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 one parameter and an output schema (not detailed here), the description is largely complete. It covers purpose, usage context, and a behavioral trait. Minor gap: no mention of what happens if no element is focused.
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 0%, so the description must compensate for the single 'text' parameter. The description implies text is the string to type, but adds no format, length, or encoding constraints 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 'Type text at the current cursor position (no element targeting)', using a specific verb and resource. It effectively distinguishes the tool from siblings like browser_fill (which targets an element) and browser_press (key presses).
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 clear context: 'Use this after clicking an input to type into it, or to send keyboard input to the focused element.' This gives appropriate usage guidance, but does not explicitly contrast with alternatives like browser_fill or browser_press, which would enhance differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_wait_forA
Wait for an element matching the CSS selector to appear in the DOM. Useful after triggering an action that causes a loading state. timeout: max milliseconds to wait (default 10000). Returns the element's text content when found.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | ||
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses waiting behavior, timeout default, and return of text content. However, it does not specify behavior on timeout (e.g., throws error vs. returns null) or if the element must be visible (vs. just in DOM).
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?
Three sentences covering purpose, usage tip, and parameter details. Front-loaded with the main action, no unnecessary words. Could be slightly improved by structuring parameter info more clearly.
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 2-parameter tool with no annotations but an output schema, the description covers the core functionality and return value. However, it lacks details on error states, visibility checks, and interaction with other browser tools, which could be helpful given the sibling 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 coverage is 0%, so description must compensate. It explains 'timeout' as max milliseconds and default 10000, and implies 'selector' is a CSS selector. However, it adds limited detail beyond parameter names, leaving some ambiguity (e.g., no mention of format for selector).
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 action ('wait for') and the resource ('element matching the CSS selector to appear'). It distinguishes from sibling tools like browser_find_elements by focusing on waiting for appearance, which is a unique 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?
Explicitly states when to use: 'Useful after triggering an action that causes a loading state.' This provides clear context, though no direct exclusions or alternative tools are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: navigation, clicking, typing, scrolling, etc. No two tools overlap in function.
All tools follow a consistent 'browser_' prefix with snake_case verbs, making the naming predictable and easy to understand.
17 tools cover the full range of browser automation actions without being excessive. Each tool serves a necessary purpose.
Core browser interactions are well-covered (navigation, click, type, scroll, screenshot, etc.). Minor gaps exist for file uploads and dialog handling, but the set is largely complete.
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
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A paid remote MCP for AI agent browser approval MCP, built to return verdicts, receipts, usage logs,
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Scrape, crawl and search the web for AI agents via MCP.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server + Chrome extension that gives AI coding agents control of your real browser with existing sessions, logins, and cookies. Works with Cursor, Claude, Windsurf.1810449MIT
- AlicenseBqualityCmaintenanceBrowser MCP server that connects to your existing browser, preserving sessions, passwords, and extensions, enabling AI agents to interact with web pages without bot detection.31121MIT

agentify-desktopofficial
AlicenseNot gradedqualityBmaintenanceMCP server that enables AI tools to control local browser sessions for ChatGPT, Claude, and other AI services, supporting querying, navigation, file uploads, and artifact management.44546Mozilla Public 2.0- AlicenseAqualityBmaintenanceMCP server for browser automation with anti-detection. Scout pages, find elements, interact with websites, and monitor network traffic from any AI client that supports the Model Context Protocol.211MIT
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/Scrape-Technology/abrasio-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server