Skip to main content
Glama

tidewell/website-screenshot-pdf

tidewell--website-screenshot-pdf
Destructive

This tool calls the Actor "tidewell/website-screenshot-pdf" and retrieves its output results. Actor description: Returns a public file URL plus page title, HTTP status, size and timings for each screenshot (PNG, JPEG, WebP) or PDF of a URL, taken in Chrome on desktop, tablet or mobile. Full page or viewport, cookie banners rejected, ads blocked, element capture. $2 per 1,000 screenshots; failures are free.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "tidewell--website-screenshot-pdf"
  }
}

Input Schema

NameRequiredDescriptionDefault
htmlNoOptional raw HTML to render as an extra capture (HTML to image / HTML to PDF). Relative links won't resolve; use absolute URLs for images and CSS.
urlsNoPages to capture, one per line. 'https://' is added when missing. Duplicates are removed. Each URL is captured once per device below. Example values: ["https://apify.com","https://en.wikipedia.org/wiki/Web_scraping"]
formatNoPNG is lossless, JPEG and WebP are smaller (use Quality). PDF renders the page as a printable document (see the PDF section). Example values: "png"png
delayMsNoWait this long after everything else, just before the capture. Helps with animations and late widgets. Example values: 500
devicesNoCapture every URL on each selected device. Desktop 1920x1080, Laptop 1366x768, Tablet (iPad Air) 820x1180 @2x, Mobile (iPhone 15) 393x852 @2x, Android (Pixel 9) 412x915 @2x. 'Custom' uses the viewport width and height below. Each device is one charged capture. Example values: ["desktop","mobile"]
qualityNo1-100. Ignored for PNG and PDF. Example values: 80
blockAdsNoBlocks requests to ~150 ad, analytics and tracking networks and collapses common ad slots. Faster captures, cleaner pages.
customJsNoRuns in the page before the capture, as the body of an async function (await works). Example: document.querySelector('#tab-2').click(); await new Promise(r => setTimeout(r, 500));
darkModeNoEmulate prefers-color-scheme: dark. Only sites that support dark mode change.
fullPageNoCapture the whole scrollable page. Off captures only the visible viewport (above the fold). Example values: true
pdfScaleNoZoom of the rendered page, 0.1-2. Example values: 1
selectorNoCapture just the first visible element matching this selector, e.g. '#pricing' or 'main article'. The capture fails (free) if no element matches. Images only.
waitSecsNoMax seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget.
customCssNoInjected into the page before the capture, e.g. 'header { position: static !important; }'.
maxHeightNoFull-page screenshots of endless pages are cut at this height (CSS pixels), with a warning in the row. Example values: 20000
pdfFormatNo'Single long page' puts the whole page on one tall page, exactly as it looks on screen (up to 200 inches). Example values: "A4"A4
pdfMarginNoSame margin on all sides, with a unit: px, mm, cm or in, e.g. '10mm' or '0.5in'. 0 for none. Example values: "10mm"10mm
userAgentNoOverride the device's user agent. Leave empty for a normal Chrome (or iPhone / iPad / Android) user agent.
waitUntilNo'Load' suits most sites. 'Network idle' waits until no requests for 500 ms (best for SPAs and charts; capped at 20 s, then captured anyway). 'DOM ready' is fastest. Example values: "load"load
maxRetriesNoRetries for timeouts, connection errors and HTTP 429/5xx. Retries are free. Example values: 1
pdfLandscapeNoLandscape orientation.
pdfMediaTypeNo'Screen' renders the page as it looks in the browser. 'Print' uses the site's print stylesheet, if it has one. Example values: "screen"screen
hideSelectorsNoElements to remove before the capture, one selector per line, e.g. '#chat-widget', '.newsletter-popup'.
viewportWidthNo200-3840. Default for Custom: 1280.
maxConcurrencyNoHow many pages to capture at once. Also limited by memory (about 512 MB per page). Example values: 4
viewportHeightNo200-4320. Default for Custom: 800. For full-page captures this only affects the layout, not the image height.
waitForSelectorNoWait until an element matching this CSS selector is visible, e.g. '.chart canvas'. If it never appears the capture fails and is not charged.
captureErrorPagesNoBy default a page that answers 404, 500, 403 etc. is reported as failed and not charged. Turn on to capture (and pay for) error pages too.
deviceScaleFactorNoPixel density, 0.5-4. Leave empty for the device's own (desktop and laptop 1, tablet and phones 2). 3 matches a real iPhone. 2 gives a crisp retina image twice the width.
disableAnimationsNoStop CSS animations and transitions and ask for reduced motion, so captures are consistent. Example values: true
keyValueStoreNameNoLeave empty to use the run's own store. A named store (e.g. 'site-archive') keeps files beyond the data retention period and collects captures from many runs.
pdfPrintBackgroundNoInclude background colours and images (as on screen). Example values: true
proxyConfigurationNoOptional. Use Apify Proxy to capture pages as seen from another country, or when a site blocks datacenter traffic. Example values: {"useApifyProxy":false}
dismissCookieBannersNoBest effort: clicks 'Reject all' / 'Only necessary' on 25+ consent platforms (OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics, Google, Sourcepoint, TrustArc...) and in 14 languages. Never clicks 'Accept all'. If there is no reject button, the banner is hidden instead. Example values: true
navigationTimeoutSecsNoMaximum time for the page to load. If the page is usable when it runs out, it is captured anyway with a warning. Example values: 45
scrollToLoadLazyContentNoFor full-page captures and PDFs, scroll through the page first so lazy-loaded images and sections appear. Example values: true

Output Schema

NameRequiredDescriptionDefault
tipNoAdvisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key
runIdYesActor run ID
statsNoRun statistics
statusYesRun status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED
actorIdYesStable Apify Actor ID from the run record
summaryYesPast-tense summary of the run state
exitCodeNoActor process exit code; populated for terminal states (especially FAILED)
nextStepYesOne primary follow-up action with identifiers interpolated
storagesYesDataset and key-value store metadata, keyed by alias. "default" is always the primary entry.
actorNameNo"username/actor-name"
startedAtNoISO timestamp when the run started
finishedAtNoISO timestamp when the run finished (terminal states only)
statusMessageNoPass-through from Apify run.statusMessage
apifyConsoleUrlNoPersonalized Apify Console link to the run; present only for Console sessions

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / storages / properties / datasets / additionalProperties / properties / fields / description
      Previous value: -"Dataset field paths in dot notation (e.g. [\"metadata.url\"])"New value: +"Paths that work as a fields selection (e.g. [\"results\", \"metadata.url\"]); an array field appears by its top-level name."
    • changedOutput schema / properties / storages / properties / datasets / properties / default / properties / fields / description
      Previous value: -"Dataset field paths in dot notation (e.g. [\"metadata.url\"])"New value: +"Paths that work as a fields selection (e.g. [\"results\", \"metadata.url\"]); an array field appears by its top-level name."
  2. Changed1 schema field changed
    • addedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / cookieBanner / properties / hidden
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  3. First observed

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare openWorldHint=true and destructiveHint=true, so the safety bar is lower, yet the description still adds material context: it is a paid operation ($2 per 1,000 screenshots) with failures free, it performs consent-banner rejection and ad blocking, and it discloses the returned fields. That cost and side-effect profile is precisely what justifies the destructive hint. It does not mention that runs are asynchronous with a 30s default cap, but that is covered in 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?

Two sentences with almost no waste; the second sentence is dense but information-bearing, packing formats, devices, feature toggles and pricing. The boilerplate first sentence about calling an Actor and retrieving results could be dropped without loss. It is front-loaded with the resource and immediately followed by the concrete outputs.

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 36-parameter, open-world capture tool with an output schema and full schema descriptions, the description covers purpose, output shape, cost model and key behavioral toggles – enough to decide and invoke. The remaining gap is orchestration: it never says the run may return early with a status and nextStep to poll, which is only discoverable by reading the waitSecs parameter.

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

Parameters3/5

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

Schema description coverage is 100% across all 36 parameters, including enums and nested proxy config, so the schema carries the parameter burden. The description itself adds no per-parameter meaning beyond 'full page or viewport, cookie banners rejected, ads blocked, element capture', which merely previews a few settings. Baseline 3 is the correct ceiling here.

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 pairs a specific verb ('calls the Actor ... and retrieves its output results') with a clearly named resource and then enumerates the output form – screenshots in PNG/JPEG/WebP or PDF, plus URL, title, status, size and timings. An agent can tell exactly what it gets back. The opening clause is wrapper boilerplate ('calls the Actor X'), and it never contrasts itself with siblings such as get-dataset-items, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance in the description body: nothing says to prefer this over fetching raw HTML or over reusing an existing run, and no alternative tools are named. The only routing hint ('follow nextStep to poll via get-actor-run') lives inside the waitSecs parameter description rather than in the tool description, so it does not count toward the top-level guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources