Skip to main content
Glama

Convert a web page or HTML to PDF

generate_pdf

Convert any URL or raw HTML into a hosted PDF using a real browser. Set paper size, orientation, and page ranges to turn web pages into printable documents.

Instructions

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.

Input Schema

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'.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv1.0.2

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.