Keelage

Token intelligence for Robinhood Chain: onchain and social data on any token, timestamped.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
96%
Naming quality
80%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains suspicious base64-like encoded stringin keelage_pay

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,166Tokens (tool definitions)
~4.1 KBTypical response size
Significant attention impact (3.25% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

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

Runnable packages

npm@keelage/mcp0.4.0stdio

Remote endpoints

https://mcp.keelage.ai/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢keelage_scan(address, ruleset, wallet, signature, requestId)

One Robinhood Chain 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 $X, not sized): a share of the pool by tier when the entry test clears, with the one reason when not. verdict.moments carries the three with their reasons; verdict.key keeps the 0.3 word (ELIGIBLE, NOT_ELIGIBLE, FAIL, UNVERIFIED), mapped in verdict.keys. Computed under a named, dated ruleset (the optional ruleset argument) and marked beta; the facts are measured and timestamped. Jev probabilities as context when TYPESAFE_API_KEY is set. signals: the research triggers this scan crosses right now (hosted server; conditions that held up in later data, each with its n and dates), evaluated on the scan's own facts and never written; the verdict and the size do not change for a trigger. Research only, not financial advice.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Token contract address on Robinhood Chain (0x + 40 hex characters).",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "ruleset": {
      "description": "Which ruleset the verdict is computed under. A preset name (keelage-default; \"default\" is short for keelage-default), or { lines: [{ key, value }] } to replace lines of keelage-default. Keys are the ones in keelage_record's rules: top10.conviction, top10.scout, pool.deep, size.poolShare, deployer.max, holders.min, entry.midPump, entry.minVolume24h, entry.minTurnoverOfMcap, entry.deepPoolTurnover, entry.convictionBelowPeak, liquidity.maxDrawdown, base.atBase, base.justOff, base.wellOff, jev.halveBands, sweep.minAgeDays, sweep.minPoolUsd, sweep.poolFloorUsd, sweep.minMcapUsd, sweep.maxMcapUsd, size.poolShare.scout, activity.triggerVolume24h, watch.minMcapUsd, watch.sixHourlyMcapUsd, watch.hourlyMcapUsd. The facts never change; only the policy over them does. Omitted: keelage-default.",
      "oneOf": [
        {
          "type": "string",
          "enum": [
            "keelage-default",
            "default"
          ]
        },
        {
          "type": "object",
          "properties": {
            "lines": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "properties": {
                  "key": {
                    "type": "string"
                  },
                  "value": {
                    "description": "A number, or for a band line an array of numbers of the same length as the default."
                  }
                },
                "required": [
                  "key",
                  "value"
                ]
              }
            }
          },
          "required": [
            "lines"
          ]
        }
      ]
    },
    "wallet": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "Hosted server only: your wallet address (0x + 40 hex), the one that paid. The same as the X-Wallet header; the argument wins when both are sent. Priced calls past the free 20 a day draw on its credit, and every priced answer carries a credit line (credit: this call's price and where it was paid from, the free calls left today, the balance)."
    },
    "signature": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{130}$",
      "description": "Hosted server only: proof that you control the wallet, needed to spend prepaid credit. personal_sign (EIP-191) of the message \"Keelage credit <your address, lower case> <YYYY-MM-DD UTC> chain 4663 mcp.keelage.ai\" with the wallet's key; the same as the X-Wallet-Sig header. Good for its UTC day only."
    },
    "requestId": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{8,80}$",
      "description": "Hosted server only, optional: your own id for this call (the same as the X-Request-Id header). A retry with the same id, wallet, tool and arguments is answered from the first charge: the saved answer when there is one; \"retry shortly\" (-32000) while the first execution still holds its 120-second lease; a free re-run once the lease has lapsed with no answer (the retry then owns the execution). The same id with different arguments is refused. An answer too large to keep is re-run free on replay."
    }
  },
  "required": [
    "address"
  ]
}
🟢keelage_holders(address, smartAccounts, wallet, signature, requestId)

Top wallets for one token with pools, contracts and burn addresses labeled, top-10 share excluding pools and contracts, burn share, and the share held by EIP-7702 smart accounts (how the Robinhood app wallet reads).

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Token contract address on Robinhood Chain (0x + 40 hex characters).",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "smartAccounts": {
      "type": "boolean",
      "description": "Check each listed wallet for EIP-7702 delegation (one RPC call per wallet). Default true."
    },
    "wallet": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "Hosted server only: your wallet address (0x + 40 hex), the one that paid. The same as the X-Wallet header; the argument wins when both are sent. Priced calls past the free 20 a day draw on its credit, and every priced answer carries a credit line (credit: this call's price and where it was paid from, the free calls left today, the balance)."
    },
    "signature": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{130}$",
      "description": "Hosted server only: proof that you control the wallet, needed to spend prepaid credit. personal_sign (EIP-191) of the message \"Keelage credit <your address, lower case> <YYYY-MM-DD UTC> chain 4663 mcp.keelage.ai\" with the wallet's key; the same as the X-Wallet-Sig header. Good for its UTC day only."
    },
    "requestId": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{8,80}$",
      "description": "Hosted server only, optional: your own id for this call (the same as the X-Request-Id header). A retry with the same id, wallet, tool and arguments is answered from the first charge: the saved answer when there is one; \"retry shortly\" (-32000) while the first execution still holds its 120-second lease; a free re-run once the lease has lapsed with no answer (the retry then owns the execution). The same id with different arguments is refused. An answer too large to keep is re-run free on replay."
    }
  },
  "required": [
    "address"
  ]
}
🟢keelage_x(address, fresh, wallet, signature, requestId)

What X is saying about one Robinhood Chain token in the last 24 hours: posts and accounts, how much is a repeated template, which large profiles posted and whether they meant this chain's token, views, and a one-line read of the narrative. Context only, never part of the verdict; a scan does not read X. Cached 6 hours per token.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Token contract address on Robinhood Chain (0x + 40 hex characters).",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "fresh": {
      "type": "boolean",
      "description": "Skip the 6-hour cache and read X again. Default false."
    },
    "wallet": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "Hosted server only: your wallet address (0x + 40 hex), the one that paid. The same as the X-Wallet header; the argument wins when both are sent. Priced calls past the free 20 a day draw on its credit, and every priced answer carries a credit line (credit: this call's price and where it was paid from, the free calls left today, the balance)."
    },
    "signature": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{130}$",
      "description": "Hosted server only: proof that you control the wallet, needed to spend prepaid credit. personal_sign (EIP-191) of the message \"Keelage credit <your address, lower case> <YYYY-MM-DD UTC> chain 4663 mcp.keelage.ai\" with the wallet's key; the same as the X-Wallet-Sig header. Good for its UTC day only."
    },
    "requestId": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{8,80}$",
      "description": "Hosted server only, optional: your own id for this call (the same as the X-Request-Id header). A retry with the same id, wallet, tool and arguments is answered from the first charge: the saved answer when there is one; \"retry shortly\" (-32000) while the first execution still holds its 120-second lease; a free re-run once the lease has lapsed with no answer (the retry then owns the execution). The same id with different arguments is refused. An answer too large to keep is re-run free on replay."
    }
  },
  "required": [
    "address"
  ]
}
🟢keelage_template(address)

Which launcher template a contract came from (Pons, LaunchToken, Doppler, UERC20, tokenized stock, or unregistered), with the template verdict, the ABI privileges and the transfer-tax identifier count read from verified source.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Token contract address on Robinhood Chain (0x + 40 hex characters).",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    }
  },
  "required": [
    "address"
  ]
}
🟢keelage_record(table, history, days, cursor)

The track record behind the verdicts, cut every day from Keelage's own ledger: every Robinhood Chain pass with its 24-hour, 7-day and 30-day outcome, and every token-day since each token's first pool, re-cut daily on the hosted server into tables by horizon, band, tier, mcap, pool, age, dayOne, claim, jev, xPosts, xTone, kind, repeat, path, derived, lines, ledger, universe, tokenDays, launcher, projectType, regime, sized, holderGrowth, worst, best, signals, one table at a time (table) or all at once, with the day-by-day series (history). table "signals" is the register of research triggers (conditions that held up in later data, ranked, each with its n, dates and the field it is measured against), with its own history. No dated studies: the rules ship with their origin and are tested on the live tables. Research, not advice.

Input Schema

{
  "type": "object",
  "properties": {
    "table": {
      "type": "string",
      "enum": [
        "horizon",
        "band",
        "tier",
        "mcap",
        "pool",
        "age",
        "dayOne",
        "claim",
        "jev",
        "xPosts",
        "xTone",
        "kind",
        "repeat",
        "path",
        "derived",
        "lines",
        "ledger",
        "universe",
        "tokenDays",
        "launcher",
        "projectType",
        "regime",
        "sized",
        "holderGrowth",
        "worst",
        "best",
        "signals"
      ],
      "description": "One live table. horizon: The same alerts read 24 hours, 7 days and 30 days later. band: Distance from the 30-day low at alert, in 4 bands. tier: Sizing tier at alert: how concentrated the 10 largest wallets were. mcap: Market cap at alert, in 4 bands. pool: Dollars in the trading pool at alert, in 3 bands. age: Age of the token at alert, in 4 bands. dayOne: Where the price stood 24 hours after the alert, and what the week did from there. claim: Whether the token carried a paid takeover claim at alert. jev: Jev's chance of halving within 7 days, in 5 bands, against what happened. xPosts: How many posts X showed about the token in the 24 hours before the alert. xTone: Whether the X read called the attention organic or a campaign. kind: What kind of alert it was: a new token, one that became eligible, or an upgraded tier. repeat: First alert for the token against a later alert on the same token. path: Hours after the alert (1, 4, 12, 24) from the hourly board rows, and the share gone from the board. derived: Bands cut from the data: quartile cut points per stored fact on the train half, read on train and test, with the single cut the data prefers. lines: Every hand-set rule line that maps to a stored fact, tested: 7-day outcome below and above it, all rows and the test half. ledger: Reconciliation: the publisher's own ledger row count against the rows the store holds in the same window. universe: The field: every token on the chain swept once a day (listed, priced, first seen), its own 7- and 30-day return, our alerted tokens against it, first pools by week. tokenDays: Every token-day since each token's first pool: every rule line tested on it, cut by age, market cap, pool, volume, distance from the low, drawdown, code verdict, and holder growth over the prior and the next 7 days. launcher: Which launcher made the token, against what the pass did next. projectType: What the project is (meme, AI agent, DeFi, utility, RWA, bridged major, unknown), against what the pass did next. regime: Passes before and from 2026-10-06: the old shape against the no-floor sweep. sized: Passes that were sized at the pass against passes that were not. holderGrowth: Holder growth over the 7 days after the pass (the count at the pass against the daily sweep 7 days on), in 4 bands, against the 7-day return. worst: The 8 alerts with the worst 7-day return. best: The 8 alerts with the best 7-day return. signals: Research triggers: the conditions that held up in later data, ranked, each with its n, dates, horizon and the field it is measured against; what a token crossing one did next. Never a buy."
    },
    "history": {
      "type": "boolean",
      "description": "The daily series instead: one point per UTC day with that day's alert count and its 24-hour, 7-day and 30-day headline stats. Default false."
    },
    "days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 366,
      "description": "With history: how many days back. Default 90."
    },
    "cursor": {
      "type": "string",
      "description": "With table \"signals\" and history: continue an earlier page of the register's history from its nextCursor."
    }
  }
}
🟢keelage_token(address, cursor)

Everything Keelage holds on one Robinhood Chain token, as the token page shows it: the launch (creator, factory, template, block and time), today's price, cap, pool, volume and holders, the structural verdict the scan last recorded, every alert raised on it with its 24-hour, 7-day and 30-day outcome, the hourly price series, what X showed 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 has no store and says so.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Token contract address on Robinhood Chain (0x + 40 hex characters).",
      "pattern": "^0x[0-9a-fA-F]{40}$"
    },
    "cursor": {
      "type": "string",
      "description": "Continue the research-trigger matches (signals) from an earlier answer's signals.nextCursor."
    }
  },
  "required": [
    "address"
  ]
}
🟢keelage_today(moment, cursor)

What Keelage read today on Robinhood Chain, as the Today page shows it: this hour's and today's code passes (clean code / not clean / unread, with the reasons), today's activity passes (passes, with the tier and whether each was sized), today's sized passes, and the watch lines that fired on passed tokens (volume, momentum, price, the 10 largest wallets, original holders), plus signals: the research triggers crossed in the last 24 hours, on the rows they belong to. One moment (moment) or all four. Free, never counted. Hosted server only: the local server has no store and says so.

Input Schema

{
  "type": "object",
  "properties": {
    "moment": {
      "type": "string",
      "enum": [
        "code",
        "activity",
        "sized",
        "watch"
      ],
      "description": "One moment only. code: This hour's and today's code passes: every new pool read within the hour. activity: Today's activity passes: tokens judged once they traded like a project. sized: Today's sized passes: the activity passes whose entry test cleared. watch: The watch lines that fired today on passed tokens. Omitted: all four."
    },
    "cursor": {
      "type": "string",
      "description": "Continue the research-trigger matches (signals) from an earlier answer's signals.nextCursor."
    }
  }
}
⚪keelage_pay(tx, wallet)

Prepaid credit for priced calls on the hosted server. With tx: the hash of a USDG transfer on Robinhood Chain (chain 4663) to 0xaE313a57B2CE1cbd31bB82C90ced3CFaC0862bA1; the sending wallet is credited once with the amount. Without tx: the credit of the wallet named by the wallet argument or your X-Wallet header. Free, never counted. The local server has no payments.

Input Schema

{
  "type": "object",
  "properties": {
    "tx": {
      "type": "string",
      "description": "Transaction hash (0x + 64 hex) of your USDG transfer to the merchant address.",
      "pattern": "^0x[0-9a-fA-F]{64}$"
    },
    "wallet": {
      "type": "string",
      "pattern": "^0x[0-9a-fA-F]{40}$",
      "description": "Hosted server only: your wallet address (0x + 40 hex), the one that paid. The same as the X-Wallet header; the argument wins when both are sent. Priced calls past the free 20 a day draw on its credit, and every priced answer carries a credit line (credit: this call's price and where it was paid from, the free calls left today, the balance)."
    }
  }
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded7 tools