Skip to main content
Glama

ScreenshotAPI MCP Server

npm version GitHub Node.js License

Official MCP server for ScreenshotAPI. It gives your AI assistant 8 tools for website screenshots, URL and HTML to PDF, scrolling videos, JavaScript-aware web scraping (Markdown, text, HTML), and bulk captures. You ask in plain English and the server makes the API calls. Your assistant also gets the screenshot back as an image, so it can see the page it captured.

Works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, Cline, Codex, and any other MCP-compatible client.

Item

Value

Package

@screenshotapinet/mcp

Transport

stdio

Node.js

>=18

Quick Start

  1. Sign up for ScreenshotAPI and copy your API key from the dashboard.

  2. Cursor users can install in one click:

    Add to Cursor

  3. Everyone else: add this to your MCP client config (see Install by Client for the exact file path):

{
  "mcpServers": {
    "screenshotapi": {
      "command": "npx",
      "args": ["-y", "@screenshotapinet/mcp"],
      "env": {
        "SCREENSHOTAPI_TOKEN": "<YOUR_API_KEY>"
      }
    }
  }
}
  1. Restart your client.

  2. Test it: ask "Take a screenshot of https://example.com"

Related MCP server: Screenshot MCP

Table of Contents

Install by Client

Requirements

  • Node.js 18 or later

  • npx available in your terminal

  • A ScreenshotAPI API key (sign up)

Claude Desktop

Add to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "screenshotapi": {
      "command": "npx",
      "args": ["-y", "@screenshotapinet/mcp"],
      "env": {
        "SCREENSHOTAPI_TOKEN": "<YOUR_API_KEY>"
      }
    }
  }
}

Restart Claude Desktop after saving.

Claude Code

claude mcp add screenshotapi --env SCREENSHOTAPI_TOKEN=<YOUR_API_KEY> -- npx -y @screenshotapinet/mcp

Start a new Claude Code session after adding the server.

Cursor

One-click install:

Add to Cursor

Or add to .cursor/mcp.json manually:

{
  "mcpServers": {
    "screenshotapi": {
      "command": "npx",
      "args": ["-y", "@screenshotapinet/mcp"],
      "env": {
        "SCREENSHOTAPI_TOKEN": "<YOUR_API_KEY>"
      }
    }
  }
}

Restart Cursor after saving.

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "screenshotapi": {
      "command": "npx",
      "args": ["-y", "@screenshotapinet/mcp"],
      "env": {
        "SCREENSHOTAPI_TOKEN": "<YOUR_API_KEY>"
      }
    }
  }
}

Restart Windsurf after saving.

VS Code / GitHub Copilot

Add to your VS Code settings.json:

{
  "mcp": {
    "servers": {
      "screenshotapi": {
        "command": "npx",
        "args": ["-y", "@screenshotapinet/mcp"],
        "env": {
          "SCREENSHOTAPI_TOKEN": "<YOUR_API_KEY>"
        }
      }
    }
  }
}

Restart VS Code after saving.

Cline

Open MCP Servers panel → Configure → Advanced MCP Settings. Add to cline_mcp_settings.json:

{
  "mcpServers": {
    "screenshotapi": {
      "command": "npx",
      "args": ["-y", "@screenshotapinet/mcp"],
      "env": {
        "SCREENSHOTAPI_TOKEN": "<YOUR_API_KEY>"
      }
    }
  }
}

Restart Cline after saving.

Codex CLI

codex mcp add screenshotapi --env SCREENSHOTAPI_TOKEN=<YOUR_API_KEY> -- npx -y @screenshotapinet/mcp
codex mcp list

Start a new Codex session after adding the server.

Any Other MCP Client

Use this config:

{
  "command": "npx",
  "args": ["-y", "@screenshotapinet/mcp"],
  "env": {
    "SCREENSHOTAPI_TOKEN": "<YOUR_API_KEY>"
  }
}

Verify It Works

Try these after setup:

Prompt

Expected tool

Take a screenshot of https://example.com

take_screenshot

Screenshot stripe.com on an iPhone-sized screen in dark mode

take_screenshot with width, dark_mode

Capture the full page of https://news.ycombinator.com without ads

take_screenshot with full_page, block

Save https://example.com/invoice as an A4 PDF to ./invoice.pdf

generate_pdf with format, save_path

Read https://react.dev/learn and summarize it

scrape_page

Make a 10-second scrolling GIF of https://apple.com

record_scrolling_video

Screenshot these 5 competitor homepages

bulk_screenshots

Is bulk job 1f2e... done yet?

get_bulk_status

Tool Reference

All 8 tools wrap the ScreenshotAPI REST API. The render tools (take_screenshot, generate_pdf, scrape_page, record_scrolling_video) call GET https://shot.screenshotapi.net/v3/screenshot with output=json and share the page preparation options below. Each takes either url or custom_html.

Shared render options

Group

Parameters

Viewport

width (default 1680, max 7680), height (default 876, max 4320)

Timing

delay, wait_for_event (load / domcontentloaded / networkidle), lazy_load, scroll_delay, timeout

Page manipulation

css, css_url, js, js_url, remove_selector, blur_selector, selector_to_click, click_recursion, scroll_to_element, adjust_top

Blocking

block (list: ads, tracking, cookie_banners, chat_widgets, javascript, stylesheets, images, media, fonts, text_tracks, xhr, fetch, event_source, websockets, manifest), block_specific_requests

Emulation

dark_mode, grayscale (0-100), enable_incognito, user_agent, accept_languages, headers, cookies, template_id, proxy, latitude, longitude, timezone

Caching

fresh, enable_caching, ttl (screenshot and PDF only)

Storage

result_file_name, byob, storage_service, bucket_name (screenshot and PDF only)

take_screenshot

Captures a page as an image and returns the hosted image URL. The image is also returned inline so the assistant can see it. Full-page captures are the exception, since they are usually too tall to view; pass include_image=true to get them inline anyway.

Parameter

Required

Description

url

One of

URL to capture

custom_html

One of

Raw HTML to render instead of a URL

file_type

No

png (default), jpg, webp

full_page

No

Capture the whole scrollable page. Default false

retina

No

2x pixel density. Default false

image_quality

No

JPEG quality 0-100. Default 80

omit_background

No

Transparent background for plain-background pages (PNG only)

thumbnail_width

No

Resize output to this width, keeping aspect ratio

selector

No

Capture a single element by CSS selector

clip

No

Capture a rectangle: { x, y, width, height }

sizes

No

Capture at several viewport sizes in one request: [{ width, height }, ...]

include_image

No

Return the image inline. Default true, or false when full_page is set

save_path

No

Also save the file locally

Plus all shared render options.

generate_pdf

Converts a URL or raw HTML to PDF and returns the hosted PDF URL. With no format (and no width/height), the whole page becomes one continuous PDF page.

Parameter

Required

Description

url

One of

URL to convert

custom_html

One of

Raw HTML to convert

format

No

A0–A6, Letter, Legal, Tabloid, Ledger

landscape

No

Landscape orientation. Default false

page_range

No

Keep only these pages, e.g. 1-3

print_background

No

Include background colors and images

media

No

print or screen CSS

save_path

No

Also save the PDF locally

Plus all shared render options.

scrape_page

Renders the page in a real browser, so JavaScript runs first, then extracts its content. The server downloads the extracted files and returns their contents inline. A screenshot is captured in the same request.

Parameter

Required

Description

url

One of

URL to scrape

custom_html

One of

Raw HTML to process

extract

No

Any of markdown, text, html, image_urls. Default markdown

include_content

No

Return extracted contents inline. Default true

max_content_chars

No

Truncate each extracted file. Default 50000

Plus viewport, timing, page manipulation, blocking, and emulation options.

record_scrolling_video

Records the browser scrolling down a page and returns the hosted video URL.

Parameter

Required

Description

url

One of

URL to record

custom_html

One of

Raw HTML to record

file_type

No

mp4 (default), webm, gif

scroll_speed

No

slow, normal (default), fast

duration

No

Seconds, 0-60

scroll_back

No

Scroll back to the top at the end

start_immediately

No

Start recording before the page finishes loading

video

No

Record the viewport for duration seconds without scrolling

sizes

No

Record at several viewport sizes: [{ width, height }, ...], up to 10

save_path

No

Also save the video locally (single size only)

Plus viewport, timing, page manipulation, blocking, and emulation options.

bulk_screenshots

POST https://api.screenshotapi.net/v1/bulk/json submits up to 50 URLs as one job. Paid plans only.

Parameter

Required

Description

screenshots

Yes

[{ url, ...options }]. Options use raw API names (file_type, width, full_page, block_ads, ...)

defaults

No

Options applied to every entry unless the entry overrides them

bulk_screenshots_csv

POST https://api.screenshotapi.net/v1/bulk/csv uploads a CSV with a url column. Any other column is a render option for that row. Paid plans only.

Parameter

Required

Description

csv_path

One of

Path to a local CSV file

csv_content

One of

CSV text

get_bulk_status

GET https://api.screenshotapi.net/v1/bulk/csv/status returns percent_complete, successful_urls, and failed_urls for a job.

Parameter

Required

Description

uuid

Yes

Job uuid

download_bulk_results

GET https://api.screenshotapi.net/v1/bulk/csv/download returns one row per URL with url, status, screenshot, and error_message.

Parameter

Required

Description

uuid

Yes

Job uuid

Prompt Examples

Screenshots

PDFs

Scraping

Video

  • Record a slow scrolling MP4 of https://stripe.com that scrolls back to the top.

  • Make a scrolling GIF of our landing page at desktop and mobile sizes.

Bulk

  • Screenshot these 20 URLs at 1440x900 with cookie banners hidden.

  • What's the status of my bulk job, and download the results when it's done.

Error Codes

Tool calls never crash the server. Upstream errors come back as structured tool results with error, code, message, and a guidance field, so the client can explain the problem and suggest a fix.

Code

Meaning

310

Too many redirects on the target URL

400

Invalid parameters (URL, file type, proxy, geolocation, CSS/JS URL, clip, template) or target SSL problems

401

Missing or invalid SCREENSHOTAPI_TOKEN, or inactive subscription

402

Service paused for unpaid dues or usage over twice the plan quota

403

Screenshot quota used up, trial expired, or target refused the connection

404

Account is not on a plan or trial

407

Proxy tunnel connection failed

408

Page took too long to render

429

Too many requests per minute

444

Target site closed the connection or returned nothing

495

Target site SSL/TLS version or cipher mismatch

499

This server stopped waiting for the API (see SCREENSHOTAPI_REQUEST_TIMEOUT_MS)

500

ScreenshotAPI internal error, safe to retry

502

Server could not reach ScreenshotAPI

503

ScreenshotAPI or the target page is temporarily unavailable

Example error result for a missing URL:

{
  "error": "url_required",
  "code": 400,
  "message": "Provide either 'url' or 'custom_html'.",
  "guidance": "Pass a fully qualified URL including the protocol, e.g. 'https://example.com', or pass custom_html instead."
}

See the full list in the ScreenshotAPI error docs.

How It Works

This is a stdio MCP server that wraps the ScreenshotAPI REST API.

At runtime:

  1. Your MCP client starts the server process via npx.

  2. The client reads the tool list.

  3. When a prompt matches a tool, the client calls it.

  4. The server validates inputs, calls ScreenshotAPI with output=json, and returns structured JSON with the hosted file URL.

  5. For screenshots, the server also downloads the image and returns it inline. For scraping, it downloads the extracted Markdown, text, or HTML and returns the contents.

The API key is read from the environment on each call and sent as the token parameter. The server strips the token from every response before it reaches the model. Requests with very long values, such as large custom_html, are sent as a POST with a JSON body to avoid URL length limits.

Environment Variables

Variable

Required

Default

Description

SCREENSHOTAPI_TOKEN

Yes

Your ScreenshotAPI API key

SCREENSHOTAPI_REQUEST_TIMEOUT_MS

No

180000

Upstream request timeout in ms

SCREENSHOTAPI_MAX_INLINE_IMAGE_BYTES

No

3500000

Largest screenshot returned inline to the model

Building from Source

git clone https://github.com/Screenshot-API/screenshot-mcp.git
cd screenshot-mcp
npm install
npm run build

Run it directly:

SCREENSHOTAPI_TOKEN=<YOUR_KEY> node dist/cli.js

Inspect with the MCP Inspector:

SCREENSHOTAPI_TOKEN=<YOUR_KEY> npx @modelcontextprotocol/inspector node dist/cli.js

Troubleshooting

Client uses an old tool list after updating: Restart the client and confirm it loaded the latest npm version.

401 token_required: SCREENSHOTAPI_TOKEN is not set in your MCP client config's env block.

401 invalid_token: The key is wrong, or it was rolled in the dashboard. Copy the current key from the dashboard.

Screenshot comes back as a URL but not an image: The image is larger than SCREENSHOTAPI_MAX_INLINE_IMAGE_BYTES, or it was a full_page capture. Use thumbnail_width, jpg with a lower image_quality, or set include_image=true.

Blank or half-loaded pages: Add delay (e.g. 3000), use wait_for_event=networkidle, or set lazy_load=true for pages with lazy images.

Cookie banners or popups in the shot: Pass block: ["cookie_banners", "ads", "chat_widgets"], or remove specific elements with remove_selector.

CAPTCHA or bot blocks: Route the request through a residential proxy. See the proxy docs.

Timeouts: Slow pages may need a higher timeout (API side, default 100000 ms) and a higher SCREENSHOTAPI_REQUEST_TIMEOUT_MS (this server, default 180000 ms). Some MCP clients also have their own tool-call timeout.

License

MIT

Available Tools

8 tools
bulk_screenshotsCapture screenshots of many URLsA

Submits up to 50 URLs as one bulk screenshot job (JSON bulk API). Each entry is a URL plus any take_screenshot option using the raw API parameter names (file_type, width, height, full_page, fresh, delay, css, block_ads, no_cookie_banners, ...). 'defaults' are applied to every entry unless the entry overrides them. Returns the API's job response; if it contains a uuid, track it with get_bulk_status and fetch results with download_bulk_results. Paid plans only.

NameRequiredDescriptionDefault
defaultsNoOptions applied to every entry, e.g. {file_type:'png', width:1440, height:900, no_cookie_banners:true}.
screenshotsYesEntries to capture, e.g. [{url:'https://a.com'},{url:'https://b.com',full_page:true}]. Max 50.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the 50-entry ceiling, the defaults/override merge behavior, that the return is a raw API job response, the conditional uuid follow-up, and the paid-plan requirement. Async timing, rate limits, and failure behavior of the job are not described.

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?

Front-loads the operation and the 50-URL cap, then layers in the option vocabulary, merge semantics, return behavior, and the paid-plan caveat. The parenthetical option list earns its space because the schema's additionalProperties does not enumerate valid keys.

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?

No output schema exists, yet the description explains what comes back (the API's job response) and how to act on it (uuid → get_bulk_status → download_bulk_results). Combined with the nested-object merge semantics and plan restriction, an agent has everything needed to invoke and follow up 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 baseline is 3, but the description adds real value: it names the raw API option keys (file_type, width, height, full_page, ...) that the generic additionalProperties schema only gestures at, and it states the precedence rule — defaults apply unless an entry overrides them — which the schema does not spell out.

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 and resource — submits up to 50 URLs as one bulk screenshot job over the JSON bulk API — and the 'JSON bulk API' phrasing implicitly separates it from the bulk_screenshots_csv sibling and from the single-URL take_screenshot. An agent can identify the operation and its batch scope 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?

Gives a clear usage path: submit here, then track with get_bulk_status if a uuid comes back and fetch with download_bulk_results, and it flags the 'Paid plans only' prerequisite. It stops short of stating when to prefer bulk_screenshots_csv or take_screenshot instead, so the routing to the closest sibling is left implicit.

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

bulk_screenshots_csvStart a bulk screenshot job from a CSVA

Uploads a CSV to start a bulk screenshot job. The CSV must have a 'url' column with full https:// URLs; any other column is treated as a render option for that row using the API parameter names (file_type, width, height, css, delay, headers, ...). Pass either a local csv_path or the CSV text in csv_content. Returns the job response including its uuid for get_bulk_status and download_bulk_results. ScreenshotAPI also emails a download link when the job finishes. Paid plans only.

NameRequiredDescriptionDefault
csv_pathNoPath to a local CSV file.
csv_contentNoCSV text, e.g. 'url,file_type\nhttps://a.com,png\nhttps://b.com,jpg'. Used when csv_path is not given.

TDQS

A4.1/5.0
Behavior4/5

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

No annotations exist, so the description carries the full burden and does well: it discloses the CSV contract (a 'url' column with full https:// URLs, other columns mapped to API option names), the asynchronous job model with an email notification side effect, and the paid-plan restriction. It omits failure behavior, row limits, and whether partial failures are tolerated.

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?

Four dense sentences, front-loaded with the action, then the input contract, then the return/follow-up, then the pricing gate. No sentence is filler.

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 no output schema, the description correctly covers the return value (job response with uuid) and the follow-up tools plus the email fallback. It leaves the async timing, row limits, and error semantics undefined, which is a modest gap for a job-submission 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?

Schema coverage is 100%, so the baseline is 3, but the description earns more by explaining the CSV row/column semantics that the schema only hints at — the 'url' column requirement and that extra columns become render options named after API parameters. The csv_path vs csv_content precedence is already in 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 ('Uploads a CSV to start a bulk screenshot job') and the CSV format is a strong implicit differentiator from the sibling bulk_screenshots. It never names that sibling explicitly, so the differentiation is inferred rather than stated.

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?

Explains the input choice ('Pass either a local csv_path or the CSV text in csv_content') and routes the agent forward to get_bulk_status and download_bulk_results after the uuid is returned. It adds a real precondition ('Paid plans only') but gives no explicit when-not-to-use guidance versus bulk_screenshots.

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

download_bulk_resultsDownload bulk screenshot resultsA

Downloads the results of a finished bulk screenshot job by uuid: one row per URL with its status, the hosted screenshot URL, and any error message.

NameRequiredDescriptionDefault
uuidYesJob uuid returned when the bulk job was submitted.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the return shape (one row per URL with status, hosted screenshot URL, error message) and the prerequisite that the job must be finished. It omits permissions, delivery mechanism (file vs. inline payload), and behavior on incomplete/expired jobs.

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?

One sentence, front-loaded with the action and resource, followed by the return detail. No filler, every clause earns its place.

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?

Since there is no output schema, describing the row structure is essential and is done here; the job-completion prerequisite is also covered. The main residual gap is whether 'downloads' yields a file/artifact or a JSON payload, which an agent would want to know before calling.

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 single uuid parameter is already documented as the job uuid from submission. The description only reinforces 'by uuid' and adds no format, example, or validation detail beyond the schema; baseline 3 applies.

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 and resource (downloads the results of a bulk screenshot job) and specifies the input that identifies it (uuid). It is clearly distinct from siblings like get_bulk_status (status check) and bulk_screenshots (job submission).

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?

The phrase 'finished bulk screenshot job' tells the agent this is only applicable after completion, implying get_bulk_status as the prior step. However, it never names that sibling or states explicitly what to do if the job isn't finished, so routing is inferred rather than directed.

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

generate_pdfConvert a web page or HTML to PDFA

Renders a URL or raw HTML in a real browser and converts it to a PDF, returning the hosted PDF URL. Choose a paper size ('format') for paginated output; without format (and without width/height) the whole page becomes one long continuous PDF page. Supports landscape, page ranges, print backgrounds, print vs screen CSS, and all page preparation options (delay, lazy_load, ad/cookie-banner blocking, CSS/JS injection). Use save_path to save the PDF locally.

NameRequiredDescriptionDefault
jsNoJavaScript executed in the page before capture, e.g. "document.querySelector('.popup').remove();".
cssNoCSS injected before capture, e.g. '.header { display: none; }'.
ttlNoCache lifetime in seconds when enable_caching is true. Default 2592000 (30 days).
urlNoWebsite URL to render, including the protocol, e.g. 'https://example.com'. Either url or custom_html is required.
byobNoSave the output to your own bucket configured under Storage Integrations in the dashboard (Bring Your Own Bucket). Default false.
blockNoResources to block while rendering. For a clean capture use ['ads', 'cookie_banners', 'chat_widgets']. 'tracking' blocks analytics. 'javascript', 'stylesheets', 'xhr', and 'fetch' can break pages or hide content — use only when needed. Others: images, media (audio/video), fonts, text_tracks, event_source, websockets, manifest.
delayNoExtra wait in milliseconds after the page loads, before capture. Default 0. Use 1000-5000 for animations, charts, or late-loading content.
freshNotrue (default) always renders a new capture; false returns a cached capture when one exists from a request with enable_caching=true and identical parameters.
mediaNoCSS media type to emulate: 'print' uses the site's print stylesheet, 'screen' matches what a visitor sees.
proxyNoProxy to route the request through: 'address:port' or 'username:password@address:port' (an http:// prefix is accepted). Useful for geo-specific content or CAPTCHA-prone sites.
widthNoBrowser viewport width in pixels (max 7680). Default 1680. Use ~390 to emulate a phone, ~768 for a tablet.
formatNoPaper size. A4 or Letter for documents and invoices. Omit for a single continuous page.
heightNoBrowser viewport height in pixels (max 4320). Default 876.
js_urlNoURL of an external JavaScript file to execute before capture.
cookiesNoCookies to set before loading, as 'name=value; other=value;'. Use for pages behind a login.
css_urlNoURL of an external stylesheet to inject before capture.
headersNoExtra HTTP headers as 'Name: value;' pairs separated by semicolons, e.g. 'Authorization: Bearer abc; X-Test: 1;'.
timeoutNoMaximum milliseconds the API waits for the page to load before aborting. Default 100000.
latitudeNoLatitude reported by the browser Geolocation API.
timezoneNoIANA timezone to emulate, e.g. 'America/New_York', 'Asia/Karachi'. Default is the server timezone.
dark_modeNoRender with the dark color scheme (for sites that support it). Default false.
grayscaleNoDesaturate the output, 0 (full color, default) to 100 (fully grayscale).
landscapeNoLandscape orientation — good for wide tables and dashboards. Default false (portrait).
lazy_loadNoScroll through the whole page first so lazy-loaded images and sections render. Default false.
longitudeNoLongitude reported by the browser Geolocation API.
save_pathNoOptional local path to also save the file to, e.g. './shots/home.png'. A directory path (ending in '/' or an existing directory) keeps the remote file name. Relative paths resolve against the MCP server's working directory.
adjust_topNoScroll the viewport down this many pixels before capture. Default 0. Not supported for PDFs.
page_rangeNoKeep only these pages, as 'start-end', e.g. '1-3' or '5-5'. Needs a paginated PDF (format or width/height).
user_agentNoCustom User-Agent string, e.g. a mobile Safari UA to get the mobile site.
bucket_nameNoBucket to use with byob when several are configured under the same service.
custom_htmlNoRaw HTML to render instead of loading a URL. Takes precedence over url. Inline CSS and JavaScript in the HTML are applied. Useful for pages that are not publicly reachable.
template_idNoID of a saved cookie template from the ScreenshotAPI dashboard to apply before navigation.
scroll_delayNoMilliseconds to wait between scroll steps when lazy_load is true. Default 500. High values on long pages can hit the timeout.
blur_selectorNoCSS selector(s) of elements to blur, comma-separated — for redacting emails, account numbers, or other sensitive data.
enable_cachingNoStore this capture in the cache for reuse. Cached captures served later (with fresh=false) do not consume credits. Default false.
wait_for_eventNoPage lifecycle event to wait for before capture. 'load' (default) waits for all resources; 'domcontentloaded' is faster but may miss images; 'networkidle' waits until no network requests for 500ms — best for SPAs and dashboards.
click_recursionNoHow many times to click selector_to_click in sequence. Requires selector_to_click. Default 0.
remove_selectorNoCSS selector(s) of elements to remove from the page before capture, comma-separated, e.g. '.ad-banner, #sidebar'. Non-matching selectors are ignored.
storage_serviceNoStorage service to use with byob when several are configured: 'aws', 'wasabi', or 'google_cloud'.
accept_languagesNoAccept-Language header for localized content, e.g. 'fr-FR,fr;q=0.9'. Default 'en-US,en;q=0.8'.
enable_incognitoNoRender in an isolated incognito session with no persisted cookies or storage. Default false.
print_backgroundNoInclude background colors and images in the PDF.
result_file_nameNoCustom file name for the stored output. Non-unique names can overwrite earlier files.
scroll_to_elementNoCSS selector of an element to scroll into view before a viewport capture.
selector_to_clickNoCSS selector of an element to click before capture, e.g. to open a tab, dropdown, or accordion.
block_specific_requestsNoSpecific request URLs or patterns to block, separated by commas, spaces, or newlines, e.g. 'https://example.com/api/data, https://ads-domain.com'.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it names the return artifact (hosted PDF URL), discloses the default single-long-page behavior and how format/width/height change it. It stops short of 5 because cost/credit implications (only hinted at indirectly) and error behavior are left to the schema.

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

Conciseness4/5

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

Front-loaded with the core action and output, then capabilities, then save_path. Dense but every sentence contributes; the parenthetical option list is a bit packed but not wasteful.

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 46-parameter tool with full schema coverage and no output schema, the description adequately frames the tool's purpose, output, and the single most important parameter interaction (format vs continuous page). Deep behavioral details like caching credits are delegated to the schema, which is acceptable at 100% coverage.

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 baseline is 3; the description adds real meaning by explaining the interaction between format, width/height and continuous-page output, and clarifies save_path semantics. It adds value beyond the per-field schema text for the most consequential parameters.

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+resource+output: 'Renders a URL or raw HTML in a real browser and converts it to a PDF, returning the hosted PDF URL.' An agent can distinguish it from take_screenshot and scrape_page by the PDF output and the hosted URL, even though siblings aren't named explicitly.

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?

Gives clear selection guidance within the tool: use 'format' for paginated output, omit it for one continuous page, and use save_path to also save locally. It doesn't explicitly route to siblings like take_screenshot or scrape_page, so it stops just short of a 5.

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

get_bulk_statusCheck a bulk screenshot jobA

Returns the progress of a bulk screenshot job by uuid: percent complete plus successful and failed URLs. Call download_bulk_results once it reaches 100%.

NameRequiredDescriptionDefault
uuidYesJob uuid returned when the bulk job was submitted.

TDQS

A4/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. It discloses the return payload (percent, success/fail counts) and the completion handoff, which is genuinely useful. It says nothing about behavior on an unknown or expired uuid, whether failed URLs are retryable, or job retention, which are material gaps for a polling tool with no structured safety hints.

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, no waste, and the effect (progress read) is front-loaded ahead of the next-step instruction. Nothing could be cut without losing routing 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?

There is no output schema or annotations, but the description compensates by summarizing the return fields and the completion workflow, which is sufficient to call this correctly. Only error/expiry behavior is left unaddressed, a minor gap for a one-parameter read tool.

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 a single required parameter whose description already says it is the job uuid returned at submission. The description's 'by uuid' adds no syntax, format, or provenance information beyond the schema. Baseline 3 applies when the schema does all the work.

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 (returns the progress) and resource (bulk screenshot job by uuid) and enumerates the payload: percent complete plus successful and failed URLs. The agent can distinguish it from download_bulk_results, which is explicitly named as the follow-up rather than an alternative.

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?

Clear usage context: call it to poll a job, and call download_bulk_results once progress hits 100%. That sequencing is exactly what an agent needs. It doesn't state what to do on a failed or stalled job, and there are no explicit exclusions, so it falls short of a 5.

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

record_scrolling_videoRecord a scrolling video of a web pageA

Records a video (mp4, webm, or gif) of the browser scrolling down a web page and returns the hosted video URL. Control scroll speed, duration, and scrolling back to the top. Set video=true to record the viewport without scrolling (for animations or live dashboards). Pass 'sizes' to record the same page at several viewport sizes in one request. Rendering takes noticeably longer than a screenshot.

NameRequiredDescriptionDefault
jsNoJavaScript executed in the page before capture, e.g. "document.querySelector('.popup').remove();".
cssNoCSS injected before capture, e.g. '.header { display: none; }'.
urlNoWebsite URL to render, including the protocol, e.g. 'https://example.com'. Either url or custom_html is required.
blockNoResources to block while rendering. For a clean capture use ['ads', 'cookie_banners', 'chat_widgets']. 'tracking' blocks analytics. 'javascript', 'stylesheets', 'xhr', and 'fetch' can break pages or hide content — use only when needed. Others: images, media (audio/video), fonts, text_tracks, event_source, websockets, manifest.
delayNoExtra wait in milliseconds after the page loads, before capture. Default 0. Use 1000-5000 for animations, charts, or late-loading content.
proxyNoProxy to route the request through: 'address:port' or 'username:password@address:port' (an http:// prefix is accepted). Useful for geo-specific content or CAPTCHA-prone sites.
sizesNoRecord one video per viewport size, e.g. [{width:1920,height:1080},{width:390,height:844}]. Overrides width/height.
videoNoRecord the visible viewport for 'duration' seconds without scrolling. Default false.
widthNoBrowser viewport width in pixels (max 7680). Default 1680. Use ~390 to emulate a phone, ~768 for a tablet.
heightNoBrowser viewport height in pixels (max 4320). Default 876.
js_urlNoURL of an external JavaScript file to execute before capture.
cookiesNoCookies to set before loading, as 'name=value; other=value;'. Use for pages behind a login.
css_urlNoURL of an external stylesheet to inject before capture.
headersNoExtra HTTP headers as 'Name: value;' pairs separated by semicolons, e.g. 'Authorization: Bearer abc; X-Test: 1;'.
timeoutNoMaximum milliseconds the API waits for the page to load before aborting. Default 100000.
durationNoHow long the scrolling (or viewport recording) lasts, in seconds, 0-60.
latitudeNoLatitude reported by the browser Geolocation API.
timezoneNoIANA timezone to emulate, e.g. 'America/New_York', 'Asia/Karachi'. Default is the server timezone.
dark_modeNoRender with the dark color scheme (for sites that support it). Default false.
file_typeNoVideo format. Default mp4. gif loops and has no sound; webm is smaller.
grayscaleNoDesaturate the output, 0 (full color, default) to 100 (fully grayscale).
lazy_loadNoScroll through the whole page first so lazy-loaded images and sections render. Default false.
longitudeNoLongitude reported by the browser Geolocation API.
save_pathNoOptional local path to save the video to (ignored when 'sizes' is used, since that returns several files).
adjust_topNoScroll the viewport down this many pixels before capture. Default 0. Not supported for PDFs.
user_agentNoCustom User-Agent string, e.g. a mobile Safari UA to get the mobile site.
custom_htmlNoRaw HTML to render instead of loading a URL. Takes precedence over url. Inline CSS and JavaScript in the HTML are applied. Useful for pages that are not publicly reachable.
scroll_backNoScroll back up to the top after reaching the bottom. Default false.
template_idNoID of a saved cookie template from the ScreenshotAPI dashboard to apply before navigation.
scroll_delayNoMilliseconds to wait between scroll steps when lazy_load is true. Default 500. High values on long pages can hit the timeout.
scroll_speedNoScrolling speed. Default normal.
blur_selectorNoCSS selector(s) of elements to blur, comma-separated — for redacting emails, account numbers, or other sensitive data.
wait_for_eventNoPage lifecycle event to wait for before capture. 'load' (default) waits for all resources; 'domcontentloaded' is faster but may miss images; 'networkidle' waits until no network requests for 500ms — best for SPAs and dashboards.
click_recursionNoHow many times to click selector_to_click in sequence. Requires selector_to_click. Default 0.
remove_selectorNoCSS selector(s) of elements to remove from the page before capture, comma-separated, e.g. '.ad-banner, #sidebar'. Non-matching selectors are ignored.
accept_languagesNoAccept-Language header for localized content, e.g. 'fr-FR,fr;q=0.9'. Default 'en-US,en;q=0.8'.
enable_incognitoNoRender in an isolated incognito session with no persisted cookies or storage. Default false.
scroll_to_elementNoCSS selector of an element to scroll into view before a viewport capture.
selector_to_clickNoCSS selector of an element to click before capture, e.g. to open a tab, dropdown, or accordion.
start_immediatelyNoStart recording as soon as navigation begins instead of after load, to capture the page loading. Default false.
block_specific_requestsNoSpecific request URLs or patterns to block, separated by commas, spaces, or newlines, e.g. 'https://example.com/api/data, https://ads-domain.com'.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: it discloses the returned artifact (hosted video URL), supported formats, the cost warning that rendering is slower than a screenshot, the optional scroll-back and viewport-recording behaviors, and that sizes produces multiple recordings. It does not discuss authentication, rate limits, local file saving behavior, or what happens on partial failure, which keeps it from 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.

Conciseness5/5

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

The description is five tight sentences with no waste. It is front-loaded with the core purpose and output, then moves to the key mode switches and the performance warning, all of which are useful for selection.

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 complex 41-parameter tool with no annotations and no output schema, the description covers the essential modes, output artifact, and cost profile needed to select and invoke it correctly. It is slightly thin on the many advanced rendering options, but since the schema fully documents those, the description is largely complete.

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 all 41 parameters and a baseline of 3 would be acceptable. The description still adds useful meaning beyond the schema by clarifying the non-obvious semantics of video=true (viewport recording without scrolling), sizes (multiple viewports in one request), duration, scroll speed, and scroll_back, though most of the 41 parameters are not discussed in the description.

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 — recording a video of a browser scrolling a web page — and names the output formats and returned artifact (hosted video URL). It also distinguishes the non-scrolling 'video=true' mode and the multi-size mode, so an agent can tell exactly what this tool does and how it differs from screenshotting.

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 concrete usage guidance for the main modes: 'Set video=true to record the viewport without scrolling (for animations or live dashboards)' and 'Pass sizes to record the same page at several viewport sizes in one request.' It also implicitly contrasts with the sibling take_screenshot by warning that rendering takes noticeably longer than a screenshot, but it does not explicitly say when to prefer take_screenshot or generate_pdf instead.

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

scrape_pageScrape page content as Markdown, text, or HTMLA

Loads a page in a real browser (JavaScript executed) and extracts its content: clean Markdown (best for reading and summarizing), plain text, the fully rendered HTML, and/or every image URL on the page. Extracted files are fetched and returned inline, truncated to max_content_chars. Works on JavaScript-heavy sites that plain HTTP fetches can't read. A screenshot is captured as part of the same request and counts as one credit.

NameRequiredDescriptionDefault
jsNoJavaScript executed in the page before capture, e.g. "document.querySelector('.popup').remove();".
cssNoCSS injected before capture, e.g. '.header { display: none; }'.
urlNoWebsite URL to render, including the protocol, e.g. 'https://example.com'. Either url or custom_html is required.
blockNoResources to block while rendering. For a clean capture use ['ads', 'cookie_banners', 'chat_widgets']. 'tracking' blocks analytics. 'javascript', 'stylesheets', 'xhr', and 'fetch' can break pages or hide content — use only when needed. Others: images, media (audio/video), fonts, text_tracks, event_source, websockets, manifest.
delayNoExtra wait in milliseconds after the page loads, before capture. Default 0. Use 1000-5000 for animations, charts, or late-loading content.
proxyNoProxy to route the request through: 'address:port' or 'username:password@address:port' (an http:// prefix is accepted). Useful for geo-specific content or CAPTCHA-prone sites.
widthNoBrowser viewport width in pixels (max 7680). Default 1680. Use ~390 to emulate a phone, ~768 for a tablet.
heightNoBrowser viewport height in pixels (max 4320). Default 876.
js_urlNoURL of an external JavaScript file to execute before capture.
cookiesNoCookies to set before loading, as 'name=value; other=value;'. Use for pages behind a login.
css_urlNoURL of an external stylesheet to inject before capture.
extractNoWhat to extract. Default ['markdown']. Options: markdown, text, html, image_urls.
headersNoExtra HTTP headers as 'Name: value;' pairs separated by semicolons, e.g. 'Authorization: Bearer abc; X-Test: 1;'.
timeoutNoMaximum milliseconds the API waits for the page to load before aborting. Default 100000.
latitudeNoLatitude reported by the browser Geolocation API.
timezoneNoIANA timezone to emulate, e.g. 'America/New_York', 'Asia/Karachi'. Default is the server timezone.
dark_modeNoRender with the dark color scheme (for sites that support it). Default false.
grayscaleNoDesaturate the output, 0 (full color, default) to 100 (fully grayscale).
lazy_loadNoScroll through the whole page first so lazy-loaded images and sections render. Default false.
longitudeNoLongitude reported by the browser Geolocation API.
adjust_topNoScroll the viewport down this many pixels before capture. Default 0. Not supported for PDFs.
user_agentNoCustom User-Agent string, e.g. a mobile Safari UA to get the mobile site.
custom_htmlNoRaw HTML to render instead of loading a URL. Takes precedence over url. Inline CSS and JavaScript in the HTML are applied. Useful for pages that are not publicly reachable.
template_idNoID of a saved cookie template from the ScreenshotAPI dashboard to apply before navigation.
scroll_delayNoMilliseconds to wait between scroll steps when lazy_load is true. Default 500. High values on long pages can hit the timeout.
blur_selectorNoCSS selector(s) of elements to blur, comma-separated — for redacting emails, account numbers, or other sensitive data.
wait_for_eventNoPage lifecycle event to wait for before capture. 'load' (default) waits for all resources; 'domcontentloaded' is faster but may miss images; 'networkidle' waits until no network requests for 500ms — best for SPAs and dashboards.
click_recursionNoHow many times to click selector_to_click in sequence. Requires selector_to_click. Default 0.
include_contentNoFetch the extracted files and return their contents inline. Default true. false returns only the file URLs.
remove_selectorNoCSS selector(s) of elements to remove from the page before capture, comma-separated, e.g. '.ad-banner, #sidebar'. Non-matching selectors are ignored.
accept_languagesNoAccept-Language header for localized content, e.g. 'fr-FR,fr;q=0.9'. Default 'en-US,en;q=0.8'.
enable_incognitoNoRender in an isolated incognito session with no persisted cookies or storage. Default false.
max_content_charsNoTruncate each extracted file to this many characters. Default 50000.
scroll_to_elementNoCSS selector of an element to scroll into view before a viewport capture.
selector_to_clickNoCSS selector of an element to click before capture, e.g. to open a tab, dropdown, or accordion.
block_specific_requestsNoSpecific request URLs or patterns to block, separated by commas, spaces, or newlines, e.g. 'https://example.com/api/data, https://ads-domain.com'.

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description does most of the work: it discloses that a real browser renders the page with JavaScript executed, that extracted files are fetched and returned inline, that output is truncated to max_content_chars, and that a screenshot is included and "counts as one credit", which is a billing behavior not visible in the schema. It still omits auth/rate-limit expectations and failure behavior for a 36-param tool.

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?

Five sentences, front-loaded with the core verb and output formats, then the inline/truncation behavior, then the JS-site rationale, then cost. Each sentence carries information, and the length is reasonable for a 36-parameter tool, though the screenshot/credit sentence could be merged or moved.

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?

For a tool with 36 parameters and no output schema, the description should clarify the return shape, but it only says files are fetched and returned inline and truncated, without describing the response structure or how the screenshot relates to the extraction output. It is adequate given the rich schema, but it leaves real gaps around return values and error behavior.

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 the schema already documents all 36 parameters thoroughly, making 3 the baseline. The description adds only marginal meaning: the tradeoff between Markdown and other extract modes, and the truncation role of max_content_chars; it leaves the other 34 parameters entirely to 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?

The description has a specific verb and resource: loads a page in a real browser and extracts Markdown, text, HTML, or image URLs. It distinguishes itself from plain HTTP fetches ("JS-heavy sites that plain HTTP fetches can't read") but never contrasts with its actual siblings take_screenshot or generate_pdf, even though it notes a screenshot is captured as a side effect, which blurs the line with take_screenshot.

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?

"Works on JavaScript-heavy sites that plain HTTP fetches can't read" and "Markdown (best for reading and summarizing)" imply when to prefer this tool and which extract mode to pick. However, it never says when to use take_screenshot or generate_pdf instead, and it has no explicit exclusions or prerequisites.

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

take_screenshotTake a website screenshotA

Captures a screenshot of a web page (or of raw HTML) in a real browser and returns the hosted image URL. By default the image is also returned inline so you can see it — except for full_page captures, which are often too tall to view; set include_image=true to force it. Supports viewport or full-page capture, a single element via 'selector', a pixel region via 'clip', retina output, ad/cookie-banner blocking, CSS/JS injection, clicking elements first, dark mode, custom headers/cookies, proxies, geolocation, and timezone. Each call uses one screenshot credit unless a cached capture is served.

NameRequiredDescriptionDefault
jsNoJavaScript executed in the page before capture, e.g. "document.querySelector('.popup').remove();".
cssNoCSS injected before capture, e.g. '.header { display: none; }'.
ttlNoCache lifetime in seconds when enable_caching is true. Default 2592000 (30 days).
urlNoWebsite URL to render, including the protocol, e.g. 'https://example.com'. Either url or custom_html is required.
byobNoSave the output to your own bucket configured under Storage Integrations in the dashboard (Bring Your Own Bucket). Default false.
clipNoCapture only this rectangle of the page.
blockNoResources to block while rendering. For a clean capture use ['ads', 'cookie_banners', 'chat_widgets']. 'tracking' blocks analytics. 'javascript', 'stylesheets', 'xhr', and 'fetch' can break pages or hide content — use only when needed. Others: images, media (audio/video), fonts, text_tracks, event_source, websockets, manifest.
delayNoExtra wait in milliseconds after the page loads, before capture. Default 0. Use 1000-5000 for animations, charts, or late-loading content.
freshNotrue (default) always renders a new capture; false returns a cached capture when one exists from a request with enable_caching=true and identical parameters.
proxyNoProxy to route the request through: 'address:port' or 'username:password@address:port' (an http:// prefix is accepted). Useful for geo-specific content or CAPTCHA-prone sites.
sizesNoCapture the page at several viewport sizes in one request, e.g. [{width:1920,height:1080},{width:768,height:1024},{width:390,height:844}]. Overrides width/height. Returns one hosted image per size; images are not shown inline in this mode.
widthNoBrowser viewport width in pixels (max 7680). Default 1680. Use ~390 to emulate a phone, ~768 for a tablet.
heightNoBrowser viewport height in pixels (max 4320). Default 876.
js_urlNoURL of an external JavaScript file to execute before capture.
retinaNoRender at 2x pixel density for a sharper, larger image. Default false.
cookiesNoCookies to set before loading, as 'name=value; other=value;'. Use for pages behind a login.
css_urlNoURL of an external stylesheet to inject before capture.
headersNoExtra HTTP headers as 'Name: value;' pairs separated by semicolons, e.g. 'Authorization: Bearer abc; X-Test: 1;'.
timeoutNoMaximum milliseconds the API waits for the page to load before aborting. Default 100000.
latitudeNoLatitude reported by the browser Geolocation API.
selectorNoCSS selector of a single element to capture instead of the viewport, e.g. '#pricing' or '.product-card'.
timezoneNoIANA timezone to emulate, e.g. 'America/New_York', 'Asia/Karachi'. Default is the server timezone.
dark_modeNoRender with the dark color scheme (for sites that support it). Default false.
file_typeNoImage format. Default png. jpg is smallest (see image_quality); webp balances size and quality. For PDF use generate_pdf.
full_pageNoCapture the entire scrollable page instead of just the viewport. Default false. Combine with lazy_load for pages with lazy images.
grayscaleNoDesaturate the output, 0 (full color, default) to 100 (fully grayscale).
lazy_loadNoScroll through the whole page first so lazy-loaded images and sections render. Default false.
longitudeNoLongitude reported by the browser Geolocation API.
save_pathNoOptional local path to also save the file to, e.g. './shots/home.png'. A directory path (ending in '/' or an existing directory) keeps the remote file name. Relative paths resolve against the MCP server's working directory.
adjust_topNoScroll the viewport down this many pixels before capture. Default 0. Not supported for PDFs.
user_agentNoCustom User-Agent string, e.g. a mobile Safari UA to get the mobile site.
bucket_nameNoBucket to use with byob when several are configured under the same service.
custom_htmlNoRaw HTML to render instead of loading a URL. Takes precedence over url. Inline CSS and JavaScript in the HTML are applied. Useful for pages that are not publicly reachable.
template_idNoID of a saved cookie template from the ScreenshotAPI dashboard to apply before navigation.
scroll_delayNoMilliseconds to wait between scroll steps when lazy_load is true. Default 500. High values on long pages can hit the timeout.
blur_selectorNoCSS selector(s) of elements to blur, comma-separated — for redacting emails, account numbers, or other sensitive data.
image_qualityNoJPEG compression quality 0-100 (jpg only). Default 80.
include_imageNoReturn the image inline in the tool result so you can see it. Default true, or false when full_page is true. Images above SCREENSHOTAPI_MAX_INLINE_IMAGE_BYTES (default 3500000 bytes) are returned as a URL only.
enable_cachingNoStore this capture in the cache for reuse. Cached captures served later (with fresh=false) do not consume credits. Default false.
wait_for_eventNoPage lifecycle event to wait for before capture. 'load' (default) waits for all resources; 'domcontentloaded' is faster but may miss images; 'networkidle' waits until no network requests for 500ms — best for SPAs and dashboards.
click_recursionNoHow many times to click selector_to_click in sequence. Requires selector_to_click. Default 0.
omit_backgroundNoMake plain white/solid page backgrounds transparent (png only). Default false.
remove_selectorNoCSS selector(s) of elements to remove from the page before capture, comma-separated, e.g. '.ad-banner, #sidebar'. Non-matching selectors are ignored.
storage_serviceNoStorage service to use with byob when several are configured: 'aws', 'wasabi', or 'google_cloud'.
thumbnail_widthNoResize the output to this width in pixels, keeping the aspect ratio. Handy for previews and to keep inline images small.
accept_languagesNoAccept-Language header for localized content, e.g. 'fr-FR,fr;q=0.9'. Default 'en-US,en;q=0.8'.
enable_incognitoNoRender in an isolated incognito session with no persisted cookies or storage. Default false.
result_file_nameNoCustom file name for the stored output. Non-unique names can overwrite earlier files.
scroll_to_elementNoCSS selector of an element to scroll into view before a viewport capture.
selector_to_clickNoCSS selector of an element to click before capture, e.g. to open a tab, dropdown, or accordion.
block_specific_requestsNoSpecific request URLs or patterns to block, separated by commas, spaces, or newlines, e.g. 'https://example.com/api/data, https://ads-domain.com'.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that each call consumes one screenshot credit, that cached captures are free, and that a URL is always returned even when inline rendering is suppressed. It omits auth/prerequisite needs and timeout/error behavior, keeping it short of 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?

Three sentences, front-loaded with the core action and return value; the long capability clause is dense but justified for a 51-parameter tool. The middle sentence is a borderline run-on list, which costs a point but costs little comprehension.

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, but the description states what is returned (hosted URL, conditional inline image) and the cost model, covering the essentials for a 51-param, zero-required-parameter tool. Multi-size output (sizes array, one image per size, no inline) is only documented in the schema, leaving a small 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%, so the schema already documents all 51 parameters including enum values and examples; baseline is 3. The description's capability enumeration (selector, clip, retina, blocking, injection, cookies, proxy, geolocation) helps an agent know what surface exists without scanning 51 fields, but adds no syntax or defaults beyond the schema.

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?

Specific verb + resource ("Captures a screenshot of a web page (or of raw HTML) in a real browser") plus what it returns ("hosted image URL"). The raw-HTML variant and the capture modes make it clearly distinct from scrape_page, generate_pdf, and record_scrolling_video.

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?

Explains the default inline-render behavior and the full_page exception with the include_image=true override, which is exactly the kind of when-to-use nuance an agent needs. It stops short of explicitly excluding siblings (e.g., 'for PDFs use generate_pdf' lives only in the schema), so no explicit alternative routing in the description.

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. 8 tool updatesv1.0.2
    • First observedbulk_screenshots
    • First observedbulk_screenshots_csv
    • First observeddownload_bulk_results
    • First observedgenerate_pdf
    • First observedget_bulk_status
    • First observedrecord_scrolling_video
    • First observedscrape_page
    • First observedtake_screenshot

TDQS

A4.1/5.0

Scored across 8 tools

Disambiguation4/5

Tools map cleanly to distinct output types and stages: single screenshot, PDF, scrape, video, and bulk job submit/status/download. The only real overlap is bulk_screenshots vs bulk_screenshots_csv, which both start bulk jobs but differ by input format; descriptions clarify this.

Naming Consistency4/5

Six of eight tools follow a clear verb_noun pattern (take_screenshot, generate_pdf, scrape_page, record_scrolling_video, download_bulk_results, get_bulk_status). The two bulk submission tools are noun phrases (bulk_screenshots, bulk_screenshots_csv), a minor deviation; all names use consistent snake_case.

Tool Count5/5

Eight tools is well within the ideal 3-15 range for this server's purpose. Each tool covers a distinct capability—screenshot, PDF, scrape, video, bulk JSON/CSV submission, status polling, and result download—with no obvious padding.

Completeness4/5

The surface covers the core capture types plus a full bulk lifecycle: submit, poll status, and download results. Minor gaps remain—no cancel/delete bulk job, no account/credit check, and no job listing—but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    An MCP server that enables capturing website screenshots with full-page, element-specific, and device-responsive capabilities through natural language commands.
    3
    22 npm
    62
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for the SnapAPI web capture API. Take screenshots, scrape pages, extract structured data, generate PDFs, record videos, and run AI analysis on any URL — all from Claude, Cursor, VS Code, or any MCP client. 9 tools, 30+ device presets, ad/cookie blocking. Install: npx snapapi-mcp
    9
    6 npm
    MIT