screenshotapi-mcp
OfficialScreenshotAPI MCP Server
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 |
|
Transport |
|
Node.js |
|
Quick Start
Sign up for ScreenshotAPI and copy your API key from the dashboard.
Cursor users can install in one click:
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>"
}
}
}
}Restart your client.
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
npxavailable in your terminalA 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/mcpStart a new Claude Code session after adding the server.
Cursor
One-click install:
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 listStart 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 |
|
Screenshot stripe.com on an iPhone-sized screen in dark mode |
|
Capture the full page of https://news.ycombinator.com without ads |
|
Save https://example.com/invoice as an A4 PDF to ./invoice.pdf |
|
Read https://react.dev/learn and summarize it |
|
Make a 10-second scrolling GIF of https://apple.com |
|
Screenshot these 5 competitor homepages |
|
Is bulk job 1f2e... done yet? |
|
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 |
|
Timing |
|
Page manipulation |
|
Blocking |
|
Emulation |
|
Caching |
|
Storage |
|
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 |
| One of | URL to capture |
| One of | Raw HTML to render instead of a URL |
| No |
|
| No | Capture the whole scrollable page. Default |
| No | 2x pixel density. Default |
| No | JPEG quality 0-100. Default 80 |
| No | Transparent background for plain-background pages (PNG only) |
| No | Resize output to this width, keeping aspect ratio |
| No | Capture a single element by CSS selector |
| No | Capture a rectangle: |
| No | Capture at several viewport sizes in one request: |
| No | Return the image inline. Default |
| 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 |
| One of | URL to convert |
| One of | Raw HTML to convert |
| No |
|
| No | Landscape orientation. Default |
| No | Keep only these pages, e.g. |
| No | Include background colors and images |
| No |
|
| 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 |
| One of | URL to scrape |
| One of | Raw HTML to process |
| No | Any of |
| No | Return extracted contents inline. Default |
| 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 |
| One of | URL to record |
| One of | Raw HTML to record |
| No |
|
| No |
|
| No | Seconds, 0-60 |
| No | Scroll back to the top at the end |
| No | Start recording before the page finishes loading |
| No | Record the viewport for |
| No | Record at several viewport sizes: |
| 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 |
| Yes |
|
| 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 |
| One of | Path to a local CSV file |
| 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 |
| 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 |
| Yes | Job uuid |
Prompt Examples
Screenshots
Take a screenshot of https://linear.app
Screenshot https://github.com on a 390px-wide mobile viewport in dark mode.
Capture the full page of https://vercel.com/pricing with ads and cookie banners blocked.
Grab just the pricing table on https://example.com/pricing (selector
#pricing).Screenshot our staging site and blur anything with the class
.user-email.Show me how https://www.bbc.com looks from Germany in German.
PDFs
Convert https://example.com/report to an A4 landscape PDF and save it to ./report.pdf.
Turn this HTML invoice into a Letter-size PDF.
Export only pages 2-4 of https://docs.example.com/guide as a PDF.
Scraping
Read https://react.dev/learn and give me the key points.
Get the rendered HTML of https://example.com after JavaScript runs.
List every image URL on https://unsplash.com.
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 |
| Too many redirects on the target URL |
| Invalid parameters (URL, file type, proxy, geolocation, CSS/JS URL, clip, template) or target SSL problems |
| Missing or invalid |
| Service paused for unpaid dues or usage over twice the plan quota |
| Screenshot quota used up, trial expired, or target refused the connection |
| Account is not on a plan or trial |
| Proxy tunnel connection failed |
| Page took too long to render |
| Too many requests per minute |
| Target site closed the connection or returned nothing |
| Target site SSL/TLS version or cipher mismatch |
| This server stopped waiting for the API (see |
| ScreenshotAPI internal error, safe to retry |
| Server could not reach ScreenshotAPI |
| 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:
Your MCP client starts the server process via
npx.The client reads the tool list.
When a prompt matches a tool, the client calls it.
The server validates inputs, calls ScreenshotAPI with
output=json, and returns structured JSON with the hosted file URL.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 |
| Yes | Your ScreenshotAPI API key | |
| No |
| Upstream request timeout in ms |
| No |
| 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 buildRun it directly:
SCREENSHOTAPI_TOKEN=<YOUR_KEY> node dist/cli.jsInspect with the MCP Inspector:
SCREENSHOTAPI_TOKEN=<YOUR_KEY> npx @modelcontextprotocol/inspector node dist/cli.jsTroubleshooting
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.
Links
License
Available Tools
8 toolsbulk_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.
| Name | Required | Description | Default |
|---|---|---|---|
| defaults | No | Options applied to every entry, e.g. {file_type:'png', width:1440, height:900, no_cookie_banners:true}. | |
| screenshots | Yes | Entries to capture, e.g. [{url:'https://a.com'},{url:'https://b.com',full_page:true}]. Max 50. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| csv_path | No | Path to a local CSV file. | |
| csv_content | No | CSV text, e.g. 'url,file_type\nhttps://a.com,png\nhttps://b.com,jpg'. Used when csv_path is not given. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Job uuid returned when the bulk job was submitted. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| js | No | JavaScript executed in the page before capture, e.g. "document.querySelector('.popup').remove();". | |
| css | No | CSS injected before capture, e.g. '.header { display: none; }'. | |
| ttl | No | Cache lifetime in seconds when enable_caching is true. Default 2592000 (30 days). | |
| url | No | Website URL to render, including the protocol, e.g. 'https://example.com'. Either url or custom_html is required. | |
| byob | No | Save the output to your own bucket configured under Storage Integrations in the dashboard (Bring Your Own Bucket). Default false. | |
| block | No | Resources 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. | |
| delay | No | Extra wait in milliseconds after the page loads, before capture. Default 0. Use 1000-5000 for animations, charts, or late-loading content. | |
| fresh | No | true (default) always renders a new capture; false returns a cached capture when one exists from a request with enable_caching=true and identical parameters. | |
| media | No | CSS media type to emulate: 'print' uses the site's print stylesheet, 'screen' matches what a visitor sees. | |
| proxy | No | Proxy 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. | |
| width | No | Browser viewport width in pixels (max 7680). Default 1680. Use ~390 to emulate a phone, ~768 for a tablet. | |
| format | No | Paper size. A4 or Letter for documents and invoices. Omit for a single continuous page. | |
| height | No | Browser viewport height in pixels (max 4320). Default 876. | |
| js_url | No | URL of an external JavaScript file to execute before capture. | |
| cookies | No | Cookies to set before loading, as 'name=value; other=value;'. Use for pages behind a login. | |
| css_url | No | URL of an external stylesheet to inject before capture. | |
| headers | No | Extra HTTP headers as 'Name: value;' pairs separated by semicolons, e.g. 'Authorization: Bearer abc; X-Test: 1;'. | |
| timeout | No | Maximum milliseconds the API waits for the page to load before aborting. Default 100000. | |
| latitude | No | Latitude reported by the browser Geolocation API. | |
| timezone | No | IANA timezone to emulate, e.g. 'America/New_York', 'Asia/Karachi'. Default is the server timezone. | |
| dark_mode | No | Render with the dark color scheme (for sites that support it). Default false. | |
| grayscale | No | Desaturate the output, 0 (full color, default) to 100 (fully grayscale). | |
| landscape | No | Landscape orientation — good for wide tables and dashboards. Default false (portrait). | |
| lazy_load | No | Scroll through the whole page first so lazy-loaded images and sections render. Default false. | |
| longitude | No | Longitude reported by the browser Geolocation API. | |
| save_path | No | Optional 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_top | No | Scroll the viewport down this many pixels before capture. Default 0. Not supported for PDFs. | |
| page_range | No | Keep only these pages, as 'start-end', e.g. '1-3' or '5-5'. Needs a paginated PDF (format or width/height). | |
| user_agent | No | Custom User-Agent string, e.g. a mobile Safari UA to get the mobile site. | |
| bucket_name | No | Bucket to use with byob when several are configured under the same service. | |
| custom_html | No | Raw 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_id | No | ID of a saved cookie template from the ScreenshotAPI dashboard to apply before navigation. | |
| scroll_delay | No | Milliseconds to wait between scroll steps when lazy_load is true. Default 500. High values on long pages can hit the timeout. | |
| blur_selector | No | CSS selector(s) of elements to blur, comma-separated — for redacting emails, account numbers, or other sensitive data. | |
| enable_caching | No | Store this capture in the cache for reuse. Cached captures served later (with fresh=false) do not consume credits. Default false. | |
| wait_for_event | No | Page 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_recursion | No | How many times to click selector_to_click in sequence. Requires selector_to_click. Default 0. | |
| remove_selector | No | CSS selector(s) of elements to remove from the page before capture, comma-separated, e.g. '.ad-banner, #sidebar'. Non-matching selectors are ignored. | |
| storage_service | No | Storage service to use with byob when several are configured: 'aws', 'wasabi', or 'google_cloud'. | |
| accept_languages | No | Accept-Language header for localized content, e.g. 'fr-FR,fr;q=0.9'. Default 'en-US,en;q=0.8'. | |
| enable_incognito | No | Render in an isolated incognito session with no persisted cookies or storage. Default false. | |
| print_background | No | Include background colors and images in the PDF. | |
| result_file_name | No | Custom file name for the stored output. Non-unique names can overwrite earlier files. | |
| scroll_to_element | No | CSS selector of an element to scroll into view before a viewport capture. | |
| selector_to_click | No | CSS selector of an element to click before capture, e.g. to open a tab, dropdown, or accordion. | |
| block_specific_requests | No | Specific request URLs or patterns to block, separated by commas, spaces, or newlines, e.g. 'https://example.com/api/data, https://ads-domain.com'. |
TDQS
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.
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.
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.
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.
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.
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%.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Job uuid returned when the bulk job was submitted. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| js | No | JavaScript executed in the page before capture, e.g. "document.querySelector('.popup').remove();". | |
| css | No | CSS injected before capture, e.g. '.header { display: none; }'. | |
| url | No | Website URL to render, including the protocol, e.g. 'https://example.com'. Either url or custom_html is required. | |
| block | No | Resources 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. | |
| delay | No | Extra wait in milliseconds after the page loads, before capture. Default 0. Use 1000-5000 for animations, charts, or late-loading content. | |
| proxy | No | Proxy 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. | |
| sizes | No | Record one video per viewport size, e.g. [{width:1920,height:1080},{width:390,height:844}]. Overrides width/height. | |
| video | No | Record the visible viewport for 'duration' seconds without scrolling. Default false. | |
| width | No | Browser viewport width in pixels (max 7680). Default 1680. Use ~390 to emulate a phone, ~768 for a tablet. | |
| height | No | Browser viewport height in pixels (max 4320). Default 876. | |
| js_url | No | URL of an external JavaScript file to execute before capture. | |
| cookies | No | Cookies to set before loading, as 'name=value; other=value;'. Use for pages behind a login. | |
| css_url | No | URL of an external stylesheet to inject before capture. | |
| headers | No | Extra HTTP headers as 'Name: value;' pairs separated by semicolons, e.g. 'Authorization: Bearer abc; X-Test: 1;'. | |
| timeout | No | Maximum milliseconds the API waits for the page to load before aborting. Default 100000. | |
| duration | No | How long the scrolling (or viewport recording) lasts, in seconds, 0-60. | |
| latitude | No | Latitude reported by the browser Geolocation API. | |
| timezone | No | IANA timezone to emulate, e.g. 'America/New_York', 'Asia/Karachi'. Default is the server timezone. | |
| dark_mode | No | Render with the dark color scheme (for sites that support it). Default false. | |
| file_type | No | Video format. Default mp4. gif loops and has no sound; webm is smaller. | |
| grayscale | No | Desaturate the output, 0 (full color, default) to 100 (fully grayscale). | |
| lazy_load | No | Scroll through the whole page first so lazy-loaded images and sections render. Default false. | |
| longitude | No | Longitude reported by the browser Geolocation API. | |
| save_path | No | Optional local path to save the video to (ignored when 'sizes' is used, since that returns several files). | |
| adjust_top | No | Scroll the viewport down this many pixels before capture. Default 0. Not supported for PDFs. | |
| user_agent | No | Custom User-Agent string, e.g. a mobile Safari UA to get the mobile site. | |
| custom_html | No | Raw 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_back | No | Scroll back up to the top after reaching the bottom. Default false. | |
| template_id | No | ID of a saved cookie template from the ScreenshotAPI dashboard to apply before navigation. | |
| scroll_delay | No | Milliseconds to wait between scroll steps when lazy_load is true. Default 500. High values on long pages can hit the timeout. | |
| scroll_speed | No | Scrolling speed. Default normal. | |
| blur_selector | No | CSS selector(s) of elements to blur, comma-separated — for redacting emails, account numbers, or other sensitive data. | |
| wait_for_event | No | Page 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_recursion | No | How many times to click selector_to_click in sequence. Requires selector_to_click. Default 0. | |
| remove_selector | No | CSS selector(s) of elements to remove from the page before capture, comma-separated, e.g. '.ad-banner, #sidebar'. Non-matching selectors are ignored. | |
| accept_languages | No | Accept-Language header for localized content, e.g. 'fr-FR,fr;q=0.9'. Default 'en-US,en;q=0.8'. | |
| enable_incognito | No | Render in an isolated incognito session with no persisted cookies or storage. Default false. | |
| scroll_to_element | No | CSS selector of an element to scroll into view before a viewport capture. | |
| selector_to_click | No | CSS selector of an element to click before capture, e.g. to open a tab, dropdown, or accordion. | |
| start_immediately | No | Start recording as soon as navigation begins instead of after load, to capture the page loading. Default false. | |
| block_specific_requests | No | Specific request URLs or patterns to block, separated by commas, spaces, or newlines, e.g. 'https://example.com/api/data, https://ads-domain.com'. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| js | No | JavaScript executed in the page before capture, e.g. "document.querySelector('.popup').remove();". | |
| css | No | CSS injected before capture, e.g. '.header { display: none; }'. | |
| url | No | Website URL to render, including the protocol, e.g. 'https://example.com'. Either url or custom_html is required. | |
| block | No | Resources 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. | |
| delay | No | Extra wait in milliseconds after the page loads, before capture. Default 0. Use 1000-5000 for animations, charts, or late-loading content. | |
| proxy | No | Proxy 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. | |
| width | No | Browser viewport width in pixels (max 7680). Default 1680. Use ~390 to emulate a phone, ~768 for a tablet. | |
| height | No | Browser viewport height in pixels (max 4320). Default 876. | |
| js_url | No | URL of an external JavaScript file to execute before capture. | |
| cookies | No | Cookies to set before loading, as 'name=value; other=value;'. Use for pages behind a login. | |
| css_url | No | URL of an external stylesheet to inject before capture. | |
| extract | No | What to extract. Default ['markdown']. Options: markdown, text, html, image_urls. | |
| headers | No | Extra HTTP headers as 'Name: value;' pairs separated by semicolons, e.g. 'Authorization: Bearer abc; X-Test: 1;'. | |
| timeout | No | Maximum milliseconds the API waits for the page to load before aborting. Default 100000. | |
| latitude | No | Latitude reported by the browser Geolocation API. | |
| timezone | No | IANA timezone to emulate, e.g. 'America/New_York', 'Asia/Karachi'. Default is the server timezone. | |
| dark_mode | No | Render with the dark color scheme (for sites that support it). Default false. | |
| grayscale | No | Desaturate the output, 0 (full color, default) to 100 (fully grayscale). | |
| lazy_load | No | Scroll through the whole page first so lazy-loaded images and sections render. Default false. | |
| longitude | No | Longitude reported by the browser Geolocation API. | |
| adjust_top | No | Scroll the viewport down this many pixels before capture. Default 0. Not supported for PDFs. | |
| user_agent | No | Custom User-Agent string, e.g. a mobile Safari UA to get the mobile site. | |
| custom_html | No | Raw 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_id | No | ID of a saved cookie template from the ScreenshotAPI dashboard to apply before navigation. | |
| scroll_delay | No | Milliseconds to wait between scroll steps when lazy_load is true. Default 500. High values on long pages can hit the timeout. | |
| blur_selector | No | CSS selector(s) of elements to blur, comma-separated — for redacting emails, account numbers, or other sensitive data. | |
| wait_for_event | No | Page 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_recursion | No | How many times to click selector_to_click in sequence. Requires selector_to_click. Default 0. | |
| include_content | No | Fetch the extracted files and return their contents inline. Default true. false returns only the file URLs. | |
| remove_selector | No | CSS selector(s) of elements to remove from the page before capture, comma-separated, e.g. '.ad-banner, #sidebar'. Non-matching selectors are ignored. | |
| accept_languages | No | Accept-Language header for localized content, e.g. 'fr-FR,fr;q=0.9'. Default 'en-US,en;q=0.8'. | |
| enable_incognito | No | Render in an isolated incognito session with no persisted cookies or storage. Default false. | |
| max_content_chars | No | Truncate each extracted file to this many characters. Default 50000. | |
| scroll_to_element | No | CSS selector of an element to scroll into view before a viewport capture. | |
| selector_to_click | No | CSS selector of an element to click before capture, e.g. to open a tab, dropdown, or accordion. | |
| block_specific_requests | No | Specific request URLs or patterns to block, separated by commas, spaces, or newlines, e.g. 'https://example.com/api/data, https://ads-domain.com'. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| js | No | JavaScript executed in the page before capture, e.g. "document.querySelector('.popup').remove();". | |
| css | No | CSS injected before capture, e.g. '.header { display: none; }'. | |
| ttl | No | Cache lifetime in seconds when enable_caching is true. Default 2592000 (30 days). | |
| url | No | Website URL to render, including the protocol, e.g. 'https://example.com'. Either url or custom_html is required. | |
| byob | No | Save the output to your own bucket configured under Storage Integrations in the dashboard (Bring Your Own Bucket). Default false. | |
| clip | No | Capture only this rectangle of the page. | |
| block | No | Resources 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. | |
| delay | No | Extra wait in milliseconds after the page loads, before capture. Default 0. Use 1000-5000 for animations, charts, or late-loading content. | |
| fresh | No | true (default) always renders a new capture; false returns a cached capture when one exists from a request with enable_caching=true and identical parameters. | |
| proxy | No | Proxy 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. | |
| sizes | No | Capture 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. | |
| width | No | Browser viewport width in pixels (max 7680). Default 1680. Use ~390 to emulate a phone, ~768 for a tablet. | |
| height | No | Browser viewport height in pixels (max 4320). Default 876. | |
| js_url | No | URL of an external JavaScript file to execute before capture. | |
| retina | No | Render at 2x pixel density for a sharper, larger image. Default false. | |
| cookies | No | Cookies to set before loading, as 'name=value; other=value;'. Use for pages behind a login. | |
| css_url | No | URL of an external stylesheet to inject before capture. | |
| headers | No | Extra HTTP headers as 'Name: value;' pairs separated by semicolons, e.g. 'Authorization: Bearer abc; X-Test: 1;'. | |
| timeout | No | Maximum milliseconds the API waits for the page to load before aborting. Default 100000. | |
| latitude | No | Latitude reported by the browser Geolocation API. | |
| selector | No | CSS selector of a single element to capture instead of the viewport, e.g. '#pricing' or '.product-card'. | |
| timezone | No | IANA timezone to emulate, e.g. 'America/New_York', 'Asia/Karachi'. Default is the server timezone. | |
| dark_mode | No | Render with the dark color scheme (for sites that support it). Default false. | |
| file_type | No | Image format. Default png. jpg is smallest (see image_quality); webp balances size and quality. For PDF use generate_pdf. | |
| full_page | No | Capture the entire scrollable page instead of just the viewport. Default false. Combine with lazy_load for pages with lazy images. | |
| grayscale | No | Desaturate the output, 0 (full color, default) to 100 (fully grayscale). | |
| lazy_load | No | Scroll through the whole page first so lazy-loaded images and sections render. Default false. | |
| longitude | No | Longitude reported by the browser Geolocation API. | |
| save_path | No | Optional 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_top | No | Scroll the viewport down this many pixels before capture. Default 0. Not supported for PDFs. | |
| user_agent | No | Custom User-Agent string, e.g. a mobile Safari UA to get the mobile site. | |
| bucket_name | No | Bucket to use with byob when several are configured under the same service. | |
| custom_html | No | Raw 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_id | No | ID of a saved cookie template from the ScreenshotAPI dashboard to apply before navigation. | |
| scroll_delay | No | Milliseconds to wait between scroll steps when lazy_load is true. Default 500. High values on long pages can hit the timeout. | |
| blur_selector | No | CSS selector(s) of elements to blur, comma-separated — for redacting emails, account numbers, or other sensitive data. | |
| image_quality | No | JPEG compression quality 0-100 (jpg only). Default 80. | |
| include_image | No | Return 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_caching | No | Store this capture in the cache for reuse. Cached captures served later (with fresh=false) do not consume credits. Default false. | |
| wait_for_event | No | Page 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_recursion | No | How many times to click selector_to_click in sequence. Requires selector_to_click. Default 0. | |
| omit_background | No | Make plain white/solid page backgrounds transparent (png only). Default false. | |
| remove_selector | No | CSS selector(s) of elements to remove from the page before capture, comma-separated, e.g. '.ad-banner, #sidebar'. Non-matching selectors are ignored. | |
| storage_service | No | Storage service to use with byob when several are configured: 'aws', 'wasabi', or 'google_cloud'. | |
| thumbnail_width | No | Resize the output to this width in pixels, keeping the aspect ratio. Handy for previews and to keep inline images small. | |
| accept_languages | No | Accept-Language header for localized content, e.g. 'fr-FR,fr;q=0.9'. Default 'en-US,en;q=0.8'. | |
| enable_incognito | No | Render in an isolated incognito session with no persisted cookies or storage. Default false. | |
| result_file_name | No | Custom file name for the stored output. Non-unique names can overwrite earlier files. | |
| scroll_to_element | No | CSS selector of an element to scroll into view before a viewport capture. | |
| selector_to_click | No | CSS selector of an element to click before capture, e.g. to open a tab, dropdown, or accordion. | |
| block_specific_requests | No | Specific request URLs or patterns to block, separated by commas, spaces, or newlines, e.g. 'https://example.com/api/data, https://ads-domain.com'. |
TDQS
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.
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.
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.
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.
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.
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.
8 tool updates
v1.0.2- First observed
bulk_screenshots - First observed
bulk_screenshots_csv - First observed
download_bulk_results - First observed
generate_pdf - First observed
get_bulk_status - First observed
record_scrolling_video - First observed
scrape_page - First observed
take_screenshot
TDQS
Scored across 8 tools
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.
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.
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.
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
Related MCP Connectors
Official MCP server for twitterapis.com. Read and write Twitter/X: search, users, tweets, DMs.
Web scraping MCP server — scrape, extract structured data, screenshot any site with anti-bot bypass.
12Official MCP server for Softhills 3D/2D Visualization SDKs, API documentation, and code examples.
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Related MCP Servers
- AlicenseBqualityBmaintenanceAn official MCP server implementation that allows AI assistants to capture website screenshots through the ScreenshotOne API, enabling visual context from web pages during conversations.122 npm38MIT
- AlicenseBqualityCmaintenanceAn MCP server that enables capturing website screenshots with full-page, element-specific, and device-responsive capabilities through natural language commands.322 npm62MIT
- AlicenseAqualityBmaintenanceMCP server for the OpenGraph.io API -- extract OG metadata, capture screenshots, scrape pages, query sites with AI, and generate branded images with iterative refinement.10325 npm2ISC
- AlicenseAqualityDmaintenanceMCP 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-mcp96 npmMIT