Sign In

@site-spy/mcp-server

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@site-spy/mcp-server - npm Package Compare versions

Comparing version
0.0.1
to
0.0.2
+48
-4
dist/index.mjs

@@ -5,6 +5,5 @@ #!/usr/bin/env node

import { z } from "zod";
//#region src/index.ts
const API_URL = process.env.SITE_SPY_API_URL ?? "https://detect.coolify.vkuprin.com/api/v1";
const AUTH_URL = process.env.SITE_SPY_AUTH_URL ?? "https://app.sitespy.app/dashboard";
const AUTH_URL = process.env.SITE_SPY_AUTH_URL ?? "https://sitespy.app/dashboard";
let apiKey = process.env.SITE_SPY_API_KEY ?? "";

@@ -197,6 +196,51 @@ function requireAuth() {

});
server.registerTool("get_rss_settings", {
description: "Get the current RSS feed settings including whether feeds are enabled and the feed token.",
inputSchema: z.object({})
}, async () => {
return jsonContent(await api("/rss"));
});
server.registerTool("generate_rss_token", {
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.",
inputSchema: z.object({})
}, async () => {
return jsonContent(await api("/rss", { method: "POST" }));
});
server.registerTool("revoke_rss_token", {
description: "Revoke the RSS feed token, disabling all RSS feed access immediately.",
annotations: { destructiveHint: true },
inputSchema: z.object({})
}, async () => {
return jsonContent(await api("/rss", { method: "DELETE" }));
});
server.registerTool("create_tag", {
description: "Create a new tag for organizing watches.",
inputSchema: z.object({
title: z.string().describe("Tag name"),
color: z.string().optional().describe("Tag color (e.g. 'red', 'blue', '#ff0000')")
})
}, async ({ title, color }) => {
const body = { title };
if (color) body.color = color;
return jsonContent(await api("/tag", {
method: "POST",
body
}));
});
server.registerTool("delete_tag", {
description: "Delete a tag. Watches using this tag will be untagged.",
annotations: { destructiveHint: true },
inputSchema: z.object({ uuid: z.string().describe("Tag UUID to delete") })
}, async ({ uuid }) => {
return jsonContent(await api(`/tag/${uuid}`, { method: "DELETE" }));
});
server.registerTool("get_notifications", {
description: "Get the current notification settings (email, Telegram, web push, etc.).",
inputSchema: z.object({})
}, async () => {
return jsonContent(await api("/notifications"));
});
const transport = new StdioServerTransport();
await server.connect(transport);
//#endregion
export { };
export {};
+7
-7
{
"name": "@site-spy/mcp-server",
"version": "0.0.1",
"version": "0.0.2",
"description": "MCP server for Site Spy — lets AI agents monitor websites for changes",

@@ -15,3 +15,3 @@ "type": "module",

"bin": {
"site-spy-mcp": "dist/index.mjs"
"site-spy-mcp": "./dist/index.mjs"
},

@@ -35,10 +35,10 @@ "exports": {

"dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1",
"zod": "^3.25.67"
"@modelcontextprotocol/sdk": "^1.27.1",
"zod": "^4.3.6"
},
"devDependencies": {
"@site-spy/tsconfig": "workspace:*",
"@types/node": "^25.3.0",
"tsdown": "^0.20.3",
"tsx": "^4.19.4",
"@types/node": "^25.4.0",
"tsdown": "^0.21.1",
"tsx": "^4.21.0",
"typescript": "^5.9.3",

@@ -45,0 +45,0 @@ "vitest": "^4.0.18"

+75
-15

@@ -27,2 +27,18 @@ # @site-spy/mcp-server

**Claude Code** (`.mcp.json`):
```json
{
"mcpServers": {
"site-spy": {
"command": "npx",
"args": ["-y", "@site-spy/mcp-server"],
"env": {
"SITE_SPY_API_KEY": "your-api-key"
}
}
}
}
```
**Cursor** (`.cursor/mcp.json`):

@@ -44,3 +60,3 @@

Get your API key from [Site Spy Dashboard](https://app.sitespy.app/dashboard) → Settings → API.
Get your API key from [Site Spy Dashboard](https://sitespy.app/dashboard/settings?tab=api) → Settings → API.

@@ -51,18 +67,56 @@ If you don't set `SITE_SPY_API_KEY`, the agent will ask you to authenticate interactively.

### Authentication
| Tool | Description |
| -------------- | ------------------------------------------------ |
| `authenticate` | Connect with an API key (if not set via env var) |
| `auth_status` | Check authentication status |
### Watch Management
| Tool | Description |
| ----------------- | ------------------------------------------------------ |
| `list_watches` | List all monitored websites (optionally filter by tag) |
| `create_watch` | Start monitoring a URL for changes |
| `get_watch` | Get full details of a specific watch |
| `update_watch` | Update config — pause/resume, change interval, rename |
| `delete_watch` | Stop monitoring and delete a watch |
| `search_watches` | Search watches by URL or title |
| `trigger_recheck` | Force an immediate recheck of all watches |
### Change History
| Tool | Description |
| -------------------- | ---------------------------------------- |
| `get_change_history` | Get timestamps of detected changes |
| `get_snapshot` | Get page content at a specific timestamp |
| `get_diff` | Compare content between two timestamps |
### RSS Feeds
| Tool | Description |
| -------------------- | ------------------------------------------------------ |
| `authenticate` | Connect with an API key (if not set via env var) |
| `auth_status` | Check authentication status |
| `list_watches` | List all monitored websites (optionally filter by tag) |
| `create_watch` | Start monitoring a URL for changes |
| `get_watch` | Get full details of a specific watch |
| `update_watch` | Update config — pause/resume, change interval, rename |
| `delete_watch` | Stop monitoring and delete a watch |
| `get_change_history` | Get timestamps of detected changes |
| `get_snapshot` | Get page content at a specific timestamp |
| `get_diff` | Compare content between two timestamps |
| `search_watches` | Search watches by URL or title |
| `list_tags` | List all tags for organizing watches |
| `trigger_recheck` | Force an immediate recheck of all watches |
| `get_rss_settings` | Get current RSS feed settings and token |
| `generate_rss_token` | Generate or regenerate an RSS feed token for feed URLs |
| `revoke_rss_token` | Revoke the RSS token, disabling all feed access |
### Tags & Notifications
| Tool | Description |
| ------------------- | ------------------------------------ |
| `list_tags` | List all tags for organizing watches |
| `create_tag` | Create a new tag with name and color |
| `delete_tag` | Delete a tag |
| `get_notifications` | Get current notification settings |
## RSS Feeds
Site Spy provides per-user RSS feeds so you can subscribe to change notifications in any RSS reader.
Once you have a token (via `generate_rss_token`), feed URLs follow this pattern:
- **All watches**: `https://sitespy.app/api/rss?token={token}`
- **Single watch**: `https://sitespy.app/api/rss/watch/{watch_uuid}?token={token}`
- **By tag**: `https://sitespy.app/api/rss/tag/{tag_uuid}?token={token}`
## Environment Variables

@@ -74,4 +128,8 @@

| `SITE_SPY_API_URL` | Backend API URL | `https://detect.coolify.vkuprin.com/api/v1` |
| `SITE_SPY_AUTH_URL` | URL shown to users for getting API keys | `https://app.sitespy.app/dashboard` |
| `SITE_SPY_AUTH_URL` | URL shown to users for getting API keys | `https://sitespy.app/dashboard` |
## Documentation
Full documentation is available at [docs.sitespy.app](https://docs.sitespy.app).
## Example Prompts

@@ -86,2 +144,4 @@

- "Check all my sites right now"
- "Set up RSS feeds so I can follow changes in my feed reader"
- "Create a tag called 'production' and assign my watches to it"

@@ -88,0 +148,0 @@ ## License