@site-spy/mcp-server 0.0.1 → 0.0.2

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.
Files changed (3) hide show
  1. package/README.md +75 -15
  2. package/dist/index.mjs +48 -4
  3. package/package.json +7 -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://app.sitespy.app/dashboard) → Settings → API.
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
- | `authenticate` | Connect with an API key (if not set via env var) |
52
- | `auth_status` | Check authentication status |
53
- | `list_watches` | List all monitored websites (optionally filter by tag) |
54
- | `create_watch` | Start monitoring a URL for changes |
55
- | `get_watch` | Get full details of a specific watch |
56
- | `update_watch` | Update config — pause/resume, change interval, rename |
57
- | `delete_watch` | Stop monitoring and delete a watch |
58
- | `get_change_history` | Get timestamps of detected changes |
59
- | `get_snapshot` | Get page content at a specific timestamp |
60
- | `get_diff` | Compare content between two timestamps |
61
- | `search_watches` | Search watches by URL or title |
62
- | `list_tags` | List all tags for organizing watches |
63
- | `trigger_recheck` | Force an immediate recheck of all watches |
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://app.sitespy.app/dashboard` |
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://app.sitespy.app/dashboard";
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@site-spy/mcp-server",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "MCP server for Site Spy — lets AI agents monitor websites for changes",
5
5
  "type": "module",
6
6
  "license": "ISC",
@@ -12,7 +12,7 @@
12
12
  "ai-agents"
13
13
  ],
14
14
  "bin": {
15
- "site-spy-mcp": "dist/index.mjs"
15
+ "site-spy-mcp": "./dist/index.mjs"
16
16
  },
17
17
  "exports": {
18
18
  ".": {
@@ -31,14 +31,14 @@
31
31
  "prepublishOnly": "npm run build"
32
32
  },
33
33
  "dependencies": {
34
- "@modelcontextprotocol/sdk": "^1.12.1",
35
- "zod": "^3.25.67"
34
+ "@modelcontextprotocol/sdk": "^1.27.1",
35
+ "zod": "^4.3.6"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@site-spy/tsconfig": "workspace:*",
39
- "@types/node": "^25.3.0",
40
- "tsdown": "^0.20.3",
41
- "tsx": "^4.19.4",
39
+ "@types/node": "^25.4.0",
40
+ "tsdown": "^0.21.1",
41
+ "tsx": "^4.21.0",
42
42
  "typescript": "^5.9.3",
43
43
  "vitest": "^4.0.18"
44
44
  }