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" }
}
}
}
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
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
pip install site-shot
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)
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)
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)