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.

io.github.CloudCorpRecords/perpwatch

NPM · @RENETURCIOS/PERPWATCH · 2 COMPONENTS

Cross-exchange crypto perps microstructure feed: funding, liquidations, footprint, big trades.

62 Trust /100

Last scanned (4 hours ago)

Scores higher than 31% of npm servers

Category Crypto and Web3

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 Security81
  • No malware found by supply-chain analysis.Pass
  • CVE check failed: a known high-severity CVE affects zod 3.25.76, a direct dependency. A fixed version is available. View diagnostics → Fail
  • No install/post-install scripts declared.Pass
  • 30 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability59
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 5606 tokens (~509/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
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
  • We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 11 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

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

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.

  • 3 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 2 Nov 26 47

    First indexed and scored.

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 5 Nov 2026 · Analysed npm/@reneturcios/perpwatch@0.1.0

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 →

Vulnerabilities 1 finding
ID CVE Severity Vector Fix available
GHSA-mrhx-c7xc-m3w5 CVE-2023-54404 high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H yes

Background: What a vulnerability scan can and cannot prove →

Dependencies 93 packages
Packages resolved 93
Stale 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 11 exposed · ~5,606 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
get_big_trades ~679

Large aggressive orders ("big trades") from the trade tape of Binance, Bybit, OKX and Hyperliquid for a symbol. Answers: "Any whale market orders on BTC in the last hour?", "Were the big prints buying or selling?", "Which venue took the largest hit?". One big trade = all fills that share venue, taker side and exchange timestamp: a market order sweeping several price levels prints as many fills at one instant, and they are summed back into one trade. aggressor: buy = the taker bought, sell = the taker sold. Per trade: t = exchange timestamp, epoch ms; venue; price = volume-weighted fill price, USD; usd = notional, whole dollars. min_usd = smallest notional that counts, at least 50000; default = the asset's threshold on the MarketTrace chart (BTC and ETH 1000000; SOL, BNB, XRP, DOGE and HYPE 500000; ZEC and ENA 100000); the response echoes the value used. totals = count (n) and summed usd of every trade at or above min_usd in the window, per side. trades = at most limit of them (1..=150, default 50): when there are more, the LARGEST are kept and truncated=true; the list is ordered by time. Window: from/to as RFC3339, YYYY-MM-DD or epoch ms; default the last hour; at most 12 h per call and from no older than 31 days, beyond either is an error, not a clamp. settled=false means the window reaches into the last 3 minutes, which the tape may not hold in full yet. coverage.venues lists the venues with tape in the window; an empty list means no tape there, not no trades (ZEC and ENA keep a 14-day tape). An order the trader split into separate child orders shows up as separate smaller trades. Descriptive: a big trade is executed flow, not a signal. Read-only.

NameTypeReqDescription
fromstring|null–Window start: RFC3339, `YYYY-MM-DD` (UTC midnight) or epoch ms. Default: `to` minus one hour. No older than 31 days.
limitinteger|null–Trades listed, 1..=150 (default 50); the largest are kept.
min_usdinteger|null–Smallest notional that counts, whole USD, at least 50000. Default: the asset's chart threshold (echoed in the response). Read as any JSON value and checked in [`big_trades_query`], so a fractional,…
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted).
tostring|null–Window end (exclusive), same formats. Default: now. At most 12 h after `from`.

No output schema declared.

No examples provided.

get_conditional_outcomes ~1,004

Measured HISTORY of forward returns after a stated condition — the base rate from this feed's own data, replacing folklore like "high funding = squeeze". Answers: "What happened historically after funding above the 90th percentile?", "When OBI stayed bid-heavy while funding was positive, what did the next 24h look like?". Condition fields AND together (state at least one). Funding (multi-year series): funding_pct_gte/lte (AS-OF percentile 0..100 — the rank the live endpoint showed at that moment, no look-ahead), streak_h_gte (hours funding kept its sign), funding_sign (positive|negative). Archive (v2, 15-min state archive — YOUNG series, growing daily): archive_feature ∈ obi_skew (−1..+1) | oi_chg_1h_pct (%) | taker_buy_ratio (0..1) | basis_bps, with archive_gte/lte (raw value, no sample floor) and archive_pct_gte/lte (as-of percentile). An archive condition shrinks the match window to the INTERSECTION of the series' spans — the response window and coverage.archive.{window_days,n_samples} disclose exactly how thin the evidence is; weight accordingly. horizons: ["4h","24h","72h"] default, each 1h..168h. Per horizon: n_matches (raw), n_effective (overlap-collapsed — overlapping forward windows are NOT independent samples; all stats use the collapsed set), median/p10/p90 forward return in PERCENT, hit_rate_up (RATIO 0..1), max_dd_median_pct (median worst drawdown before the horizon resolves, ≤0). verdict=history_silent means the condition matched too rarely to measure (n_effective<12 on every horizon): a first-class answer — you are trading on belief, size accordingly; stats are null, never noise. warnings flag overlap collapse, 14-day clustering and silenced horizons. matches_sample = up to 50 audit timestamps. current = where the LAST hour of the same series sits on the condition axes (funding_pct as-of percentile, null below the floor; streak_h; sign) — read the band it falls in, then ask about that band; null only when there is no funding series. Percentile-form c…

NameTypeReqDescription
archive_featurestring|null–v2: condition on ONE archived state feature (15-min archive): `obi_skew` (−1..+1), `oi_chg_1h_pct` (%), `taker_buy_ratio` (0..1), `basis_bps`. ANDs with the funding fields; the match window becomes t…
archive_gtenumber|null–Match hours where the archive feature's RAW value ≥ this (raw thresholds have no sample floor — they exist from the first point).
archive_ltenumber|null–Match hours where the archive feature's RAW value ≤ this.
archive_pct_gtenumber|null–Match hours where the feature's AS-OF percentile ≥ this (0..=100; the rank exists only once its series has warmup_samples points).
archive_pct_ltenumber|null–Match hours where the feature's as-of percentile ≤ this (0..=100).
funding_pct_gtenumber|null–Match hours where the AS-OF funding percentile was ≥ this (0..=100). "As-of" = the rank the live endpoint reported at that moment — computed only from data available then, no look-ahead.
funding_pct_ltenumber|null–Match hours where the as-of funding percentile was ≤ this (0..=100).
funding_signstring|null–Funding sign filter: `positive` (longs pay shorts) or `negative`.
horizonsarray|null–Forward horizons as `<hours>h` labels, each 1h..=168h (default `["4h","24h","72h"]`).
streak_h_gteinteger|null–Match hours where funding had kept its sign for at least this many hours.
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted).

No output schema declared.

No examples provided.

get_footprint_events ~775

Order-book wall events from the 1-minute footprint of a symbol, built on the consolidated book and trade tape of Binance, Bybit, OKX and Hyperliquid. Answers: "Did a large resting order get absorbed on BTC in the last hour?", "Were bid walls pulled before this drop?", "How thin was the book this hour?". A wall = a resting price row far larger than the book's typical row (above median + 5 MAD of row sizes). kind=absorbed: trades hit the wall for at least 5% of its peak size, it still held at least 85% of that peak at the minute's close, and price did not break through it. kind=pulled: the wall fell below half of its peak while trades covered less than 30% of the drop, it did not refill within 2 seconds, and price had come within reach of it (cancelled, not filled). Scope: only price rows that traded in that minute and lie within the nearest 60 rows per side of mid are examined, so distant or untouched walls are not reported. wall_side: bid = resting buy orders, ask = resting sell orders. Per event: t = minute open, epoch ms; price = USD, lower edge of a `bucket`-wide row; peak_usd = largest resting size seen in the minute; executed_usd = volume traded against the wall; close_usd = resting size at the minute's close (whole dollars). At most 4 events of each kind are kept per minute, the largest peaks. thin_minutes = minutes whose resting depth near mid (within 25 bps, capped at the nearest 60 rows per side) was below the 20th percentile of the previous 2 hours, per side (bid, ask, both); classified = minutes of the window classified so far (the newest 2-3 minutes are still pending). Window: from/to as RFC3339, YYYY-MM-DD or epoch ms; default the last hour; at most 24 h per call, longer is an error, not a clamp. kinds = absorbed and/or pulled (default both); min_usd filters by peak_usd; limit 1..=150 (default 50) keeps the NEWEST events, counts cover the whole window and truncated=true says the list was cut. coverage.archive_from is when recording began; the archive o…

NameTypeReqDescription
fromstring|null–Window start: RFC3339 (`2026-10-12T09:10:00Z`), `YYYY-MM-DD` (UTC midnight) or epoch milliseconds. Default: `to` minus one hour.
kindsarray|null–Event kinds to return: `absorbed` and/or `pulled` (default both).
limitinteger|null–Events returned, 1..=150 (default 50). When the window holds more, the NEWEST are kept and `truncated` is true; `counts` still cover the window.
min_usdnumber|null–Smallest `peak_usd` that counts, USD, >= 0 (default 0 = every event).
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted).
tostring|null–Window end (exclusive), same formats. Default: now. At most 24 h after `from` — longer is an error, not a clamp.

No output schema declared.

No examples provided.

get_funding_percentile ~162

Current perpetual funding rate for a symbol, ranked vs its own multi-year history as a percentile (0-100). Answers: "Is BTC funding unusually high?", "What percentile is ETH funding at?". Returns rate_bps (basis points, 8h-normalized, cross-venue; positive = longs pay shorts), percentile (0-100), streak_h (hours the rate has kept its sign), and the coverage (venues + history depth backing the rank). Read-only.

NameTypeReqDescription
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted, e.g. `BTCUSDT`).

No output schema declared.

No examples provided.

get_liquidations_recent ~221

Recent cross-exchange liquidation notional estimates for a symbol. Answers: "How much got liquidated on ETH in the last hour?", "Mostly longs or shorts?". Covers Binance, Bybit, OKX (not Hyperliquid). USD values are base quantity multiplied by each venue's source reference price; Bybit/OKX expose bankruptcy price, so these are estimates rather than execution notionals. Returns whole-dollar estimates, long_ratio (0..1 share of LONGS liquidated), notional_semantics, and event count for the window (window_s, default 3600, max 86400). Read-only.

NameTypeReqDescription
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted).
window_sinteger|null–Look-back window in seconds, 1..=86400 (default 3600). Values beyond 24 h are rejected, not clamped.

No output schema declared.

No examples provided.

get_market_state ~362

Single normalized perpetual-futures microstructure snapshot for one crypto symbol, aggregated across Binance, Bybit, OKX and Hyperliquid. Answers: "What's the market state for BTC?", "Is ETH positioning stretched?". Covers BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC, ENA. Returns funding+2y-percentile, OI, volume, CVD aggression, order-book imbalance, recent liquidation pressure, basis, and key drivers. Scales: *_ratio fields are 0..1, percentiles are 0-100, rel.* are multipliers of the trailing median (1.4 = 140%), obi.skew is -1..+1 (positive = bid-heavy), cvd.delta_usd positive = net taker buying, basis_bps positive = perp above spot index. Every metric carries a coverage entry (venues, window depth, partial reason) — weight confidence by it. Read-only, ~30s fresh. Use first for market context; for the historical base rate of a condition you observe here (e.g. funding percentile ≥ 90), follow with get_conditional_outcomes. For volume-profile levels (POC, value area, naked POCs) use get_volume_profile; for large aggressive orders use get_big_trades. For absorbed or pulled order-book walls use get_footprint_events. For stacked buy or sell imbalances in the footprint use get_stacked_imbalances.

NameTypeReqDescription
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted, e.g. `BTCUSDT`).

No output schema declared.

No examples provided.

get_ohlcv ~427

Consolidated cross-exchange OHLCV candles for a symbol (all four venues' trades merged onto one timeline). Answers: "Show me BTC 1h candles", "What's the 24h range?". Use for stop placement, position sizing (ATR), R:R and realized-volatility math — the exact-candle complement to get_market_state's approximate price block. Intervals: 5m, 15m, 1h, 4h, 1d (default 1h); limit 1..=200 candles (default 100), oldest first. The consolidated tape holds 31 days, so limit × interval must fit inside it: 1d ≤ 31, 4h ≤ 186, 1h and finer reach the full 200 — beyond that is an error, not a clamp. ZEC and ENA keep a 14-day tape that started filling when they were added, so their longer windows return fewer candles than asked — count what comes back. The NEWEST candle may be partial:true (bucket still forming) — exclude it from ATR/RV math. Fields: t = bucket open epoch ms, o/h/l/c = USD, v = traded volume in BASE units (BTC, ETH, ...), NOT USD — multiply by price for approximate notional. delta = taker-buy minus taker-sell volume inside the candle, BASE units like v (positive = net aggressive buying); the running sum of delta over the returned candles is the CVD of that window. Read-only.

NameTypeReqDescription
intervalstring|null–Candle interval: 5m, 15m, 1h, 4h or 1d (default 1h).
limitinteger|null–Number of candles, newest last: 1..=200 (default 100).
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted).

No output schema declared.

No examples provided.

get_stacked_imbalances ~942

Stacked imbalances in the footprint of a symbol, computed on the consolidated trade tape of Binance, Bybit, OKX and Hyperliquid. Answers: "Any stacked buying imbalance on BTC in the last hour?", "Where did aggressive selling stack up this morning?", "Which price bands saw one-sided market orders?". Rule (diagonal, the same as the MarketTrace footprint chart): each candle is split into price rows `bucket` wide; rows with no trades are skipped, so a row's neighbour is the nearest traded row above or below. A row is a buy imbalance when its taker-buy volume is at least ratio × the taker-sell volume of the nearest traded row below it, and a sell imbalance when its taker-sell volume is at least ratio × the taker-buy volume of the nearest traded row above it; a zero opposite side counts, zero against zero does not. A row counts only if its total volume is at least 10% of the candle's largest row. A stacked imbalance = 3 or more consecutive traded rows flagged on the same side within one candle; a row can sit in a buy run and a sell run at once. ratio = 2, 3 or 4 (default 3). interval = 1m, 5m, 15m or 1h candles (default 1m). Per event: t = candle open, epoch ms; kind = buy (aggressive buying) or sell (aggressive selling); low/high = USD band from the lower edge of the run's lowest row to the upper edge of its highest row (it may include untraded rows); rows = flagged rows in the run; usd = dominant-side volume of the run × row price, whole dollars; partial = true while the candle is still forming or closed less than 3 minutes ago (the tape may still add trades). candles = candles with trades in the window. counts = runs per kind in the whole window; events lists at most limit of them (1..=150, default 50): when there are more, the LARGEST by usd are kept and truncated=true; the list is ordered by time. kinds = buy and/or sell (default both). On BTC at ratio 3 a typical hour has about 38 runs on 1m candles, 13 on 5m, 4 on 15m and 1 on 1h. Window: from/to as RFC3339, YYYY-…

NameTypeReqDescription
fromstring|null–Window start: RFC3339, `YYYY-MM-DD` (UTC midnight) or epoch ms. Default: `to` minus one hour. No older than 31 days.
intervalstring|null–Candle interval: 1m, 5m, 15m or 1h (default 1m).
kindsarray|null–Sides to return: `buy` and/or `sell` (default both).
limitinteger|null–Runs listed, 1..=150 (default 50); the largest by usd are kept.
ratiointeger|null–Dominance ratio: 2, 3 or 4 (default 3). Read as any JSON value and checked in [`stacked_imbalances_query`], so 2.5 or "3" is an invalid_params NAMING the parameter (a typed `u32` would fail inside r…
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted).
tostring|null–Window end (exclusive), same formats. Default: now. At most 12 h after `from`.

No output schema declared.

No examples provided.

get_state_history ~536

Time series of any numeric market-state fields from the 15-minute full-state archive — the derivative/trend view get_market_state cannot give. Answers: "How did OI build over the last 3 days?", "Is funding percentile rising or falling this week?", "When did the book skew flip?". fields = dotted numeric paths of get_market_state (1..=16), e.g. funding.percentile, oi.usd, obi.skew, cvd.delta_usd, basis_bps, price.last, depth.bid_usd.10bps, venues.binance.oi_usd. Returns parallel arrays: t (epoch ms, ascending) + series[field] aligned with t; null = that field was not populated in the archived row (honest hole, common near the archive's start — blocks accrue at their own pace). Downsampling: max_points 1..=1000 (default 200); stride in the response says how many 15-min rows each point skips; the newest row is never sampled away. coverage.archive_from/to are the WHOLE archive's bounds — the archive is YOUNG (born 2026-07-03) and grows a row per 15 min per asset; a thin answer is honest, not broken. from/to accept RFC3339, YYYY-MM-DD or epoch ms. Read-only.

NameTypeReqDescription
fieldsarrayyesDotted numeric paths of the market state, 1..=16 per request — e.g. `funding.percentile`, `oi.usd`, `obi.skew`, `cvd.delta_usd`, `basis_bps`, `price.last`, `depth.bid_usd.10bps`, `venues.binance.oi_u…
fromstring|null–Range start: RFC3339 (`2026-07-03T08:00:00Z`), `YYYY-MM-DD` (UTC midnight), or epoch milliseconds. Default: the whole archive.
max_pointsinteger|null–Points returned after downsampling, 1..=1000 (default 200). The response's `stride` says how many archived rows each point skips.
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted).
tostring|null–Range end, same formats. Default: the whole archive.

No output schema declared.

No examples provided.

get_volume_profile ~414

Volume-profile reference levels for a symbol, from the consolidated trade tape of Binance, Bybit, OKX and Hyperliquid. Answers: "Where are the key volume levels on BTC?", "Is price inside yesterday's value area?", "Any untested POCs nearby?". Sessions are UTC days. poc = price row with the most traded volume; vah/val = top and bottom of the value area, the band around the POC that holds 70% of the session's volume. Returns today (the session still forming, developing:true, its levels still move), days (the last N complete days, days 1..=30, default 7, oldest first), composite (one profile over those days plus today) and naked_pocs (POCs of the last 30 complete days that price has not traded back to since). Per profile: poc/vah/val in USD (lower edge of a `bucket`-wide price row), va_width_pct = (vah − val) / poc × 100, volume in BASE units (BTC, ETH, ...), taker_buy_ratio 0..1 (share of volume that was aggressive buying). va_width_rank.percentile (0-100) ranks the latest complete day's va_width_pct among the last n_days complete days: low = an unusually tight day; null below 12 days. Levels only, no histogram. For where price sits against these levels read price.last from get_market_state. ZEC and ENA were added later, so fewer days come back for them: count what is returned and read coverage. Read-only.

NameTypeReqDescription
daysinteger|null–Complete UTC days to return, 1..=30 (default 7). Out of range is an error, not a clamp.
symbolstringyesAsset symbol: BTC, ETH, SOL, BNB, XRP, DOGE, HYPE, ZEC or ENA (case-insensitive; a `USDT` suffix is accepted).

No output schema declared.

No examples provided.

help ~84

Guide to this server: every tool grouped by the question it answers, with a working example call for each, the supported symbols, how to read the scales, request limits, and where to find data that is not a tool of its own here (open interest, CVD, funding rate). Call it whenever you are unsure which tool to use. Takes no arguments. Read-only.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

Install

How do I install the io.github.CloudCorpRecords/perpwatch MCP server?

io.github.CloudCorpRecords/perpwatch runs locally as an npm package, launched with npx -y @reneturcios/perpwatch. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @reneturcios/perpwatch

# add to Claude Code
claude mcp add cloudcorprecords-perpwatch -- npx -y @reneturcios/perpwatch
Common questions

What is the io.github.CloudCorpRecords/perpwatch MCP server?

io.github.CloudCorpRecords/perpwatch is an MCP server listed in the public MCP registry as io.github.CloudCorpRecords/perpwatch. Cross-exchange crypto perps microstructure feed: funding, liquidations, footprint, big trades. This page covers its npm package (@reneturcios/perpwatch).

Is the io.github.CloudCorpRecords/perpwatch MCP server safe to use?

io.github.CloudCorpRecords/perpwatch scores 62 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 5 November 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 io.github.CloudCorpRecords/perpwatch MCP server expose?

io.github.CloudCorpRecords/perpwatch exposes 11 tools: get_market_state, get_funding_percentile, get_liquidations_recent, get_ohlcv, get_conditional_outcomes, and 6 more. Their descriptions and schemas cost roughly 5,606 tokens of context every time the server is loaded.

Is the io.github.CloudCorpRecords/perpwatch MCP server still maintained?

io.github.CloudCorpRecords/perpwatch is still listed as active in the MCP registry. We last reached this channel on 5 November 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 io.github.CloudCorpRecords/perpwatch MCP server under?

io.github.CloudCorpRecords/perpwatch declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.