Content
# Snapgrab
[](https://pypi.org/project/snapgrab/)
[](https://pypi.org/project/snapgrab/)
[](https://github.com/QuartzUnit/snapgrab/blob/main/LICENSE)
[]()
> [한국어 문서](README.ko.md) · [llms.txt](llms.txt)
> URL to screenshot with metadata. Claude Vision optimized.
```python
from snapgrab import capture
result = await capture("https://example.com")
print(result.path) # /tmp/snapgrab/example_com_desktop_20260317_120000.png
print(result.metadata.title) # "Example Domain"
print(result.vision_tokens) # ~2764
```
## Features
- **Screenshot capture** — PNG, JPEG, PDF with full-page support
- **Page metadata** — title, description, Open Graph tags, favicon, HTTP status
- **Claude Vision optimized** — auto-resize to 1568px, token cost estimation
- **Viewport presets** — desktop (1920x1080), tablet (768x1024), mobile (375x812)
- **MCP server included** — 3 tools for Claude Code / MCP clients
- **Element capture** — screenshot specific CSS selectors
- **Dark mode** — force light/dark color scheme
## Install
```bash
pip install snapgrab
```
First run will prompt to install Playwright browsers:
```bash
playwright install chromium
```
## Usage
### Python API
```python
import asyncio
from snapgrab import capture
async def main():
# Basic screenshot
result = await capture("https://example.com")
# Mobile viewport, full page
result = await capture("https://example.com", viewport="mobile", full_page=True)
# Dark mode, JPEG format
result = await capture("https://example.com", dark_mode=True, format="jpeg")
# Specific element
result = await capture("https://example.com", selector="#main-content")
# Custom viewport
result = await capture("https://example.com", viewport=(1440, 900))
asyncio.run(main())
```
### CLI
```bash
snapgrab https://example.com # basic PNG
snapgrab https://example.com -v mobile -f # mobile, full page
snapgrab https://example.com --format jpeg -q 90 # JPEG quality 90
snapgrab https://example.com -s "#hero" --dark-mode # element + dark mode
snapgrab https://example.com -j # JSON output
snapgrab meta https://example.com # metadata only
```
### MCP Server
```bash
pip install "snapgrab[mcp]"
snapgrab-mcp # starts stdio MCP server
```
**Tools:**
- `capture_screenshot` — capture URL with metadata and vision token estimate
- `capture_comparison` — compare desktop vs mobile (or any viewports)
- `extract_page_metadata` — metadata only, no screenshot
## How It Works
```mermaid
flowchart LR
A["🔗 URL"] --> B["Playwright\nlaunch browser"]
B --> C["📸 Screenshot\nfull page / viewport"]
C --> D["Resize for\nClaude Vision"]
D --> E["✅ Image +\nMetadata"]
```
## CaptureResult
```python
result.path # saved file path
result.format # "png", "jpeg", "pdf"
result.width # viewport width
result.height # page height (full_page) or viewport height
result.file_size # bytes
result.vision_tokens # estimated Claude Vision token cost
result.vision_path # path to Vision-optimized image (≤1568px)
result.processing_time_ms
result.metadata.title
result.metadata.description
result.metadata.og_title
result.metadata.og_image
result.metadata.favicon_url
result.metadata.status_code
result.metadata.url # final URL after redirects
```
## Used in
- [watchdeck](https://github.com/QuartzUnit/watchdeck) — Web page monitoring with visual diffs and safety guards
## License
[MIT](LICENSE)
<!-- mcp-name: io.github.QuartzUnit/snapgrab -->
---
<sub>Part of the [QuartzUnit](https://github.com/QuartzUnit) ecosystem — composable Python libraries for data collection, extraction, search, and AI agent safety.</sub>
Connection Info
You Might Also Like
everything-claude-code
Complete Claude Code configuration collection - agents, skills, hooks,...
markitdown
MarkItDown-MCP is a lightweight server for converting URIs to Markdown.
cc-switch
All-in-One Assistant for Claude Code, Codex & Gemini CLI across platforms.
servers
Model Context Protocol Servers
servers
Model Context Protocol Servers
Time
A Model Context Protocol server for time and timezone conversions.