{
  "markdown": "# Snapshot Site MCP\n\n[![npm](https://img.shields.io/npm/v/%40snapshot-site%2Fmcp.svg)](https://www.npmjs.com/package/@snapshot-site/mcp)\n[![Node](https://img.shields.io/badge/node-%3E%3D20.9.0-339933.svg)](https://nodejs.org/)\n[![License](https://img.shields.io/github/license/snapshot-site/snapshot-site-mcp.svg?cacheSeconds=300)](https://github.com/snapshot-site/snapshot-site-mcp/blob/main/LICENSE)\n[![CI](https://github.com/snapshot-site/snapshot-site-mcp/actions/workflows/tests.yml/badge.svg)](https://github.com/snapshot-site/snapshot-site-mcp/actions/workflows/tests.yml)\n\nOfficial MCP server for the Snapshot Site API\n\n## Tools\n\n- `screenshot`\n- `analyze`\n- `compare`\n\nThese tools are annotated for MCP clients as:\n\n- read-only\n- idempotent\n- open-world\n\nThey also include richer titles, category metadata, and example intents to improve tool selection in Claude Desktop and Cursor.\n\n## Two ways to connect\n\n**Hosted, with OAuth** — point your client at `https://mcp.snapshot-site.com/mcp`\nand sign in. There is no local process to run and no API key in your client\nconfig; the server resolves your account from the OAuth session.\n\n**Local, with an API key** — run the package yourself over stdio and provide\n`SNAPSHOT_SITE_API_KEY`. The server calls the Snapshot Site API directly.\n\nEither way, calls count against the same plan quota as direct API calls. Nothing\nis metered differently because it came through MCP.\n\n## Credentials\n\nThe hosted server needs no credential — you sign in through OAuth and the server\nresolves your account from the session. Skip this section unless you run the\nserver yourself over stdio.\n\nFor local stdio mode you need a Snapshot Site API key.\n\n1. Sign up for a [Snapshot Site Console](https://console.snapshot-site.com/) account.\n2. Create an API key on the [API Keys](https://console.snapshot-site.com/api-keys) page.\n\n   ![Snapshot Site Console — API Keys](assets/console-apikeys.png)\n3. Pass the key to the server as the `SNAPSHOT_SITE_API_KEY` environment variable.\n4. Leave `SNAPSHOT_SITE_BASE_URL` at its default (`https://api.prod.ss.snapshot-site.com`)\n   unless you're pointed at a self-hosted or staging instance.\n\n## Compatibility\n\nRequires Node.js 20.9 or later. Built against `@modelcontextprotocol/sdk` v1.28\nand tested with Claude Desktop and Cursor over stdio, and with any client that\nspeaks the streamable HTTP transport against the hosted endpoint.\n\n## Usage\n\nNot sure which options to use? Preview a capture and its parameters in the\n[Screenshot](https://console.snapshot-site.com/screenshot) console playground\nbefore wiring them into a tool call.\n\n![Snapshot Site Console — Screenshot playground](assets/console-screenshot.png)\n\n## OAuth discovery flow\n\nWhat a client does when connecting to the hosted server:\n\n```text\n1. Discovery\n\nClaude\n  -> GET https://mcp.snapshot-site.com/.well-known/oauth-protected-resource\n\nMCP\n  -> responds:\n     authorization_servers = https://mcp.snapshot-site.com\n```\n\n```text\n2. Authorization\n\nClaude\n  -> must know client_id\n  -> opens:\n     https://mcp.snapshot-site.com/oauth/v2/authorize\n     ?client_id=...\n     &redirect_uri=https://claude.ai/api/mcp/auth_callback\n     &response_type=code\n     &code_challenge=...\n```\n\n```text\n3. Token\n\nClaude\n  -> receives an access token\n  -> calls the MCP server:\n     POST https://mcp.snapshot-site.com/\n     Authorization: Bearer <access_token>\n```\n\nThe server then validates the token against the issuer and resolves the account\nit belongs to before running the tool.\n\n### Verifying the deployment\n\n```bash\ncurl -s https://mcp.snapshot-site.com/.well-known/oauth-protected-resource | jq\ncurl -s https://mcp.snapshot-site.com/.well-known/openid-configuration | jq\ncurl -i https://mcp.snapshot-site.com/\ncurl -i -X POST https://mcp.snapshot-site.com/mcp -H 'content-type: application/json' --data '{}'\n```\n\n### Manual vs implicit client_id\n\n- The `client_id` is only needed for the authorization step.\n- If your client cannot discover that `client_id` beforehand, enter it manually in the connector UI.\n- It cannot be injected later once the OAuth flow has started.\n- The server can publish an experimental implicit mode by exposing a `preferred_client_id` in `/.well-known/oauth-protected-resource`.\n- Clients that read this metadata may then skip the manual entry. Clients that ignore the field still require a manual `client_id`.\n\n## Environment\n\n```bash\nexport SNAPSHOT_SITE_API_KEY=ss_live_xxx\nexport SNAPSHOT_SITE_BASE_URL=https://api.prod.ss.snapshot-site.com\n```\n\n## Build\n\n```bash\npnpm install\npnpm run build\n```\n\n## Local stdio mode\n\n```bash\nexport SNAPSHOT_SITE_API_KEY=ss_live_xxx\nsnapshot-site-mcp\n```\n\n## Claude Desktop configuration\n\n```json\n{\n  \"mcpServers\": {\n    \"snapshot-site\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/snapshot-site-mcp/build/server.js\"],\n      \"env\": {\n        \"SNAPSHOT_SITE_API_KEY\": \"ss_live_xxx\",\n        \"SNAPSHOT_SITE_BASE_URL\": \"https://api.prod.ss.snapshot-site.com\"\n      }\n    }\n  }\n}\n```\n\n## Cursor configuration\n\n```json\n{\n  \"mcpServers\": {\n    \"snapshot-site\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/snapshot-site-mcp/build/server.js\"],\n      \"env\": {\n        \"SNAPSHOT_SITE_API_KEY\": \"ss_live_xxx\"\n      }\n    }\n  }\n}\n```\n\n## Remote HTTP mode\n\nThis package also supports a hosted MCP endpoint for clients using `mcp-remote`.\n\nStart the HTTP server:\n\n```bash\npnpm start:http\n```\n\nor:\n\n```bash\nnpx snapshot-site-mcp-http\n```\n\nEnvironment variables:\n\n```bash\nexport PORT=3000\nexport HOST=0.0.0.0\nexport MCP_PATH=/mcp\nexport HEALTH_PATH=/healthz\nexport MCP_ALLOWED_HOSTS=mcp.snapshot-site.com\nexport SNAPSHOT_SITE_BASE_URL=https://api.prod.ss.snapshot-site.com\n```\n\nRemote client configuration with direct API key header:\n\n```json\n{\n  \"mcpServers\": {\n    \"Snapshot Site MCP\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https://mcp.snapshot-site.com/mcp\",\n        \"--header\",\n        \"x-snapshotsiteapi-key: ss_live_xxx\"\n      ]\n    }\n  }\n}\n```\n\nThe hosted server is stateless. Each request authenticates with `x-snapshotsiteapi-key`, which makes the service safe to run on multiple replicas without session affinity.\n\n## Zitadel / OAuth\n\nThe remote HTTP server also supports OAuth bearer tokens validated against an OIDC issuer such as Zitadel.\n\nEnvironment variables:\n\n```bash\nexport OIDC_ISSUER_URL=https://auth.snapshot-site.com\nexport OIDC_AUDIENCE=snapshot-site-mcp\nexport OIDC_REQUIRED_SCOPE=claudeai\nexport OIDC_DISCOVERY_CLIENT_ID=366546620977775166\nexport RESOURCE_SERVER_URL=https://mcp.snapshot-site.com\nexport ALLOW_API_KEY_AUTH=false\nexport SNAPSHOT_SITE_API_KEY=ss_server_side_xxx\n```\n\nIn bearer-token mode, the MCP server validates the incoming access token against the issuer JWKS and then uses the server-side Snapshot Site API key to call the backend API.\n\nIt also exposes and proxies:\n\n```text\nGET /.well-known/oauth-protected-resource\nGET /.well-known/openid-configuration\nGET/POST /oauth/v2/*\nGET /ui/*\nGET/POST /oauth/register\n```\n\nso MCP clients can discover the authorization server metadata automatically.\n\nWhen `OIDC_DISCOVERY_CLIENT_ID` is set, the protected resource metadata also includes:\n\n```json\n{\n  \"resource_name\": \"Snapshot Site MCP\",\n  \"preferred_client_id\": \"366546620977775166\",\n  \"oauth_client_metadata\": {\n    \"client_id\": \"366546620977775166\",\n    \"token_endpoint_auth_method\": \"none\"\n  }\n}\n```\n\nThis is an experimental compatibility hint for clients that can infer the OAuth public client automatically. Manual `client_id` entry remains the reliable fallback.\n\nThe MCP server also exposes a lightweight `registration_endpoint` compatibility shim at:\n\n```text\nPOST https://mcp.snapshot-site.com/oauth/register\n```\n\nThis shim currently returns the preconfigured public PKCE client instead of provisioning a brand-new Zitadel client per installation. It validates and reflects the `redirect_uris` requested by the client, as long as they are valid HTTPS URLs. It is meant to improve compatibility with clients that expect DCR-style discovery, while keeping the existing manual flow as fallback.\n",
  "bytes": 8096,
  "sha": "13d6f2a7e759ca036939e322e50b534f525a6b7fd7b99d26e30da275276331b3",
  "repo_slug": "snapshot-site/snapshot-site-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_snapshot_site_screenshots_e760f498/readme"
}