{"_id":"@captureze/mcp","_rev":"3-4f9b77d5ae6613f422c95e03d511df89","name":"@captureze/mcp","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@captureze/mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","captureze","screenshot","visual-diff","agent","claude","chatgpt"],"license":"MIT","_id":"@captureze/mcp@0.1.0","maintainers":[{"name":"einperegrin","email":"einperegrin@gmail.com"}],"homepage":"https://github.com/Captureze/mcp#readme","bugs":{"url":"https://github.com/Captureze/mcp/issues"},"bin":{"captureze-mcp":"dist/index.js"},"dist":{"shasum":"28c5f00fb4240008dec5104ff9b98e675a40bb9f","tarball":"https://registry.npmjs.org/@captureze/mcp/-/mcp-0.1.0.tgz","fileCount":61,"integrity":"sha512-jfapqdgMp18Xz5IBgNuXpk5FPbscLUOP1fIO7e1SnjAC1aOoAvAJW8GmrcVBU/Acz309/NuY32P5ez7Sj4cRug==","signatures":[{"sig":"MEUCIG4foJsL7muJ1DNtTuU8eji2c4/teBRiF3rThTclo0oGAiEA1u+pfKMNPNs44nSCIkWuzimUfKHnrmQFrjRJRRKL5ms=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166842},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"6d0c08e2a45c55512f3b0b8ea7cf35ed2191ea01","scripts":{"cli":"node --experimental-strip-types src/index.ts","dev":"node --experimental-strip-types src/index.ts","http":"node --experimental-strip-types src/index.ts --http","lint":"eslint .","test":"node --experimental-strip-types --test \"src/**/*.test.ts\"","build":"tsc -p tsconfig.build.json && node -e \"require('fs').chmodSync('dist/index.js', 0o755)\"","format":"prettier --write .","lint:fix":"eslint . --fix","typecheck":"tsc -p tsconfig.json --noEmit","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"einperegrin","email":"einperegrin@gmail.com"},"repository":{"url":"git+https://github.com/Captureze/mcp.git","type":"git"},"_npmVersion":"11.6.4","description":"Model Context Protocol server for Captureze — scheduled website screenshots, visual diffs and capture certificates for AI agents","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","dotenv":"^17.4.2","express":"^5.2.1","commander":"^15.0.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^22.10.0","@types/express":"^5.0.0","typescript-eslint":"^8.67.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.0_1788543277906_0.7374458678888856","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@captureze/mcp","version":"0.1.1","keywords":["mcp","model-context-protocol","captureze","screenshot","visual-diff","agent","claude","chatgpt"],"author":{"name":"Captureze"},"license":"MIT","_id":"@captureze/mcp@0.1.1","maintainers":[{"name":"einperegrin","email":"einperegrin@gmail.com"}],"homepage":"https://github.com/Captureze/mcp#readme","bugs":{"url":"https://github.com/Captureze/mcp/issues"},"bin":{"captureze-mcp":"dist/index.js"},"dist":{"shasum":"467d13ae185bd430dd07b66baed33cd8c0375de8","tarball":"https://registry.npmjs.org/@captureze/mcp/-/mcp-0.1.1.tgz","fileCount":64,"integrity":"sha512-h2H6DgZnPFVE047LwXA3mljM/1RNXSDL44SOTTqTTJnEWzwJkbOQuwte178NXX77n2oAfSPvo7jR4P4z1RCI+A==","signatures":[{"sig":"MEUCIF1lAYAsyqQZU7Yb/FprpwLCbuqeJL0WzOKPORb3fP+MAiEApbuVjOiRJq/WyaJ9MzjiZagozPqXyKv2wzobsBXXFRE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":209623},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"00d4bed46f321a5884041dd4fdbefcfbd9104f3b","scripts":{"cli":"node --experimental-strip-types src/index.ts","dev":"node --experimental-strip-types src/index.ts","http":"node --experimental-strip-types src/index.ts --http","lint":"eslint .","test":"node --experimental-strip-types --test \"src/**/*.test.ts\"","build":"tsc -p tsconfig.build.json && node -e \"require('fs').chmodSync('dist/index.js', 0o755)\"","format":"prettier --write .","lint:fix":"eslint . --fix","typecheck":"tsc -p tsconfig.json --noEmit","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"einperegrin","email":"einperegrin@gmail.com"},"repository":{"url":"git+https://github.com/Captureze/mcp.git","type":"git"},"_npmVersion":"11.6.4","description":"Model Context Protocol server for Captureze — scheduled website screenshots, visual diffs and capture certificates for AI agents","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","dotenv":"^17.4.2","express":"^5.2.1","commander":"^15.0.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^22.10.0","@types/express":"^5.0.0","typescript-eslint":"^8.67.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.1_1789575931615_0.8645612217988428","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"_id":"@captureze/mcp@0.1.2","bin":{"captureze-mcp":"dist/index.js"},"bugs":{"url":"https://github.com/Captureze/mcp/issues"},"dist":{"shasum":"f8731ded6b4d415423a445956e094a924d473f67","tarball":"https://registry.npmjs.org/@captureze/mcp/-/mcp-0.1.2.tgz","fileCount":64,"integrity":"sha512-B732LmkqD4oyWY/lXAcApqfUlmJSNX1NHAp8CEuqjPLm0l73QwX1hvmCVrop1T2cWEmOQS47aAj0LvWBNABEwQ==","signatures":[{"sig":"MEYCIQDgEiHqBT9Xe29zt/ChvFPMQPXD4cy3bXFLiuuta+pKeQIhAJ/YD/RnZZ87MqqhZYcCmUBH500hrq4VJv+UdTvMxApj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEnl/TRGddorGPWgzhaTxgtzBpoYg9C0fisaih6alhCCAiBXhlgopCEIG/aiAXPZPCDUkGSt97OzEN8gNm1HvCQwiA=="}],"unpackedSize":209623},"main":"dist/index.js","name":"@captureze/mcp","type":"module","types":"./dist/index.d.ts","author":{"name":"Captureze"},"engines":{"node":">=20.0.0"},"gitHead":"6cc0f6b720be0a12cd15fc474e73a49158ddacad","license":"MIT","scripts":{"cli":"node --experimental-strip-types src/index.ts","dev":"node --experimental-strip-types src/index.ts","http":"node --experimental-strip-types src/index.ts --http","lint":"eslint .","test":"node --experimental-strip-types --test \"src/**/*.test.ts\"","build":"tsc -p tsconfig.build.json && node -e \"require('fs').chmodSync('dist/index.js', 0o755)\"","format":"prettier --write .","lint:fix":"eslint . --fix","typecheck":"tsc -p tsconfig.json --noEmit","format:check":"prettier --check .","prepublishOnly":"npm run build"},"version":"0.1.2","_npmUser":{"name":"einperegrin","email":"einperegrin@gmail.com"},"homepage":"https://github.com/Captureze/mcp#readme","keywords":["mcp","model-context-protocol","captureze","screenshot","visual-diff","agent","claude","chatgpt"],"repository":{"url":"git+https://github.com/Captureze/mcp.git","type":"git"},"_npmVersion":"11.6.4","description":"Model Context Protocol server for Captureze — scheduled website screenshots, visual diffs and capture certificates for AI agents","directories":{},"maintainers":[{"name":"einperegrin","email":"einperegrin@gmail.com"}],"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","dotenv":"^17.4.2","express":"^5.2.1","commander":"^15.0.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^22.10.0","@types/express":"^5.0.0","typescript-eslint":"^8.67.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.1.2_1790259739385_0.4089232552700839"}}},"time":{"created":"2026-09-04T17:34:37.783Z","modified":"2026-09-24T14:22:19.669Z","0.1.0":"2026-09-04T17:34:38.083Z","0.1.1":"2026-09-16T16:25:31.755Z","0.1.2":"2026-09-24T14:22:19.470Z"},"bugs":{"url":"https://github.com/Captureze/mcp/issues"},"author":{"name":"Captureze"},"license":"MIT","homepage":"https://github.com/Captureze/mcp#readme","keywords":["mcp","model-context-protocol","captureze","screenshot","visual-diff","agent","claude","chatgpt"],"repository":{"url":"git+https://github.com/Captureze/mcp.git","type":"git"},"description":"Model Context Protocol server for Captureze — scheduled website screenshots, visual diffs and capture certificates for AI agents","maintainers":[{"name":"einperegrin","email":"einperegrin@gmail.com"}],"readme":"# Captureze MCP server\n\nModel Context Protocol server for [Captureze](https://captureze.com) — scheduled website\nscreenshots, visual diffs and Certificates of Capture, exposed as tools an AI agent can call.\n\nWith it connected, an agent can:\n\n- screenshot any URL and **look at the image** (proxy-backed, so bot-protected and geo-restricted pages work);\n- keep a page under watch on a cron and report **what changed and by how much**;\n- pull a **Certificate of Capture** (SHA-256, timestamp, capture origin, verification URL) for evidence work;\n- detect a site's **cookie consent banner** and its accept/reject selectors.\n\nWorks with any MCP client: Claude Code, Claude Desktop, claude.ai, ChatGPT (developer mode /\ndeep research connectors), OpenClaw, and anything built on the MCP SDKs or an agent framework\nwith MCP support.\n\n## Requirements\n\n- A Captureze API key (`cap_...`) — Captureze console → **Settings → API keys**\n- Node.js 20+ — only if you run the server yourself (stdio, or a self-hosted HTTP deployment)\n\n## Quick start\n\n**Remote clients** (claude.ai, ChatGPT, hosted agents) — point them at the endpoint we run:\n\n```\nhttps://mcp.captureze.com/mcp\n```\n\nAuthenticate each request with `Authorization: Bearer cap_...`. There is nothing to install and\nnothing to deploy.\n\n**Local clients** (Claude Code, Claude Desktop, OpenClaw) — run it over stdio:\n\n```bash\nCAPTUREZE_API_KEY=cap_xxx npx -y @captureze/mcp\n```\n\nYou can also run the HTTP transport yourself; see\n[Self-hosting the HTTP transport](#self-hosting-the-http-transport).\n\n## Connect it\n\n### Claude Code\n\n```bash\nclaude mcp add captureze --env CAPTUREZE_API_KEY=cap_xxx -- npx -y @captureze/mcp\n```\n\n### Claude Desktop / any stdio client\n\n```json\n{\n  \"mcpServers\": {\n    \"captureze\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@captureze/mcp\"],\n      \"env\": { \"CAPTUREZE_API_KEY\": \"cap_xxx\" }\n    }\n  }\n}\n```\n\n### Claude Code (remote)\n\n```bash\nclaude mcp add -s user --transport http captureze https://mcp.captureze.com/mcp \\\n  --header \"Authorization: Bearer cap_xxx\"\n```\n\n### ChatGPT (custom connector, developer mode)\n\nChatGPT only talks to **remote** servers. Add a custom connector pointing at\n`https://mcp.captureze.com/mcp` with your API key as an `Authorization: Bearer cap_...` header —\nthe server ships the `search` and `fetch` tools ChatGPT requires alongside the `captureze_*` ones.\nSee [docs/INTEGRATIONS.md](docs/INTEGRATIONS.md).\n\n### claude.ai (custom connector)\n\nAdd `https://mcp.captureze.com/mcp` as a custom connector and press connect: the endpoint speaks\nOAuth 2.1, so you sign in with the same Captureze account you use on the site and there is no key\nto paste. Clients that can attach an `Authorization` header may still use an API key instead —\nboth work, on the same endpoint. See [docs/INTEGRATIONS.md](docs/INTEGRATIONS.md).\n\n### OpenClaw\n\n```json\n{\n  \"mcpServers\": {\n    \"captureze\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@captureze/mcp\"],\n      \"env\": { \"CAPTUREZE_API_KEY\": \"cap_xxx\" }\n    }\n  }\n}\n```\n\nHermes-based and other OpenAI-compatible agent loops connect through their MCP client layer —\nstdio locally, `https://your-host/mcp` remotely. Details for each in\n[docs/INTEGRATIONS.md](docs/INTEGRATIONS.md).\n\n## Tools\n\n| Tool                                                                  | What it does                                                                   |\n| --------------------------------------------------------------------- | ------------------------------------------------------------------------------ |\n| `captureze_capture_url`                                               | Screenshot a URL now; returns the image and the change vs the previous capture |\n| `captureze_capture_site`                                              | Capture an existing site with its stored settings                              |\n| `captureze_list_sites` / `captureze_get_site`                         | What the account monitors                                                      |\n| `captureze_monitor_site`                                              | Start capturing a page on a cron                                               |\n| `captureze_update_site` / `captureze_delete_site`                     | Change or remove a site (delete is destructive)                                |\n| `captureze_list_captures`                                             | Capture history with per-capture change percentages                            |\n| `captureze_get_capture_image`                                         | Look at a stored capture, or its diff overlay                                  |\n| `captureze_list_capture_runs`                                         | Execution log — why a scheduled capture failed                                 |\n| `captureze_compare_captures`                                          | Pixel-diff any two captures (Pro)                                              |\n| `captureze_diff_trend`                                                | How much a page has been moving (Pro)                                          |\n| `captureze_get_capture_certificate`                                   | Certificate of Capture for evidence (Starter+)                                 |\n| `captureze_detect_consent_banner` / `captureze_get_consent_detection` | Find the cookie banner and its selectors                                       |\n| `captureze_account_status`                                            | Plan, entitlements, usage against limits                                       |\n| `search` / `fetch`                                                    | ChatGPT-compatible views over the same data                                    |\n\nResources: `captureze://sites`, `captureze://viewport-presets`.\nPrompts: `watch-page`, `evidence-pack`, `consent-audit`.\n\n### How ad-hoc captures are stored\n\nEvery capture belongs to a _site_, which is what gives it history, diffs and certificates. So\n`captureze_capture_url` files its capture under a site for that URL: an existing one if the\naccount already has it, otherwise a new one created **paused** (`is_active: false`), which\ncaptures on request and never on its own. Pass `monitor: true` to have it run on a schedule too.\n\n## CLI\n\nThe same tools are reachable by hand, which is the quickest way to tell \"the agent asked for the\nwrong thing\" apart from \"the API misbehaved\":\n\n```bash\nexport CAPTUREZE_API_KEY=cap_xxx        # or put it in a .env file\n\ncaptureze-mcp sites                     # what the account monitors\ncaptureze-mcp capture https://example.com --full-page --out shot.png\ncaptureze-mcp captures <site-id>        # history with change percentages\ncaptureze-mcp compare <capture-id> <capture-id>\ncaptureze-mcp account                   # plan, entitlements, usage\ncaptureze-mcp --help                    # every command\n```\n\nOutput is JSON on stdout. With no command the same binary starts the MCP server, so existing\nclient configs are unaffected.\n\n## Configuration\n\n| Variable                           | Default                 | Meaning                                                                                       |\n| ---------------------------------- | ----------------------- | --------------------------------------------------------------------------------------------- |\n| `CAPTUREZE_API_KEY`                | —                       | API key. Required for stdio; the fallback for HTTP requests without an `Authorization` header |\n| `CAPTUREZE_BASE_URL`               | `https://captureze.com` | Captureze install (self-hosted or staging)                                                    |\n| `CAPTUREZE_TIMEOUT_MS`             | `180000`                | Upstream timeout — captures run a real browser and are slow                                   |\n| `CAPTUREZE_MAX_INLINE_IMAGE_BYTES` | `4500000`               | Above this, tools return a URL instead of inlining the image                                  |\n| `PORT` / `HOST`                    | `8787` / `127.0.0.1`    | HTTP transport bind                                                                           |\n| `CAPTUREZE_MCP_ALLOWED_HOSTS`      | —                       | `Host` header allowlist when binding beyond localhost                                         |\n\nA `.env` file in the working directory is loaded on startup.\n\n### OAuth (HTTP transport, optional)\n\nSet these to let clients that can only authenticate by OAuth — the claude.ai connector dialog\namong them — sign in against a Clerk instance. Leave them unset and none of it loads: the\nendpoint stays exactly what it is on an API key, which is what a self-hosted install wants.\n\n| Variable                   | Meaning                                                                |\n| -------------------------- | ---------------------------------------------------------------------- |\n| `CLERK_PUBLISHABLE_KEY`    | `pk_live_…` / `pk_test_…`. Names the authorization server              |\n| `CLERK_SECRET_KEY`         | `sk_live_…` / `sk_test_…`. Verifies access tokens                      |\n| `CAPTUREZE_MCP_PUBLIC_URL` | This endpoint's public origin. Defaults to what the request says it is |\n\nWith them set the server publishes `/.well-known/oauth-protected-resource/mcp` (RFC 9728) and\nmirrors the issuer's `/.well-known/oauth-authorization-server` (RFC 8414), and a `401` carries the\n`resource_metadata` pointer that lets a connector find them. API keys keep working unchanged.\n\n## Self-hosting the HTTP transport\n\nYou do not need this to use Captureze from a remote client — `https://mcp.captureze.com/mcp` is\nalready running. Self-host when you point at a **self-hosted Captureze install**, or when you want\nthe endpoint inside your own network.\n\n```bash\n# published image\ndocker run --rm -p 8787:8787 -e HOST=0.0.0.0 \\\n  -e CAPTUREZE_MCP_ALLOWED_HOSTS=mcp.example.com \\\n  ghcr.io/captureze/mcp:latest --http\n\n# or build it from this repo\ndocker build -t captureze-mcp .\ndocker run --rm -p 8787:8787 -e HOST=0.0.0.0 \\\n  -e CAPTUREZE_MCP_ALLOWED_HOSTS=mcp.example.com captureze-mcp --http\n```\n\nImages are published to `ghcr.io/captureze/mcp` on every push to `main` (`:latest` and an\nimmutable `:main-<short-sha>`) and on every `v*` release tag (`:0.1.0`). Pin an immutable tag in\nproduction — never `:latest`.\n\nThe HTTP transport is **stateless and multi-tenant**: each request carries its own credential —\nan API key, or an OAuth access token — a fresh server instance handles it, and nothing about one\ncaller survives into the next request. Any instance can answer any request, so it scales behind\nan ordinary load balancer with no sticky sessions.\n\nTerminate TLS in front of it, keep `CAPTUREZE_MCP_ALLOWED_HOSTS` set to the public hostname, and\ndo not set `CAPTUREZE_API_KEY` on a shared deployment — that key would become the fallback for\nevery unauthenticated request.\n\n## Development\n\n```bash\nnpm install\nnpm test            # node:test, no network\nnpm run lint\nnpm run format      # prettier --write\nnpm run typecheck\nnpm run build\n```\n\n## Releasing\n\nThe package is published to npm as `@captureze/mcp` — that is what makes `npx -y @captureze/mcp`\nwork. Tagging is the trigger:\n\n```bash\nnpm version patch          # or minor / major\ngit push --follow-tags\n```\n\nThe release workflow runs lint, format, typecheck, tests and build, checks the tag matches\n`package.json`, and publishes with provenance. It needs an `NPM_TOKEN` repository secret (an npm\nautomation token), unless the repo is set up as a trusted publisher on npm.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}