snaprender-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +282 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# snaprender-mcp
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for [SnapRender Screenshot API](https://snap-render.com). Lets AI agents like Claude capture website screenshots, check cache status, and monitor usage.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### With Claude Desktop
|
|
8
|
+
|
|
9
|
+
Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"snaprender": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "snaprender-mcp"],
|
|
17
|
+
"env": {
|
|
18
|
+
"SNAPRENDER_API_KEY": "sk_live_your_key_here"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### With Claude Code
|
|
26
|
+
|
|
27
|
+
Add to your project's `.mcp.json`:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"snaprender": {
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["-y", "snaprender-mcp"],
|
|
35
|
+
"env": {
|
|
36
|
+
"SNAPRENDER_API_KEY": "sk_live_your_key_here"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Tools
|
|
44
|
+
|
|
45
|
+
### `take_screenshot`
|
|
46
|
+
|
|
47
|
+
Capture a screenshot of any website.
|
|
48
|
+
|
|
49
|
+
**Parameters:**
|
|
50
|
+
| Parameter | Type | Required | Description |
|
|
51
|
+
|-----------|------|----------|-------------|
|
|
52
|
+
| `url` | string | Yes | URL to capture |
|
|
53
|
+
| `format` | string | No | `png`, `jpeg`, `webp`, or `pdf` (default: `png`) |
|
|
54
|
+
| `width` | integer | No | Viewport width 320-3840 (default: 1280) |
|
|
55
|
+
| `height` | integer | No | Viewport height 200-10000 (default: 800) |
|
|
56
|
+
| `full_page` | boolean | No | Capture entire scrollable page |
|
|
57
|
+
| `device` | string | No | `iphone_14`, `iphone_15_pro`, `pixel_7`, `ipad_pro`, `macbook_pro` |
|
|
58
|
+
| `dark_mode` | boolean | No | Enable dark mode |
|
|
59
|
+
| `block_ads` | boolean | No | Block ads (default: true) |
|
|
60
|
+
| `block_cookie_banners` | boolean | No | Remove cookie banners (default: true) |
|
|
61
|
+
| `quality` | integer | No | JPEG/WebP quality 1-100 (default: 90) |
|
|
62
|
+
| `delay` | integer | No | Wait ms after page load (default: 0) |
|
|
63
|
+
|
|
64
|
+
### `check_screenshot_cache`
|
|
65
|
+
|
|
66
|
+
Check if a screenshot is cached without capturing.
|
|
67
|
+
|
|
68
|
+
| Parameter | Type | Required | Description |
|
|
69
|
+
|-----------|------|----------|-------------|
|
|
70
|
+
| `url` | string | Yes | URL to check |
|
|
71
|
+
| `format` | string | No | Output format |
|
|
72
|
+
|
|
73
|
+
### `get_usage`
|
|
74
|
+
|
|
75
|
+
Get current month's usage statistics. No parameters required.
|
|
76
|
+
|
|
77
|
+
## Get an API Key
|
|
78
|
+
|
|
79
|
+
Sign up for free at [app.snap-render.com](https://app.snap-render.com/auth/signup) — 50 screenshots/month, no credit card required.
|
|
80
|
+
|
|
81
|
+
## Environment Variables
|
|
82
|
+
|
|
83
|
+
| Variable | Required | Description |
|
|
84
|
+
|----------|----------|-------------|
|
|
85
|
+
| `SNAPRENDER_API_KEY` | Yes | Your API key (starts with `sk_live_`) |
|
|
86
|
+
| `SNAPRENDER_URL` | No | API base URL (default: `https://app.snap-render.com`) |
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
const API_KEY = process.env.SNAPRENDER_API_KEY;
|
|
6
|
+
const BASE_URL = process.env.SNAPRENDER_URL || "https://app.snap-render.com";
|
|
7
|
+
if (!API_KEY) {
|
|
8
|
+
console.error("Error: SNAPRENDER_API_KEY environment variable is required.\n" +
|
|
9
|
+
"Get a free API key at https://app.snap-render.com/auth/signup");
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const server = new Server({ name: "snaprender-mcp", version: "1.0.0" }, { capabilities: { tools: {} } });
|
|
13
|
+
// --- Tool definitions ---
|
|
14
|
+
const TOOLS = [
|
|
15
|
+
{
|
|
16
|
+
name: "take_screenshot",
|
|
17
|
+
description: "Capture a screenshot of any website. Returns the image as a PNG, JPEG, WebP, or PDF. " +
|
|
18
|
+
"Supports device emulation (iPhone, Pixel, iPad), dark mode, ad blocking, " +
|
|
19
|
+
"cookie banner removal, full-page capture, and custom viewports.",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: "object",
|
|
22
|
+
properties: {
|
|
23
|
+
url: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "URL to capture (must start with http:// or https://)",
|
|
26
|
+
},
|
|
27
|
+
format: {
|
|
28
|
+
type: "string",
|
|
29
|
+
enum: ["png", "jpeg", "webp", "pdf"],
|
|
30
|
+
description: "Output format (default: png)",
|
|
31
|
+
},
|
|
32
|
+
width: {
|
|
33
|
+
type: "integer",
|
|
34
|
+
minimum: 320,
|
|
35
|
+
maximum: 3840,
|
|
36
|
+
description: "Viewport width in pixels (default: 1280)",
|
|
37
|
+
},
|
|
38
|
+
height: {
|
|
39
|
+
type: "integer",
|
|
40
|
+
minimum: 200,
|
|
41
|
+
maximum: 10000,
|
|
42
|
+
description: "Viewport height in pixels (default: 800)",
|
|
43
|
+
},
|
|
44
|
+
full_page: {
|
|
45
|
+
type: "boolean",
|
|
46
|
+
description: "Capture entire scrollable page (default: false)",
|
|
47
|
+
},
|
|
48
|
+
quality: {
|
|
49
|
+
type: "integer",
|
|
50
|
+
minimum: 1,
|
|
51
|
+
maximum: 100,
|
|
52
|
+
description: "Image quality for JPEG/WebP, 1-100 (default: 90)",
|
|
53
|
+
},
|
|
54
|
+
delay: {
|
|
55
|
+
type: "integer",
|
|
56
|
+
minimum: 0,
|
|
57
|
+
maximum: 10000,
|
|
58
|
+
description: "Milliseconds to wait after page load (default: 0)",
|
|
59
|
+
},
|
|
60
|
+
dark_mode: {
|
|
61
|
+
type: "boolean",
|
|
62
|
+
description: "Enable dark mode CSS emulation (default: false)",
|
|
63
|
+
},
|
|
64
|
+
block_ads: {
|
|
65
|
+
type: "boolean",
|
|
66
|
+
description: "Block advertisements and trackers (default: true)",
|
|
67
|
+
},
|
|
68
|
+
block_cookie_banners: {
|
|
69
|
+
type: "boolean",
|
|
70
|
+
description: "Remove cookie consent banners (default: true)",
|
|
71
|
+
},
|
|
72
|
+
device: {
|
|
73
|
+
type: "string",
|
|
74
|
+
enum: [
|
|
75
|
+
"iphone_14",
|
|
76
|
+
"iphone_15_pro",
|
|
77
|
+
"pixel_7",
|
|
78
|
+
"ipad_pro",
|
|
79
|
+
"macbook_pro",
|
|
80
|
+
],
|
|
81
|
+
description: "Device preset for mobile/tablet emulation",
|
|
82
|
+
},
|
|
83
|
+
hide_selectors: {
|
|
84
|
+
type: "string",
|
|
85
|
+
description: "Comma-separated CSS selectors to hide before capture",
|
|
86
|
+
},
|
|
87
|
+
click_selector: {
|
|
88
|
+
type: "string",
|
|
89
|
+
description: "CSS selector to click before capture",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
required: ["url"],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "check_screenshot_cache",
|
|
97
|
+
description: "Check if a screenshot is already cached without capturing a new one. " +
|
|
98
|
+
"Does not count against your quota.",
|
|
99
|
+
inputSchema: {
|
|
100
|
+
type: "object",
|
|
101
|
+
properties: {
|
|
102
|
+
url: {
|
|
103
|
+
type: "string",
|
|
104
|
+
description: "URL to check",
|
|
105
|
+
},
|
|
106
|
+
format: {
|
|
107
|
+
type: "string",
|
|
108
|
+
enum: ["png", "jpeg", "webp", "pdf"],
|
|
109
|
+
description: "Output format (default: png)",
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
required: ["url"],
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: "get_usage",
|
|
117
|
+
description: "Get current month's screenshot usage statistics including " +
|
|
118
|
+
"screenshots used, limit, and remaining quota.",
|
|
119
|
+
inputSchema: {
|
|
120
|
+
type: "object",
|
|
121
|
+
properties: {},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
];
|
|
125
|
+
// --- Tool handlers ---
|
|
126
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
127
|
+
tools: TOOLS,
|
|
128
|
+
}));
|
|
129
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
130
|
+
const { name, arguments: args } = request.params;
|
|
131
|
+
switch (name) {
|
|
132
|
+
case "take_screenshot":
|
|
133
|
+
return handleScreenshot(args);
|
|
134
|
+
case "check_screenshot_cache":
|
|
135
|
+
return handleCacheCheck(args);
|
|
136
|
+
case "get_usage":
|
|
137
|
+
return handleUsage();
|
|
138
|
+
default:
|
|
139
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
async function handleScreenshot(args) {
|
|
143
|
+
const url = args.url;
|
|
144
|
+
if (!url)
|
|
145
|
+
throw new Error("url is required");
|
|
146
|
+
const params = new URLSearchParams();
|
|
147
|
+
params.set("url", url);
|
|
148
|
+
// Map all optional params
|
|
149
|
+
const stringParams = ["format", "device", "hide_selectors", "click_selector"];
|
|
150
|
+
const intParams = ["width", "height", "quality", "delay"];
|
|
151
|
+
const boolParams = ["full_page", "dark_mode", "block_ads", "block_cookie_banners"];
|
|
152
|
+
for (const key of stringParams) {
|
|
153
|
+
if (args[key] !== undefined)
|
|
154
|
+
params.set(key, String(args[key]));
|
|
155
|
+
}
|
|
156
|
+
for (const key of intParams) {
|
|
157
|
+
if (args[key] !== undefined)
|
|
158
|
+
params.set(key, String(args[key]));
|
|
159
|
+
}
|
|
160
|
+
for (const key of boolParams) {
|
|
161
|
+
if (args[key] !== undefined)
|
|
162
|
+
params.set(key, args[key] ? "true" : "false");
|
|
163
|
+
}
|
|
164
|
+
const response = await fetch(`${BASE_URL}/v1/screenshot?${params}`, {
|
|
165
|
+
headers: { "X-API-Key": API_KEY },
|
|
166
|
+
});
|
|
167
|
+
if (!response.ok) {
|
|
168
|
+
const errorBody = await response.text();
|
|
169
|
+
let errorMessage;
|
|
170
|
+
try {
|
|
171
|
+
const parsed = JSON.parse(errorBody);
|
|
172
|
+
errorMessage = parsed.error?.message || errorBody;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
errorMessage = errorBody;
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
content: [
|
|
179
|
+
{
|
|
180
|
+
type: "text",
|
|
181
|
+
text: `Screenshot failed (${response.status}): ${errorMessage}`,
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
isError: true,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const buffer = await response.arrayBuffer();
|
|
188
|
+
const base64 = Buffer.from(buffer).toString("base64");
|
|
189
|
+
const format = args.format || "png";
|
|
190
|
+
const cacheStatus = response.headers.get("X-Cache") || "MISS";
|
|
191
|
+
const responseTime = response.headers.get("X-Response-Time") || "unknown";
|
|
192
|
+
const remaining = response.headers.get("X-Remaining-Credits") || "unknown";
|
|
193
|
+
// PDFs are returned as text resource since MCP image type doesn't support PDF
|
|
194
|
+
if (format === "pdf") {
|
|
195
|
+
return {
|
|
196
|
+
content: [
|
|
197
|
+
{
|
|
198
|
+
type: "text",
|
|
199
|
+
text: `PDF generated successfully (${buffer.byteLength} bytes, cache: ${cacheStatus}, time: ${responseTime}, remaining credits: ${remaining}). The PDF binary data is base64-encoded below:\n\n${base64}`,
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const mimeType = format === "jpeg"
|
|
205
|
+
? "image/jpeg"
|
|
206
|
+
: format === "webp"
|
|
207
|
+
? "image/webp"
|
|
208
|
+
: "image/png";
|
|
209
|
+
return {
|
|
210
|
+
content: [
|
|
211
|
+
{
|
|
212
|
+
type: "image",
|
|
213
|
+
data: base64,
|
|
214
|
+
mimeType,
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
type: "text",
|
|
218
|
+
text: `Screenshot captured (${buffer.byteLength} bytes, cache: ${cacheStatus}, time: ${responseTime}, remaining credits: ${remaining})`,
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
async function handleCacheCheck(args) {
|
|
224
|
+
const url = args.url;
|
|
225
|
+
if (!url)
|
|
226
|
+
throw new Error("url is required");
|
|
227
|
+
const params = new URLSearchParams({ url });
|
|
228
|
+
if (args.format)
|
|
229
|
+
params.set("format", args.format);
|
|
230
|
+
const response = await fetch(`${BASE_URL}/v1/screenshot/info?${params}`, { headers: { "X-API-Key": API_KEY } });
|
|
231
|
+
if (!response.ok) {
|
|
232
|
+
const errorBody = await response.text();
|
|
233
|
+
return {
|
|
234
|
+
content: [
|
|
235
|
+
{
|
|
236
|
+
type: "text",
|
|
237
|
+
text: `Cache check failed (${response.status}): ${errorBody}`,
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
isError: true,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const data = await response.json();
|
|
244
|
+
return {
|
|
245
|
+
content: [
|
|
246
|
+
{
|
|
247
|
+
type: "text",
|
|
248
|
+
text: JSON.stringify(data, null, 2),
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
async function handleUsage() {
|
|
254
|
+
const response = await fetch(`${BASE_URL}/v1/usage`, {
|
|
255
|
+
headers: { "X-API-Key": API_KEY },
|
|
256
|
+
});
|
|
257
|
+
if (!response.ok) {
|
|
258
|
+
const errorBody = await response.text();
|
|
259
|
+
return {
|
|
260
|
+
content: [
|
|
261
|
+
{
|
|
262
|
+
type: "text",
|
|
263
|
+
text: `Usage check failed (${response.status}): ${errorBody}`,
|
|
264
|
+
},
|
|
265
|
+
],
|
|
266
|
+
isError: true,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
const data = await response.json();
|
|
270
|
+
return {
|
|
271
|
+
content: [
|
|
272
|
+
{
|
|
273
|
+
type: "text",
|
|
274
|
+
text: JSON.stringify(data, null, 2),
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// --- Start server ---
|
|
280
|
+
const transport = new StdioServerTransport();
|
|
281
|
+
await server.connect(transport);
|
|
282
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "snaprender-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for SnapRender Screenshot API — lets AI agents capture website screenshots",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"snaprender-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": ["dist", "README.md"],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": ["mcp", "screenshot", "api", "snaprender", "claude", "ai", "agent", "model-context-protocol"],
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"homepage": "https://snap-render.com",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/User0856/snaprender",
|
|
22
|
+
"directory": "packages/mcp-server"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.12.1"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"typescript": "^5.7.0",
|
|
32
|
+
"@types/node": "^22.0.0"
|
|
33
|
+
}
|
|
34
|
+
}
|