Screenshot API
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Screenshot APITake a screenshot of https://example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Screenshot API
Capture any public URL as a PNG, JPEG, or PDF via REST API or MCP tool for AI agents. Powered by Playwright (Chromium) + Fastify.
MCP Server — for AI Agents (Claude, Cursor, Copilot)
The MCP server lets Claude Desktop, Cursor, and any MCP-compatible agent call screenshot tools natively — no API key, no HTTP wiring.
Tools exposed
Tool | What it does |
| Captures URL → returns image Claude can see (base64 PNG/JPEG) |
| Screenshot + title + H1 + meta description in one call |
| Renders URL as A4 PDF |
Add to Claude Desktop
Open
~/Library/Application Support/Claude/claude_desktop_config.jsonAdd:
{
"mcpServers": {
"screenshot-api": {
"command": "npx",
"args": ["-y", "screenshot-api-mcp"]
}
}
}Restart Claude Desktop — the tools appear automatically.
Then ask Claude: "Take a screenshot of https://example.com" or "Describe what's on https://github.com"
Add to Cursor
Settings → MCP → Add Server:
{
"name": "screenshot-api",
"command": "npx",
"args": ["-y", "screenshot-api-mcp"]
}Install via npm
npm install -g screenshot-api-mcpRun standalone
npx screenshot-api-mcpRelated MCP server: Junipr MCP Server
API
GET /screenshot
Param | Type | Default | Description |
| string | required | Public URL to capture (http/https only) |
|
|
| Output format |
|
|
| Capture full scrollable page |
| number |
| Viewport width (320–3840) |
| number |
| Viewport height (200–2160) |
Response headers: Content-Type, X-Capture-Ms (render time in ms)
curl "http://localhost:3099/screenshot?url=https://example.com&format=png" -o out.png
curl "http://localhost:3099/screenshot?url=https://example.com&format=pdf" -o out.pdfGET /health
Returns { "status": "ok", "browserConnected": true }. Used by Fly health checks.
Local development
npm install
npm run dev # tsx watch — reloads on file changesThe demo test page is available at http://localhost:3099.
Tests
npm run typecheck
npm test # vitest — launches real Chromium; needs ~60s for the capture testSet SKIP_BROWSER_TESTS=1 to skip the live Chromium test (not yet wired up in the test file, but the capture test can be .skip-ped if needed).
Deploy to Fly.io
Prerequisites
flyctl installed and logged in
Docker installed (for local image verification)
Steps
# 1. Create the app (once)
fly launch --no-deploy
# 2. Set the proxy secret (keeps direct callers from bypassing RapidAPI billing)
fly secrets set PROXY_SECRET=$(openssl rand -hex 24)
# 3. Deploy
fly deploy
# 4. Verify
fly checks list # health check should be passing
curl "https://<your-app>.fly.dev/health"
curl "https://<your-app>.fly.dev/screenshot?url=https://example.com" \
-H "X-Proxy-Secret: <your-secret>" -o test.pngMemory ⚠️
The Fly default (256 MB) will OOM Chromium. fly.toml is already set to 1gb. Do not scale down below 512 MB, and if you use 512 MB set MAX_CONCURRENCY=1.
CI/CD (GitHub Actions)
Add your Fly token as a repo secret:
fly tokens create deploy
# → paste into GitHub → Settings → Secrets → FLY_API_TOKENThe CI workflow (.github/workflows/ci.yml) runs typecheck + tests on every push/PR and auto-deploys main to Fly.
Configuration
All settings are read from environment variables. See .env.example for the full list with defaults and descriptions.
Listing on RapidAPI
Create a RapidAPI provider account
Add an API → set the base URL to your Fly app URL
Paste the value of
PROXY_SECRETinto the RapidAPI "proxy secret" fieldDefine tiers — screenshot APIs on RapidAPI cluster around:
Free: 100 req/mo
Basic: $9.99 → 2,500 req/mo
Pro: $29.99 → 15,000 req/mo
Ultra: $99 → 75,000 req/mo
Bump
min_machines_running = 1infly.tomlonce listed (cold-start hurts marketplace ratings)
Roadmap
Phase 1 — Production hardening (this release)
Rate limiting with RapidAPI-aware key
Proxy-secret auth (prevents billing bypass)
Concurrency cap + queue-depth 503
Structured JSON logging (pino)
Graceful shutdown (SIGTERM drain)
/healthendpointDockerfile + Fly.io config
GitHub Actions CI with Playwright container
Smoke tests (SSRF regression, auth, real capture)
Phase 2 — Own billing (after marketplace demand is proven)
API key issuance + auth middleware
Usage metering (Postgres or Fly-hosted SQLite)
Stripe metered billing + webhooks
Minimal customer dashboard (key management, usage graphs)
Phase 3 — Scale
Result caching (S3-compatible, signed URLs)
Webhook / async capture (POST → callback URL)
Multi-A-record SSRF hardening (resolve all records, not just first)
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/raphy78626/screenshot-api'
If you have feedback or need assistance with the MCP directory API, please join our Discord server