npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@keelage/mcp

v0.5.0

Published

Token intelligence for Robinhood Chain, as an MCP server. Structural verdicts, holder maps, launcher templates and a published track record. Research only, not financial advice.

Readme

@keelage/mcp

Token intelligence for Robinhood Chain, as an MCP server. Better decisions on any token, with onchain and social data your agent can read. Every verdict is timestamped before the outcome.

Research only, not financial advice. Read-only: no wallet, no key, nothing here can spend.

Install

Node 22 or newer. No runtime dependencies.

{
  "mcpServers": {
    "keelage": { "command": "npx", "args": ["-y", "@keelage/mcp"] }
  }
}

Or from a checkout: node core/bin/keelage.mjs starts the stdio server.

Tools

| Tool | What it answers | |---|---| | keelage_scan | One token at the three moments, read from the chain now. The code pass: clean code, not clean, unread (verified source, launcher template, owner privileges, transfer-tax code, honeypot flags). The activity pass: passes, fails, not judged (the code again plus sells clearing, the pool not drained, the deployer share, the holder concentration tier). The size: sized with the dollars, share and pool, or not sized with the one reason. verdict.moments carries the three with their reasons and caps; verdict.key keeps the 0.3 word (ELIGIBLE = clean code, passes, sized; NOT_ELIGIBLE = clean code, passes, not sized; FAIL = the activity pass fails, the code clean or not; UNVERIFIED = unread, not judged, not sized), mapped in verdict.keys. Plus ATH drawdown, the 30-day-low band and the entry test. signals (hosted server): the research triggers this scan crosses right now, evaluated on the scan's own facts and never written, each with what earlier crossings did, its n and its dates; the verdict and the size do not change for a trigger. | | keelage_holders | Top wallets with pools, contracts and burn addresses labeled; top-10 share excluding pools and contracts; burn share; share held by EIP-7702 smart accounts. | | keelage_x | What X is saying about the token in the last 24 hours: posts and accounts, repeated-template share, large profiles and the chain they meant, views, a one-line read of the narrative. Its own call: a scan never reads X. Offered only where the server has a posts source. | | keelage_template | Which launcher template the contract came from, with the template verdict, the ABI privileges and the transfer-tax identifier count. | | keelage_record | The rules with their origins, and on the hosted server the live record, cut every day from every pass and every token-day since each token's first pool (no dated studies): every alert's outcomes re-cut daily, one table at a time (table) or all at once, with the day-by-day series (history). The live tables: horizon, band, tier, mcap, pool, age, dayOne, claim, jev, xPosts, xTone, kind, repeat, path (hours after the alert from the hourly board), derived (bands cut from the data on a train/test split), lines (every hand-set rule line tested), ledger (publisher rows against stored rows), universe (the field: every token swept daily, its own return, launches by week), tokenDays (every rule line tested on every token-day, with the pool, code-verdict and holder-growth cuts), launcher, projectType, regime, sized, holderGrowth (how the holder count moved over the 7 days after the pass, against the return), worst, best, and signals: the register of research triggers (conditions that held up in later data, ranked, each with its n, dates, horizon and the field it is measured against), with its own history and a cursor to continue it. Every row carries its n. | | keelage_today | What Keelage read today, as the Today page shows it: this hour's and today's code passes with their reasons, today's activity passes with the tier and whether each was sized, today's sized passes, and the watch lines that fired on passed tokens. One moment (moment: code, activity, sized, watch) or all four. Every row speaks the moments words. signals: the research triggers crossed in the last 24 hours, on the rows they belong to. Free, never counted. Hosted server only; the local server says the store is unavailable. | | keelage_token | One token's page: the launch (creator, factory, template, block, time), today's price, cap, pool, volume and holders, the structural verdict last recorded, every alert on it with its 24-hour, 7-day and 30-day outcome, the hourly price series, X by day, a dated log of what changed, and signals: the research triggers the token crossed, dated. Free, never counted. Hosted server only; the local server says the store is unavailable. |

Rules, fixed: the score ranks, it never admits. Unknown facts cap size. Only evidence blocks. Unknown is null, never zero.

Research triggers (signals on four tools) are conditions found on Keelage's own ledger and tested on later rows, re-cut every day and expired after 36 hours; a row carries its trigger in words, n, dates, horizon, the field it is measured against and an approximate confidence. A trigger never changes a verdict or a size, and the envelope answers available:false with its reason (no store, not public, register expired) rather than a measured zero. Research, timestamped. Never a buy.

The ruleset argument

keelage_scan takes an optional ruleset. The facts don't move; the lines the verdict policy reads can.

  • Omitted, or "keelage-default" (short form "default"): the 26 lines in data/thresholds.json, each with its origin and the date it was last changed. The only preset today.
  • { "lines": [{ "key": "pool.deep", "value": 100000 }] }: keelage-default with those lines replaced. A key is one of the 25 below; a value is a number in that line's unit. An unknown key, a value of the wrong shape or a key given twice comes back as an ok:false result with the reason, never a verdict. One line can't be moved, jev.halveBands: the words on each band were measured at exactly those cuts.

Every answer says what it ran under, in verdict.ruleset: name (keelage-default, or custom for your own lines), date (the preset's date, or today for your own lines) and overrides (the keys whose value differs from the default; empty for a preset).

| Key | Unit | Default | What it decides | |---|---|---|---| | top10.conviction | % of supply | 30 | Conviction tier: the 10 largest wallets hold this much or less | | top10.scout | % of supply | 45 | Above this the token is watch-only and never sized | | pool.deep | USD in the pool | 50,000 | Conviction needs a pool at least this deep; thinner pools are scout size | | size.poolShare | % of the pool | 1 | Conviction size: this share of the pool, in dollars (the dollar caps came out 2026-10-06) | | size.poolShare.scout | % of the pool | 0.5 | Scout size: this share of the pool | | activity.triggerVolume24h | USD traded in 24h | 1,000 | Cadence: the activity pass runs once, the first day a token trades this much | | watch.minMcapUsd · watch.sixHourlyMcapUsd · watch.hourlyMcapUsd | USD market cap | 50,000 · 250,000 · 1,000,000 | Cadence: watched from the first, 6-hourly from the second, hourly from the third | | deployer.max | % of supply | 5 | A deployer still holding more than this fails the token | | holders.min | wallets | 0 | Off since 2026-10-06 (0 = the check does not run); was a 100-wallet floor the record could not test | | entry.midPump | % price change in 24h | 30 | Up more than this today fails the entry test | | entry.minVolume24h | USD traded in 24h | 0 | Off since 2026-10-06 (0 = the check does not run); was a $10,000 floor | | entry.minTurnoverOfMcap | % of market cap traded in 24h | 0 | Off since 2026-10-06 (0 = the check does not run); was a 5% floor | | entry.deepPoolTurnover | % of the pool traded in 24h | 0.2 | A pool over $100,000 doing less than this reads as fabricated or dead | | entry.convictionBelowPeak | % below all-time high | 0 | Off since 2026-10-06 (0 = the check does not run); conviction no longer needs a decline from peak | | liquidity.maxDrawdown | % below its recorded peak | 70 | A pool drained more than this fails the token | | base.atBase | % above the 30-day low | 30 | At base band ends here | | base.justOff | % above the 30-day low | 100 | Just off base band ends here | | base.wellOff | % above the 30-day low | 500 | Well off base band ends here; beyond is already ran | | jev.halveBands | probability | 0.5 | Two Jev ranges: under 50% (unlikely to halve this week) and 50% and over (may well halve) |

A stricter preset ships only when every line it moves has a documented source: an earlier value stated in that line's own origin, or a measurement on the live record. Today 1 line has one (pool.deep was 100,000 before 2026-08-01). The other 17 are set by hand or measured at their current value, and we don't invent the stricter number.

Hosted

The same server runs at https://mcp.keelage.ai/mcp over Streamable HTTP (POST JSON-RPC; GET answers 405). No key and no sign-in. Per caller, 20 counted calls a day across keelage_scan, keelage_holders and keelage_x; keelage_record, keelage_template, keelage_token and keelage_today are never counted. The free quota counts by a salted hash of the network address that changes daily, whatever wallet is named. Prepaid credit follows the wallet that paid: name it with the X-Wallet header or the wallet argument on keelage_pay and every priced tool (the argument wins when both are sent), and prove it with X-Wallet-Sig (or the signature argument): a personal_sign of Keelage credit <your address, lower case> <YYYY-MM-DD UTC> chain 4663 mcp.keelage.ai, good for its UTC day only. A deposit is credited after 64 confirmations in the canonical chain. Send X-Request-Id (or requestId) and a retried call is not charged twice: it is answered from the saved answer, told to retry while the first execution's 120-second lease holds, or re-run free once that lease has lapsed; a call cut off at its 100-second budget is refunded and told to retry the same way, and an answer once delivered is never refunded. Every priced answer carries a credit line: this call's price and whether it was paid from the free quota or from credit, the free calls used and left today, and the balance when a wallet was named. Past the quota a priced tool draws on the caller's prepaid credit, or answers with its price in USDG on Robinhood Chain and the payment terms: send USDG to the merchant address on keelage.ai/#ledger, register the transaction once with the hosted-only tool keelage_pay, and the wallet that sent it is credited; later calls that carry X-Wallet draw on it. The server holds no wallet key; it reads receipts from the chain. The hosted code is this package plus one transport file, so the two give the same answers.

What the signature is, and is not (stated 2026-10-08): it is a daily bearer credential. Anyone holding a valid signature can spend that wallet's credit until the UTC day in the message ends (plus 10 minutes of grace), so it travels only over TLS and never into a log or a shared transcript. There is no revocation before the day ends, no nonce and no session: the server keeps no per-client state by design, so a replay within the day is not detected. Recovery runs through the chain's ecrecover precompile, so only externally owned accounts can sign; contract wallets (EIP-1271) are not supported. The keccak-256 and EIP-191 implementation is checked against independent OpenSSL vectors across the block boundary (core/test/sig-vectors.mjs).

Command line

keelage scan <0x> [--text] [--ruleset <name|json>]
keelage holders <0x> [--no-smart]
keelage template <0x>
keelage codehash <0x>
keelage record
keelage tools

keelage tools prints the list exactly as this server's tools/list offers it: keelage_x appears only when SOCIALDATA_API_KEY is set, and the hosted-only keelage_pay never appears locally.

Environment (all optional)

| Variable | Purpose | |---|---| | ROBINHOOD_RPC_URL | JSON-RPC endpoint. Default: the public Robinhood Chain RPC. | | KEELAGE_STATE_DIR | Cache directory. Default: ~/.cache/keelage. | | BLOCKSCOUT_IP | Pin the explorer's A record where a resolver misdirects it. | | CG_PRO_API_KEY | CoinGecko Pro routing for GeckoTerminal reads. | | TYPESAFE_API_KEY | Jev probabilities as context on a verdict. | | SOCIALDATA_API_KEY, XAI_API_KEY | What X is saying, as context on a verdict. |

Upstreams

DexScreener (pairs, takeover orders), Blockscout for Robinhood Chain (contract, source, ABI, holders), GoPlus (corroboration only), GeckoTerminal (price history, holder count), the chain RPC (owner(), eth_getCode).

Tests

npm test            # pure: measurements, the three moments and the key map, JSON shape, keelage_today, the credit line, MCP handshake
npm run test:live   # five reference tokens against the live chain

Research, timestamped.