@site-spy/mcp-server 0.0.1 → 0.0.3
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 +75 -15
- package/dist/index.mjs +48 -4
- package/package.json +12 -7
package/README.md
CHANGED
|
@@ -24,6 +24,22 @@ Add to your AI client config:
|
|
|
24
24
|
}
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
**Claude Code** (`.mcp.json`):
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"site-spy": {
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["-y", "@site-spy/mcp-server"],
|
|
35
|
+
"env": {
|
|
36
|
+
"SITE_SPY_API_KEY": "your-api-key"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
27
43
|
**Cursor** (`.cursor/mcp.json`):
|
|
28
44
|
|
|
29
45
|
```json
|
|
@@ -40,27 +56,65 @@ Add to your AI client config:
|
|
|
40
56
|
}
|
|
41
57
|
```
|
|
42
58
|
|
|
43
|
-
Get your API key from [Site Spy Dashboard](https://
|
|
59
|
+
Get your API key from [Site Spy Dashboard](https://sitespy.app/dashboard/settings?tab=api) → Settings → API.
|
|
44
60
|
|
|
45
61
|
If you don't set `SITE_SPY_API_KEY`, the agent will ask you to authenticate interactively.
|
|
46
62
|
|
|
47
63
|
## Tools
|
|
48
64
|
|
|
65
|
+
### Authentication
|
|
66
|
+
|
|
67
|
+
| Tool | Description |
|
|
68
|
+
| -------------- | ------------------------------------------------ |
|
|
69
|
+
| `authenticate` | Connect with an API key (if not set via env var) |
|
|
70
|
+
| `auth_status` | Check authentication status |
|
|
71
|
+
|
|
72
|
+
### Watch Management
|
|
73
|
+
|
|
74
|
+
| Tool | Description |
|
|
75
|
+
| ----------------- | ------------------------------------------------------ |
|
|
76
|
+
| `list_watches` | List all monitored websites (optionally filter by tag) |
|
|
77
|
+
| `create_watch` | Start monitoring a URL for changes |
|
|
78
|
+
| `get_watch` | Get full details of a specific watch |
|
|
79
|
+
| `update_watch` | Update config — pause/resume, change interval, rename |
|
|
80
|
+
| `delete_watch` | Stop monitoring and delete a watch |
|
|
81
|
+
| `search_watches` | Search watches by URL or title |
|
|
82
|
+
| `trigger_recheck` | Force an immediate recheck of all watches |
|
|
83
|
+
|
|
84
|
+
### Change History
|
|
85
|
+
|
|
86
|
+
| Tool | Description |
|
|
87
|
+
| -------------------- | ---------------------------------------- |
|
|
88
|
+
| `get_change_history` | Get timestamps of detected changes |
|
|
89
|
+
| `get_snapshot` | Get page content at a specific timestamp |
|
|
90
|
+
| `get_diff` | Compare content between two timestamps |
|
|
91
|
+
|
|
92
|
+
### RSS Feeds
|
|
93
|
+
|
|
49
94
|
| Tool | Description |
|
|
50
95
|
| -------------------- | ------------------------------------------------------ |
|
|
51
|
-
| `
|
|
52
|
-
| `
|
|
53
|
-
| `
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
|
|
96
|
+
| `get_rss_settings` | Get current RSS feed settings and token |
|
|
97
|
+
| `generate_rss_token` | Generate or regenerate an RSS feed token for feed URLs |
|
|
98
|
+
| `revoke_rss_token` | Revoke the RSS token, disabling all feed access |
|
|
99
|
+
|
|
100
|
+
### Tags & Notifications
|
|
101
|
+
|
|
102
|
+
| Tool | Description |
|
|
103
|
+
| ------------------- | ------------------------------------ |
|
|
104
|
+
| `list_tags` | List all tags for organizing watches |
|
|
105
|
+
| `create_tag` | Create a new tag with name and color |
|
|
106
|
+
| `delete_tag` | Delete a tag |
|
|
107
|
+
| `get_notifications` | Get current notification settings |
|
|
108
|
+
|
|
109
|
+
## RSS Feeds
|
|
110
|
+
|
|
111
|
+
Site Spy provides per-user RSS feeds so you can subscribe to change notifications in any RSS reader.
|
|
112
|
+
|
|
113
|
+
Once you have a token (via `generate_rss_token`), feed URLs follow this pattern:
|
|
114
|
+
|
|
115
|
+
- **All watches**: `https://sitespy.app/api/rss?token={token}`
|
|
116
|
+
- **Single watch**: `https://sitespy.app/api/rss/watch/{watch_uuid}?token={token}`
|
|
117
|
+
- **By tag**: `https://sitespy.app/api/rss/tag/{tag_uuid}?token={token}`
|
|
64
118
|
|
|
65
119
|
## Environment Variables
|
|
66
120
|
|
|
@@ -68,7 +122,11 @@ If you don't set `SITE_SPY_API_KEY`, the agent will ask you to authenticate inte
|
|
|
68
122
|
| ------------------- | --------------------------------------- | ------------------------------------------- |
|
|
69
123
|
| `SITE_SPY_API_KEY` | API key for authentication | — (interactive auth) |
|
|
70
124
|
| `SITE_SPY_API_URL` | Backend API URL | `https://detect.coolify.vkuprin.com/api/v1` |
|
|
71
|
-
| `SITE_SPY_AUTH_URL` | URL shown to users for getting API keys | `https://
|
|
125
|
+
| `SITE_SPY_AUTH_URL` | URL shown to users for getting API keys | `https://sitespy.app/dashboard` |
|
|
126
|
+
|
|
127
|
+
## Documentation
|
|
128
|
+
|
|
129
|
+
Full documentation is available at [docs.sitespy.app](https://docs.sitespy.app).
|
|
72
130
|
|
|
73
131
|
## Example Prompts
|
|
74
132
|
|
|
@@ -79,6 +137,8 @@ Once configured, try asking your AI assistant:
|
|
|
79
137
|
- "Show me what changed on my watched pages"
|
|
80
138
|
- "Pause all monitors tagged 'staging'"
|
|
81
139
|
- "Check all my sites right now"
|
|
140
|
+
- "Set up RSS feeds so I can follow changes in my feed reader"
|
|
141
|
+
- "Create a tag called 'production' and assign my watches to it"
|
|
82
142
|
|
|
83
143
|
## License
|
|
84
144
|
|
package/dist/index.mjs
CHANGED
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
|
|
6
5
|
//#region src/index.ts
|
|
7
6
|
const API_URL = process.env.SITE_SPY_API_URL ?? "https://detect.coolify.vkuprin.com/api/v1";
|
|
8
|
-
const AUTH_URL = process.env.SITE_SPY_AUTH_URL ?? "https://
|
|
7
|
+
const AUTH_URL = process.env.SITE_SPY_AUTH_URL ?? "https://sitespy.app/dashboard";
|
|
9
8
|
let apiKey = process.env.SITE_SPY_API_KEY ?? "";
|
|
10
9
|
function requireAuth() {
|
|
11
10
|
if (!apiKey) throw new Error(`Not authenticated. Ask the user to open ${AUTH_URL} to log in and copy their API key, then call the 'authenticate' tool with it.`);
|
|
@@ -193,8 +192,53 @@ server.registerTool("trigger_recheck", {
|
|
|
193
192
|
if (tag) query.tag = tag;
|
|
194
193
|
return jsonContent(await api("/watch", { query }));
|
|
195
194
|
});
|
|
195
|
+
server.registerTool("get_rss_settings", {
|
|
196
|
+
description: "Get the current RSS feed settings including whether feeds are enabled and the feed token.",
|
|
197
|
+
inputSchema: z.object({})
|
|
198
|
+
}, async () => {
|
|
199
|
+
return jsonContent(await api("/rss"));
|
|
200
|
+
});
|
|
201
|
+
server.registerTool("generate_rss_token", {
|
|
202
|
+
description: "Generate or regenerate an RSS feed token. Use the token to build feed URLs: {server}/rss?token={token} for all watches, {server}/rss/watch/{uuid}?token={token} for a single watch, {server}/rss/tag/{tag_uuid}?token={token} for a tag. Regenerating invalidates all existing feed URLs.",
|
|
203
|
+
inputSchema: z.object({})
|
|
204
|
+
}, async () => {
|
|
205
|
+
return jsonContent(await api("/rss", { method: "POST" }));
|
|
206
|
+
});
|
|
207
|
+
server.registerTool("revoke_rss_token", {
|
|
208
|
+
description: "Revoke the RSS feed token, disabling all RSS feed access immediately.",
|
|
209
|
+
annotations: { destructiveHint: true },
|
|
210
|
+
inputSchema: z.object({})
|
|
211
|
+
}, async () => {
|
|
212
|
+
return jsonContent(await api("/rss", { method: "DELETE" }));
|
|
213
|
+
});
|
|
214
|
+
server.registerTool("create_tag", {
|
|
215
|
+
description: "Create a new tag for organizing watches.",
|
|
216
|
+
inputSchema: z.object({
|
|
217
|
+
title: z.string().describe("Tag name"),
|
|
218
|
+
color: z.string().optional().describe("Tag color (e.g. 'red', 'blue', '#ff0000')")
|
|
219
|
+
})
|
|
220
|
+
}, async ({ title, color }) => {
|
|
221
|
+
const body = { title };
|
|
222
|
+
if (color) body.color = color;
|
|
223
|
+
return jsonContent(await api("/tag", {
|
|
224
|
+
method: "POST",
|
|
225
|
+
body
|
|
226
|
+
}));
|
|
227
|
+
});
|
|
228
|
+
server.registerTool("delete_tag", {
|
|
229
|
+
description: "Delete a tag. Watches using this tag will be untagged.",
|
|
230
|
+
annotations: { destructiveHint: true },
|
|
231
|
+
inputSchema: z.object({ uuid: z.string().describe("Tag UUID to delete") })
|
|
232
|
+
}, async ({ uuid }) => {
|
|
233
|
+
return jsonContent(await api(`/tag/${uuid}`, { method: "DELETE" }));
|
|
234
|
+
});
|
|
235
|
+
server.registerTool("get_notifications", {
|
|
236
|
+
description: "Get the current notification settings (email, Telegram, web push, etc.).",
|
|
237
|
+
inputSchema: z.object({})
|
|
238
|
+
}, async () => {
|
|
239
|
+
return jsonContent(await api("/notifications"));
|
|
240
|
+
});
|
|
196
241
|
const transport = new StdioServerTransport();
|
|
197
242
|
await server.connect(transport);
|
|
198
|
-
|
|
199
243
|
//#endregion
|
|
200
|
-
export {
|
|
244
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@site-spy/mcp-server",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "MCP server for Site Spy — lets AI agents monitor websites for changes",
|
|
5
|
+
"mcpName": "io.github.vkuprin/site-spy",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/vkuprin/site-spy-monitor.git"
|
|
9
|
+
},
|
|
5
10
|
"type": "module",
|
|
6
11
|
"license": "ISC",
|
|
7
12
|
"keywords": [
|
|
@@ -12,7 +17,7 @@
|
|
|
12
17
|
"ai-agents"
|
|
13
18
|
],
|
|
14
19
|
"bin": {
|
|
15
|
-
"site-spy-mcp": "dist/index.mjs"
|
|
20
|
+
"site-spy-mcp": "./dist/index.mjs"
|
|
16
21
|
},
|
|
17
22
|
"exports": {
|
|
18
23
|
".": {
|
|
@@ -31,14 +36,14 @@
|
|
|
31
36
|
"prepublishOnly": "npm run build"
|
|
32
37
|
},
|
|
33
38
|
"dependencies": {
|
|
34
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
35
|
-
"zod": "^3.
|
|
39
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
40
|
+
"zod": "^4.3.6"
|
|
36
41
|
},
|
|
37
42
|
"devDependencies": {
|
|
38
43
|
"@site-spy/tsconfig": "workspace:*",
|
|
39
|
-
"@types/node": "^25.
|
|
40
|
-
"tsdown": "^0.
|
|
41
|
-
"tsx": "^4.
|
|
44
|
+
"@types/node": "^25.4.0",
|
|
45
|
+
"tsdown": "^0.21.1",
|
|
46
|
+
"tsx": "^4.21.0",
|
|
42
47
|
"typescript": "^5.9.3",
|
|
43
48
|
"vitest": "^4.0.18"
|
|
44
49
|
}
|