Skip to main content
Glama
Santhosh-p653

Scrapling MCP Server

AWS Lightsail上のScrapling MCPサーバー

ライブWebコンテンツをLLM対応Markdownに変換する高性能Web抽出MCPサーバー — 一度デプロイすれば、AI IDE、エージェント、RAGパイプライン、自動化ワークフローにプラグインとして組み込めます。

AWS MCP Python Docker Scrapling

概要

現代のAIアプリケーションは、新鮮で構造化された外部知識へのアクセスをますます必要としています。すべてのRAGシステムやAIエージェント内でWebスクレイピングを個別に実装する代わりに、このプロジェクトはScraplingのWeb抽出機能をModel Context Protocol (MCP)を通じて公開します。

一度デプロイすれば、MCP互換のAIクライアントはサーバーに接続し、再利用可能なWebデータ取り込みコンポーネントとして使用できます。

┌──────────────────────┐
│   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

なぜWeb抽出にMCPなのか?

従来、Webデータを必要とするすべてのAIアプリケーションは、独自に以下を実装していました:

  • HTTPリクエスト

  • HTMLパース

  • ブラウザ自動化

  • 動的ページ処理

  • 抽出ロジック

  • リトライ機構

  • コンテンツ正規化

これにより重複したインフラストラクチャが生まれていました。MCPを使えば、Web抽出は共有機能になります。

導入前 — 複数の実装:

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

導入後 — 1つの機能、複数のクライアント:

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

サーバーを一度デプロイすれば、MCP互換のワークフロー全体で再利用できます。

単なるWebスクレイパーではない

このプロジェクトの核となるアイデアは、スクレイピングよりも広い範囲をカバーしています。多くのLLMアプリケーションでは、外部情報は最終的に、パース、クリーニング、構造化、チャンク分割、埋め込み、インデックス化、検索が可能な表現になる必要があります。

Markdownは、有用なドキュメント階層を保持するため、このパイプラインで特に有用です:

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

これにより、MCPサーバーは単なるスクレイピングユーティリティではなく、LLMデータ挿入/取り込みレイヤーとして機能します。

特徴

  • MCP互換のWeb抽出

  • Scraplingを搭載

  • AIエージェントとAI IDE向けに設計

  • Markdown指向の出力

  • RAG取り込みパイプラインに適合

  • Dockerでコンテナ化

  • AWS Lightsailにデプロイ可能

  • 複数のAIアプリケーション間で再利用可能

  • データ取得をAIアプリケーション自体から分離

  • エージェンティックワークフローに統合可能

アーキテクチャ

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

技術スタック

コンポーネント

技術

Web抽出

Scrapling

プロトコル

Model Context Protocol (MCP)

言語

Python

コンテナ化

Docker

クラウド

AWS Lightsail

CI/CD

GitHub Actions

出力

Markdown / 構造化コンテンツ

AI統合

MCP互換クライアント

プロジェクト構造

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

リポジトリのソースレイアウトが異なる場合は、上記の構造を調整してください。

ローカルでの実行

1. リポジトリをクローン

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

2. 依存関係をインストール

仮想環境を作成して有効化:

python -m venv .venv

# Linux / macOS
source .venv/bin/activate

# Windows
.venv\Scripts\activate

依存関係をインストール:

pip install -r requirements.txt

Dockerで実行

イメージをビルド:

docker build -t scrapling-mcp .

コンテナを実行:

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

コンテナが実行中であることを確認:

docker ps

AWS Lightsailへのデプロイ

このプロジェクトは、AWS Lightsail上のコンテナ化されたサービスとして実行されるように設計されています。

高レベルのデプロイフロー:

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

デプロイ手順

  1. AWS Lightsailコンテナサービスを作成 — AWSコンソールまたはAWS CLIから。

  2. Dockerイメージをビルド

    docker build -t scrapling-mcp .
  3. コンテナをプッシュ/デプロイ — CI/CDワークフローで生成されたイメージを使用して、Lightsailコンテナデプロイを構成します。

  4. 環境変数を設定 — 認証情報とデプロイ設定はリポジトリの外部に保持:

    AWS_REGION=
    LIGHTSAIL_SERVICE=
    CONTAINER_NAME=

⚠️ 認証情報やシークレットをGitにコミットしないでください。

GitHub Actions

リポジトリはGitHub Actionsを使用してデプロイを自動化できます:

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

デプロイはシンプルなワークフローに従います:

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

ワークフローが完了すると、更新されたMCPサーバーがデプロイされます。

MCPサーバーの使用

サーバーがデプロイされたら、そのMCPエンドポイントをMCP互換のAIクライアントに接続します:

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

AIクライアントは、ワークフローの一部として公開されたツールを呼び出せます — サーバーはAIアプリケーションのプラグインのように動作し、各プロジェクト内のカスタムスクレイピングコードを置き換えます:

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

RAG統合

典型的なRAGパイプラインは、このサーバーを取り込みレイヤーとして使用できます:

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

考えられるダウンストリームコンポーネントは次のとおりです:

  • Qdrant

  • PostgreSQL + pgvector

  • Elasticsearch

  • OpenSearch

  • Chroma

  • FAISS

  • カスタムナレッジストア

MCPサーバーはダウンストリームのストレージレイヤーから独立しています。

エージェンティックワークフロー

サーバーはAIエージェントが利用できるツールにもなります:

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

これにより、エージェントは静的トレーニングデータや以前にインデックス化されたドキュメントにのみ依存するのではなく、動的に情報を取得できます。

なぜMarkdownなのか?

Markdownは、意味構造を保持するため、LLMパイプラインにとって有用な中間表現を提供します。

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.

生のHTMLとの比較:

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

Markdownは一般的に、検査、クリーニング、チャンク分割、処理、保存、LLMパイプラインへの受け渡しが容易です。

したがって、目標は単に「Webページをスクレイピングする」ことではなく、LLMデータパイプラインに自然に取り込める形式で外部知識を取得することです。

ユースケース

ユースケース

説明

RAGシステム

インデックス化する前に新鮮なWeb情報を自動取得します。

AIリサーチエージェント

エージェントがライブWebサイトから情報を取得・分析できるようにします。

ナレッジベース

継続的に更新される知識リポジトリを構築します。

AI IDE

MCPを通じてコーディングアシスタントに外部Web抽出機能を提供します。

ドキュメント取り込み

オンラインドキュメントをダウンストリーム処理に適したMarkdownに変換します。

エージェンティック自動化

自律ワークフロー内の多くのツールの1つとしてWeb抽出を使用します。

パフォーマンス指向の設計

アーキテクチャは、Web取得レイヤーをAIアプリケーションから分離します。

すべてのAIアプリケーションがカスタムスクレイパーを維持する代わりに、アプローチは次のようになります:

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

これにより、スクレイピングインフラストラクチャを一度デプロイし、複数のワークフローで再利用できます。

セキュリティに関する考慮事項

サーバーを公開デプロイする場合:

  • コンテナ内にAWS認証情報を公開しない

  • 本番環境ではHTTPSを使用する

  • 必要に応じてネットワークアクセスを制限する

  • 要求されたURLを検証する

  • 必要に応じてレート制限を適用する

  • リソース消費を監視する

  • サイトの利用規約や適用される法律に違反するスクレイピングを避ける

  • シークレットは環境変数または専用のシークレットマネージャーに保持する

本番環境での推奨事項

本番デプロイでは、以下を追加することを検討してください:

  • 認証

  • API/MCPアクセス制御

  • HTTPS

  • レート制限

  • リクエストロギング

  • 可観測性

  • リトライポリシー

  • キャッシング

  • URL許可リスト

  • リソース制限

  • ヘルスチェック

  • 監視とアラート

今後の改善点

  • MCPクライアントの認証

  • URL/ドメイン許可リスト

  • コンテンツキャッシング

  • 分散クローリング

  • キューベースの取り込み

  • 自動ドキュメントチャンク分割

  • ベクトルデータベースへの直接統合

  • S3ベースのドキュメントストレージ

  • クロールスケジューリング

  • 可観測性ダッシュボード

  • マルチユーザーアクセス制御

エンドツーエンドのワークフロー例

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

リポジトリ

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

技術記事

このプロジェクトのアーキテクチャ、デプロイ方法、および動機はAWS Builder Centerに文書化されています:

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

貢献

貢献、アイデア、改善、実験を歓迎します。このMCPサーバーを使用して何かを構築した場合は、遠慮なくissueまたはプルリクエストを開いてワークフローを共有してください。

著者

Santhosh P

以下を中心としたシステムを構築:

  • AIエージェント

  • RAG

  • MCP

  • クラウドインフラストラクチャ

  • Webデータパイプライン

  • AI/ML

GitHub: @Santhosh-p653


重要なアイデア: スクレイピング機能を一度デプロイします。新鮮で構造化されたWebデータが必要なときはいつでも、AIワークフローにプラグインします。

Scrapling + MCPは、Web抽出を最新のLLMスタックの再利用可能なインフラストラクチャコンポーネントに変えます。

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