docs · @keelage/mcp 0.1.1

4 tools. One chain.
Every field explained.

Keelage is an MCP server. Your agent connects once, lists the tools, and calls them with a contract address. Every answer is JSON with fixed keys. Unknown is null, never zero.

01 Install

Local today. Hosted next.

The local server runs on your machine with Node 22 or newer, reads public APIs, and needs no key. The hosted endpoint at mcp.keelage.ai is the next milestone.

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

Optional environment: ROBINHOOD_RPC_URL (defaults to the public RPC), KEELAGE_STATE_DIR (cache, defaults to ~/.cache/keelage), TYPESAFE_API_KEY and SOCIALDATA_API_KEY for the optional context lines. Nothing in the server can hold a key that spends.

02 Tools

What you can ask, and what comes back.

Every tool is read-only and idempotent. A scan takes 10 to 40 seconds because it reads 4 upstreams in sequence and paces itself under their limits.

keelage_scan

Input: address. The full structural verdict for one token.

KeyWhat it holds
verdictkey is one of ELIGIBLE, NOT_ELIGIBLE, FAIL, UNVERIFIED; head and why are the one-line answer and the reason.
tier · actionable · entryBlock · scoreSizing tier from top-10 concentration; whether the entry test cleared; the one reason it didn't; the ranking score (ranks, never admits).
sizeusd when eligible: the lower of 1% of the pool and the tier cap. The two inputs are included.
marketPrice, liquidity, market cap, 24h volume, buys and sells, 24h change, age in days, the pair and dex, the quote symbol.
locationPercent below ATH, percent above the 30-day low, the base band in words, ATH and low values, median daily range over 14 days.
structurePass or fail with reasons (what blocked) and caps (what's unknown). Verified source, contract and implementation names, proxy type, creator, template key and verdict, privileges found in the ABI, whether owner() is renounced, transfer-tax identifier counts, sells clearing, liquidity drawdown.
holdersCount, top-10 share excluding pools and contracts (with its source), top-10 including pools, largest wallet, contracts and pools among the top 10, creator share.
goplusCorroboration only: honeypot flag, buy and sell tax, mintable, pausable, LP mode and LP holder statistics. record:false when GoPlus has nothing.
takeoverClaim · discoveryShape · x · jevA paid takeover claim if present (a caution). Whether the token sits inside the discovery shape. The optional X and probability context lines.
links · scannedAt · disclaimerDexScreener, GeckoTerminal and Blockscout pages. The timestamp. "Research only, not financial advice."

keelage_holders

Input: address, optional smartAccounts (default true). The holder map.

KeyWhat it holds
holderCount · totalSupplyFrom the explorer.
top10Share excluding pools and contracts, share including pools, largest wallet, how many contracts and pools sit in the top 10.
burnPctShare held by the zero, dead and 0x1 addresses.
smartAccountsHow many of the listed wallets are EIP-7702 delegated accounts (how the Robinhood app wallet reads), and their combined share.
holdersUp to 20 rows: address, percent of supply, balance, is it a contract, is it a pool, is it a burn address, the explorer's name for it, smart-account flag.
poolsKnown · creator · creatorPctEvery pool address we matched, and the deployer with its current share where GoPlus has it.

keelage_template

Input: address. Which launcher factory the contract came from.

KeyWhat it holds
templateKey (pons-launcher, launchtoken, doppler, uerc20-pools-trade, party, robinhood-stock, or unregistered), verdict, what it matched on, the fee model, and the census note.
contractVerified source and when, compiler, contract and implementation names, proxy type, creator, function count.
privileges · livePrivilege · taxCodeOwner privileges in the ABI; whether any can change what holders can do; tax and reflection identifier counts and whether they count against the token.

keelage_record

Input: optional study key. The dated studies behind every rule, with sample sizes. The same numbers as the track record page.

03 Glossary

Every word we use, in plain English.

Two layers. The facts are measured from the chain and timestamped; they are the product and they are not in beta. The verdict is a policy laid over the facts under a named, dated ruleset (today: keelage-default, 2026-10-04), 12 of whose 18 lines are still set by hand, so the verdict is in beta and says so. The four verdicts first, then every other term alphabetically.

ELIGIBLE beta

The code passed every check, the holders aren't too concentrated, and the entry test is clear. Comes with a suggested size. Still not advice.

NOT_ELIGIBLE beta

The code passed, but we wouldn't size it now: too concentrated, too quiet, mid-pump, or no price history to judge. The one reason is always stated.

FAIL beta

The chain says no. Unverified code, an excluded launcher, an owner who can still change the rules, a transfer tax, a honeypot flag, nobody able to sell, a drained pool, or a deployer still holding more than 5%.

UNVERIFIED beta

A data source failed, so we don't know. Never a verdict and never a reason to size. Try again in a minute.

TermWhat it means here
AlertA token that passed the structural checks at the hour our scanner saw it. We log its price then and read it again later. Every row in the track record is an alert.
All-time high, "below peak"The highest price the token has traded at. "57% below peak" means it trades at 43% of that.
30-day low, distance, bandsThe lowest price in the last 30 days, and how far above it the price sits now. We group the distance into 4 bands: at base (within 30%), just off base (30 to 100% above), well off base (100 to 500%), already ran (more than 500%).
Caps, unknownsFacts we couldn't read. An unknown never fails a token; it caps the size we'd suggest. Every unknown is listed on the verdict.
Robinhood Chain, 4663The blockchain these tokens live on. 4663 is its chain ID, the number wallets and tools use to tell it apart from other chains.
Creator feesOn most launchers the deployer earns a cut of every trade. We read how much has been earned, claimed, and what the deployer did with it.
Deployer, creatorThe wallet that created the token contract. "Deployer 0%" means it holds none of the supply now.
Entry testThree checks on top of the code checks before we'd size a token: at least 100 holders, at least $10,000 traded in the last 24 hours and 5% of market cap, and not up more than 30% today. A token we'd call conviction also has to be at least 60% below its peak.
FOMOA social trading phone app (fomo.family) with 2.7 million users as of October 2026, where most Robinhood Chain memecoin buys come from. It routes a buy from the user's USDC on Solana through the Relay bridge to Robinhood Chain. Keelage has no connection to FOMO; we read what its users' trades do on the chain like any other trade.
Structural checks, "the gate"What we read from the chain about the code itself: is it verified, which launcher made it, can an owner mint, pause, blacklist, change fees or upgrade it, is there a transfer tax, did anyone sell in the last 24 hours, has the pool been drained, does the deployer still hold more than 5%, does any source flag it as a honeypot. Pass all of them or the verdict is FAIL.
HoneypotA token you can buy but not sell. We take the flag from two outside sources and we also look at whether sells actually went through.
JevA model that answers a typed question with a probability. We ask it "will this halve within 7 days?" and show the answer as context. We tested it against 423 outcomes; the halving answer tracks reality, the "up in 7 days" answer doesn't.
In the pool, liquidityThe dollars sitting in the token's trading pool. Thin pools move a lot on small trades, so we size against them: never more than 1% of the pool.
Market capPrice times the number of tokens that exist.
MCPModel Context Protocol, the standard way an AI agent connects to a tool. Keelage is an MCP server: your agent connects once and can call our four tools.
MedianThe middle result when every row is lined up from worst to best. Half did better, half did worse. We use it instead of the average because one 60x would hide forty tokens that went to zero.
nHow many rows are behind a number. Under 30 is small; treat the number as a hint, not a fact. We print it next to every figure.
ReasonsThe evidence that failed a token. Only evidence blocks; an unknown never does. Every reason is listed on the verdict.
RPCThe address your software uses to talk to the chain. The local server uses the public one unless you give it your own.
ScannerOur hourly process. It reads every token it can find on Robinhood Chain, runs the checks, and logs the result with a timestamp. Running since July 2026, Robinhood Chain only since 9 Sep 2026.
ScoreA number that orders tokens on the board. It never admits or rejects one, and in our studies it didn't predict returns, so it's the last tiebreak.
Size, size ruleHow much we'd put in, in dollars, if the token is eligible: the lower of 1% of the pool and the tier's cap ($1,000 for conviction, $100 for scout). Never more.
Robinhood app wallet, smart accountWallets created inside the Robinhood app read on the chain as EIP-7702 smart accounts. We count them among the holders so you can see how much of a token is held by app users.
Paid takeover claimA listing a new team can buy on DexScreener to say they've taken over an abandoned token. In our study tokens carrying one did far worse than tokens without, so it shows as a caution and counts for nothing.
Transfer taxCode that skims a cut of every transfer to someone's wallet. We read the contract for it. Pool fees, which every token pays to the exchange, are not a transfer tax.
Launcher, templateA factory contract that deploys the same token code for anyone who pays. Pons, LaunchToken, Doppler and UERC20 made 68% of the tokens on this chain. We judge the launcher's code once and every token from it inherits that judgement. "No launcher" means somebody wrote the contract by hand.
Third-party safety scoreServices like GoPlus publish a safety rating for tokens. We read them for corroboration only. In our study a rule set built on them admitted the worse half of the market.
Sizing tier, the 30% and 45% linesHow concentrated the holders are, used to cap size. Conviction: the 10 largest wallets hold 30% or less and the pool is $50,000 or more. Scout, thin pool: 30% or less, pool under $50,000. Scout, cluster check: 30 to 45%. Watch only: over 45%, never sized.

Where the lines come from. The 30% line is from a 2025 study of 34,988 meme coins across 4 chains (arXiv 2507.01963, read July 2026): the 10 largest holders owning over 30% of the supply was the most common anomaly, present in 87.14% of the anomalies it detected. The 30 to 45% band is our own buffer, where we ask for a check on whether those wallets are one group. Above 45% a handful of wallets can set the price on their own, so we don't size at all. Our own record cuts the other way on returns: tokens over 45% didn't lose more (median -8%, 42% positive, 45 alerts). So the line is about one holder being able to dump on you, not about expected return. Both numbers get re-tested as the record grows.
10 largest walletsThe share of the supply held by the ten biggest holders, with trading pools and other contracts taken out so you see people, not plumbing. Also written "top-10".
USDGA dollar stablecoin on Robinhood Chain. Paid calls are priced in it.
Verified codeThe contract's source code has been published and the explorer confirmed it matches what's on the chain. Unverified code means nobody can read what the contract does.
x402A way for a server to answer "pay 0.05 USDG first" and for your agent to pay and retry, with no account or card. Paid Keelage calls will work this way.
04 What's coming

Anything we store, you can ask for.

Tools and fields are declared by the server, so your agent sees new ones the next time it connects. These are the ones in the build queue, in order.

ToolWhat it will answerNeeds
request form, stored and notifiedThe request a metric form writes to our own database first and then emails us, so nothing is missed. Until the hosting exists it opens an email to [email protected] instead.Cloudflare Pages, Supabase, Resend under the Keelage identity
lines from the recordEvery threshold in the rules (30% and 45% concentration, the $10,000 and 5% trading floors, 60% below peak for conviction, 5% deployer share) re-cut from our own outcome data on a schedule, and published with the date it was set and the rows behind it. Until then the lines are stated with their origin, not presented as measured.Enough rows per line
app-wallet shareOn the holder map: the share of a token held by wallets that were filled through the Relay bridge, which is how FOMO and similar apps deliver tokens. So you can see how much of a token sits with app users versus wallets that bought on the chain directly.Relay fill history per wallet
keelage_feesCreator fees earned, claimed, unclaimed. Dev wallet buys, sells, burns, bridge-outs. A flag when the pattern flips.Fee-escrow and dev-wallet reads
keelage_boardThe hourly board, as on the board page, with every row's verdict.The hourly publisher
keelage_historyEvery past verdict on a token, with its 24-hour and 7-day outcome.The hourly publisher
keelage_xWhat X is saying about a token in the last 24 hours: how many posts and accounts, how much is copy-paste, which large accounts posted and whether they meant this chain's token, and a one-line read of the narrative. Priced to cover the post data we buy.Funded post-data account
keelage_exitRoute and slippage to ETH for your position size, quoted from live pools.Pool quoting
keelage_creatorEarlier launches from the same deployer and how each one ended on our log.The hourly publisher
keelage_watchA push when a watched token's gate breaks, top-10 drifts, or liquidity halves.Hosted server

Already here: the ruleset argument

The verdict is a policy laid over the facts. The facts don't move; the lines the policy reads can. ruleset on keelage_scan says which lines. Leave it out and you get keelage-default, the 18 lines on the track record page, dated 2026-10-04. It's the only preset today. "default" is accepted as its short form.

Or pass your own lines over it: { "lines": [{ "key": "pool.deep", "value": 100000 }, { "key": "top10.scout", "value": 35 }] }. A key is one of the 18 below, with a number in that line's unit. A key we don't know, a value of the wrong shape, or a key given twice comes back as an error, not a verdict. One line can't be moved, jev.halveBands, because the words next to each Jev band were measured at exactly those cuts.

Every answer names 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.

KeyUnitDefaultWhat it decides
top10.conviction% of supply30Conviction tier: the 10 largest wallets hold this much or less
top10.scout% of supply45Above this the token is watch-only and never sized
pool.deepUSD in the pool50,000Conviction needs a pool at least this deep; thinner pools are scout size
size.cap.convictionUSD1,000Largest size we would suggest for a conviction token
size.cap.scoutUSD100Largest size we would suggest for a scout token
size.poolShare% of the pool1Never more than this share of the pool, whatever the tier
deployer.max% of supply5A deployer still holding more than this fails the token
holders.minwallets100Fewer holders than this fails the entry test
entry.midPump% price change in 24h30Up more than this today fails the entry test
entry.minVolume24hUSD traded in 24h10,000Quieter than this fails the entry test
entry.minTurnoverOfMcap% of market cap traded in 24h5Less turnover than this fails the entry test
entry.deepPoolTurnover% of the pool traded in 24h0.2A pool over $100,000 doing less than this reads as fabricated or dead
entry.convictionBelowPeak% below all-time high60Conviction needs at least this much decline from peak
liquidity.maxDrawdown% below its recorded peak70A pool drained more than this fails the token
base.atBase% above the 30-day low30At base band ends here
base.justOff% above the 30-day low100Just off base band ends here
base.wellOff% above the 30-day low500Well off base band ends here; beyond is already ran
jev.halveBandsprobability0.4, 0.5, 0.6, 0.7Bands for the halve-in-7-days read

A stricter preset isn't in this release. We ship one only when every line it moves has a documented source: an earlier value stated in that line's own origin, or a dated study with its n. 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.

05 Changelog

What changed, and when.

DateVersionChange
2026-10-040.1.0First release: keelage_scan, keelage_holders, keelage_template, keelage_record over stdio. 5 reference tokens held to their structural verdict in the live test.
2026-10-040.1.1keelage_scan takes an optional ruleset: keelage-default (the only preset) or your own lines over it. Every verdict names its ruleset, date and overrides.