# SpotCheck

> Score Spotify playlists for bot-farm patterns and triage an artificial streaming warning.

- name: io.github.chrisschouk/spotcheck
- version: 1.0.1
- connection class: R0 (autonomous)
- trust: 97/100
- quality: 82/100 (new)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.chrisschouk%2Fspotcheck
- tools: https://api.protogrid.dev/v1/servers/io.github.chrisschouk%2Fspotcheck/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "spotcheck": {
      "type": "http",
      "url": "https://spotcheck.cc/api/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 100
- provenance: 90
- drivers: +repository +namespace-matches-repo +website +reachable +uptime-100% +updated-5d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 82/100 (new)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2024-11-05; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 88 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 2 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 7 of 7 tools declare readOnlyHint or destructiveHint
- warn `tools.directory_hints`: 2 of 7 tools declare all four hints; missing: get_curator_contacts (destructiveHint, idempotentHint); check_playlist (destructiveHint, idempotentHint); scan_warning_playlists (destructiveHint, idempotentHint); …
- pass `tools.token_cost`: about 2,118 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump
- pass `tools.hidden_text`: no hidden text in tool names, descriptions, schemas or annotations

### stability: n/a (weight 15)

- n/a `stability.changes`, `stability.rug_pull`, `stability.new_links`: tool history recorded for 5 of the 7 days needed

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 7, about 2,118 tokens to load them all
- tool set hash: 72a8bbc24531550c25ba3bc88969a6f7
- tools last changed: 2026-11-09T15:30:34.282Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.chrisschouk/spotcheck.svg)](https://protogrid.dev/servers/io.github.chrisschouk/spotcheck)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-11-09 `scan_warning_playlists` changed (description, annotations)
  - before: Scores every Spotify playlist an artist pastes after a distributor flags a track for artificial streaming (the full list from Spotify for Artists). Returns each playlist ranked by bot-risk score with skip reasons for invalid or unavailable links. Free accounts get up to 2 scans a day with only the worst flagged playlist unlocked; Pro and Premium are unlimited with the full ranked report. Requires a signed-in account (anonymous callers are not supported). Supply artistName, trackName and distributor to also receive drafted reply text once the report is unlocked.
  - after: Scores every Spotify playlist an artist pastes after a distributor flags a track for artificial streaming (the full list from Spotify for Artists). Use it for a batch of up to 50 links; for one playlist, use check_playlist, which also works anonymously. Returns each playlist ranked by bot-risk score with skip reasons for invalid or unavailable links. Free accounts get up to 2 scans a day with only the worst flagged playlist unlocked; Pro and Premium are unlimited with the full ranked report. Requires a signed-in account (anonymous callers are not supported). Supply artistName, trackName and distributor to also receive drafted reply text once the report is unlocked.
- 2026-11-09 `get_account_status` changed (description, annotations) **meaning changed**
  - before: Returns the authenticated user account status, subscription tier (Free, Pro £4.99, Premium £14.99), remaining free check allowances, and enabled features.
  - after: Describes who SpotCheck thinks the caller is and what they can do right now. Returns email (null when anonymous), tier (free, pro or premium), isAnonymous, authMethod (oauth, session, api_key, anonymous or env_override), features (playlistChecking, fullFactorBreakdown, historicalTrends, curatorContacts, cloudMonitoring, maxMonitors), allowance (dailyChecksRemaining and unlimited; usageUnavailable is set when today's count could not be read) and upgradeUrl (null on paid tiers). Use it before other calls to plan: whether check_playlist has checks left today (anonymous 1 a day, Free 3, Pro and Premium unlimited), whether get_curator_contacts and the monitor tools will work (Premium, £14.99/mo), and whether the full factor breakdown is unlocked (Pro, £4.99/mo, or Premium). Takes no arguments, works without signing in, costs nothing and does not use up a check. Read-only and safe to repeat.
- 2026-11-09 `remove_monitor` changed (description, inputSchema, annotations) **meaning changed**
  - before: Stops automated monitoring and alert tracking for a Spotify playlist.
  - after: Stops cloud monitoring for one playlist on the signed-in Premium account. The daily follower snapshot, the spike and drop alert emails and the track-removed alert all stop for that playlist on this account, and it disappears from list_monitors. Returns { ok, message, playlistId }. Side effects: deletes this account's monitor entry, including its custom name and track_id. Follower snapshots already stored for the playlist are kept and still appear in check_playlist, and other accounts monitoring the same playlist are unaffected. Reversible with add_monitor, but the name and track_id have to be supplied again. Idempotent: removing a playlist that is not monitored still returns ok: true. Use it to free a slot when the account is at the 25-monitor limit, or to change a monitor's name or tracked track (there is no update tool, so remove it and call add_monitor with the new values). Call list_monitors first if you need the exact playlist id. Requires Premium (£14.99/mo) and a signed-in account: returns FORBIDDEN on other tiers, UNAUTHORIZED without an account, and INVALID_PARAMS for a link that is not a playlist.
- 2026-11-09 `add_monitor` changed (description, annotations)
  - before: Enrolls a Spotify playlist in automated cloud monitoring for daily follower snapshots, growth trend analysis, and inorganic spike alerts. Allows up to 25 monitored playlists per Premium account.
  - after: Enrolls a Spotify playlist in automated cloud monitoring for daily follower snapshots, growth trend analysis, and inorganic spike alerts. Allows up to 25 monitored playlists per Premium account. Adding a playlist that is already monitored leaves its existing name and track_id unchanged; to change them, call remove_monitor first.
- 2026-11-09 `list_monitors` changed (description, annotations)
  - before: Lists all playlists currently tracked under 24/7 cloud monitoring for the authenticated account, including 24-hour and 7-day follower deltas, anomaly flags, and latest snapshot timestamps.
  - after: Lists all playlists currently tracked under 24/7 cloud monitoring for the authenticated account, including 24-hour and 7-day follower deltas, anomaly flags, and latest snapshot timestamps. For one playlist's full 31-day snapshot series, call check_playlist with its playlist_id.
- 2026-11-09 `get_curator_contacts` changed (annotations)
- 2026-11-09 `check_playlist` changed (description, inputSchema, annotations) **meaning changed**
  - before: Analyses a Spotify playlist for inorganic follower inflation and bot activity. Returns a 0-100 risk score, risk level (low, medium, high, editorial), heuristic factor breakdown (follower/track ratios, generic naming patterns, sudden follower spikes), and historical snapshot trends.
  - after: Scores one Spotify playlist for bot and fake-follower risk. Returns the playlist (id, name, curator, followers, tracks, url), botRisk.score from 0 to 100, botRisk.level (low, medium, high or editorial), the warning factors behind the score (follower-to-track ratio, generic naming, sudden follower spikes and similar), the caller tier, and the follower snapshots SpotCheck holds for the last 31 days. Use it when the question is about a single playlist, such as one an artist is about to pitch to or has just been added to. For a whole list pasted from Spotify for Artists after a distributor artificial-streaming warning, use scan_warning_playlists instead: it ranks up to 50 playlists in one call and drafts the replies. Limits: anonymous callers get 1 check a day and signed-in Free accounts 3; Free responses show only the most severe factor (lockedFactors counts the hidden ones) and no snapshots. Pro (£4.99/mo) and Premium (£14.99/mo) are unlimited and get every factor and the snapshot history. Call get_account_status to see what is left today. Read-only: it reads public Spotify data and stored snapshots and changes nothing apart from the daily usage count, which is refunded if Spotify fails. Errors: INVALID_PARAMS (not a playlist link), NOT_FOUND (deleted or private), SPOTIFY_PLAYLIST (Spotify-owned editorial or algorithmic playlists, which the API does not expose), UNVERIFIABLE, RATE_LIMITED (daily allowance used).

Full history: https://api.protogrid.dev/v1/servers/io.github.chrisschouk%2Fspotcheck/changes

## Remotes

- https://spotcheck.cc/api/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (7)

- `add_monitor`: Enrolls a Spotify playlist in automated cloud monitoring for daily follower snapshots, growth trend analysis, and inorganic spike alerts. Allows up to 25 monitored playlists per Premium account. Adding a playlist that is already monitored leaves its existing name and track_id unchanged; to change them, call remove_monitor first.
- `check_playlist`: Scores one Spotify playlist for bot and fake-follower risk. Returns the playlist (id, name, curator, followers, tracks, url), botRisk.score from 0 to 100, botRisk.level (low, medium, high or editorial), the warning factors behind the score (follower-to-track ratio, generic naming, sudden follower spikes and similar), the caller tier, and the follower snapshots SpotCheck holds for the last 31 days. Use it when the question is about a single playlist, such as one an artist is about to pitch to or has just been added to. For a whole list pasted from Spotify for Artists after a distributor artificial-streaming warning, use scan_warning_playlists instead: it ranks up to 50 playlists in one call and drafts the replies. Limits: anonymous callers get 1 check a day and signed-in Free accounts 3; Free responses show only the most severe factor (lockedFactors counts the hidden ones) and no snapshots. Pro (£4.99/mo) and Premium (£14.99/mo) are unlimited and get every factor and the snapshot history. Call get_account_status to see what is left today. Read-only: it reads public Spotify data and stored snapshots and changes nothing apart from the daily usage count, which is refunded if Spotify fails. Errors: INVALID_PARAMS (not a playlist link), NOT_FOUND (deleted or private), SPOTIFY_PLAYLIST (Spotify-owned editorial or algorithmic playlists, which the API does not expose), UNVERIFIABLE, RATE_LIMITED (daily allowance used).
- `get_account_status`: Describes who SpotCheck thinks the caller is and what they can do right now. Returns email (null when anonymous), tier (free, pro or premium), isAnonymous, authMethod (oauth, session, api_key, anonymous or env_override), features (playlistChecking, fullFactorBreakdown, historicalTrends, curatorContacts, cloudMonitoring, maxMonitors), allowance (dailyChecksRemaining and unlimited; usageUnavailable is set when today's count could not be read) and upgradeUrl (null on paid tiers). Use it before other calls to plan: whether check_playlist has checks left today (anonymous 1 a day, Free 3, Pro and Premium unlimited), whether get_curator_contacts and the monitor tools will work (Premium, £14.99/mo), and whether the full factor breakdown is unlocked (Pro, £4.99/mo, or Premium). Takes no arguments, works without signing in, costs nothing and does not use up a check. Read-only and safe to repeat.
- `get_curator_contacts`: Extracts public submission contact channels (emails, Instagram, X/Twitter, TikTok handles, and submission links) from a Spotify playlist description, along with researched curator pitch guidance when available.
- `list_monitors`: Lists all playlists currently tracked under 24/7 cloud monitoring for the authenticated account, including 24-hour and 7-day follower deltas, anomaly flags, and latest snapshot timestamps. For one playlist's full 31-day snapshot series, call check_playlist with its playlist_id.
- `remove_monitor`: Stops cloud monitoring for one playlist on the signed-in Premium account. The daily follower snapshot, the spike and drop alert emails and the track-removed alert all stop for that playlist on this account, and it disappears from list_monitors. Returns { ok, message, playlistId }. Side effects: deletes this account's monitor entry, including its custom name and track_id. Follower snapshots already stored for the playlist are kept and still appear in check_playlist, and other accounts monitoring the same playlist are unaffected. Reversible with add_monitor, but the name and track_id have to be supplied again. Idempotent: removing a playlist that is not monitored still returns ok: true. Use it to free a slot when the account is at the 25-monitor limit, or to change a monitor's name or tracked track (there is no update tool, so remove it and call add_monitor with the new values). Call list_monitors first if you need the exact playlist id. Requires Premium (£14.99/mo) and a signed-in account: returns FORBIDDEN on other tiers, UNAUTHORIZED without an account, and INVALID_PARAMS for a link that is not a playlist.
- `scan_warning_playlists`: Scores every Spotify playlist an artist pastes after a distributor flags a track for artificial streaming (the full list from Spotify for Artists). Use it for a batch of up to 50 links; for one playlist, use check_playlist, which also works anonymously. Returns each playlist ranked by bot-risk score with skip reasons for invalid or unavailable links. Free accounts get up to 2 scans a day with only the worst flagged playlist unlocked; Pro and Premium are unlimited with the full ranked report. Requires a signed-in account (anonymous callers are not supported). Supply artistName, trackName and distributor to also receive drafted reply text once the report is unlocked.
