---
title: "Screenshot MCP Server for Claude, Cursor & AI Agents | ScreenshotAPI"
slug: "/integrations/mcp-server"
description: "The official ScreenshotAPI MCP server gives Claude, Cursor, VS Code, and any MCP client 8 tools for website screenshots, URL to PDF, scrolling videos, and web scraping."
---

# 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`

[Get a Free API Key](https://app.screenshotapi.net/)

[View on GitHub](https://github.com/Screenshot-API/screenshot-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

*   Claude Desktop
*   Claude Code
*   Cursor
*   Windsurf
*   VS Code
*   Cline
*   Codex CLI

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

*   ### It sees what it captured
    
    Screenshots come back to the model as an image, not just a link, so it can describe the page, spot a broken layout, or compare two versions.
    
*   ### Errors it can explain
    
    A failed call returns a guidance field next to the error code, so the assistant tells you what to fix instead of repeating a status number.
    
*   ### Runs on your machine
    
    Your client starts the server with npx over stdio. The key stays in your local config and is stripped from every response before the model sees it.
    

## 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
    

## 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](https://app.screenshotapi.net/) 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”calls`take_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.

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

#Tool and what it doesEndpoint

*   01
    
    ### 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
    
*   02
    
    ### 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
    
*   03
    
    ### 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
    
*   04
    
    ### 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
    
*   05
    
    ### 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
    
*   06
    
    ### 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
    
*   07
    
    ### get_bulk_status(uuid)
    
    Reports percent_complete, successful_urls, and failed_urls for a bulk job.
    
    GET/v1/bulk/csv/status
    
*   08
    
    ### 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

`width``height`

Timing

`delay``wait_for_event``lazy_load``scroll_delay``timeout`

Page manipulation

`css``js``remove_selector``blur_selector``selector_to_click``scroll_to_element`

Blocking

`block_js``block_specific_requests`

Emulation

`dark_mode``user_agent``headers``cookies``proxy``timezone`

Storage

`byob``storage_service``bucket_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 call`take_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
    

## 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](https://www.screenshotapi.net/docs/errors)

## 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](https://www.screenshotapi.net/help)
