Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Site Spy

NPM · @SITE-SPY/MCP-SERVER · SCANNED SEP 25

MCP server for Site Spy — lets AI agents monitor websites for changes

+1 this week 78 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 95 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency19
Schema Quality & AI Usability80
  • AI-judged instruction clarity (excellent).Pass
  • Tool/resource definitions use about 1714 tokens (~90/item across 19 items; 19 tools + 0 resources), lean.Pass
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management85
  • Stability check failed: the tool surface changed between 0.2.2 and 0.3.1: 1 tool removals, 0 breaking changes, 0 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 19 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Site Spy MCP server?

Site Spy runs locally as an npm package, launched with npx -y @site-spy/mcp-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @site-spy/mcp-server

# add to Claude Code
claude mcp add vkuprin-site-spy -- npx -y @site-spy/mcp-server
// .cursor/mcp.json
{
  "mcpServers": {
    "vkuprin-site-spy": {
      "command": "npx",
      "args": [
        "-y",
        "@site-spy/mcp-server"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "vkuprin-site-spy": {
      "command": "npx",
      "args": [
        "-y",
        "@site-spy/mcp-server"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add vkuprin-site-spy -- npx -y @site-spy/mcp-server
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "vkuprin-site-spy": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@site-spy/mcp-server"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add vkuprin-site-spy --command npx --arg -y --arg @site-spy/mcp-server
# ~/.hermes/config.yaml
mcp_servers:
  vkuprin-site-spy:
    command: "npx"
    args: ["-y", "@site-spy/mcp-server"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "vkuprin-site-spy": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@site-spy/mcp-server"
      ]
    }
  }
}
# add to Vellum
assistant mcp add vkuprin-site-spy -t stdio -c npx -a -y @site-spy/mcp-server
// mcp.json
{
  "mcpServers": {
    "vkuprin-site-spy": {
      "command": "npx",
      "args": [
        "-y",
        "@site-spy/mcp-server"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 25 Sept 26 +1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 23 Sept 26 −2

    No change was recorded against any check on this day. Stability & Change Management went from 95 to 78.

  • 22 Sept 26 +1
    • Stability: fail → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Package version: 0.3.0 → 0.3.1 functional
  • 19 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 82 to 85.

  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 75 to 78.

  • 16 Sept 26 −3

    No change was recorded against any check on this day. Stability & Change Management went from 95 to 75.

  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 92 to 95.

  • 12 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 82 to 85.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 25 Sept 2026 · Analysed npm/@site-spy/mcp-server@0.3.1

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 95 packages
Packages resolved 95
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 19 exposed · ~1,714 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
auth_status ~20

Check whether the MCP server is currently authenticated with Site Spy.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

authenticate ~85

Connect to Site Spy with an API key. If the user doesn't have one, ask them to open https://sitespy.app/dashboard 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.

NameTypeReqDescription
api_keystringyesSite Spy API key

No output schema declared.

No examples provided.

create_watch ~151

Start monitoring a URL for changes. Returns the UUID of the new watch.

NameTypeReqDescription
check_hoursnumber–Hours between checks (default: uses account setting)
check_minutesnumber–Minutes between checks
fetch_backendstring–How to fetch the page: html_requests (fast, no JS), html_webdriver (browser with JS, for SPAs), or html_hybrid (plain HTTP first, then a browser and the anti-bot solvers when the page needs them). Pr…
titlestring–Human-readable name for this monitor
urlstringyesURL to monitor for changes

No output schema declared.

No examples provided.

delete_watch ~32

Stop monitoring a URL and delete the watch with all its history.

NameTypeReqDescription
uuidstringyesWatch UUID to delete

No output schema declared.

No examples provided.

fetch_url ~470

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'. 'auto' starts cheap and escalates only when the site blocks us — plain HTTP, then a browser-grade TLS fingerprint, then a browser, then the anti-bot solvers — capped at 50s total (FETCH_URL_AUTO_TOTAL_TIMEOUT_SECONDS). On failure, response includes attempts[] and cascade_summary so you can see what was tried. This does not create a watch or save history.

NameTypeReqDescription
bodystring–Optional request body string.
fetch_backendstring–Fetch strategy. Default 'auto' escalates on a block: html_requests -> impersonate (Chrome TLS, no browser) -> html_webdriver -> flaresolverr -> stealth_browser, with a 50s total cap. Prefer 'html_req…
headersobject–Optional request headers.
ignore_status_codesboolean–Return content for non-2xx responses instead of failing. Defaults to true.
include_filtersarray–Optional selectors used by auto mode to decide if browser rendering is needed.
jsstring–JavaScript to execute before extraction when a browser backend is used.
max_content_charsinteger–Maximum returned characters for content fields.
methodstring–HTTP method. Browser fetchers use GET-like navigation.
outputstring–Response content format. Defaults to text.
screenshotboolean–Return a base64 screenshot when the browser backend captures one.
screenshot_formatstring–Screenshot format. Defaults to PNG.
timeoutinteger–Per-backend timeout in seconds (1-120). 'auto' mode also has a separate 30s total wall-clock cap (env FETCH_URL_AUTO_TOTAL_TIMEOUT_SECONDS) that bounds the whole cascade.
urlstringyesURL to fetch
wait_secondsinteger–Extra browser wait before extracting content.

No output schema declared.

No examples provided.

generate_rss_token ~76

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_ai_summary ~56

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.

NameTypeReqDescription
uuidstringyesWatch UUID

No output schema declared.

No examples provided.

get_change_history ~77

Get the list of timestamps when changes were detected for a watch. Use these timestamps with get_snapshot or get_diff.

NameTypeReqDescription
limitinteger–Return at most this many entries. Default: all of them.
offsetinteger–Skip this many entries before returning. Use with limit.
uuidstringyesWatch UUID

No output schema declared.

No examples provided.

get_diff ~98

Compare page content between two timestamps to see exactly what changed. Use get_change_history to find valid timestamps. Output is capped at 20000 characters by default — raise max_chars if you need more.

NameTypeReqDescription
from_timestampstringyesEarlier timestamp
max_charsinteger–Maximum characters of diff output to return. Defaults to 20000.
to_timestampstringyesLater timestamp
uuidstringyesWatch UUID

No output schema declared.

No examples provided.

get_notifications ~23

Get the current notification settings (email, Telegram, web push, etc.).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_rss_settings ~26

Get the current RSS feed settings including whether feeds are enabled and the feed token.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_snapshot ~88

Get the page content captured at a specific timestamp. Use get_change_history first to find valid timestamps. Content is capped at 20000 characters by default — raise max_chars if you need more.

NameTypeReqDescription
max_charsinteger–Maximum characters of page content to return. Defaults to 20000.
timestampstringyesTimestamp from change history
uuidstringyesWatch UUID

No output schema declared.

No examples provided.

get_watch ~37

Get full details of a specific watch including its configuration, last check status, and change history summary.

NameTypeReqDescription
uuidstringyesWatch UUID

No output schema declared.

No examples provided.

list_watches ~74

List all monitored websites. Returns an object keyed by watch UUID, each with its URL, title, status, and last checked/changed timestamps.

NameTypeReqDescription
limitinteger–Return at most this many watches. Default: all of them.
offsetinteger–Skip this many watches before returning. Use with limit.

No output schema declared.

No examples provided.

revoke_rss_token ~24

Revoke the RSS feed token, disabling all RSS feed access immediately.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

search_watches ~40

Search across all watches by URL, title, or content. Returns matching watches.

NameTypeReqDescription
querystringyesSearch query (matches against URL, title)

No output schema declared.

No examples provided.

trigger_recheck ~44

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

update_watch ~110

Update a watch's configuration. Use this to pause/resume, change check interval, update title, or modify notification settings.

NameTypeReqDescription
check_hoursnumber–Hours between checks
check_minutesnumber–Minutes between checks
notification_mutedboolean–Mute or unmute notifications
pausedboolean–Pause or resume monitoring
titlestring–New title
urlstring–New URL to monitor
uuidstringyesWatch UUID

No output schema declared.

No examples provided.

web_search ~183

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 results.

NameTypeReqDescription
debugboolean–When true, include a debug_html_excerpt in the response for troubleshooting parsing failures.
limitinteger–Max results to return. Default 10, max 20.
querystringyesSearch query.
regionstring–DuckDuckGo region code. Default 'wt-wt' (worldwide). Examples: 'us-en', 'fr-fr', 'de-de'.

No output schema declared.

No examples provided.

Common questions

What is the Site Spy MCP server?

Site Spy is an MCP server listed in the public MCP registry as io.github.vkuprin/site-spy. MCP server for Site Spy, lets AI agents monitor websites for changes. This page covers its npm package (@site-spy/mcp-server).

Is the Site Spy MCP server safe to use?

Site Spy scores 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 25 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Site Spy MCP server expose?

Site Spy exposes 19 tools: authenticate, auth_status, list_watches, create_watch, get_watch, and 14 more. Their descriptions and schemas cost roughly 1,714 tokens of context every time the server is loaded.

Is the Site Spy MCP server still maintained?

Site Spy is still listed as active in the MCP registry. We last reached this channel on 25 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Site Spy MCP server under?

Site Spy declares the ISC licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.