webpage screenshot mcp
by srigi
README.md
# Webpage Screenshot MCP
<img src="https://i.postimg.cc/LRfcTXD9/Chat-GPT-Image-Aug-2-2025-06-52-39-PM.webp" width="50%" alt="Webpage Screenshot MCP">
Capture screenshots of web URLs or local `.html` files using Playwright Chromium.
Each capture is saved to disk and exposed as a [Resource](https://modelcontextprotocol.io/specification/2025-06-18/server/resources) with URI scheme `screenshots://{screenshotId}`, that compatible MCP clients can read.
## Usage & Requirements
### Requirements
- Node.js v20+
- pnpm v10.x
### Configure MCP in your IDE
#### Claude Code
```bash
claude mcp add webpageScreenshot pnpm dlx @srigi/mcp-webpage-screenshot
```
#### JSON configuration
Add the following configuration to your MCP settings:
```json
{
"mcpServers": {
"webpageScreenshot": {
"command": "pnpm",
"args": ["dlx", "@srigi/mcp-webpage-screenshot"],
"autoApprove": [
"create_webpage_file_screenshot",
"create_webpage_url_screenshot"
]
}
}
}
```
## Usage examples
Prompts you can try:
### Screenshot of an URL
- Take a screenshot of `https://example.com` and save it as `example-website.png`.
- Make another screenshot with viewport width 640 and height 1280px.
### Screenshot of a local file
- Capture a full-page screenshot of `example/page.html` and save it alongside.
## Logging
You can configure logging by adding flags to the `args` array in your MCP configuration:
```json
"webpageScreenshot": {
"command": "pnpm",
"args": [
"dlx", "@srigi/mcp-webpage-screenshot",
"--debug", "/absolute/path/to/debug.log",
"--pretty-print"
]
}
```
Debug flags:
- No `--debug`: logging disabled
- `--debug`: writes to `debug.log` in the current working directory of the running MCP
- `--debug /absolute/path/to/debug.log`: writes logs to that absolute path (absolute paths only)
- `--pretty-print`: pretty formatted JSON logs
## 🛠️ Tools & Resources
### Tool: `create_webpage_file_screenshot`
Create a screenshot of a local HTML file:
- loads the local HTML via `file://`
- waits for `networkidle`
- captures PNG (Buffer), supports full-page height
- saves the image to a workspace-relative path
- adds an in-memory Resource entry and returns a `screenshots://` URI
Parameters:
- `screenshotFilePath`: File where to save the screenshot (relative to the current workspace)
- `webpageFilePath`: HTML file path of the webpage to screenshot (relative to the current workspace)
- `workspacePath`: The current workspace absolute path
- `viewport` (optional):
- `width: number` (default 1280)
- `height: number | "fullpage"` (default 768). Use `"fullpage"` to capture the entire page height.
_Security constraints: all paths are resolved relative to `workspacePath`_
### Tool: `create_webpage_url_screenshot`
Create a screenshot of a web URL:
- validates HTTP/HTTPS URLs only (rejects `file://`, `data://`, etc.)
- implements retry logic with progressive timeouts (5s, 9s, 15s)
- waits for `networkidle` and dynamic content loading
- applies security headers (DNT, User-Agent) and safe browser settings
- captures PNG (Buffer), supports full-page height
- saves the image to a workspace-relative path
- adds an in-memory Resource entry and returns a `screenshots://` URI
Parameters:
- `screenshotFilePath`: File where to save the screenshot (relative to the current workspace)
- `url`: URL of the webpage to screenshot (HTTP/HTTPS only)
- `workspacePath`: The current workspace absolute path
- `viewport` (optional):
- `width: number` (default 1280)
- `height: number | "fullpage"` (default 768). Use `"fullpage"` to capture the entire page height.
_Security features: protocol validation, security headers, download blocking, CSP respect, HTTPS error handling_
### Resource: `screenshots://{screenshotId}`
Each created screenshot is added to an in-memory registry and exposed as a Resource with:
- `uri`: `screenshots://<screenshotId>`
- `blob`: `data:image/png;base64,...`
- `mimeType`: `image/png`
- `text`: original webpage file path or URL used for the screenshot
Note:
- Listing resources is not implemented (list is not available).
## Development
### Requirements
- Node.js v20+
- PNPM v10
The install step will _post-install_ Playwright Chromium, but it's not guaranteed to work. To ensure the shell browser is installed, run:
```
pnpm playwright install --with-deps --only-shell chromium
```
### Steps
1. Install dependencies:
```
pnpm install
```
2. Start the TypeScript compiler in watch mode:
```
pnpm dev
```
3. (Optional) Start the MCP Inspector:
```
pnpm dev:inspector
```
4. Update your MCP configuration for development (adjust the path to the compiled JS):
```json
{
"mcpServers": {
"webpageScreenshot": {
"command": "node",
"args": ["/absolute/path/to/compiled/src/index.js", "--debug", "--pretty-print"],
"autoApprove": [
"create_webpage_file_screenshot", "create_webpage_url_screenshot"
]
}
}
}
```
### Testing
Run tests:
```
pnpm test
```
Tests use Vitest with global logger setup in `vitest.setup.ts` to handle TypeScript/JavaScript module isolation.
Notes:
- Restart the MCP in your IDE after source changes to pick up newly compiled code.
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues