Official MCP Server

Give your AI assistant eyes on the web

The ScreenshotAPI MCP server adds 8 tools to Claude, Cursor, VS Code, and any MCP client. Ask in plain English for a screenshot, a PDF, a scrolling video, or the rendered content of a page, and the model makes the API call for you.

$ npx -y @screenshotapinet/mcp
MCP tools
8
MCP tools
AI clients
7+
AI clients
URLs per bulk job
50
URLs per bulk job
Open source
MIT
Open source
Your AI assistant
screenshotapi

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

take_screenshot200
INPUT
url: "https://stripe.com"
width: 390
height: 844
dark_mode: true

Here is stripe.com at 390 x 844 in dark mode. The image came back inline, so I can check the layout for you.

Works in

Any stdio MCP client

Why it exists

Models can't open a browser. Now they can call one.

A language model only knows the web as it looked at training time, and most can't load a page that needs JavaScript. With the MCP server connected, the same question runs a real Chromium render and the answer is grounded in the page as it looks right now.

Without the server

Guess

“Does our pricing page look right on mobile?”

I can't browse the web or view live pages, so I can't check how your pricing page renders. You could open it in your browser's device mode and share a screenshot with me.

With ScreenshotAPI MCP

Rendered

“Does our pricing page look right on mobile?”

take_screenshot · width: 390

I captured it at 390px. The plan cards stack correctly, but the comparison table overflows to the right and the FAQ toggle sits under the cookie banner.

How it works

Five hops from question to capture

The server is a thin, typed layer over the ScreenshotAPI REST API. It validates input before spending a credit, then hands structured JSON back to the model. Very long inputs such as large custom_html are sent as a POST body so they never hit URL length limits.

  1. 1

    You ask

    “Save https://example.com as an A4 PDF”

  2. 2

    Client picks a tool

    generate_pdf format=A4

  3. 3

    Server calls the API

    GET /v3/screenshot output=json + token

  4. 4

    JSON comes back

    Hosted file URL, token stripped

  5. 5

    Model answers

    With the image or page content inline

Setup

Running in about two minutes

Add one config block to your MCP client. There is no repo to clone and nothing to build.

  • Node.js 18+
  • ScreenshotAPI API key
  • Any MCP client
  1. 01

    Get an API key

    Sign up free and copy the key from your dashboard.

  2. 02

    Add the server to your client

    Pick your client in the config panel and paste the block with your key.

  3. 03

    Restart the client

    MCP clients read their server list at startup.

  4. 04

    Ask for a screenshot

    “Take a screenshot of https://example.com”callstake_screenshot

Pick your client

Open Settings, then Developer, then Edit Config, and add the server to claude_desktop_config.json.

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

Restart Claude Desktop after saving.

Tool reference

Eight tools, one per job

Every tool wraps a ScreenshotAPI endpoint. The four render tools take either a url or custom_html, so the assistant can also capture HTML it just wrote.

  • take_screenshot(url, full_page, selector, sizes, ...)

    Captures a page as PNG, JPG, or WebP and returns the hosted URL. The image also comes back inline, so the assistant can look at what it captured.

    GET/v3/screenshot
  • generate_pdf(url, format, landscape, page_range, ...)

    Turns a URL or raw HTML into a PDF. Pick A0 to A6, Letter, Legal, Tabloid, or Ledger, or leave format empty for one continuous page.

    GET/v3/screenshot
  • scrape_page(url, extract, max_content_chars, ...)

    Renders the page in a real browser so JavaScript runs first, then returns Markdown, text, HTML, or image URLs inline.

    GET/v3/screenshot
  • record_scrolling_video(url, file_type, scroll_speed, duration, ...)

    Records the browser scrolling down a page as MP4, WebM, or GIF, at up to 10 viewport sizes in one call.

    GET/v3/screenshot
  • bulk_screenshots(screenshots, defaults)

    Submits up to 50 URLs as one job, each with its own options, plus defaults shared by every entry.

    POST/v1/bulk/jsonPaid plans
  • bulk_screenshots_csv(csv_path, csv_content)

    Uploads a CSV with a url column. Every other column becomes a render option for that row.

    POST/v1/bulk/csvPaid plans
  • get_bulk_status(uuid)

    Reports percent_complete, successful_urls, and failed_urls for a bulk job.

    GET/v1/bulk/csv/status
  • download_bulk_results(uuid)

    Returns one row per URL with its status, screenshot link, and any error message.

    GET/v1/bulk/csv/download

Shared render options

take_screenshot, generate_pdf, scrape_page, and record_scrolling_video all accept the same page preparation options, so a prompt like “hide the cookie banner” works for every format.

Viewport
widthheight
Timing
delaywait_for_eventlazy_loadscroll_delaytimeout
Page manipulation
cssjsremove_selectorblur_selectorselector_to_clickscroll_to_element
Blocking
block_jsblock_specific_requests
Emulation
dark_modeuser_agentheaderscookiesproxytimezone
Storage
byobstorage_servicebucket_name

Try it

Plain English in, a real browser underneath

Pick a prompt to see which tool the client calls and what it sends to ScreenshotAPI. Exact wording of the reply depends on the model.

MCP client
screenshotapi connected

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

Tool calltake_screenshot
{
  "url": "https://stripe.com",
  "width": 390,
  "height": 844,
  "dark_mode": true
}

Hosted PNG URL, plus the image returned inline

AI

Here is stripe.com at 390px wide in dark mode. I can see the capture, so ask me what to check on it.

More prompts to try

Copy one and paste it into your client.

  • “Grab just the pricing table on https://example.com/pricing”

    take_screenshot

  • “Screenshot our staging site and blur anything with .user-email”

    take_screenshot

  • “Show me how https://www.bbc.com looks from Germany in German”

    take_screenshot

  • “Turn this HTML invoice into a Letter size PDF”

    generate_pdf

  • “Export only pages 2-4 of https://docs.example.com/guide as a PDF”

    generate_pdf

  • “List every image URL on https://unsplash.com”

    scrape_page

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

    record_scrolling_video

  • “What's the status of my bulk job? Download the results when done”

    get_bulk_status

Error handling

A failed call still tells the model what to do

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

400tool result · take_screenshot
{
  "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."           }

What your assistant says

Take a screenshot for me

AI

I need a page to capture. Send me a full URL such as https://example.com, or paste the HTML and I'll render that instead.

Built from the highlighted guidance line. Exact wording depends on the model.

  • 400Invalid URL, file type, clip, proxy, or other parameter
  • 401Missing or invalid SCREENSHOTAPI_TOKEN
  • 403Quota used up, trial expired, or target refused
  • 408Page took too long to render
  • 429Too many requests per minute
  • 444Target site closed the connection
  • 499This server stopped waiting for the API
  • 503API or target page temporarily unavailable
See every error code

Questions developers ask first

Short answers on cost, setup, API keys, and the most common capture problems.

Don't see your question here?

Browse all help articles

Ready to capture those screenshots?

Start with a free trial today.

Get Started