{"name":"io.github.vkuprin/site-spy","slug":"vkuprin-site-spy","title":"Site Spy","description":"MCP server for Site Spy — lets AI agents monitor websites for changes","url":"https://mcp.market/server/vkuprin-site-spy","rating":null,"grade":"C","score":55,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":11,"stars":null,"forks":null,"downloads_week":38,"last_push_at":null,"license":"ISC"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":null,"website":"https://docs.sitespy.app/docs/dashboard/mcp-integration","version":"0.3.0","remotes":[],"packages":[{"registryType":"npm","identifier":"@site-spy/mcp-server","version":"0.3.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Site Spy API key from Settings > API","isRequired":true,"format":"string","isSecret":true,"name":"SITE_SPY_API_KEY"}]}],"tools":[{"name":"auth_status","description":"Check whether the MCP server is currently authenticated with Site Spy.","write_action":false,"price_micros":0,"input_schema":null},{"name":"authenticate","description":"Connect to Site Spy with an API key. If the user doesn't have one, ask them to open … to log in and copy their key from the Settings > API tab. The key is held in memory only and is lost when the server restarts — set SITE_SPY_API_KEY to persist it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_watch","description":"Start monitoring a URL for changes. Returns the UUID of the new watch.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_watch","description":"Stop monitoring a URL and delete the watch with all its history.","write_action":true,"price_micros":0,"input_schema":null},{"name":"fetch_url","description":"Fetch a single known URL through Site Spy. Do NOT use this for discovery — use web_search to find URLs first, then fetch_url on each result. Do NOT fetch google.com / bing.com directly (they always block — wastes the cascade budget). For known static sites prefer fetch_backend: 'html_requests' (≤10s). For SPAs use 'html_webdriver'. For Cloudflare-protected pages use 'flaresolverr'. 'auto' cascades","write_action":false,"price_micros":0,"input_schema":null},{"name":"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. Regenerating invalidates all existing feed URLs, so any reader already subscribed will stop receiving updates.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_ai_summary","description":"Get the AI-generated plain-English summary of a watch's most recent change. Requires a Pro or Business plan. Returns the summary text if available, or a message if no summary exists yet.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_change_history","description":"Get the list of timestamps when changes were detected for a watch. Use these timestamps with get_snapshot or get_diff.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_diff","description":"Compare page content between two timestamps to see exactly what changed. Use get_change_history to find valid timestamps. Output is capped at … characters by default — raise max_chars if you need more.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_notifications","description":"Get the current notification settings (email, Telegram, web push, etc.).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_rss_settings","description":"Get the current RSS feed settings including whether feeds are enabled and the feed token.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_snapshot","description":"Get the page content captured at a specific timestamp. Use get_change_history first to find valid timestamps. Content is capped at … characters by default — raise max_chars if you need more.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_watch","description":"Get full details of a specific watch including its configuration, last check status, and change history summary.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_watches","description":"List all monitored websites. Returns an object keyed by watch UUID, each with its URL, title, status, and last checked/changed timestamps.","write_action":false,"price_micros":0,"input_schema":null},{"name":"revoke_rss_token","description":"Revoke the RSS feed token, disabling all RSS feed access immediately.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_watches","description":"Search across all watches by URL, title, or content. Returns matching watches.","write_action":false,"price_micros":0,"input_schema":null},{"name":"trigger_recheck","description":"Force an immediate recheck of every watch. Useful when you need fresh data now rather than waiting for the next scheduled check. Manual rechecks are capped per day by plan.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_watch","description":"Update a watch's configuration. Use this to pause/resume, change check interval, update title, or modify notification settings.","write_action":true,"price_micros":0,"input_schema":null},{"name":"web_search","description":"Search the web via DuckDuckGo HTML and return a list of result URLs with titles and snippets. Use this BEFORE fetch_url when the user asks you to 'search', 'find', 'look up', or otherwise discover content — instead of guessing google.com (which always blocks). Pipeline: web_search(query) -> pick relevant results -> fetch_url(result.url, fetch_backend: 'html_requests') on each. Returns up to 20 res","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":55,"grade":"C","scanned_at":"2026-09-20T16:16:25.275Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T16:16:25.266Z","components":{"code":{"score":25,"max":25,"notes":["2 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"packages":[{"registryType":"npm","identifier":"@site-spy/mcp-server","version":"0.3.0","found":true,"license":"ISC","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-09-04T10:39:29.835Z","weeklyDownloads":38}],"repo":{"found":false},"icon":{"url":"https://docs.sitespy.app/mintlify-assets/_mintlify/favicons/site-spy/F1e6kCOyPCH3VyF3/_generated/favicon/apple-touch-icon.png","source":"site","width":180,"height":180},"presence":{"stars":null,"forks":null,"downloadsWeek":38,"license":"ISC","lastPushAt":null,"score":11}}}},"grade_history":[],"reviews":[]}