Skip to main content
Glama
Santhosh-p653

Scrapling MCP Server

Scrapling MCP Server on AWS Lightsail

A high-performance web extraction MCP server that turns live web content into LLM-ready Markdown — deploy once, then plug it into your AI IDEs, agents, RAG pipelines, and automation workflows.

AWS MCP Python Docker Scrapling M8ven Score

Overview

Modern AI applications increasingly need access to fresh, structured, external knowledge. Instead of implementing web scraping separately inside every RAG system or AI agent, this project exposes Scrapling's web extraction capabilities through the Model Context Protocol (MCP).

Once deployed, any MCP-compatible AI client can connect to the server and use it as a reusable web data-ingestion component.

┌──────────────────────┐
│   AI IDE / AI Agent   │
│ Claude / MCP Client   │
└──────────┬────────────┘
           │ MCP
           ▼
┌──────────────────────┐
│   Scrapling MCP       │
│      Server           │
└──────────┬────────────┘
           ▼
┌──────────────────────┐
│        Web            │
│  Dynamic / Static      │
│     Content            │
└──────────┬────────────┘
           ▼
┌──────────────────────┐
│      Markdown          │
│   LLM-ready Data       │
└──────────┬────────────┘
           ▼
┌─────────────────────────────────┐
│ RAG / Embeddings / Vector DB /   │
│ Knowledge Base / Agent Memory    │
└─────────────────────────────────┘

Related MCP server: read-website-fast

Why MCP for Web Extraction?

Traditionally, every AI application that needs web data implements its own:

  • HTTP requests

  • HTML parsing

  • Browser automation

  • Dynamic page handling

  • Extraction logic

  • Retry mechanisms

  • Content normalization

This creates duplicated infrastructure. With MCP, web extraction becomes a shared capability.

Before — multiple implementations:

RAG App        ──────► Scraper
Agent          ──────► Scraper
Research Tool  ──────► Scraper
AI IDE         ──────► Scraper

After — one capability, multiple clients:

RAG App    ──┐
Agent      ──┼──► Scrapling MCP Server
AI IDE     ──┤
Research   ──┘

Deploy the server once and reuse it across MCP-compatible workflows.

Not Just a Web Scraper

The core idea behind this project is broader than scraping. For many LLM applications, external information eventually needs to become a representation that can be parsed, cleaned, structured, chunked, embedded, indexed, and retrieved.

Markdown is particularly useful in this pipeline because it preserves useful document hierarchy:

Web Page → Scrapling → Markdown
                          ├── Heading
                          ├── Subheading
                          ├── Paragraph
                          ├── List
                          ├── Table
                          └── Links
                          │
                          ▼
                      Chunking → Embeddings → Vector Database → RAG / Agent

This makes the MCP server useful as an LLM data insertion/ingestion layer, rather than only a scraping utility.

Features

  • MCP-compatible web extraction

  • Powered by Scrapling

  • Designed for AI agents and AI IDEs

  • Markdown-oriented output

  • Suitable for RAG ingestion pipelines

  • Containerized with Docker

  • Deployable on AWS Lightsail

  • Reusable across multiple AI applications

  • Separates data acquisition from the AI application itself

  • Can be integrated into agentic workflows

Architecture

                    Internet
                       │
                       ▼
                ┌───────────────┐
                │      Web       │
                └───────┬───────┘
                        ▼
              ┌───────────────────┐
              │     Scrapling      │
              │  Extraction Layer  │
              └─────────┬─────────┘
                        ▼
              ┌───────────────────┐
              │    MCP Server      │
              │   Tool Interface   │
              └─────────┬─────────┘
                        │
                   MCP Protocol
                        │
          ┌─────────────┼─────────────┐
          ▼             ▼             ▼
       AI IDE         Agent          RAG
          │             │             │
          └─────────────┼─────────────┘
                        ▼
                Markdown / Data
                        ▼
              ┌────────────────────┐
              │ LLM Data Pipeline   │
              └──────────┬─────────┘
                        ▼
              ┌────────────────────┐
              │  Embeddings / DB    │
              └──────────┬─────────┘
                        ▼
                     LLM / RAG

Technology Stack

Component

Technology

Web Extraction

Scrapling

Protocol

Model Context Protocol (MCP)

Language

Python

Containerization

Docker

Cloud

AWS Lightsail

CI/CD

GitHub Actions

Output

Markdown / Structured Content

AI Integration

MCP-compatible clients

Project Structure

.
├── src/
│   └── ...
├── Dockerfile
├── requirements.txt
├── .dockerignore
├── .gitignore
├── docker-compose.yml
└── README.md

Adjust the structure above if your repository uses a different source layout.

Running Locally

1. Clone the repository

git clone https://github.com/Santhosh-p653/aws-mcp-test.git
cd aws-mcp-test

2. Install dependencies

Create and activate a virtual environment:

python -m venv .venv

# Linux / macOS
source .venv/bin/activate

# Windows
.venv\Scripts\activate

Install dependencies:

pip install -r requirements.txt

Run with Docker

Build the image:

docker build -t scrapling-mcp .

Run the container:

docker run -d \
  --name scrapling-mcp \
  -p 8000:8000 \
  scrapling-mcp

Verify that the container is running:

docker ps

Deploy to AWS Lightsail

The project is designed to run as a containerized service on AWS Lightsail.

High-level deployment flow:

GitHub → Push → GitHub Actions → Build → Docker Image → Deploy → AWS Lightsail
                                                                      │
                                                                      ▼
                                                          Scrapling MCP Server
                                                                      │
                                                                      ▼
                                                      MCP-Compatible AI Clients

Deployment Steps

  1. Create an AWS Lightsail container service — from the AWS Console or AWS CLI.

  2. Build the Docker image

    docker build -t scrapling-mcp .
  3. Push/deploy the container — configure the Lightsail container deployment using the image produced by your CI/CD workflow.

  4. Configure environment variables — keep credentials and deployment configuration outside the repository:

    AWS_REGION=
    LIGHTSAIL_SERVICE=
    CONTAINER_NAME=

⚠️ Never commit secrets or credentials to Git.

GitHub Actions

The repository can use GitHub Actions to automate deployment:

git push → GitHub Actions
             ├── Checkout
             ├── Configure AWS credentials
             ├── Build container
             ├── Push/deploy
             └── Update Lightsail

Deployment then follows a simple workflow:

git add .
git commit -m "update scraper"
git push origin main

After the workflow completes, the updated MCP server is deployed.

Using the MCP Server

Once the server is deployed, connect its MCP endpoint to an MCP-compatible AI client:

AI Client → MCP → https://your-mcp-server.example.com → Scrapling → Web Content

The AI client can then invoke the exposed tools as part of its workflow — the server behaves like a plugin for AI applications, replacing custom scraping code inside every project:

AI Application
      ├── RAG
      ├── Agents
      ├── Research
      └── Automation
             │
             ▼
        MCP Server → Scrapling

RAG Integration

A typical RAG pipeline can use this server as the ingestion layer:

Web Sources → Scrapling MCP → Markdown → Document Parser → Chunking
    → Embeddings → Vector Store → Retriever → LLM

Possible downstream components include:

  • Qdrant

  • PostgreSQL + pgvector

  • Elasticsearch

  • OpenSearch

  • Chroma

  • FAISS

  • Custom knowledge stores

The MCP server remains independent of the downstream storage layer.

Agentic Workflow

The server can also become a tool available to an AI agent:

User → AI Agent
         ├── Decide what information is required
         ├── Call Scrapling MCP
         ├── Extract relevant content
         ├── Transform/use Markdown
         ├── Store information
         └── Generate final response

This allows the agent to dynamically acquire information instead of relying only on static training data or previously indexed documents.

Why Markdown?

Markdown provides a useful intermediate representation for LLM pipelines because it preserves semantic structure.

Markdown:

# AWS Lambda

## Overview
AWS Lambda is a serverless compute service.

## Features
- Event-driven execution
- Automatic scaling
- Pay-per-use pricing

## Architecture
### Invocation
Lambda functions can be invoked through multiple AWS services.

Compared with raw HTML:

<div>
    <h1>AWS Lambda</h1>
    <div>
        <h2>Overview</h2>
        ...
    </div>
</div>

Markdown is generally easier to inspect, clean, chunk, process, store, and pass to LLM pipelines.

The goal, therefore, is not simply to "scrape a webpage" — it is to acquire external knowledge in a form that can naturally enter an LLM data pipeline.

Use Cases

Use Case

Description

RAG Systems

Automatically acquire fresh web information before indexing it.

AI Research Agents

Allow agents to retrieve and analyze information from live websites.

Knowledge Bases

Build continuously updated knowledge repositories.

AI IDEs

Give coding assistants an external web extraction capability through MCP.

Documentation Ingestion

Convert online documentation into Markdown suitable for downstream processing.

Agentic Automation

Use web extraction as one tool among many in an autonomous workflow.

Performance-Oriented Design

The architecture separates the web acquisition layer from the AI application.

Instead of every AI application maintaining a custom scraper, the approach becomes:

                ┌───────────────┐
                │ Scrapling MCP  │
                └───────┬───────┘
                        │
          ┌─────────────┼─────────────┐
          ▼             ▼             ▼
        RAG          Agent          AI IDE

This allows scraping infrastructure to be deployed once and reused across multiple workflows.

Security Considerations

When deploying the server publicly:

  • Do not expose AWS credentials in the container

  • Use HTTPS in production

  • Restrict network access where appropriate

  • Validate requested URLs

  • Apply rate limits where required

  • Monitor resource consumption

  • Avoid scraping websites in violation of their terms or applicable laws

  • Keep secrets in environment variables or a dedicated secrets manager

Production Recommendations

For a production deployment, consider adding:

  • Authentication

  • API/MCP access control

  • HTTPS

  • Rate limiting

  • Request logging

  • Observability

  • Retry policies

  • Caching

  • URL allowlists

  • Resource limits

  • Health checks

  • Monitoring and alerting

Future Improvements

  • Authentication for MCP clients

  • URL/domain allowlisting

  • Content caching

  • Distributed crawling

  • Queue-based ingestion

  • Automatic document chunking

  • Direct vector database integration

  • S3-based document storage

  • Crawl scheduling

  • Observability dashboard

  • Multi-user access control

Example End-to-End Workflow

User / Agent → MCP-Compatible IDE → Scrapling MCP Server → Website
    → Markdown → Document Processing → Chunking → Embeddings
    → Vector DB → Retriever → LLM → Final Response

Repository

GitHub: github.com/Santhosh-p653/aws-mcp-test

Technical Article

The architecture, deployment, and motivation behind this project is documented on AWS Builder Center:

Supercharging Agentic AI with Fast Web Scraping using Scrapling, MCP, and AWS Lightsail

Contributing

Contributions, ideas, improvements, and experiments are welcome. If you build something using this MCP server, feel free to open an issue or pull request and share the workflow.

Author

Santhosh P

Building systems around:

  • AI Agents

  • RAG

  • MCP

  • Cloud Infrastructure

  • Web Data Pipelines

  • AI/ML

GitHub: @Santhosh-p653


Key Idea: Deploy the scraping capability once. Plug it into your AI workflows whenever you need fresh, structured web data.

Scrapling + MCP turns web extraction into a reusable infrastructure component for the modern LLM stack.

Available Tools

16 tools
browser_actionsBrowser actionsA
Destructive

Run mouse, field, key, dialog, and wait actions in order; return plain text without a snapshot. Stop on the first error, identifying its action; partial effects remain. No retries. Element mouse targets auto-wait and scroll into view; coordinates and wheel do not wait for navigation or scrolling. Cancelled/timed-out clicks attempt button release. Load waits observe the current document, not future navigation.

NameRequiredDescriptionDefault
slowlyNoFresh random delays: 50-150 ms per character, 100-300 ms between all actions, including waits.
actionsYesOrdered actions; fields need target; mouse needs target or viewport (x, y).
session_idYesID from `browser_open`; call `browser_fetch` first.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavior beyond annotations: ordered execution, stop-on-first-error with action identification, partial effects remaining, no retries, auto-wait/scroll behavior for element targets, coordinate/wheel non-waiting behavior, button release on cancelled/timed-out clicks, and load-wait scope. These details are consistent with destructiveHint=true and give the agent a precise operational picture.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and return behavior, then adds operational constraints in compact sentences. Every sentence carries useful information, with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, destructive, open-world tool, the description covers execution order, error behavior, partial effects, retry policy, waiting semantics, and return format. The schema supplies parameter details and session prerequisites, so the description is complete enough for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents parameters thoroughly. The description still adds actionable semantics by clarifying that element mouse targets auto-wait and scroll into view while coordinate and wheel actions do not wait, and that load waits observe the current document rather than future navigation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: run ordered browser actions covering mouse, field, key, dialog, and wait categories. It also distinguishes the output profile by returning plain text without a snapshot, making the tool's role clear relative to screenshot/extract/fetch siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through its list of interactive action types, but it does not explicitly say when to choose this tool over browser_evaluate, browser_extract, browser_fetch, or other siblings. There are no named alternatives or exclusions, so routing is left partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_evaluateRun JavaScriptA
Destructive

Run JavaScript on the current page, await promises, and return JSON text without a snapshot. Return JSON-compatible values; null/undefined become null. Script effects are not undone on failure. Cancellation stops waiting, but may not stop the script.

NameRequiredDescriptionDefault
argNoJSON object passed to the function; use properties for scalar or array values.
expressionYesJavaScript expression or function to invoke.
session_idYesID from `browser_open`; call `browser_fetch` first.
isolated_contextNoFalse accesses the page's own JS variables; True uses a separate context with the same DOM.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, but the description adds two pieces of genuine context the agent could not infer: script effects are not undone on failure, and cancellation may not stop the script. That is exactly the operational caveat a caller needs before invoking an irreversible page mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action, then return-value normalization, then two failure caveats. No filler; the only mild cost is that 'without a snapshot' is left unexpanded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by explaining the return shape (JSON text, null/undefined coerced to null). Combined with the failure and cancellation caveats, the agent has enough to invoke it safely; only error-signaling specifics are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter (including isolated_context and arg) is already documented in the schema; the description adds no parameter-level guidance such as when to disable isolated_context or how expression vs arg interact. Baseline 3 applies when the schema carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Run JavaScript on the current page') plus scope details: awaits promises and returns JSON text without a snapshot, which implicitly distinguishes it from browser_screenshot and browser_extract. It never names a sibling, so differentiation is inferential rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'without a snapshot' hints that this is the no-screenshot path, but there is no explicit statement of when to choose browser_evaluate over browser_extract, browser_actions, or browser_fetch, nor any prerequisite sequencing beyond the session_id note in the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_extractExtract page contentA
Read-only

Read the current page or one element as snapshot, HTML, Markdown, or text without navigating. Return plain text; snapshot search keeps refs, ancestor paths and three lines of nearby context.

NameRequiredDescriptionDefault
boxesNoInclude viewport bounding boxes in snapshots; ignored for other formats.
depthNoSnapshot depth before search; unlimited if omitted. Ignored for other formats.
searchNoSnapshot-only Python regex; case-sensitive unless (?i). No matches returns empty text.
targetNoPlaywright selector or aria-ref=<ref> matching one element; omitted reads the page.
session_idYesID from `browser_open`; call `browser_fetch` first.
extraction_typeNoOutput format; defaults to an AI ARIA snapshot.snapshot
main_content_onlyNoClean body/target content for AI; ignored for snapshots.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld annotations, the description discloses that extraction does not navigate and that snapshot search preserves refs, ancestor paths, and nearby context. It does not cover error behavior or permission requirements, but it adds useful behavioral detail for a read-only extraction tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tightly written sentences with no filler. It front-loads the action and scope, then adds the most relevant output behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the fully described schema and read-only/openWorld annotations, the description is largely complete: it covers formats, non-navigation, and snapshot search context. It does not fully explain return shapes for every format, which is a minor gap because no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all seven parameters are already documented in the schema. The description adds some useful context about snapshot search output, but it does not add parameter-level meaning beyond what the schema already provides for target, depth, boxes, session_id, and main_content_only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: read the current page or one element as snapshot, HTML, Markdown, or text. The phrase 'without navigating' directly distinguishes it from navigation/fetch siblings, so an agent can identify its role without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context by specifying reading the current page or a single element without navigating. It does not explicitly name alternatives such as browser_fetch or browser_evaluate, so it stops short of full when/when-not routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_fetchFetch in browser sessionB
Read-only

Fetch a URL in an open stealthy browser session. Options apply only to this request.

NameRequiredDescriptionDefault
urlYesURL to fetch.
waitNoExtra milliseconds after the page is ready, before returning.
timeoutNoNavigation and page-operation timeout in milliseconds.
load_domNoWait for DOMContentLoaded.
session_idYesID from `browser_open`.
css_selectorNoSelect after `main_content_only` filtering; snapshots require exactly one match.
network_idleNoTry to wait for 500 ms without network activity; continue if the wait fails.
extra_headersNoAdditional request headers.
google_searchNoSet a Google referer, overriding any supplied referer.
pierce_shadowNoInclude open Shadow DOM content; ignored for snapshots.
wait_selectorNoWait for the first CSS match; continue if the wait fails.
blocked_domainsNoBlock requests to these domains and their subdomains.
extraction_typeNoContent output format; snapshots include element bounding boxes.markdown
solve_cloudflareNoAttempt to solve Cloudflare Turnstile/interstitial challenges.
disable_resourcesNoBlock font, image, media, beacon, object, imageset, texttrack, websocket, csp_report, and stylesheet requests.
main_content_onlyNoSanitize <body> before selection; False uses the full document. Ignored for snapshots.
wait_selector_stateNoTarget state of `wait_selector`.attached

Output Schema

NameRequiredDescription
urlYesThe URL given by the user that resulted in this response.
statusYesThe status code returned by the website.
contentYesThe page content as Markdown, HTML, text, or an AI ARIA snapshot.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and network reach are covered structurally. The description adds two useful traits — the session is "stealthy" and options do not persist across calls — but says nothing about failure behavior for the 17 options (timeout, cloudflare solving, blocked domains) or what happens when the session is stale.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and with zero filler. The brevity is efficient; the only cost is that the second sentence is doing very little work for a tool with 17 parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return values and annotations cover read-only/open-world, so those burdens are lifted. Still, for a 17-parameter tool with 2 required fields, the description should state the session-lifecycle constraint and the distinction from browser_fetch_once; "options apply only to this request" only partly covers that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including wait, network_idle, pierce_shadow and extraction_type is already documented. The description adds no parameter meaning beyond "options apply only to this request", so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Fetch a URL") and scopes it to an existing browser session, which separates it from browser_open. However it never names browser_fetch_once or browser_extract, so the sibling with the near-identical name is not disambiguated from the text alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"In an open stealthy browser session" implies a prerequisite (session_id from browser_open, as the schema notes) and "Options apply only to this request" hints at per-call vs persistent state. There is no explicit when-to-use/when-not guidance against browser_fetch_once, browser_extract, or make_request.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_fetch_onceFetch page in browserB
Read-only

Fetch a page with a stealth browser and JavaScript rendering.

NameRequiredDescriptionDefault
urlYesURL to fetch.
waitNoExtra milliseconds after the page is ready, before returning.
proxyNoProxy URL, or dictionary with server and optional username/password.
localeNoBrowser language, Accept-Language, and formatting locale; system default if omitted.
cdp_urlNoConnect to an existing Chromium browser over CDP in a new context; launch settings do not apply.
cookiesNoInitial cookies as Playwright cookie dictionaries.
timeoutNoNavigation and page-operation timeout in milliseconds.
headlessNoHide the browser window.
useragentNoUser-Agent override; otherwise generated in headless mode, native in headful mode.
allow_webglNoEnable WebGL; disabling it can trigger bot detection.
hide_canvasNoAdd noise to canvas operations.
real_chromeNoUse locally installed Chrome.
timezone_idNoBrowser timezone; uses the system timezone if omitted.
block_webrtcNoDisable non-proxied WebRTC UDP to reduce IP leaks.
css_selectorNoSelect matching elements after `main_content_only` filtering.
network_idleNoTry to wait for 500 ms without network activity; continue if the wait fails.
extra_headersNoAdditional request headers.
google_searchNoSet a Google referer, overriding any supplied referer.
pierce_shadowNoInclude open Shadow DOM content.
wait_selectorNoWait for the first CSS match; continue if the wait fails.
additional_argsNoBrowser context options that override Scrapling settings.
executable_pathNoAbsolute Chromium-compatible executable path; overrides the server default.
extraction_typeNoContent output format.markdown
solve_cloudflareNoAttempt to solve Cloudflare Turnstile/interstitial challenges before returning.
disable_resourcesNoBlock font, image, media, beacon, object, imageset, texttrack, websocket, csp_report, and stylesheet requests.
main_content_onlyNoSanitize <body> content before selection; False uses the full document.
wait_selector_stateNoTarget state of `wait_selector`.attached

Output Schema

NameRequiredDescription
urlYesThe URL given by the user that resulted in this response.
statusYesThe status code returned by the website.
contentYesThe page content as Markdown, HTML, text, or an AI ARIA snapshot.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and open-world nature are covered. The description adds genuinely useful context by naming stealth and JS rendering, but omits the tradeoffs an agent cares about here — whether a session persists, what gets destroyed, and why one would choose this over browser_fetch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is efficient, though the leanness borders on under-specification given the tool's 27-parameter complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema and rich annotations reduce what the description must carry, but with 27 parameters and 16 sibling browser/session tools, the description should at least clarify one-shot versus session semantics. It leaves that ambiguity unresolved.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across 27 parameters, so the schema carries the full burden of explaining url, wait, timeout, extraction_type, cookies, and stealth flags. The description adds nothing beyond what the schema documents, which is the expected baseline when coverage is this high.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (fetch a page) plus the distinguishing mechanism (stealth browser, JavaScript rendering). However, it never contrasts with sibling tools like browser_fetch, browser_open, or make_request, so an agent must infer where it fits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no exclusions, and no mention of alternatives. The 'once' in the name implies one-shot versus session-based fetching, but the description never confirms or explains this relative to browser_open or open_request_session.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_load_stateLoad browser stateA
Destructive

Replace browser cookies, local storage and IndexedDB from a Playwright-compatible JSON file.

Leaves sessionStorage and open tabs unchanged. Fetch or reload pages to use the restored login.

NameRequiredDescriptionDefault
pathYesFile on the MCP server host; relative to its working directory.
session_idYesID from `browser_open`; no page fetch required.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag destructiveHint=true; the description adds the crucial scope of that destruction (which stores are overwritten), a non-obvious carve-out (sessionStorage and open tabs untouched), and the follow-up needed for the restoration to take effect. That is exactly the kind of detail structured fields cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The primary effect is front-loaded and the caveats/follow-up immediately follow it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation tool with rich annotations and no output schema, the description covers what changes, what doesn't, and what the agent must do next. What remains unstated is behavior on error or a missing/invalid state file, which is a modest gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with path and session_id fully documented in the schema. The description contributes only one extra semantic detail, the file being Playwright-compatible, which is minor additional meaning; the schema does the heavy lifting as expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Replace') plus the exact resources affected (cookies, local storage, IndexedDB) and the source format (Playwright-compatible JSON file). This is clearly the inverse of browser_save_state, so an agent can distinguish the pair from the text alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Fetch or reload pages to use the restored login' tells the agent what must happen after the call, and 'Leaves sessionStorage and open tabs unchanged' defines the boundaries of what this call restores. It stops short of explicitly naming browser_save_state as the counterpart or stating when not to use this, so it falls just short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_network_requestRead network requestA
Read-only

Read a complete saved request part without resending it, with structured data and availability notes.

NameRequiredDescriptionDefault
partNoRequest summary, headers, or text body; incomplete headers are marked.summary
request_idYesID from `browser_network_requests`.
session_idYesBrowser session ID.

Output Schema

NameRequiredDescription
dataNo
noteNo
partYes
request_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that retrieval does not resend the request and that 'availability notes' accompany the data, which is modest but real context beyond the annotations; it does not explain failure behavior when a part was not captured.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the non-resend guarantee appears early. The phrasing 'complete saved request part' is slightly dense but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return structure needn't be explained, and the enum plus request_id provenance cover the parameters. The main residual gap is what happens when a requested part wasn't captured, only loosely covered by 'availability notes'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the 'part' enum is documented including the note that incomplete headers are marked, plus request_id pointing back to browser_network_requests. The description adds nothing about parameters beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read') and resource ('a complete saved request part'), and the phrase 'without resending it' implicitly distinguishes it from the fetch/make_request siblings. It stops short of naming browser_network_requests as the companion list tool, so the differentiation is inferred rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Without resending it' hints that this is the right choice when you already have a captured request and don't want to re-issue traffic, but there is no explicit statement of when to use this versus browser_network_requests or browser_fetch. Usage is implied, not spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_network_requestsList network requestsA
Read-only

List completed requests across page changes, with IDs and pagination. Recording starts when the browser session opens.

NameRequiredDescriptionDefault
limitNoMaximum requests to return.
after_idNoReturn requests with a higher ID; use next_cursor for more.
session_idYesBrowser session ID.
url_patternNoFilter URLs by regular expression.
include_staticNoInclude successful non-API requests too.

Output Schema

NameRequiredDescription
has_moreYes
requestsYes
next_cursorYes
dropped_countYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds a genuinely useful behavioral fact not in any structured field: recording begins when the browser session opens, so requests before that are not captured. It stops short of describing filtering defaults (static assets excluded) or the cursor mechanics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the core scope ('completed requests across page changes') front-loaded before the lifecycle caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and the parameter schema is fully documented, so the return shape and argument semantics need not be restated. The description covers scope and the recording-start caveat; only the static-vs-API default filtering could be surfaced earlier, but the schema handles it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with limit, after_id, url_pattern, and include_static all documented inline, including the next_cursor hand-off. The description only echoes the existence of IDs and pagination, adding no syntax or format detail beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List completed requests') plus scope ('across page changes') and mentions IDs and pagination. It reads clearly enough to separate it from the singular browser_network_request, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: 'across page changes' hints this is the paged-list counterpart to fetching a single request, but there is no explicit when-to-use or when-not-to-use guidance, and no mention of browser_network_request or the fetch tools as alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_openOpen browserA

Open a reusable stealthy browser session. Pass per-request options to browser_fetch.

NameRequiredDescriptionDefault
proxyNoProxy URL, or dictionary with server and optional username/password.
localeNoBrowser language, Accept-Language, and formatting locale; system default if omitted.
cdp_urlNoConnect to an existing Chromium browser over CDP in a new context; launch settings do not apply.
cookiesNoInitial cookies as Playwright cookie dictionaries.
headlessNoHide the browser window.
useragentNoUser-Agent override; otherwise generated in headless mode, native in headful mode.
session_idNoCustom ID; a random 12-character hex ID if omitted.
allow_webglNoEnable WebGL; disabling it can trigger bot detection.
hide_canvasNoAdd noise to canvas operations.
real_chromeNoUse locally installed Chrome.
timezone_idNoBrowser timezone; uses the system timezone if omitted.
block_webrtcNoDisable non-proxied WebRTC UDP to reduce IP leaks.
additional_argsNoBrowser context options that override Scrapling settings.
executable_pathNoAbsolute Chromium-compatible executable path; overrides the server default.

Output Schema

NameRequiredDescription
session_idYesThe unique identifier of the session.
session_typeYesThe type of the session: 'stealthy' or 'static'.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true. The description adds the meaningful traits 'stealthy' and 'reusable', but says nothing about session lifetime, cleanup requirements (close_session), or resource persistence, leaving important behavioral context unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and resource, with zero filler. The downstream-tool hint is placed immediately after the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need not be described. However, for a 14-parameter session opener, the description omits how sessions are reused across calls, whether they must be closed, and what happens if a session_id already exists — leaving the lifecycle under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds one genuinely useful routing signal: per-request options belong on browser_fetch, clarifying the division of labor between session creation and request execution beyond what the schema alone conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — open a reusable stealthy browser session — and names a downstream sibling (browser_fetch). It does not distinguish itself from other session-creating siblings such as open_request_session or browser_fetch_once, so differentiation is incomplete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The line 'Pass per-request options to browser_fetch' implies the session is a container for later fetch calls, but it never says when to choose this over open_request_session or browser_fetch_once. Usage is inferable but not explicitly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_save_stateSave browser stateB
Destructive

Save browser cookies, local storage and IndexedDB as Playwright-compatible JSON. Excludes sessionStorage.

NameRequiredDescriptionDefault
pathYesFile on the MCP server host; relative to its working directory. Overwrites the file; parent must exist.
session_idYesID from `browser_open`; no page fetch required.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false and openWorldHint=true, so safety is covered structurally. The description earns credit for enumerating exactly which storage areas are captured and that sessionStorage is deliberately dropped — a real behavioral constraint beyond the annotations. It does not restate the overwrite behavior, which lives in the path schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the contents and format, with the exclusion clause placed where it reads as a qualifier. No filler whatsoever.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter write tool with full schema coverage and destructive annotations, the description supplies the one thing the schema cannot: what state is and isn't captured. The only minor omission is the round-trip relationship to browser_load_state, which an agent restoring state would want stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the path parameter already documents relative-to-working-directory, overwrite, and parent-must-exist semantics, plus session_id ties back to browser_open. The description adds no parameter-level detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Save) and a precisely enumerated resource (cookies, local storage, IndexedDB) plus the output format (Playwright-compatible JSON). The explicit exclusion of sessionStorage further sharpens scope. It does not, however, name its inverse sibling browser_load_state, so the pairing must be inferred from the shared 'state' naming.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says what is captured but never when to use this instead of alternatives; the obvious pairing with browser_load_state for persist/restore workflows is left unstated. No preconditions (an open session, a writable host path) are mentioned in the description itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_screenshotTake browser session screenshotA
Read-only

Capture the current page or one element without navigating; return the image and current URL. Element capture waits and scrolls into view. Use browser_actions for other waits before capture.

NameRequiredDescriptionDefault
refNoCurrent snapshot element reference; omit both targets for page capture.
qualityNoJPEG quality, 0-100; invalid for PNG.
timeoutNoCapture limit in milliseconds; 0 disables it.
selectorNoPlaywright selector matching one element; omit when using ref.
full_pageNoCapture the full scrollable page; incompatible with selector/ref.
image_typeNoImage format.png
session_idYesID from `browser_open`; call `browser_fetch` first.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description still adds real behavior: no navigation occurs, element capture waits and scrolls into view, and the return includes the image plus the current URL. It omits cost/size implications and timeout behavior, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core action and the 'no navigation' constraint, then the alternative tool. Nothing is redundant, though the second sentence's phrasing is slightly clipped.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by stating what is returned (the image and current URL). Combined with annotations and full schema coverage, an agent has enough to call it correctly; missing pieces like full_page behavior and timeout effects are minor and schema-documented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter (ref, selector, full_page, quality, image_type, timeout) is documented in-schema, so the baseline of 3 applies. The description's only additional signal is that capture targets either the page or 'one element', which is already inferable from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Capture the current page or one element') and adds the key constraint 'without navigating', which separates it from navigation-capable siblings like browser_open/browser_fetch. It does not explicitly contrast with browser_extract or browser_evaluate, so sibling differentiation is partial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

One usage pointer is given ('Use browser_actions for other waits before capture'), which is genuinely useful. However there is no guidance on when to prefer screenshots over browser_extract/browser_evaluate, nor on when not to use it (e.g. session not yet fetched, non-visual data extraction).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_sessionClose sessionB

Close a session and free its resources.

NameRequiredDescriptionDefault
session_idYesSession ID to close.

Output Schema

NameRequiredDescription
messageYesA confirmation message.
session_idYesThe unique identifier of the closed session.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=false, readOnlyHint=false, and openWorldHint=true, so safety framing is covered. The description adds that resources are freed, which hints at resource cleanup, but omits idempotency (what happens on a second close), the effect on in-flight requests, and behavior for an invalid session_id — all material for a lifecycle-mutating call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler. It is efficient, though its brevity reflects under-specification rather than disciplined compression.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. However, for a state-changing session-termination tool with annotations only carrying hint flags, the description should at least cover idempotency and error conditions to be complete; it covers neither.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter exists and the schema documents it at 100% coverage ('Session ID to close.'). The description adds no syntax, format, or origin information for session_id, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Close a session') plus a secondary effect ('free its resources'). It is distinguishable from siblings like open_request_session and list_sessions, but it never names which session types it applies to, so the boundary with browser sessions vs. request sessions is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to close a session versus leaving it to expire, no prerequisites (e.g., that the session_id must come from open_request_session), and no mention of alternatives such as list_sessions for verifying what exists. The agent must infer the entire lifecycle context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sessionsList sessionsB
Read-only

List registered sessions, their status, and effective settings.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that results include status and effective settings, which hints at response content, but says nothing about whether the list is scoped to the current connection or global, or how large it can get.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is efficient, though so terse that the key ambiguity about what a 'session' is here goes unaddressed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and an output schema present, the description needn't explain return values. But given a sibling set dense with both request-session and browser-session tools, the omission of which session domain this lists is a meaningful gap in an otherwise minimal tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies no filtering inputs are needed, matching the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (registered sessions) plus the fields returned (status, effective settings). It does not, however, distinguish this from session-adjacent siblings like open_request_session or close_session, so an agent can't tell from the description alone whether these are request sessions, browser sessions, or both.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus the many sibling session tools, no prerequisites, and no stated outcome for the agent to use in routing decisions. The agent must infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

make_requestSend HTTP requestB
Read-only

Make an HTTP request without JavaScript. Suitable for low-to-mid protection.

NameRequiredDescriptionDefault
urlYesURL to fetch.
authNoBasic auth: {"username": ..., "password": ...}.
dataNoForm or raw body; ignored for GET.
jsonNoJSON body; ignored for GET.
http3NoUse HTTP/3; may conflict with browser impersonation.
proxyNoProxy URL, optionally including credentials.
methodNoHTTP method.GET
paramsNoQuery parameters.
verifyNoVerify TLS certificates.
cookiesNoRequest cookies.
headersNoRequest headers.
retriesNoMaximum attempts, including the first; None or values below 1 send once.
timeoutNoTimeout in seconds.
proxy_authNoProxy basic auth: {"username": ..., "password": ...}.
impersonateNoBrowser/version to impersonate; "chrome" uses the latest supported Chrome profile. Lists pick randomly per attempt; None disables impersonation.chrome
retry_delayNoSeconds between retries.
css_selectorNoSelect matching elements after `main_content_only` filtering.
max_redirectsNoRedirect limit; -1 means unlimited.
extraction_typeNoContent output format.markdown
follow_redirectsNo"safe" blocks redirects to private/internal IPs; True allows all; False disables redirects.safe
stealthy_headersNoFill missing browser headers and use a Google referer if none was supplied.
main_content_onlyNoSanitize <body> content before selection; False uses the full document.

Output Schema

NameRequiredDescription
urlYesThe URL given by the user that resulted in this response.
statusYesThe status code returned by the website.
contentYesThe page content as Markdown, HTML, text, or an AI ARIA snapshot.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external reach are covered. The description adds the meaningful behavioral note that no JavaScript executes and that it targets low-to-mid protection sites, but it is silent on the significant behaviors exposed by the schema (retries, impersonation conflicts, redirect safety) that an agent should understand before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with zero filler and the key differentiator placed early. It is efficiently written, though the brevity borders on under-specification for a 22-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, but for a 22-parameter tool with impersonation, retries, proxy, and redirect-safety behaviors, the description omits routing guidance versus the many sibling fetch/session tools and any note on limits or typical failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 22 parameters are self-documented with defaults, enums, and semantics (e.g. follow_redirects safe mode, impersonate list randomization). The description adds no parameter-level meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Make an HTTP request") and adds a differentiator against the browser siblings by noting it runs "without JavaScript." An agent can tell this is the non-browser fetch path, though it doesn't name which specific sibling to prefer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Suitable for low-to-mid protection" implies a scope boundary and hints that heavier protection needs another tool, but it never names the alternative (browser_fetch, browser_fetch_once, session_make_request) nor states explicit when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_request_sessionOpen HTTP sessionA

Open a reusable HTTP session for session_make_request, keeping cookies, connections, and request settings.

NameRequiredDescriptionDefault
proxyNoProxy URL for all session requests, optionally including credentials.
session_idNoCustom ID; a random 12-character hex ID if omitted.
impersonateNoBrowser/version to impersonate; "chrome" uses the latest supported Chrome profile. Lists pick randomly per attempt; None disables impersonation.chrome

Output Schema

NameRequiredDescription
session_idYesThe unique identifier of the session.
session_typeYesThe type of the session: 'stealthy' or 'static'.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, openWorldHint=true and destructiveHint=false. The description adds genuine value by disclosing persistence semantics (cookies, connections, request settings are retained), but says nothing about session lifetime, resource cleanup via close_session, or whether sessions expire.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the purpose and the key persistence benefit both land immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and all parameters documented, the description only needs to cover intent and lifecycle. Intent is covered; the missing piece is that this creates stateful server-side resources that should be released with close_session.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so proxy, session_id, and impersonate are already fully documented including defaults and the random-hex fallback. The description adds no parameter-level meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Open a reusable HTTP session") and names the sibling it feeds (session_make_request), so the agent can separate it from make_request and browser_open. It stops short of explicitly contrasting with browser_open, which also opens a session-like resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "for session_make_request" implies the intended pairing, but there is no explicit when-to-use, when-not-to-use, or alternative routing (e.g., use make_request for one-off calls, browser_open for JS-rendered pages). Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

session_make_requestSend HTTP request in HTTP sessionB
Read-only

Make an HTTP request using the session's cookies, connections, impersonation, and proxy. Options apply to this request.

NameRequiredDescriptionDefault
urlYesURL to fetch.
authNoBasic auth: {"username": ..., "password": ...}.
dataNoForm or raw body; ignored for GET.
jsonNoJSON body; ignored for GET.
http3NoUse HTTP/3; may conflict with browser impersonation.
methodNoHTTP method.GET
paramsNoQuery parameters.
verifyNoVerify TLS certificates.
cookiesNoRequest cookies.
headersNoRequest headers.
retriesNoMaximum attempts, including the first; None or values below 1 send once.
timeoutNoTimeout in seconds.
session_idYesHTTP session ID from `open_request_session`.
retry_delayNoSeconds between retries.
css_selectorNoSelect matching elements after `main_content_only` filtering.
max_redirectsNoRedirect limit; -1 means unlimited.
extraction_typeNoContent output format.markdown
follow_redirectsNo"safe" blocks redirects to private/internal IPs; True allows all; False disables redirects.safe
stealthy_headersNoFill missing browser headers and use a Google referer if none was supplied.
main_content_onlyNoSanitize <body> content before selection; False uses the full document.

Output Schema

NameRequiredDescription
urlYesThe URL given by the user that resulted in this response.
statusYesThe status code returned by the website.
contentYesThe page content as Markdown, HTML, text, or an AI ARIA snapshot.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and network reach are covered. The description adds real context by listing the session state it inherits (cookies, connections, impersonation, proxy) and that "Options apply to this request" (per-call overrides of session defaults). It omits two loaded behaviors an agent needs: whether cookies/state from the response are written back into the session, and that a POST/PUT/DELETE is a genuine external mutation despite readOnlyHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler, front-loaded with the action and the state it consumes. It is not padded, but the second sentence is vague enough that its brevity shades toward under-specification rather than efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema and annotations are present, and the schema documents all 20 parameters, so the description needn't restate them. Still, for a tool this behaviorally rich (redirect safety modes, browser impersonation, content extraction, session state carry-over), the description leaves the session/mutation semantics and sibling routing unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across 20 parameters, so the schema already explains url, method, data/json, retries, follow_redirects and the rest. The description contributes only the blanket claim that options apply per-request, adding no semantics for any specific parameter. Baseline 3 is appropriate when the schema carries the full burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Make an HTTP request") and adds the distinguishing trait that it draws on the session's cookies, connection pool, impersonation, and proxy. That implicitly separates it from the stateless `make_request` sibling, but the sibling is never named and an agent must infer the difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the phrase "using the session's cookies" hints this is the tool for requests that must stay within an existing session, and the schema's session_id points at `open_request_session`. However, there is no explicit when-to-use / when-not-to-use guidance against `make_request` or the `browser_fetch*` siblings, and no statement that a session must be opened first.

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.

  1. 16 tool updatesv0.1.0
    • First observedbrowser_actions
    • First observedbrowser_evaluate
    • First observedbrowser_extract
    • First observedbrowser_fetch
    • First observedbrowser_fetch_once
    • First observedbrowser_load_state
    • First observedbrowser_network_request
    • First observedbrowser_network_requests
    • First observedbrowser_open
    • First observedbrowser_save_state
    • First observedbrowser_screenshot
    • First observedclose_session
    • First observedlist_sessions
    • First observedmake_request
    • First observedopen_request_session
    • First observedsession_make_request

TDQS

B3.4/5.0

Scored across 16 tools

Disambiguation3/5

The set contains several close pairs whose boundaries require careful reading of descriptions: make_request vs session_make_request, browser_fetch vs browser_fetch_once, and browser_network_requests vs browser_network_request. The distinctions exist (stateless vs session-bound, one-off vs persistent, list vs detail), but an agent can easily misselect without parsing the long descriptions.

Naming Consistency3/5

There are two coherent families: browser_* prefixed tools and session/verb-first tools (open_request_session, close_session, list_sessions, session_make_request, make_request). Within each family it is readable, but the mixed conventions across the set (browser_open vs open_request_session, bare make_request vs session_make_request) create inconsistency.

Tool Count3/5

16 tools is borderline heavy for the surface. Many are justified (fetch variants, network inspection), but the fetch/request pairs (browser_fetch vs browser_fetch_once, make_request vs session_make_request) inflate the count and add selection burden without adding fundamentally new capability.

Completeness4/5

The surface covers the full scraping lifecycle: session lifecycle (open/close/list), state save/load, multiple fetch/request modes, extraction, actions, evaluation, network inspection, and screenshots. Minor gaps exist (no explicit browser teardown distinct from close_session, no cookie-specific tool), but the core workflow is well covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents and MCP clients to fetch webpages and crawl sites, extract main content, and convert it into clean Markdown with preserved links for fast, token-efficient scraping.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables MCP clients and AI agents to fetch webpages and crawl sites, strip noise, and convert content into clean, link-preserving Markdown with caching and configurable multi-page depth while minimizing token usage.
    MIT