Screenshot API
Pixel-perfect website screenshot service that captures any URL as PNG, JPEG, or PDF. Exposed as both a REST API (FastAPI) and an MCP server for use with Claude Desktop, Cursor, and other MCP-compatible clients. Uses Playwright with a pooled Chromium browser for fast, reliable rendering.
Quick Start
Docker (recommended)
docker-compose up -d
The API will be available at http://localhost:8500.
Local Development
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
bash setup_browsers.sh
python server.py
MCP Installation
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"screenshot": {
"command": "python",
"args": ["/path/to/mcp-services/screenshot-api/mcp_server.py"]
}
}
}
Cursor
Add to your Cursor MCP settings:
{
"mcpServers": {
"screenshot": {
"command": "python",
"args": ["/path/to/mcp-services/screenshot-api/mcp_server.py"]
}
}
}
Via uvx (after PyPI publish)
{
"mcpServers": {
"screenshot": {
"command": "uvx",
"args": ["mcp-server-screenshot"]
}
}
}
API Documentation
Endpoints
POST /screenshot
Take a screenshot with full control over parameters.
Request body (JSON):
| Parameter | Type | Default | Description |
|---|---|---|---|
url |
string | required | URL to capture |
viewport_width |
int | 1280 | Viewport width (320-3840) |
viewport_height |
int | 720 | Viewport height (240-2160) |
full_page |
bool | false | Capture entire scrollable page |
format |
string | "png" | Output: "png", "jpeg", or "pdf" |
wait_for |
string | null | CSS selector to wait for |
block_cookies |
bool | false | Block cookie consent banners |
inject_css |
string | null | Custom CSS to inject |
delay_ms |
int | 0 | Extra delay after load (0-10000) |
Example:
curl -X POST http://localhost:8500/screenshot \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "full_page": true, "format": "png"}' \
-o screenshot.png
GET /screenshot
Simple GET-based screenshot (no CSS injection support).
curl "http://localhost:8500/screenshot?url=https://example.com&width=1920&height=1080&format=jpeg" -o screenshot.jpg
Query parameters: url, width, height, full_page, format, wait_for, block_cookies, delay_ms
POST /screenshot/base64
Same parameters as POST /screenshot, returns JSON with base64-encoded image.
curl -X POST http://localhost:8500/screenshot/base64 \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
Response:
{
"url": "https://example.com",
"format": "png",
"content_type": "image/png",
"base64": "iVBORw0KGgo...",
"size_bytes": 45231
}
GET /health
Health check. Returns {"status": "ok"}.
GET /stats
Cache and usage statistics.
POST /admin/keys
Create API keys (requires X-Admin-Key header matching ADMIN_KEY env var).
curl -X POST "http://localhost:8500/admin/keys?key=my-api-key&tier=pro&owner=alice" \
-H "X-Admin-Key: your-admin-key"
Authentication
| Header | Description |
|---|---|
X-API-Key |
Your API key. Omit for free tier. |
Response Headers
| Header | Description |
|---|---|
X-Cache-Key |
Truncated cache key for debugging |
X-Rate-Remaining |
Remaining requests today |
MCP Tools
When used as an MCP server, two tools are available:
take_screenshot
Returns the screenshot as a viewable image (ImageContent for PNG/JPEG, TextContent with base64 for PDF).
screenshot_to_base64
Returns the screenshot as a base64 string in a TextContent response, suitable for passing to other tools or embedding.
Both tools accept: url, viewport_width, viewport_height, full_page, format, wait_for, inject_css.
Pricing Tiers
| Tier | Daily Limit | Auth |
|---|---|---|
| Free | 100/day per IP | No key needed |
| Basic | 1,000/day | API key |
| Pro | 10,000/day | API key |
| Enterprise | 100,000/day | API key |
Caching
Screenshots are cached using SHA256(url + params) as the key. Default TTL is 1 hour (configurable via CACHE_TTL). Expired entries are cleaned up automatically every 30 minutes.
Self-Hosting
Environment Variables
See .env.example for all options. Key settings:
CACHE_DIR- Where cached screenshots are stored (default:/data/cache)CACHE_TTL- Cache duration in seconds (default:3600)MAX_FREE_DAILY- Free tier daily limit (default:100)ADMIN_KEY- Secret key for the admin endpointsPORT- API port (default:8500)
Docker Resource Limits
The default docker-compose.yml limits the container to 2 CPU cores and 2GB RAM. Adjust in the deploy.resources section as needed.
Persistent Storage
The docker-compose file uses a named volume screenshot-data for the cache and SQLite database. To use a host directory instead:
volumes:
- /path/on/host:/data
Metadata
Release files for mcp-server-screenshot 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcp_server_screenshot-0.1.0.tar.gz | 13.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_server_screenshot-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.4 kB
Release files / mcp_server_screenshot-0.1.0.tar.gz
| Download URL | mcp_server_screenshot-0.1.0.tar.gz |
|---|---|
| Size | 13.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a4db3dda2a7d09e4e258d7aa967cdaa1d6a3c3b534da9d6fcdd8b734a585ab79
|
|
BLAKE2b-256 checksum How to use checksums |
6480435243736c8e5bbbb49072bdaa6af58c6e8846e00d6622b3e102b8c9946c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / mcp_server_screenshot-0.1.0-py3-none-any.whl
| Download URL | mcp_server_screenshot-0.1.0-py3-none-any.whl |
|---|---|
| Size | 24.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
844e2d68980250f133dc96c0b02d21d1890dd95c56eb72ac09911086c466b1eb
|
|
BLAKE2b-256 checksum How to use checksums |
150cca843ed1abd0d334324835b2221062bed7b25a285263db2dffe044f3c960
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|