DEV Community

alekseykazandaev
alekseykazandaev

Posted on

Site-Shot in August: an MCP server, Node + Python SDKs, and scheduled captures

Three things shipped on Site-Shot in August that change how you wire website screenshots into an agent or a backend. Here is each one, with the code.

1. An official MCP server

If your agent runs in an MCP-capable client — Claude Desktop, Cursor, Cline, VS Code — it can take screenshots now without you writing an HTTP layer at all.

{
  "mcpServers": {
    "site-shot": {
      "command": "npx",
      "args": ["-y", "site-shot-mcp"],
      "env": { "SITESHOT_API_KEY": "YOUR_API_KEY" }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Restart the client, then ask it to "take a full-page screenshot of https://news.ycombinator.com".

Two tools ship: capture_screenshot and capture_full_page. block_ads and block_cookie_banners both default to true, which matters more than it sounds — a cookie wall covering the fold is simultaneously a useless image and a bill for vision tokens.

2. Node and Python SDKs

Both are zero-dependency and fully typed.

npm install site-shot-sdk
Enter fullscreen mode Exit fullscreen mode
import { SiteShot } from "site-shot-sdk";
import fs from "node:fs/promises";

const client = new SiteShot(process.env.SITESHOT_API_KEY);

const png = await client.capture({ url: "example.com", full_size: true });
await fs.writeFile("shot.png", png); // png is a Buffer
Enter fullscreen mode Exit fullscreen mode
pip install site-shot
Enter fullscreen mode Exit fullscreen mode
from site_shot import SiteShot

client = SiteShot()  # reads SITESHOT_API_KEY from the env

png = client.capture("example.com", full_size=True)  # png is bytes
with open("shot.png", "wb") as f:
    f.write(png)
Enter fullscreen mode Exit fullscreen mode

One capture concept, four return modes — you pick the method rather than a flag: capture() for bytes, captureToFile() / capture_to_file(), captureBase64() / capture_base64() for data URLs and LLM vision payloads, and captureJson() / capture_json() for the image plus metadata (add source_code and you get the rendered HTML alongside the pixels).

There is also buildUrl() / build_url(), which returns the request URL without executing it. It embeds your API key, and there is no signed-URL scheme — so it is for debugging and server-side proxying, never for an <img src>.

3. Scheduled captures

Point a schedule at a URL and it re-captures on a cadence, filing every shot in your library as a dated series. Finest cadence hourly, coarsest weekly. Every plan carries a weekly allowance — from 35 captures a week on the smallest plan to 12,000 a week on the largest — and each scheduled capture counts as one screenshot, like any other.

A schedule also compares each capture with the previous one and can email you when the changed share of the page crosses a threshold you set. Worth being precise about the boundaries, because "change detection" gets oversold:

  • it measures how much of the page moved, not what changed — there is no text or element diff;
  • email is the only destination, and alerts are deduped to at most one per schedule per day;
  • the soonest anything can reach you is the schedule's own cadence;
  • alerts stay off until you switch them on per schedule.

If you need element-level diffs or a ping within minutes, a dedicated change-detection service is the right tool. What this gives you instead is the comparable, timestamped series — what the page actually looked like before and after.

Geotargeting: 49 countries

Add country=DE and the render goes through a real IP in that country, with the language, time zone and geolocation defaults that belong to it. It takes an ISO 3166-1 alpha-2 code; full country names are not valid values.

png = client.capture("https://example.com/", country="DE", strict_country=True)
Enter fullscreen mode Exit fullscreen mode

strict_country is the part worth knowing about. Without it, an exhausted country pool quietly falls back to a US render and you get a screenshot that looks plausible and is wrong. With it, you get an in-band country_unavailable error instead — which is the failure you actually want, because a silently-wrong geo screenshot is undetectable downstream.

Where to start

The free browser tool at site-shot.com needs no signup. The API needs a key; plans start at $5/month for 2,000 screenshots. Agent-facing docs live at site-shot.com/ai-agents/.

Numbers here are current as of 2026-09-01 — the country count moves with verified proxy capacity, so check /countries/ for today's list.

Top comments (0)