mcp-server-madeonsol 1.23.0 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,351 +1,358 @@
1
- # mcp-server-madeonsol
2
-
3
- [![npm version](https://img.shields.io/npm/v/mcp-server-madeonsol?style=flat-square)](https://www.npmjs.com/package/mcp-server-madeonsol)
4
- [![npm downloads](https://img.shields.io/npm/dm/mcp-server-madeonsol?style=flat-square)](https://www.npmjs.com/package/mcp-server-madeonsol)
5
- [![Smithery](https://img.shields.io/badge/Smithery-listed-blueviolet?style=flat-square)](https://smithery.ai/servers/madeonsol/solana-kol-intelligence)
6
- [![Glama](https://glama.ai/mcp/servers/madeonsol/mcp-server-madeonsol/badges/score.svg)](https://glama.ai/mcp/servers/madeonsol/mcp-server-madeonsol)
7
- [![MCP](https://img.shields.io/badge/MCP-compatible-blueviolet?style=flat-square)](https://modelcontextprotocol.io/)
8
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue?style=flat-square)](LICENSE)
9
-
10
- > ⚡ **[Install via Smithery](#install-via-smithery-one-line)** · 🤖 **[Use in Claude Desktop](#claude-desktop)** · 🖱️ **[Use in Cursor](#cursor)** · 📚 **[API docs](https://madeonsol.com/api-docs)** · 💰 **[Free API key](https://madeonsol.com/pricing)** · 🔎 **[On Glama](https://glama.ai/mcp/servers/madeonsol/mcp-server-madeonsol)**
11
-
12
- MCP server for [MadeOnSol](https://madeonsol.com) Solana KOL intelligence API. Use from Claude Desktop, Cursor, or any MCP-compatible client.
13
-
14
- > Real-time Solana trading intelligence: track 1,069 KOL wallets with <3s latency, score 23,000+ Pump.fun deployers, surface deshred deploy signals **~500ms before on-chain confirmation**, detect multi-KOL coordination, surface bundle-cohort holdings (which same-slot wallets still hold a token's supply), verify any wallet's CURRENT on-chain holdings straight from its token accounts, and stream every DEX trade across 9+ programs. Free tier: 200 requests/day, every endpoint — no signup payment. Get a key at [madeonsol.com/pricing](https://madeonsol.com/pricing).
15
-
16
- > **New in 1.23.0 — live holder census: exact holder count, labelled holders, and pools that are named, not just excluded.** The new `madeonsol_token_holders` tool binds `GET /tokens/{mint}/holders` (PRO+): every token account of the mint read from the ledger at `confirmed` and merged per owner, so `concentration.holder_count` is EXACT (distinct non-zero owners minus pools / bonding curves / burns) — never a trade-derived estimate; it is `null` only when the provider refuses the census for a mega-cap, in which case you get the top-20 view and `source.census_fallback_reason` says so. Each disclosed owner carries our labels (`deployer` / `kol` / `early_buyer` / `bundle` / `bot` / `dump_cluster` — empty means unknown to us, not clean), and `excluded[]` NAMES what was taken out of the circulating denominator: `reason` = `pool` (with `dex` + `pool_address`), `bonding_curve` (pump.fun / LaunchLab), `burn`, or `program_account` only when we genuinely cannot attribute the PDA; `pool_pct` / `burned_pct` / `program_pct` split the exclusion. Amounts are raw u64 **strings**. Disclosure: PRO ranks 1–10, ULTRA 1–50, BUSINESS 1–100 — the maths is tier-independent. Big tokens take 5–30 s upstream: you get `503 holder_scan_in_progress` with `retry_after_seconds: 20` while the scan finishes into the cache, and the retry is instant.
17
-
18
- > **New in 1.22.0 — two prices on the trade tape, and the right one is now the default.** The trade tape now tells you what a trade actually cost. `price_sol`/`price_usd` on each trade are THIS trade's executed price — `sol_amount / token_amount`, reconciling exactly with the amounts on the same row and with the PnL endpoints. Because `sol_amount` is the wallet's net SOL movement, that is the trader's all-in effective rate: swap fee and any account rent included, not the pool mid. The market-cap tracker's canonical pool price moved to the new **`market_price_sol`/`market_price_usd`** fields — it is sampled once per token per pool update, so every trade in the same slot shares it. Until now `price_sol` carried that canonical value and disagreed with the row's own amounts by a **7.9% median** (p90 ~74%): a stale market price reads low in a pump and high in a dump, so anything you averaged out of the tape inherited the bias instead of cancelling it. Use `price_sol` for cost basis, fills and PnL; `market_price_sol` for a per-token series independent of trade size and direction. Both `madeonsol_token_trades` and `madeonsol_wallet_trades` carry all four fields, and both tool descriptions spell out which price to use so an agent does not average the wrong one.
19
-
20
- > **New in 1.21.0 — the Deployer Hunter surface completed.** Seven new operations that existed on the API but had no SDK binding: `madeonsol_deployer_leaderboard`, `madeonsol_deployer_stats`, `madeonsol_deployer_profile`, `madeonsol_deployer_tokens`, `madeonsol_deployer_alert_stats`, `madeonsol_deployer_best_tokens` and `madeonsol_deployer_recent_bonds`. Read `bonding_rate` (lifetime) against `recent_bond_rate` (rolling) — the gap between them is the signal, not either number alone. `runner_rate` only means something once `labeled_tokens >= 3`, and an **untracked wallet returns a profile with zeroed counters, not a 404**, so check `total_deployed` before reading a 0% bond rate as a track record. Dependency ranges are now bounded to the versions actually tested (`@x402/*` `^2.x`, `@solana/kit` `^5.5.1`) instead of open-ended `>=0.0.1`, and the lazily-imported x402 peers are marked optional — a keyed install no longer pulls the whole Solana stack.
21
-
22
- > **New in 1.20.0** — **Token depth / price impact + deployer self-activity on risk.** New tool `madeonsol_token_depth` (`GET /tokens/{mint}/depth`) — per-pool price-impact / slippage: "how much SOL moves this token's price N%", per pool (NOT router-optimal). Pass up to 8 SOL buy `sizes` (each >0 and ≤10000; default `[0.5, 1, 5, 10]`); every computable pool returns `spot_price_sol`, `fee_pct`, a `quotes[]` entry per size (`size_sol`, `tokens_out`, `avg_price_sol`, `price_impact_pct`), and `to_move_price` — the SOL required to move price **1% / 5% / 10%**. Constant-product AMMs are served from stream reserves (`source: "stream"` with `reserves_age_ms`); pump.fun/bonk bonding curves from a **live** read of the curve's virtual reserves (`source: "live_rpc"`). Pools that can't be priced honestly — concentrated CLMM/Orca/DLMM, Meteora-DBC curves, unclassified models — come back in `unsupported_pools[]` with a `reason` (e.g. `concentrated_liquidity_depth_not_supported`, `curve_graduated_use_amm_pool`) instead of a wrong number; `primary_pool` names the deepest computable pool, `found: false` means no pools tracked. PRO/ULTRA only. And `madeonsol_token_risk` now returns a top-level **`dev` block** (deployer self-activity; `null` when the mint has no deployer-pipeline row): the create-tx self-buy snapshot (`buy_sol`, `buy_tokens`, `buy_supply_pct`), the post-create rollup (`bought_tokens_after` — catches the same-second-separate-tx dev buy the create snapshot reads as 0 — `sold_tokens`, `sold_sol`, `first_sell_at`/`last_sell_at`), **live on-chain holdings** (`holdings_tokens`, `holdings_supply_pct` — pump.fun 1B denominator, null elsewhere — `wallet_empty`: is the dev wallet empty NOW), and `transferred_out` (tokens left without a sell; `null` = unknown, never a guess), plus `as_of`. `deployer:alert` webhook/WS payloads gain `dev_buy_sol` + `dev_buy_supply_pct`.
23
- >
24
- > **New in 1.19.0** — **Batch wallet classification + token trade tape + bigger keyless catalog.** New tool `madeonsol_wallet_batch_classify` — reputation flags for 1–100 wallets in one call (counts as one request): per wallet `is_sniper` / `is_bundler` / `is_dumper` / `is_kol` (+ `kol_name`), `bot_confidence` (string enum `none`/`low`/`medium`/`high`, `null` when not alpha-tracked), and a `dump_cluster` block (`dump_cohorts`, `runner_cohorts`, `total_cohorts`, `as_of`). Flags are pump.fun-pipeline scoped — `false` = not observed, NOT verified clean; `is_bundler` is lifetime, `is_dumper` is a rolling 42d window. New tool `madeonsol_token_trades` — mint-scoped cursor-paginated trade tape (the backfill complement to the live firehose): `tx_signature`, `wallet_address`, `action`, `sol_amount`, `token_amount`, `price_sol`/`price_usd`, `early_buyer_rank`, `slot`, `block_time`, `traded_at`; filters `action` / `wallet` / `since`–`until` (default FULL history — capture starts 2026-04-12), plus a `coverage` honesty block. Both PRO/ULTRA. `madeonsol_wallet_stats` flags gain `is_sniper`/`is_bundler`/`is_dumper` + `dump_cluster`, and `bot_confidence` is now correctly typed as a string enum (it was documented as a number and always came back `null` due to a server bug — now returns real values). `madeonsol_token_risk` inputs and `madeonsol_sniper_recent` deploys gain the slot-window `sniper_footprint`/`footprint` rollup (`buys`, `buyers`, `sol`, `supply_pct`, `sniper_wallet_buys`, `data_available`, `as_of` — `null` = not observable, not zero). The **keyless x402 catalog grows 18 → 25 endpoints**: token candles ($0.01), almost-bonded ($0.01), top-traders ($0.02), cap-table ($0.02), sniper recent ($0.01), token flow ($0.01), deployer trajectory ($0.01) — `madeonsol_sniper_recent` and `madeonsol_deployer_trajectory` now work keyless via x402 too.
25
- >
26
- > **New in 1.18.0** — **Verified on-chain wallet holdings.** New tool `madeonsol_wallet_holdings` — the wallet's CURRENT holdings read straight from chain: its actual SPL + Token-2022 token accounts and SOL balance, each enriched with our `price_usd` / `value_usd` / `market_cap_usd` / `name` / `symbol` / `is_bonded`, plus `transfer_delta` (on-chain amount − trade-derived net position — exposes non-swap flows like airdrops, insider funding, and wallet-hopping). Distinct from `madeonsol_wallet_positions` (trade-derived FIFO): this is what the wallet *actually* holds right now. Params: `limit` (1–500, default 200), `min_value_usd` (default 0). Returns `{ address, sol_balance, holdings[], summary, verified_at, trade_window_days, cache_hit, ttl_seconds }`. ULTRA only.
27
- >
28
- > **New in 1.17.0** — **Bundle-cohort holdings.** New tool `madeonsol_token_bundle` — which same-slot "bundle" wallets bought a token and how much of supply they *still* hold (the incumbents' "current held %" rug/insider signal, from confirmed on-chain data). Returns a `bundle` block (`wallet_count`, `bundle_kind` atomic_tx/same_slot/none, `held_ratio`, `held_pct_of_supply` — the headline, net held / circulating supply, null if unknown — `fully_exited`, `buy_volume`, `tokens_held`) plus a `wallets[]` array (`rank`, `wallet`, `held_ratio`, `has_sold`, `atomic`, `is_kol`). BASIC get the bundle block only (empty `wallets[]`); PRO adds top-10 flags-only wallets; ULTRA returns the full cohort with enriched identities (`kol_name`, `win_rate`, `bot_confidence`, `tokens_held`).
29
- >
30
- > **New in 1.16.0** — **Batch risk scoring + live stream-session control.** New tool `madeonsol_tokens_batch_risk` — bulk rug-risk/safety scoring for up to 50 mints in one call, returning the same per-mint shape as `madeonsol_token_risk` (0–100 score, `band`, explainable `factors[]`, raw `inputs`) plus an `as_of` timestamp; untracked mints come back as `{ mint, error: "not_tracked" }` without failing the batch, and the whole call counts as one request against quota. Plus two WebSocket session tools: `madeonsol_stream_sessions_list` (list your live sessions — `id`, `service`, `tier`, `channels`, `connected_at`, `remote_ip`, `messages_sent`) and `madeonsol_stream_session_kill` (force-disconnect a session by id to free its connection slot, e.g. a ghost socket). PRO/ULTRA only.
31
- >
32
- > **New in 1.15.0** — **Almost-bonded discovery + trending sorts.** New tool `madeonsol_almost_bonded` — pre-bond pump.fun tokens near graduation, ranked by velocity (Δprogress/min): "95% and accelerating" beats "92% stalled". Each token carries `progress_pct`, `velocity_pct_per_min`, `eta_minutes`, `stalled`, `real_sol_reserves`, `market_cap_usd`, `liquidity_usd`, `authorities_revoked`, `deployer_tier`, and `age_minutes`. Params: `min_progress`, `max_progress`, `min_velocity_pct_per_min`, `max_age_minutes`, `deployer_tier`, `authority_revoked`, `min_liq`, `sort` (velocity_desc / progress_desc / eta_asc), `limit`. PRO/ULTRA only. Plus `madeonsol_tokens_list` gains four momentum sorts — `mc_change_5m_desc`, `mc_change_1h_desc`, `volume_1h_desc`, and `trending` (composite recent-volume × positive-momentum rank).
33
- >
34
- > **New in 1.14.0** — **Token trade flow.** New tool `madeonsol_token_flow` — a trade-flow aggregate (organic-vs-fake volume) over a `1h`/`24h` window: `unique_wallets` / `unique_buyers` / `unique_sellers`, `buy_count` / `sell_count` / `total_trades`, `buy_sol` / `sell_sol` / `net_sol` (sell − buy; positive = net SOL leaving the pool), and `trades_per_wallet` (wash-trading proxy). PRO/ULTRA only. Deployer alerts (`madeonsol_deployer_alerts`) now carry `deployers.deployer_sol_balance` — the deployer wallet's SOL balance at alert time (null for historical rows).
35
- >
36
- > **New in 1.13.0** — **Token OHLCV candles.** New tool `madeonsol_token_candles` — historical price candles (1m/5m/15m/1h/4h/1d) aggregated from the on-chain trade firehose. Each candle has `t/open/high/low/close/volume_usd/trades/market_cap_usd`. PRO returns OHLCV for the last 30 days; ULTRA adds buy/sell volume + count splits, net flow, MEV volume, open/close liquidity, high/low MC, and full history. PRO/ULTRA only.
37
- >
38
- > **New in 1.12.0** — **Token risk score.** New tool `madeonsol_token_risk` — a transparent 0–100 rug-risk/safety score (higher = riskier) with a `band` (safe/caution/danger), an explainable `factors[]` array, and the raw `inputs` (mint/freeze authority, liquidity, liq-to-MC ratio, transfer fee, launch cohort, deployer bond rate, KOL signal, blacklist). PRO/ULTRA only.
39
- >
40
- > **New in 1.11.0** — `madeonsol_tokens_list` gains three new filter params: `min_liq_mc_ratio`, `max_liq_mc_ratio`, and `deployer_tier`. Response items now include `liquidity_to_mc_ratio` and `deployer_tier`. New tool: `madeonsol_signal_performance` — evaluate signal efficacy (hit rate, sample size, median outcome) before acting on any signal. KOL leaderboard entries now include `median_hold_minutes_30d` and `percentile_early_entry_30d`.
41
- >
42
- > **New in 1.10.4** — Deployer alerts/profiles now expose `runner_rate` + `labeled_tokens` (fraction of a deployer's labeled tokens that ran vs dumped, gate on `labeled_tokens` ≥3) plus `avg_time_to_bond_minutes`.
43
-
44
- > **New in 1.10.3** — **Dump-cluster detection.** `madeonsol_token_buyer_quality` breakdown now includes `dump_cluster_count` (3+ dump-cluster wallets in the first-20 → 94% historical dump rate vs 61% base) and `recycled_early_buyer_count`. Full breakdown is returned on all tiers. Also: the API now pushes every pump.fun graduation in real time (`token:graduations` WS channel).
45
-
46
- > **New in 1.10** — **Deshred Sniper Alerts.** `madeonsol_sniper_recent` surfaces pump.fun deploys from shred-level data ~500ms before on-chain confirmation. PRO: elite/good deployers. ULTRA: all tiers + custom watchlist. Use `sniper:deploys` WebSocket or `sniper:deploy` webhook for live push.
47
- >
48
- > **New in 1.9** — **Price alerts, scout leaderboard, coordination history.** `madeonsol_price_alerts_*` CRUD (PRO=5, ULTRA=25). `madeonsol_scout_leaderboard` ranks top scouts by first-touch follow-on rate. `madeonsol_coordination_history` and `madeonsol_peak_history` expose the historical record. `madeonsol_wallet_stats` now returns `derived`: win_rate, roi, verdict, biggest_miss.
49
- >
50
- > **New in 1.8** — **Universal Wallet API.** `madeonsol_wallet_stats`, `madeonsol_wallet_pnl`, `madeonsol_wallet_positions`, `madeonsol_wallet_trades` — FIFO cost-basis PnL and cursor-paginated raw trades for any Solana wallet. PRO+. Cache hits don't count against quota.
51
- >
52
- > **New in 1.7.0** *(2026-05-12)* — Two new tools: **`madeonsol_me`** (account/quota introspection — read tier, remaining requests, and per-feature usage without parsing rate-limit headers) and **`madeonsol_tokens_list`** (PRO+ filtered, sortable token directory — MC band, liquidity floor, primary DEX, authority/safety flags, plus computed 1h volume / MEV-share / MC-change deltas). Token responses now expose **velocity / MEV-share** fields. Token directory defaults to **`min_liq=2000`** to skip phantom-MC dust — pass `min_liq=0` to opt out. `/token/{mint}` now returns **structured 400 errors** (`code` / `reason` / `example` / `docs`) instead of plain strings. Deprecated `avg_entry_mc_usd` field fully removed from KOL/alpha leaderboards.
53
-
54
- ## Install via Smithery (one line)
55
-
56
- [Smithery](https://smithery.ai/servers/madeonsol/solana-kol-intelligence) is the easiest path — it writes the config for you and handles the install:
57
-
58
- ```bash
59
- npx -y smithery mcp add madeonsol/solana-kol-intelligence
60
- ```
61
-
62
- Smithery prompts for your `MADEONSOL_API_KEY` ([free at madeonsol.com/pricing](https://madeonsol.com/pricing)) and wires up Claude Desktop or your chosen MCP client. Restart the client and ask: *"What are KOLs buying right now?"*
63
-
64
- You can also browse tools from the CLI:
65
-
66
- ```bash
67
- npx -y smithery tool get madeonsol/solana-kol-intelligence madeonsol_kol_feed
68
- ```
69
-
70
- ## Quick start — manual config (10 seconds)
71
-
72
- ```bash
73
- npm install -g mcp-server-madeonsol
74
- ```
75
-
76
- Add to `claude_desktop_config.json` or Cursor MCP settings (free tier at https://madeonsol.com/pricing):
77
-
78
- ```json
79
- { "mcpServers": { "madeonsol": { "command": "mcp-server-madeonsol", "env": { "MADEONSOL_API_KEY": "msk_..." } } } }
80
- ```
81
-
82
- Restart Claude Desktop and ask: *"What are KOLs buying right now?"*
83
-
84
- ## AI agent quickstart (x402 / pay-per-call)
85
-
86
- Building an autonomous agent? Skip the signup. Point a **funded Solana wallet** at the server and every tool call **auto-pays a micropayment** over [x402](https://x402.org) — no API key, no account, no rate-limit dance.
87
-
88
- ```json
89
- {
90
- "mcpServers": {
91
- "madeonsol": {
92
- "command": "mcp-server-madeonsol",
93
- "env": {
94
- "SVM_PRIVATE_KEY": "<base58 solana private key>"
95
- }
96
- }
97
- }
98
- }
99
- ```
100
-
101
- How it works:
102
-
103
- - The wallet behind `SVM_PRIVATE_KEY` settles each request as a **USDC micropayment on Solana** (~$0.005–$0.02 per call, settled on-chain). No subscription, no quota.
104
- - The keyless catalog covers **25 endpoints** — the latest additions: token candles ($0.01), almost-bonded ($0.01), top-traders ($0.02), cap-table ($0.02), sniper recent deploys ($0.01), token flow ($0.01), and deployer trajectory ($0.01).
105
- - The free **`madeonsol_discovery`** tool needs no auth and returns every endpoint with its exact per-call price — call it first to see what each tool costs.
106
- - Install the x402 peer deps alongside the server (only required for this mode):
107
-
108
- ```bash
109
- npm install -g mcp-server-madeonsol @x402/fetch @x402/svm @x402/core @solana/kit @scure/base
110
- ```
111
-
112
- > **Data only.** MadeOnSol returns trading *intelligence* — it never trades, signs swaps, or takes custody of funds. The only thing your wallet ever pays for is the per-call data fee.
113
-
114
- Prefer a fixed monthly bill, free tier, or no wallet? Use the developer path below.
115
-
116
- ## Authentication
117
-
118
- Two options (in priority order):
119
-
120
- | Method | Env var | Best for |
121
- |---|---|---|
122
- | **MadeOnSol API key** (recommended) | `MADEONSOL_API_KEY` | Developers — [get a free key](https://madeonsol.com/pricing) |
123
- | x402 micropayments | `SVM_PRIVATE_KEY` | AI agents with Solana wallets |
124
-
125
- > **v1.0 breaking change:** RapidAPI auth (`RAPIDAPI_KEY`) has been removed. The MadeOnSol RapidAPI marketplace was retired on 2026-04-19. Get a free `msk_` key at [madeonsol.com/pricing](https://madeonsol.com/pricing).
126
-
127
- ## Install
128
-
129
- ```bash
130
- npm install -g mcp-server-madeonsol
131
- ```
132
-
133
- > x402 peer deps (`@x402/fetch @x402/svm @x402/core @solana/kit @scure/base`) are only needed when using `SVM_PRIVATE_KEY`.
134
-
135
- ## Configure
136
-
137
- ### Claude Desktop
138
-
139
- Add to `claude_desktop_config.json`:
140
-
141
- ```json
142
- {
143
- "mcpServers": {
144
- "madeonsol": {
145
- "command": "mcp-server-madeonsol",
146
- "env": {
147
- "MADEONSOL_API_KEY": "msk_your_api_key_here"
148
- }
149
- }
150
- }
151
- }
152
- ```
153
-
154
- ### Cursor
155
-
156
- Add to MCP settings with the same command and env vars.
157
-
158
- ## Tools
159
-
160
- ### KOL Intelligence
161
-
162
- | Tool | Description |
163
- |---|---|
164
- | `madeonsol_kol_feed` | Real-time KOL trade feed (1,000+ wallets) |
165
- | `madeonsol_kol_coordination` | Multi-KOL convergence signals (v1.1) — peak-density window, exit detection, 0-100 score |
166
- | `madeonsol_kol_first_touches` | First-KOL-touch events — backtested scout signal. Filter by scout tier, winrate, token age, mint suffix |
167
- | `madeonsol_kol_leaderboard` | KOL PnL and win rate rankings (180 days of history; periods: today, 7d, 30d, 90d, 180d) |
168
- | `madeonsol_kol_pairs` | KOL affinity matrix — which KOLs co-trade the same tokens |
169
- | `madeonsol_kol_hot_tokens` | KOL momentum tokens — accelerating buy interest |
170
- | `madeonsol_kol_trending_tokens` | Tokens ranked by KOL buy volume (5m–12h windows). ULTRA adds full KOL wallet addresses. |
171
- | `madeonsol_kol_pnl` | Deep per-wallet PnL: equity curve, risk metrics, closed positions. ULTRA adds open positions (tokens bought but not yet sold). |
172
- | `madeonsol_kol_timing` | KOL entry/exit timing profile — available on all tiers |
173
-
174
- ### Deployer Hunter
175
-
176
- | Tool | Description |
177
- |---|---|
178
- | `madeonsol_deployer_alerts` | Pump.fun deployer launches with KOL enrichment. Filter by tier (elite/good/moderate/rising/cold). ULTRA unlocks full pagination. Each alert's `deployers` now includes `deployer_sol_balance` — the deployer wallet's SOL balance at alert time (null for historical rows). |
179
- | `madeonsol_deployer_trajectory` | Deployer skill curve — streaks, rolling bond rate, trend — available on all tiers |
180
- | `madeonsol_deployer_history` | A pump.fun deployer's daily reputation time-series (`bonding_rate`, `recent_bond_rate`, `tier`, `avg_peak_mc` per day) — backtest deployer signals at launch time without look-ahead bias. `limit` 1–365 (default 90) |
181
-
182
- ### Deshred Sniper Alerts *(new in 1.10 — Pro/Ultra)*
183
-
184
- Pre-confirm pump.fun deploy feed reconstructed from shred-level (**deshred**) data — launches surface **~500ms before they confirm on-chain**. Pro sees elite/good deployers; Ultra sees every tier.
185
-
186
- | Tool | Description |
187
- |---|---|
188
- | `madeonsol_sniper_recent` | Newest-first deshred deploy feed. Pro: elite/good · Ultra: all tiers · keyless x402: $0.01 (elite/good). `watchlist: true` (Ultra) narrows to your custom deployer watchlist. **New 1.19:** each deploy carries `footprint` — the slot-window snipe rollup (`buys`, `buyers`, `sol`, `supply_pct`, `sniper_wallet_buys`, `data_available`, `as_of`) or `null` when not yet settled/observable |
189
- | `madeonsol_sniper_by_deployer` | Deshred deploys for a single deployer wallet (Ultra) |
190
-
191
- ### Wallet Tracker
192
-
193
- | Tool | Description |
194
- |---|---|
195
- | `madeonsol_wallet_tracker_watchlist` | List your tracked wallets and remaining capacity (Free: 10, Pro: 50, Ultra: 100) |
196
- | `madeonsol_wallet_tracker_add` | Add a wallet to your watchlist |
197
- | `madeonsol_wallet_tracker_remove` | Remove a wallet from your watchlist |
198
- | `madeonsol_wallet_tracker_trades` | Historical swap/transfer events for watched wallets (120-day retention) |
199
- | `madeonsol_wallet_tracker_summary` | Per-wallet stats: swap counts, SOL bought/sold, last event |
200
-
201
- ### Universal Wallet *(new in 1.8 — any wallet, not just curated KOLs, PRO+)*
202
-
203
- | Tool | Description |
204
- |---|---|
205
- | `madeonsol_wallet_stats` | Aggregate 90d stats + cross-product flags (is_kol, is_alpha_tracked + bot_confidence `none`/`low`/`medium`/`high`, is_deployer + tokens_deployed, **new 1.19:** is_sniper / is_bundler / is_dumper + `dump_cluster` cohorts) — quick sizing-up of an unknown wallet |
206
- | `madeonsol_wallet_batch_classify` | **New 1.19** · Bulk reputation flags for 1–100 wallets in one call — is_sniper/is_bundler/is_dumper/is_kol + kol_name, bot_confidence, dump_cluster. Pump.fun-pipeline scoped: `false` = not observed, not verified clean |
207
- | `madeonsol_wallet_pnl` | Full FIFO cost-basis PnL: realized + unrealized SOL, profit factor, max drawdown, avg + median hold minutes, daily UTC PnL curve, closed + open positions hydrated with live mc-tracker prices |
208
- | `madeonsol_wallet_positions` | Open positions only — lighter slice of /pnl. Shares the same cache. |
209
- | `madeonsol_wallet_holdings` | **New 1.18** · Verified CURRENT on-chain holdings (real SPL + Token-2022 accounts + SOL) enriched with price/MC/name, plus `transfer_delta` vs trade-derived position. ULTRA only. |
210
- | `madeonsol_wallet_trades` | Cursor-paginated raw trades with action / token / since-until filters |
211
-
212
- Cached server-side with dynamic TTL (5min / 1h / 24h based on last activity). Cost basis observable only inside the 90-day window.
213
-
214
- ### Alpha Wallet Intelligence
215
-
216
- Scored from 1M+ early-buyer records (wallets seen in the first 20 buyers of Pump.fun tokens).
217
-
218
- | Tool | Tier | Description |
219
- |---|---|---|
220
- | `madeonsol_alpha_leaderboard` | All | Top profitable early-buyer wallets. Up to 100 on Free/Pro; ULTRA unlocks 500 + bot signals |
221
- | `madeonsol_alpha_wallet` | ULTRA | Full per-token breakdown + bot_signals array |
222
- | `madeonsol_alpha_linked` | ULTRA | Wallets behaviorally linked (co-bought 3+ tokens within 2s) |
223
-
224
- ### Token Quality
225
-
226
- | Tool | Tier | Description |
227
- |---|---|---|
228
- | `madeonsol_tokens_list` | PRO+ | Filtered, sortable token directory — MC band, liquidity floor, primary DEX, authority/safety flags, computed 1h volume / MEV-share / MC-change deltas, plus momentum sorts (`mc_change_5m_desc`, `mc_change_1h_desc`, `volume_1h_desc`, `trending`). Default `min_liq=2000` skips phantom-MC dust. |
229
- | `madeonsol_almost_bonded` | PRO+ | Pre-bond pump.fun tokens near graduation, ranked by velocity (Δprogress/min) — `progress_pct`, `velocity_pct_per_min`, `eta_minutes`, `stalled`, `deployer_tier`, `age_minutes` |
230
- | `madeonsol_token_cap_table` | PRO+ | First non-deployer early buyers, enriched with PnL/KOL/bot flags. PRO=10, ULTRA=20 |
231
- | `madeonsol_token_buyer_quality` | All | 0–100 buyer-quality score + full breakdown (5-min cached) |
232
- | `madeonsol_token_risk` | PRO+ | Transparent 0–100 rug-risk/safety score with `band`, explainable `factors[]`, and raw `inputs` (**new 1.19:** `inputs.sniper_footprint` — slot-window snipe rollup, `null` = not observable; **new 1.20:** top-level `dev` block — deployer self-buy at create, sells rollup, live on-chain holdings, `wallet_empty`, `transferred_out`) |
233
- | `madeonsol_token_bundle` | All | Bundle-cohort holdings — which same-slot bundle wallets bought a token and how much of supply they still hold (`held_pct_of_supply` headline, plus `bundle_kind`, `held_ratio`, `fully_exited`). BASIC: bundle block only. PRO: top-10 flags. ULTRA: full cohort + identities |
234
- | `madeonsol_token_pools` | PRO+ | Per-venue liquidity map — every DEX pool a token trades in (pump.fun/PumpSwap/Raydium/Meteora/Orca) with per-pool `liquidity_usd`, `is_active` (live vs parked), plus a `summary` (pool/DEX counts, `total_liquidity_usd`, `primary_pool`, `top_pool_share_pct` concentration) |
235
- | `madeonsol_token_depth` | **New 1.20** · PRO+ | Per-pool price impact / slippage — `quotes[]` per SOL buy size (`tokens_out`, `avg_price_sol`, `price_impact_pct`) + `to_move_price` (SOL to move price 1%/5%/10%). `sizes` max 8, default `[0.5, 1, 5, 10]`; unsupported pools (CLMM/DLMM/DBC) flagged with a `reason` |
236
- | `madeonsol_token_holders` | **New** · PRO+ | Live holder census + concentration — who holds NOW (vs `madeonsol_token_cap_table` = who bought first). `concentration.holder_count` is EXACT (mint-scoped `getProgramAccounts` census merged per owner; `null` only when the provider refuses a mega-cap → top-20 fallback with `source.census_fallback_reason`, never trade-estimated). Each disclosed owner labelled `deployer` / `kol` / `early_buyer` / `bundle` / `bot` / `dump_cluster` (empty = unknown, not clean). Pools / bonding curves / burns EXCLUDED from the circulating denominator and NAMED in `excluded[]` (`reason`: `pool` + `dex` + `pool_address`, `bonding_curve`, `burn`, `program_account`); `amount_raw` is a raw u64 STRING. Disclosure PRO 10 / ULTRA 50 / BUSINESS 100. Big tokens: first call may be HTTP 503 `holder_scan_in_progress` (`retry_after_seconds: 20`) — scan continues + cached, retry is instant |
237
- | `madeonsol_tokens_batch_risk` | PRO+ | Bulk rug-risk/safety scoring for up to 50 mints — same shape as `madeonsol_token_risk` + `as_of`. Untracked mints return `{ mint, error: "not_tracked" }` without failing the batch; counts as one request |
238
- | `madeonsol_token_candles` | PRO+ | Historical OHLCV candles (1m–1d). PRO=OHLCV 30d; ULTRA=+net flow, liquidity delta, MEV volume, full history |
239
- | `madeonsol_token_flow` | PRO+ | Trade-flow aggregate (organic-vs-fake volume) over a 1h/24h `window` — unique wallets/buyers/sellers, buy/sell counts + SOL, `net_sol`, `trades_per_wallet` wash-trading proxy |
240
- | `madeonsol_token_trades` | **New 1.19** · PRO+ | Mint-scoped trade tape — cursor-paginated raw trades for one token (action / wallet / since–until filters, default FULL history). History starts 2026-04-12; `coverage` block marks scope |
241
-
242
- ### Copy-Trade Rules (PRO/ULTRA)
243
-
244
- Server-side rules that fire signals when a watched source wallet trades. Delivered via webhook (HMAC-signed) and/or WebSocket.
245
-
246
- | Tool | Description |
247
- |---|---|
248
- | `madeonsol_copytrade_list` | List your rules |
249
- | `madeonsol_copytrade_create` | Create a rule. Returns `webhook_secret` once — store it |
250
- | `madeonsol_copytrade_get` | Get one rule |
251
- | `madeonsol_copytrade_update` | Update fields or toggle `is_active` |
252
- | `madeonsol_copytrade_delete` | Delete permanently |
253
- | `madeonsol_copytrade_signals` | Recent fired signals (up to 7 days) |
254
-
255
- ### KOL Coordination Alerts (PRO/ULTRA — v1.1 push signals)
256
-
257
- Real-time push alerts when a KOL cluster co-buys the same token. Fires within ~1s (pg_notify push). Delivered via WebSocket (`kol:coordination` channel, user-scoped) and/or HMAC-signed webhook.
258
-
259
- | Tool | Description |
260
- |---|---|
261
- | `madeonsol_coordination_alerts_list` | List your rules (PRO=5, ULTRA=20) |
262
- | `madeonsol_coordination_alerts_create` | Create a rule. Returns `webhook_secret` once — store it |
263
- | `madeonsol_coordination_alerts_get` | Get one rule |
264
- | `madeonsol_coordination_alerts_update` | Update fields or toggle `is_active` |
265
- | `madeonsol_coordination_alerts_delete` | Delete permanently |
266
-
267
- ### KOL Scout Signal — first KOL touches *(new in 1.3)*
268
-
269
- Every "first KOL buy on a token mint" event. Filterable by **scout tier** (S/A/B/C from `mv_kol_scout_score`), KOL winrate, token age, mint suffix.
270
-
271
- **Backtest:** S-tier scouts attract ≥3 follow-on KOLs within 4h ~50% of the time vs ~14% baseline (38d / 491k buys / 72,549 events). Public leaderboard at [madeonsol.com/kol/scouts](https://madeonsol.com/kol/scouts).
272
-
273
- | Tool | Description |
274
- |---|---|
275
- | `madeonsol_kol_first_touches` | Recent first-KOL-touch events. Filters: `min_scout_tier`, `min_kol_winrate_7d`, `token_age_max_min`, `mint_suffix`, `preset`, etc. |
276
- | `madeonsol_first_touch_subscriptions_list` | List your first-touch webhook subscriptions — ULTRA |
277
- | `madeonsol_first_touch_subscriptions_create` | Create a webhook rule (HMAC-signed). Returns `webhook_secret` once — store it. Up to 10/user — ULTRA |
278
- | `madeonsol_first_touch_subscriptions_get` | Get one subscription — ULTRA |
279
- | `madeonsol_first_touch_subscriptions_update` | Update fields or toggle `is_active` — ULTRA |
280
- | `madeonsol_first_touch_subscriptions_delete` | Delete permanently — ULTRA |
281
-
282
- > **Don't poll — push.** Median lead time before the second KOL is 12 seconds. WebSocket channel: `kol:first_touches` (PRO+).
283
-
284
- ### Price Alerts *(new in 1.9)*
285
-
286
- CRUD for token dip/recovery price alerts. Fires when a token's market cap crosses your threshold. PRO=5 rules, ULTRA=25.
287
-
288
- | Tool | Description |
289
- |---|---|
290
- | `madeonsol_price_alerts_list` | List your price alert rules |
291
- | `madeonsol_price_alerts_create` | Create a dip/recovery alert. Returns `webhook_secret` once — store it |
292
- | `madeonsol_price_alerts_get` | Get one alert rule by ID |
293
- | `madeonsol_price_alerts_update` | Update fields or toggle `is_active` |
294
- | `madeonsol_price_alerts_delete` | Delete permanently |
295
-
296
- ### Scout Leaderboard & KOL Consensus *(new in 1.9)*
297
-
298
- | Tool | Tier | Description |
299
- |---|---|---|
300
- | `madeonsol_scout_leaderboard` | PRO+ | Top scout-tier KOLs ranked by first-touch follow-on rate, win rate, and ROI |
301
- | `madeonsol_kol_consensus` | PRO+ | Tokens with the strongest KOL agreement signal — weighted by scout score and recent PnL |
302
- | `madeonsol_peak_history` | PRO+ | Historical peak-density windows for a token — every coordination spike with KOL breakdown |
303
- | `madeonsol_coordination_history` | PRO+ | Global coordination event log with token, KOL count, score, and outcome |
304
-
305
- ### Wallet Derived Stats *(new in 1.9)*
306
-
307
- `madeonsol_wallet_stats` now returns a `stats` object with derived fields: `win_rate` (0-1), `roi`, `verdict` ("strong" | "profitable" | "neutral" | "losing"), and `biggest_miss` (token with the highest post-exit gain the wallet missed).
308
-
309
- ### Streaming & Webhooks
310
-
311
- | Tool | Description |
312
- |---|---|
313
- | `madeonsol_stream_token` | Get a 24h WebSocket token for KOL/deployer streaming and DEX trade stream — PRO/ULTRA |
314
- | `madeonsol_stream_sessions_list` | List your live WebSocket sessions — `id`, `service`, `tier`, `channels`, `connected_at`, `remote_ip`, `messages_sent` — PRO/ULTRA |
315
- | `madeonsol_stream_session_kill` | Evict a live WebSocket session by id to free its connection slot (e.g. a ghost socket) — PRO/ULTRA |
316
- | `madeonsol_create_webhook` | Register a webhook for real-time push notifications — PRO/ULTRA |
317
- | `madeonsol_list_webhooks` | List your registered webhooks — PRO/ULTRA |
318
- | `madeonsol_delete_webhook` | Delete a webhook by ID — PRO/ULTRA |
319
- | `madeonsol_test_webhook` | Send a test payload to verify a webhook — PRO/ULTRA |
320
-
321
- ### General
322
-
323
- | Tool | Description |
324
- |---|---|
325
- | `madeonsol_discovery` | List all endpoints and prices (free, no auth) |
326
- | `madeonsol_me` | Inspect your account — tier, daily/burst quota state, remaining requests, subscription expiry, per-feature usage (webhooks, copy-trade wallets, coordination rules, etc.). Self-throttle without parsing rate-limit headers. |
327
-
328
- ## Tiers
329
-
330
- | Tier | Price | Wallets tracked | Requests/day |
331
- |------|-------|-----------------|--------------|
332
- | BASIC (free) | $0 | 10 | 200 |
333
- | PRO | €43/mo (€430/yr) ≈ $49 | 50 | 10,000 |
334
- | ULTRA | €131/mo (€1310/yr) ≈ $149 | 100 + WS events | 100,000 |
335
- | BUSINESS | €400/mo (€4000/yr) ≈ $449 | 500 + WS events | 500,000 |
336
-
337
- Free tier returns the full REST response shape on every endpoint — real wallets, TX signatures, full precision. Paid tiers unlock webhooks, WebSockets, rule engines, and ULTRA-only data depth. Get a key at [madeonsol.com/pricing](https://madeonsol.com/pricing).
338
-
339
- ## Also Available
340
-
341
- | Platform | Package |
342
- |---|---|
343
- | TypeScript SDK | [`madeonsol`](https://www.npmjs.com/package/madeonsol) on npm |
344
- | Rust SDK | [`madeonsol`](https://crates.io/crates/madeonsol) on crates.io |
345
- | Python (LangChain, CrewAI) | [`madeonsol-x402`](https://pypi.org/project/madeonsol-x402/) on PyPI |
346
- | ElizaOS | [`@madeonsol/plugin-madeonsol`](https://www.npmjs.com/package/@madeonsol/plugin-madeonsol) |
347
- | Solana Agent Kit | [`solana-agent-kit-plugin-madeonsol`](https://www.npmjs.com/package/solana-agent-kit-plugin-madeonsol) |
348
-
349
- ## License
350
-
351
- MIT
1
+ # mcp-server-madeonsol
2
+
3
+ [![npm version](https://img.shields.io/npm/v/mcp-server-madeonsol?style=flat-square)](https://www.npmjs.com/package/mcp-server-madeonsol)
4
+ [![npm downloads](https://img.shields.io/npm/dm/mcp-server-madeonsol?style=flat-square)](https://www.npmjs.com/package/mcp-server-madeonsol)
5
+ [![Smithery](https://img.shields.io/badge/Smithery-listed-blueviolet?style=flat-square)](https://smithery.ai/servers/madeonsol/solana-kol-intelligence)
6
+ [![Glama](https://glama.ai/mcp/servers/madeonsol/mcp-server-madeonsol/badges/score.svg)](https://glama.ai/mcp/servers/madeonsol/mcp-server-madeonsol)
7
+ [![MCP](https://img.shields.io/badge/MCP-compatible-blueviolet?style=flat-square)](https://modelcontextprotocol.io/)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue?style=flat-square)](LICENSE)
9
+
10
+ > ⚡ **[Install via Smithery](#install-via-smithery-one-line)** · 🤖 **[Use in Claude Desktop](#claude-desktop)** · 🖱️ **[Use in Cursor](#cursor)** · 📚 **[API docs](https://madeonsol.com/api-docs)** · 💰 **[Free API key](https://madeonsol.com/pricing)** · 🔎 **[On Glama](https://glama.ai/mcp/servers/madeonsol/mcp-server-madeonsol)**
11
+
12
+ MCP server for [MadeOnSol](https://madeonsol.com) Solana KOL intelligence API. Use from Claude Desktop, Cursor, or any MCP-compatible client.
13
+
14
+ > Real-time Solana trading intelligence: track 1,069 KOL wallets with <3s latency, score 23,000+ Pump.fun deployers, surface deshred deploy signals **~500ms before on-chain confirmation**, detect multi-KOL coordination, surface bundle-cohort holdings (which same-slot wallets still hold a token's supply), verify any wallet's CURRENT on-chain holdings straight from its token accounts, and stream every DEX trade across 9+ programs. Free tier: 200 requests/day, every endpoint — no signup payment. Get a key at [madeonsol.com/pricing](https://madeonsol.com/pricing).
15
+
16
+ > **New in 1.24.0 — token locks & vesting, upcoming unlocks, and pump.fun creator-fee sharing / claims.** Five new tools (all PRO+, keyed `msk_` API only — no x402 route). `madeonsol_token_locks` binds `GET /tokens/{mint}/locks`: every on-chain lock / vesting contract on a mint (Streamflow, Jupiter Lock, Bonfida vesting) with the schedule, the terms (`cancelable_by_sender` = the locker can pull it — funds are locked against the recipient, not the locker) and a live-derived view (`locked_*`, `claimable_*`, `next_unlock`) plus a `summary` with 7d / 30d forward unlock totals. `madeonsol_token_locks_feed` (`GET /tokens/locks`) is the cross-token feed of NEW contracts (cursor `pagination.next_since`, or push on WS channel **`token:locks`**), `madeonsol_token_unlocks` (`GET /tokens/unlocks`) lists upcoming unlock EVENTS (cliff / period / final / tranche) inside a 1h–90d window sorted by soonest / largest_usd / largest_pct. **LP locks are not included** — token/vesting locks only. `madeonsol_token_fee_shares` (`GET /tokens/{mint}/fee-shares`) decodes a pump.fun coin's on-chain `SharingConfig` — shareholders with `share_bps`, `is_admin`, `is_social_pda` (fees earmarked for an X identity: `social.platform` 2 = X, `user_id` = the numeric platform id, not the handle), `redirected_bps`, `is_default: true` = 100% to the creator — plus a distributions rollup and config history; `madeonsol_token_fee_claims` (`GET /tokens/fee-claims`) is the fee-event feed (`distribution` with per-address `payouts[]`, `social_claim`, `shares_created/updated/reset`, `creator_transferred`, `creator_claim` only when asked via `type=`), pushed on WS channel **`token:fee_claims`**. **Fee-event history starts 2026-08-17.** All base-unit amounts are digit **strings**; ui / usd / pct are `null` when decimals or price are unknown.
17
+
18
+ > **New in 1.23.0 — live holder census: exact holder count, labelled holders, and pools that are named, not just excluded.** The new `madeonsol_token_holders` tool binds `GET /tokens/{mint}/holders` (PRO+): every token account of the mint read from the ledger at `confirmed` and merged per owner, so `concentration.holder_count` is EXACT (distinct non-zero owners minus pools / bonding curves / burns) — never a trade-derived estimate; it is `null` only when the provider refuses the census for a mega-cap, in which case you get the top-20 view and `source.census_fallback_reason` says so. Each disclosed owner carries our labels (`deployer` / `kol` / `early_buyer` / `bundle` / `bot` / `dump_cluster` — empty means unknown to us, not clean), and `excluded[]` NAMES what was taken out of the circulating denominator: `reason` = `pool` (with `dex` + `pool_address`), `bonding_curve` (pump.fun / LaunchLab), `burn`, or `program_account` only when we genuinely cannot attribute the PDA; `pool_pct` / `burned_pct` / `program_pct` split the exclusion. Amounts are raw u64 **strings**. Disclosure: PRO ranks 1–10, ULTRA 1–50, BUSINESS 1–100 — the maths is tier-independent. Big tokens take 5–30 s upstream: you get `503 holder_scan_in_progress` with `retry_after_seconds: 20` while the scan finishes into the cache, and the retry is instant.
19
+
20
+ > **New in 1.22.0 — two prices on the trade tape, and the right one is now the default.** The trade tape now tells you what a trade actually cost. `price_sol`/`price_usd` on each trade are THIS trade's executed price — `sol_amount / token_amount`, reconciling exactly with the amounts on the same row and with the PnL endpoints. Because `sol_amount` is the wallet's net SOL movement, that is the trader's all-in effective rate: swap fee and any account rent included, not the pool mid. The market-cap tracker's canonical pool price moved to the new **`market_price_sol`/`market_price_usd`** fields — it is sampled once per token per pool update, so every trade in the same slot shares it. Until now `price_sol` carried that canonical value and disagreed with the row's own amounts by a **7.9% median** (p90 ~74%): a stale market price reads low in a pump and high in a dump, so anything you averaged out of the tape inherited the bias instead of cancelling it. Use `price_sol` for cost basis, fills and PnL; `market_price_sol` for a per-token series independent of trade size and direction. Both `madeonsol_token_trades` and `madeonsol_wallet_trades` carry all four fields, and both tool descriptions spell out which price to use so an agent does not average the wrong one.
21
+
22
+ > **New in 1.21.0 — the Deployer Hunter surface completed.** Seven new operations that existed on the API but had no SDK binding: `madeonsol_deployer_leaderboard`, `madeonsol_deployer_stats`, `madeonsol_deployer_profile`, `madeonsol_deployer_tokens`, `madeonsol_deployer_alert_stats`, `madeonsol_deployer_best_tokens` and `madeonsol_deployer_recent_bonds`. Read `bonding_rate` (lifetime) against `recent_bond_rate` (rolling) — the gap between them is the signal, not either number alone. `runner_rate` only means something once `labeled_tokens >= 3`, and an **untracked wallet returns a profile with zeroed counters, not a 404**, so check `total_deployed` before reading a 0% bond rate as a track record. Dependency ranges are now bounded to the versions actually tested (`@x402/*` `^2.x`, `@solana/kit` `^5.5.1`) instead of open-ended `>=0.0.1`, and the lazily-imported x402 peers are marked optional — a keyed install no longer pulls the whole Solana stack.
23
+
24
+ > **New in 1.20.0** — **Token depth / price impact + deployer self-activity on risk.** New tool `madeonsol_token_depth` (`GET /tokens/{mint}/depth`) — per-pool price-impact / slippage: "how much SOL moves this token's price N%", per pool (NOT router-optimal). Pass up to 8 SOL buy `sizes` (each >0 and ≤10000; default `[0.5, 1, 5, 10]`); every computable pool returns `spot_price_sol`, `fee_pct`, a `quotes[]` entry per size (`size_sol`, `tokens_out`, `avg_price_sol`, `price_impact_pct`), and `to_move_price` — the SOL required to move price **1% / 5% / 10%**. Constant-product AMMs are served from stream reserves (`source: "stream"` with `reserves_age_ms`); pump.fun/bonk bonding curves from a **live** read of the curve's virtual reserves (`source: "live_rpc"`). Pools that can't be priced honestly — concentrated CLMM/Orca/DLMM, Meteora-DBC curves, unclassified models — come back in `unsupported_pools[]` with a `reason` (e.g. `concentrated_liquidity_depth_not_supported`, `curve_graduated_use_amm_pool`) instead of a wrong number; `primary_pool` names the deepest computable pool, `found: false` means no pools tracked. PRO/ULTRA only. And `madeonsol_token_risk` now returns a top-level **`dev` block** (deployer self-activity; `null` when the mint has no deployer-pipeline row): the create-tx self-buy snapshot (`buy_sol`, `buy_tokens`, `buy_supply_pct`), the post-create rollup (`bought_tokens_after` — catches the same-second-separate-tx dev buy the create snapshot reads as 0 — `sold_tokens`, `sold_sol`, `first_sell_at`/`last_sell_at`), **live on-chain holdings** (`holdings_tokens`, `holdings_supply_pct` — pump.fun 1B denominator, null elsewhere — `wallet_empty`: is the dev wallet empty NOW), and `transferred_out` (tokens left without a sell; `null` = unknown, never a guess), plus `as_of`. `deployer:alert` webhook/WS payloads gain `dev_buy_sol` + `dev_buy_supply_pct`.
25
+ >
26
+ > **New in 1.19.0** — **Batch wallet classification + token trade tape + bigger keyless catalog.** New tool `madeonsol_wallet_batch_classify` — reputation flags for 1–100 wallets in one call (counts as one request): per wallet `is_sniper` / `is_bundler` / `is_dumper` / `is_kol` (+ `kol_name`), `bot_confidence` (string enum `none`/`low`/`medium`/`high`, `null` when not alpha-tracked), and a `dump_cluster` block (`dump_cohorts`, `runner_cohorts`, `total_cohorts`, `as_of`). Flags are pump.fun-pipeline scoped — `false` = not observed, NOT verified clean; `is_bundler` is lifetime, `is_dumper` is a rolling 42d window. New tool `madeonsol_token_trades` — mint-scoped cursor-paginated trade tape (the backfill complement to the live firehose): `tx_signature`, `wallet_address`, `action`, `sol_amount`, `token_amount`, `price_sol`/`price_usd`, `early_buyer_rank`, `slot`, `block_time`, `traded_at`; filters `action` / `wallet` / `since`–`until` (default FULL history — capture starts 2026-04-12), plus a `coverage` honesty block. Both PRO/ULTRA. `madeonsol_wallet_stats` flags gain `is_sniper`/`is_bundler`/`is_dumper` + `dump_cluster`, and `bot_confidence` is now correctly typed as a string enum (it was documented as a number and always came back `null` due to a server bug — now returns real values). `madeonsol_token_risk` inputs and `madeonsol_sniper_recent` deploys gain the slot-window `sniper_footprint`/`footprint` rollup (`buys`, `buyers`, `sol`, `supply_pct`, `sniper_wallet_buys`, `data_available`, `as_of` — `null` = not observable, not zero). The **keyless x402 catalog grows 18 → 25 endpoints**: token candles ($0.01), almost-bonded ($0.01), top-traders ($0.02), cap-table ($0.02), sniper recent ($0.01), token flow ($0.01), deployer trajectory ($0.01) — `madeonsol_sniper_recent` and `madeonsol_deployer_trajectory` now work keyless via x402 too.
27
+ >
28
+ > **New in 1.18.0** — **Verified on-chain wallet holdings.** New tool `madeonsol_wallet_holdings` — the wallet's CURRENT holdings read straight from chain: its actual SPL + Token-2022 token accounts and SOL balance, each enriched with our `price_usd` / `value_usd` / `market_cap_usd` / `name` / `symbol` / `is_bonded`, plus `transfer_delta` (on-chain amount − trade-derived net position — exposes non-swap flows like airdrops, insider funding, and wallet-hopping). Distinct from `madeonsol_wallet_positions` (trade-derived FIFO): this is what the wallet *actually* holds right now. Params: `limit` (1–500, default 200), `min_value_usd` (default 0). Returns `{ address, sol_balance, holdings[], summary, verified_at, trade_window_days, cache_hit, ttl_seconds }`. ULTRA only.
29
+ >
30
+ > **New in 1.17.0** — **Bundle-cohort holdings.** New tool `madeonsol_token_bundle` — which same-slot "bundle" wallets bought a token and how much of supply they *still* hold (the incumbents' "current held %" rug/insider signal, from confirmed on-chain data). Returns a `bundle` block (`wallet_count`, `bundle_kind` atomic_tx/same_slot/none, `held_ratio`, `held_pct_of_supply` — the headline, net held / circulating supply, null if unknown — `fully_exited`, `buy_volume`, `tokens_held`) plus a `wallets[]` array (`rank`, `wallet`, `held_ratio`, `has_sold`, `atomic`, `is_kol`). BASIC get the bundle block only (empty `wallets[]`); PRO adds top-10 flags-only wallets; ULTRA returns the full cohort with enriched identities (`kol_name`, `win_rate`, `bot_confidence`, `tokens_held`).
31
+ >
32
+ > **New in 1.16.0** — **Batch risk scoring + live stream-session control.** New tool `madeonsol_tokens_batch_risk` — bulk rug-risk/safety scoring for up to 50 mints in one call, returning the same per-mint shape as `madeonsol_token_risk` (0–100 score, `band`, explainable `factors[]`, raw `inputs`) plus an `as_of` timestamp; untracked mints come back as `{ mint, error: "not_tracked" }` without failing the batch, and the whole call counts as one request against quota. Plus two WebSocket session tools: `madeonsol_stream_sessions_list` (list your live sessions — `id`, `service`, `tier`, `channels`, `connected_at`, `remote_ip`, `messages_sent`) and `madeonsol_stream_session_kill` (force-disconnect a session by id to free its connection slot, e.g. a ghost socket). PRO/ULTRA only.
33
+ >
34
+ > **New in 1.15.0** — **Almost-bonded discovery + trending sorts.** New tool `madeonsol_almost_bonded` — pre-bond pump.fun tokens near graduation, ranked by velocity (Δprogress/min): "95% and accelerating" beats "92% stalled". Each token carries `progress_pct`, `velocity_pct_per_min`, `eta_minutes`, `stalled`, `real_sol_reserves`, `market_cap_usd`, `liquidity_usd`, `authorities_revoked`, `deployer_tier`, and `age_minutes`. Params: `min_progress`, `max_progress`, `min_velocity_pct_per_min`, `max_age_minutes`, `deployer_tier`, `authority_revoked`, `min_liq`, `sort` (velocity_desc / progress_desc / eta_asc), `limit`. PRO/ULTRA only. Plus `madeonsol_tokens_list` gains four momentum sorts — `mc_change_5m_desc`, `mc_change_1h_desc`, `volume_1h_desc`, and `trending` (composite recent-volume × positive-momentum rank).
35
+ >
36
+ > **New in 1.14.0** — **Token trade flow.** New tool `madeonsol_token_flow` — a trade-flow aggregate (organic-vs-fake volume) over a `1h`/`24h` window: `unique_wallets` / `unique_buyers` / `unique_sellers`, `buy_count` / `sell_count` / `total_trades`, `buy_sol` / `sell_sol` / `net_sol` (sell − buy; positive = net SOL leaving the pool), and `trades_per_wallet` (wash-trading proxy). PRO/ULTRA only. Deployer alerts (`madeonsol_deployer_alerts`) now carry `deployers.deployer_sol_balance` — the deployer wallet's SOL balance at alert time (null for historical rows).
37
+ >
38
+ > **New in 1.13.0** — **Token OHLCV candles.** New tool `madeonsol_token_candles` — historical price candles (1m/5m/15m/1h/4h/1d) aggregated from the on-chain trade firehose. Each candle has `t/open/high/low/close/volume_usd/trades/market_cap_usd`. PRO returns OHLCV for the last 30 days; ULTRA adds buy/sell volume + count splits, net flow, MEV volume, open/close liquidity, high/low MC, and full history. PRO/ULTRA only.
39
+ >
40
+ > **New in 1.12.0** — **Token risk score.** New tool `madeonsol_token_risk` — a transparent 0–100 rug-risk/safety score (higher = riskier) with a `band` (safe/caution/danger), an explainable `factors[]` array, and the raw `inputs` (mint/freeze authority, liquidity, liq-to-MC ratio, transfer fee, launch cohort, deployer bond rate, KOL signal, blacklist). PRO/ULTRA only.
41
+ >
42
+ > **New in 1.11.0** — `madeonsol_tokens_list` gains three new filter params: `min_liq_mc_ratio`, `max_liq_mc_ratio`, and `deployer_tier`. Response items now include `liquidity_to_mc_ratio` and `deployer_tier`. New tool: `madeonsol_signal_performance` — evaluate signal efficacy (hit rate, sample size, median outcome) before acting on any signal. KOL leaderboard entries now include `median_hold_minutes_30d` and `percentile_early_entry_30d`.
43
+ >
44
+ > **New in 1.10.4** — Deployer alerts/profiles now expose `runner_rate` + `labeled_tokens` (fraction of a deployer's labeled tokens that ran vs dumped, gate on `labeled_tokens` ≥3) plus `avg_time_to_bond_minutes`.
45
+
46
+ > **New in 1.10.3** — **Dump-cluster detection.** `madeonsol_token_buyer_quality` breakdown now includes `dump_cluster_count` (3+ dump-cluster wallets in the first-20 → 94% historical dump rate vs 61% base) and `recycled_early_buyer_count`. Full breakdown is returned on all tiers. Also: the API now pushes every pump.fun graduation in real time (`token:graduations` WS channel).
47
+
48
+ > **New in 1.10** — **Deshred Sniper Alerts.** `madeonsol_sniper_recent` surfaces pump.fun deploys from shred-level data ~500ms before on-chain confirmation. PRO: elite/good deployers. ULTRA: all tiers + custom watchlist. Use `sniper:deploys` WebSocket or `sniper:deploy` webhook for live push.
49
+ >
50
+ > **New in 1.9** — **Price alerts, scout leaderboard, coordination history.** `madeonsol_price_alerts_*` CRUD (PRO=5, ULTRA=25). `madeonsol_scout_leaderboard` ranks top scouts by first-touch follow-on rate. `madeonsol_coordination_history` and `madeonsol_peak_history` expose the historical record. `madeonsol_wallet_stats` now returns `derived`: win_rate, roi, verdict, biggest_miss.
51
+ >
52
+ > **New in 1.8** — **Universal Wallet API.** `madeonsol_wallet_stats`, `madeonsol_wallet_pnl`, `madeonsol_wallet_positions`, `madeonsol_wallet_trades` — FIFO cost-basis PnL and cursor-paginated raw trades for any Solana wallet. PRO+. Cache hits don't count against quota.
53
+ >
54
+ > **New in 1.7.0** *(2026-05-12)* — Two new tools: **`madeonsol_me`** (account/quota introspection — read tier, remaining requests, and per-feature usage without parsing rate-limit headers) and **`madeonsol_tokens_list`** (PRO+ filtered, sortable token directory — MC band, liquidity floor, primary DEX, authority/safety flags, plus computed 1h volume / MEV-share / MC-change deltas). Token responses now expose **velocity / MEV-share** fields. Token directory defaults to **`min_liq=2000`** to skip phantom-MC dust — pass `min_liq=0` to opt out. `/token/{mint}` now returns **structured 400 errors** (`code` / `reason` / `example` / `docs`) instead of plain strings. Deprecated `avg_entry_mc_usd` field fully removed from KOL/alpha leaderboards.
55
+
56
+ ## Install via Smithery (one line)
57
+
58
+ [Smithery](https://smithery.ai/servers/madeonsol/solana-kol-intelligence) is the easiest path — it writes the config for you and handles the install:
59
+
60
+ ```bash
61
+ npx -y smithery mcp add madeonsol/solana-kol-intelligence
62
+ ```
63
+
64
+ Smithery prompts for your `MADEONSOL_API_KEY` ([free at madeonsol.com/pricing](https://madeonsol.com/pricing)) and wires up Claude Desktop or your chosen MCP client. Restart the client and ask: *"What are KOLs buying right now?"*
65
+
66
+ You can also browse tools from the CLI:
67
+
68
+ ```bash
69
+ npx -y smithery tool get madeonsol/solana-kol-intelligence madeonsol_kol_feed
70
+ ```
71
+
72
+ ## Quick start — manual config (10 seconds)
73
+
74
+ ```bash
75
+ npm install -g mcp-server-madeonsol
76
+ ```
77
+
78
+ Add to `claude_desktop_config.json` or Cursor MCP settings (free tier at https://madeonsol.com/pricing):
79
+
80
+ ```json
81
+ { "mcpServers": { "madeonsol": { "command": "mcp-server-madeonsol", "env": { "MADEONSOL_API_KEY": "msk_..." } } } }
82
+ ```
83
+
84
+ Restart Claude Desktop and ask: *"What are KOLs buying right now?"*
85
+
86
+ ## AI agent quickstart (x402 / pay-per-call)
87
+
88
+ Building an autonomous agent? Skip the signup. Point a **funded Solana wallet** at the server and every tool call **auto-pays a micropayment** over [x402](https://x402.org) — no API key, no account, no rate-limit dance.
89
+
90
+ ```json
91
+ {
92
+ "mcpServers": {
93
+ "madeonsol": {
94
+ "command": "mcp-server-madeonsol",
95
+ "env": {
96
+ "SVM_PRIVATE_KEY": "<base58 solana private key>"
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ How it works:
104
+
105
+ - The wallet behind `SVM_PRIVATE_KEY` settles each request as a **USDC micropayment on Solana** (~$0.005–$0.02 per call, settled on-chain). No subscription, no quota.
106
+ - The keyless catalog covers **25 endpoints** — the latest additions: token candles ($0.01), almost-bonded ($0.01), top-traders ($0.02), cap-table ($0.02), sniper recent deploys ($0.01), token flow ($0.01), and deployer trajectory ($0.01).
107
+ - The free **`madeonsol_discovery`** tool needs no auth and returns every endpoint with its exact per-call price — call it first to see what each tool costs.
108
+ - Install the x402 peer deps alongside the server (only required for this mode):
109
+
110
+ ```bash
111
+ npm install -g mcp-server-madeonsol @x402/fetch @x402/svm @x402/core @solana/kit @scure/base
112
+ ```
113
+
114
+ > **Data only.** MadeOnSol returns trading *intelligence* — it never trades, signs swaps, or takes custody of funds. The only thing your wallet ever pays for is the per-call data fee.
115
+
116
+ Prefer a fixed monthly bill, free tier, or no wallet? Use the developer path below.
117
+
118
+ ## Authentication
119
+
120
+ Two options (in priority order):
121
+
122
+ | Method | Env var | Best for |
123
+ |---|---|---|
124
+ | **MadeOnSol API key** (recommended) | `MADEONSOL_API_KEY` | Developers — [get a free key](https://madeonsol.com/pricing) |
125
+ | x402 micropayments | `SVM_PRIVATE_KEY` | AI agents with Solana wallets |
126
+
127
+ > **v1.0 breaking change:** RapidAPI auth (`RAPIDAPI_KEY`) has been removed. The MadeOnSol RapidAPI marketplace was retired on 2026-04-19. Get a free `msk_` key at [madeonsol.com/pricing](https://madeonsol.com/pricing).
128
+
129
+ ## Install
130
+
131
+ ```bash
132
+ npm install -g mcp-server-madeonsol
133
+ ```
134
+
135
+ > x402 peer deps (`@x402/fetch @x402/svm @x402/core @solana/kit @scure/base`) are only needed when using `SVM_PRIVATE_KEY`.
136
+
137
+ ## Configure
138
+
139
+ ### Claude Desktop
140
+
141
+ Add to `claude_desktop_config.json`:
142
+
143
+ ```json
144
+ {
145
+ "mcpServers": {
146
+ "madeonsol": {
147
+ "command": "mcp-server-madeonsol",
148
+ "env": {
149
+ "MADEONSOL_API_KEY": "msk_your_api_key_here"
150
+ }
151
+ }
152
+ }
153
+ }
154
+ ```
155
+
156
+ ### Cursor
157
+
158
+ Add to MCP settings with the same command and env vars.
159
+
160
+ ## Tools
161
+
162
+ ### KOL Intelligence
163
+
164
+ | Tool | Description |
165
+ |---|---|
166
+ | `madeonsol_kol_feed` | Real-time KOL trade feed (1,000+ wallets) |
167
+ | `madeonsol_kol_coordination` | Multi-KOL convergence signals (v1.1) — peak-density window, exit detection, 0-100 score |
168
+ | `madeonsol_kol_first_touches` | First-KOL-touch events — backtested scout signal. Filter by scout tier, winrate, token age, mint suffix |
169
+ | `madeonsol_kol_leaderboard` | KOL PnL and win rate rankings (180 days of history; periods: today, 7d, 30d, 90d, 180d) |
170
+ | `madeonsol_kol_pairs` | KOL affinity matrix — which KOLs co-trade the same tokens |
171
+ | `madeonsol_kol_hot_tokens` | KOL momentum tokens — accelerating buy interest |
172
+ | `madeonsol_kol_trending_tokens` | Tokens ranked by KOL buy volume (5m–12h windows). ULTRA adds full KOL wallet addresses. |
173
+ | `madeonsol_kol_pnl` | Deep per-wallet PnL: equity curve, risk metrics, closed positions. ULTRA adds open positions (tokens bought but not yet sold). |
174
+ | `madeonsol_kol_timing` | KOL entry/exit timing profile — available on all tiers |
175
+
176
+ ### Deployer Hunter
177
+
178
+ | Tool | Description |
179
+ |---|---|
180
+ | `madeonsol_deployer_alerts` | Pump.fun deployer launches with KOL enrichment. Filter by tier (elite/good/moderate/rising/cold). ULTRA unlocks full pagination. Each alert's `deployers` now includes `deployer_sol_balance` — the deployer wallet's SOL balance at alert time (null for historical rows). |
181
+ | `madeonsol_deployer_trajectory` | Deployer skill curve — streaks, rolling bond rate, trend — available on all tiers |
182
+ | `madeonsol_deployer_history` | A pump.fun deployer's daily reputation time-series (`bonding_rate`, `recent_bond_rate`, `tier`, `avg_peak_mc` per day) — backtest deployer signals at launch time without look-ahead bias. `limit` 1–365 (default 90) |
183
+
184
+ ### Deshred Sniper Alerts *(new in 1.10 — Pro/Ultra)*
185
+
186
+ Pre-confirm pump.fun deploy feed reconstructed from shred-level (**deshred**) data — launches surface **~500ms before they confirm on-chain**. Pro sees elite/good deployers; Ultra sees every tier.
187
+
188
+ | Tool | Description |
189
+ |---|---|
190
+ | `madeonsol_sniper_recent` | Newest-first deshred deploy feed. Pro: elite/good · Ultra: all tiers · keyless x402: $0.01 (elite/good). `watchlist: true` (Ultra) narrows to your custom deployer watchlist. **New 1.19:** each deploy carries `footprint` — the slot-window snipe rollup (`buys`, `buyers`, `sol`, `supply_pct`, `sniper_wallet_buys`, `data_available`, `as_of`) or `null` when not yet settled/observable |
191
+ | `madeonsol_sniper_by_deployer` | Deshred deploys for a single deployer wallet (Ultra) |
192
+
193
+ ### Wallet Tracker
194
+
195
+ | Tool | Description |
196
+ |---|---|
197
+ | `madeonsol_wallet_tracker_watchlist` | List your tracked wallets and remaining capacity (Free: 10, Pro: 50, Ultra: 100) |
198
+ | `madeonsol_wallet_tracker_add` | Add a wallet to your watchlist |
199
+ | `madeonsol_wallet_tracker_remove` | Remove a wallet from your watchlist |
200
+ | `madeonsol_wallet_tracker_trades` | Historical swap/transfer events for watched wallets (120-day retention) |
201
+ | `madeonsol_wallet_tracker_summary` | Per-wallet stats: swap counts, SOL bought/sold, last event |
202
+
203
+ ### Universal Wallet *(new in 1.8 — any wallet, not just curated KOLs, PRO+)*
204
+
205
+ | Tool | Description |
206
+ |---|---|
207
+ | `madeonsol_wallet_stats` | Aggregate 90d stats + cross-product flags (is_kol, is_alpha_tracked + bot_confidence `none`/`low`/`medium`/`high`, is_deployer + tokens_deployed, **new 1.19:** is_sniper / is_bundler / is_dumper + `dump_cluster` cohorts) — quick sizing-up of an unknown wallet |
208
+ | `madeonsol_wallet_batch_classify` | **New 1.19** · Bulk reputation flags for 1–100 wallets in one call — is_sniper/is_bundler/is_dumper/is_kol + kol_name, bot_confidence, dump_cluster. Pump.fun-pipeline scoped: `false` = not observed, not verified clean |
209
+ | `madeonsol_wallet_pnl` | Full FIFO cost-basis PnL: realized + unrealized SOL, profit factor, max drawdown, avg + median hold minutes, daily UTC PnL curve, closed + open positions hydrated with live mc-tracker prices |
210
+ | `madeonsol_wallet_positions` | Open positions only — lighter slice of /pnl. Shares the same cache. |
211
+ | `madeonsol_wallet_holdings` | **New 1.18** · Verified CURRENT on-chain holdings (real SPL + Token-2022 accounts + SOL) enriched with price/MC/name, plus `transfer_delta` vs trade-derived position. ULTRA only. |
212
+ | `madeonsol_wallet_trades` | Cursor-paginated raw trades with action / token / since-until filters |
213
+
214
+ Cached server-side with dynamic TTL (5min / 1h / 24h based on last activity). Cost basis observable only inside the 90-day window.
215
+
216
+ ### Alpha Wallet Intelligence
217
+
218
+ Scored from 1M+ early-buyer records (wallets seen in the first 20 buyers of Pump.fun tokens).
219
+
220
+ | Tool | Tier | Description |
221
+ |---|---|---|
222
+ | `madeonsol_alpha_leaderboard` | All | Top profitable early-buyer wallets. Up to 100 on Free/Pro; ULTRA unlocks 500 + bot signals |
223
+ | `madeonsol_alpha_wallet` | ULTRA | Full per-token breakdown + bot_signals array |
224
+ | `madeonsol_alpha_linked` | ULTRA | Wallets behaviorally linked (co-bought 3+ tokens within 2s) |
225
+
226
+ ### Token Quality
227
+
228
+ | Tool | Tier | Description |
229
+ |---|---|---|
230
+ | `madeonsol_tokens_list` | PRO+ | Filtered, sortable token directory — MC band, liquidity floor, primary DEX, authority/safety flags, computed 1h volume / MEV-share / MC-change deltas, plus momentum sorts (`mc_change_5m_desc`, `mc_change_1h_desc`, `volume_1h_desc`, `trending`). Default `min_liq=2000` skips phantom-MC dust. |
231
+ | `madeonsol_almost_bonded` | PRO+ | Pre-bond pump.fun tokens near graduation, ranked by velocity (Δprogress/min) — `progress_pct`, `velocity_pct_per_min`, `eta_minutes`, `stalled`, `deployer_tier`, `age_minutes` |
232
+ | `madeonsol_token_cap_table` | PRO+ | First non-deployer early buyers, enriched with PnL/KOL/bot flags. PRO=10, ULTRA=20 |
233
+ | `madeonsol_token_buyer_quality` | All | 0–100 buyer-quality score + full breakdown (5-min cached) |
234
+ | `madeonsol_token_risk` | PRO+ | Transparent 0–100 rug-risk/safety score with `band`, explainable `factors[]`, and raw `inputs` (**new 1.19:** `inputs.sniper_footprint` — slot-window snipe rollup, `null` = not observable; **new 1.20:** top-level `dev` block — deployer self-buy at create, sells rollup, live on-chain holdings, `wallet_empty`, `transferred_out`) |
235
+ | `madeonsol_token_bundle` | All | Bundle-cohort holdings — which same-slot bundle wallets bought a token and how much of supply they still hold (`held_pct_of_supply` headline, plus `bundle_kind`, `held_ratio`, `fully_exited`). BASIC: bundle block only. PRO: top-10 flags. ULTRA: full cohort + identities |
236
+ | `madeonsol_token_pools` | PRO+ | Per-venue liquidity map — every DEX pool a token trades in (pump.fun/PumpSwap/Raydium/Meteora/Orca) with per-pool `liquidity_usd`, `is_active` (live vs parked), plus a `summary` (pool/DEX counts, `total_liquidity_usd`, `primary_pool`, `top_pool_share_pct` concentration) |
237
+ | `madeonsol_token_depth` | **New 1.20** · PRO+ | Per-pool price impact / slippage — `quotes[]` per SOL buy size (`tokens_out`, `avg_price_sol`, `price_impact_pct`) + `to_move_price` (SOL to move price 1%/5%/10%). `sizes` max 8, default `[0.5, 1, 5, 10]`; unsupported pools (CLMM/DLMM/DBC) flagged with a `reason` |
238
+ | `madeonsol_token_holders` | **New** · PRO+ | Live holder census + concentration — who holds NOW (vs `madeonsol_token_cap_table` = who bought first). `concentration.holder_count` is EXACT (mint-scoped `getProgramAccounts` census merged per owner; `null` only when the provider refuses a mega-cap → top-20 fallback with `source.census_fallback_reason`, never trade-estimated). Each disclosed owner labelled `deployer` / `kol` / `early_buyer` / `bundle` / `bot` / `dump_cluster` (empty = unknown, not clean). Pools / bonding curves / burns EXCLUDED from the circulating denominator and NAMED in `excluded[]` (`reason`: `pool` + `dex` + `pool_address`, `bonding_curve`, `burn`, `program_account`); `amount_raw` is a raw u64 STRING. Disclosure PRO 10 / ULTRA 50 / BUSINESS 100. Big tokens: first call may be HTTP 503 `holder_scan_in_progress` (`retry_after_seconds: 20`) — scan continues + cached, retry is instant |
239
+ | `madeonsol_token_locks` | **New 1.24** · PRO+ | Token locks & vesting on a mint — every Streamflow / Jupiter Lock / Bonfida contract: `program`, `kind` (lock / vesting), derived `status`, sender / recipient, schedule (`start_at` / `cliff_at` / `end_at`, `period_seconds`), terms (`cancelable_by_sender` — the locker can pull it), live `locked_*` / `claimable_*` / `next_unlock`, plus `summary` (locked / deposited totals, `unlocking_7d_*` / `unlocking_30d_*`, nearest `next_unlock`, `active_cancelable_by_sender`). Filters `status`, `program`, `limit` ≤500. Base-unit amounts are STRINGS; ui/usd/pct `null` when unknown. **LP locks not included** |
240
+ | `madeonsol_token_locks_feed` | **New 1.24** · PRO+ | Cross-token feed of NEW lock / vesting contracts, newest first — same row shape + `token {symbol, price_usd, market_cap_usd}`. Cursors `since` / `before` (`pagination.next_since` / `next_before`); filters `mint`, `sender`, `recipient`, `program`, `kind`, `status`, `min_usd`, `min_pct_of_supply`, `include_estimated` (backfilled Jupiter rows). Push: WS channel `token:locks` (event `token:lock`) |
241
+ | `madeonsol_token_unlocks` | **New 1.24** · PRO+ | Upcoming unlock EVENTS across all active contracts inside `within` = 1h–90d — one entry per contract = its next `event` (cliff / period / final / tranche) with `amount_*` + `window_amount_*` (total release over the window), `token`, `lock`. `sort` soonest / largest_usd / largest_pct; filters `mint`, `program`, `kind`, `min_usd`, `min_pct_of_supply`; `limit` ≤200, `offset` |
242
+ | `madeonsol_token_fee_shares` | **New 1.24** · PRO+ | pump.fun creator-fee `SharingConfig` on a coin — `shareholders[]` (`share_bps`, `is_admin`, `is_social_pda` + `social {platform (2 = X), user_id, lifetime_claimed}`, `received_*`), `redirected_bps`, `social_bps`, `is_default` (100% to creator), `source` stream / chain; `distributions` rollup (recipients, past_recipients), `history[]`, `recent_distributions[]`. Amounts in quote base units (lamports) as STRINGS. **Event history starts 2026-08-17** |
243
+ | `madeonsol_token_fee_claims` | **New 1.24** · PRO+ | pump.fun fee-event feed, newest first — `type` distribution (with `payouts[]` per shareholder) / social_claim (X identity → wallet, `mint` null) / shares_created / shares_updated / shares_reset / creator_transferred / creator_claim (excluded unless `type=` asks). Filters `type` (comma list), `mint`, `recipient`, `actor`, `social_platform`, `social_user_id`, `min_sol`, `since` / `before`. Push: WS channel `token:fee_claims` (event `token:fee_claim`). **History starts 2026-08-17** |
244
+ | `madeonsol_tokens_batch_risk` | PRO+ | Bulk rug-risk/safety scoring for up to 50 mints — same shape as `madeonsol_token_risk` + `as_of`. Untracked mints return `{ mint, error: "not_tracked" }` without failing the batch; counts as one request |
245
+ | `madeonsol_token_candles` | PRO+ | Historical OHLCV candles (1m–1d). PRO=OHLCV 30d; ULTRA=+net flow, liquidity delta, MEV volume, full history |
246
+ | `madeonsol_token_flow` | PRO+ | Trade-flow aggregate (organic-vs-fake volume) over a 1h/24h `window` — unique wallets/buyers/sellers, buy/sell counts + SOL, `net_sol`, `trades_per_wallet` wash-trading proxy |
247
+ | `madeonsol_token_trades` | **New 1.19** · PRO+ | Mint-scoped trade tape — cursor-paginated raw trades for one token (action / wallet / since–until filters, default FULL history). History starts 2026-04-12; `coverage` block marks scope |
248
+
249
+ ### Copy-Trade Rules (PRO/ULTRA)
250
+
251
+ Server-side rules that fire signals when a watched source wallet trades. Delivered via webhook (HMAC-signed) and/or WebSocket.
252
+
253
+ | Tool | Description |
254
+ |---|---|
255
+ | `madeonsol_copytrade_list` | List your rules |
256
+ | `madeonsol_copytrade_create` | Create a rule. Returns `webhook_secret` once — store it |
257
+ | `madeonsol_copytrade_get` | Get one rule |
258
+ | `madeonsol_copytrade_update` | Update fields or toggle `is_active` |
259
+ | `madeonsol_copytrade_delete` | Delete permanently |
260
+ | `madeonsol_copytrade_signals` | Recent fired signals (up to 7 days) |
261
+
262
+ ### KOL Coordination Alerts (PRO/ULTRA — v1.1 push signals)
263
+
264
+ Real-time push alerts when a KOL cluster co-buys the same token. Fires within ~1s (pg_notify push). Delivered via WebSocket (`kol:coordination` channel, user-scoped) and/or HMAC-signed webhook.
265
+
266
+ | Tool | Description |
267
+ |---|---|
268
+ | `madeonsol_coordination_alerts_list` | List your rules (PRO=5, ULTRA=20) |
269
+ | `madeonsol_coordination_alerts_create` | Create a rule. Returns `webhook_secret` once — store it |
270
+ | `madeonsol_coordination_alerts_get` | Get one rule |
271
+ | `madeonsol_coordination_alerts_update` | Update fields or toggle `is_active` |
272
+ | `madeonsol_coordination_alerts_delete` | Delete permanently |
273
+
274
+ ### KOL Scout Signal — first KOL touches *(new in 1.3)*
275
+
276
+ Every "first KOL buy on a token mint" event. Filterable by **scout tier** (S/A/B/C from `mv_kol_scout_score`), KOL winrate, token age, mint suffix.
277
+
278
+ **Backtest:** S-tier scouts attract ≥3 follow-on KOLs within 4h ~50% of the time vs ~14% baseline (38d / 491k buys / 72,549 events). Public leaderboard at [madeonsol.com/kol/scouts](https://madeonsol.com/kol/scouts).
279
+
280
+ | Tool | Description |
281
+ |---|---|
282
+ | `madeonsol_kol_first_touches` | Recent first-KOL-touch events. Filters: `min_scout_tier`, `min_kol_winrate_7d`, `token_age_max_min`, `mint_suffix`, `preset`, etc. |
283
+ | `madeonsol_first_touch_subscriptions_list` | List your first-touch webhook subscriptions — ULTRA |
284
+ | `madeonsol_first_touch_subscriptions_create` | Create a webhook rule (HMAC-signed). Returns `webhook_secret` once — store it. Up to 10/user — ULTRA |
285
+ | `madeonsol_first_touch_subscriptions_get` | Get one subscription — ULTRA |
286
+ | `madeonsol_first_touch_subscriptions_update` | Update fields or toggle `is_active` — ULTRA |
287
+ | `madeonsol_first_touch_subscriptions_delete` | Delete permanently — ULTRA |
288
+
289
+ > **Don't poll — push.** Median lead time before the second KOL is 12 seconds. WebSocket channel: `kol:first_touches` (PRO+).
290
+
291
+ ### Price Alerts *(new in 1.9)*
292
+
293
+ CRUD for token dip/recovery price alerts. Fires when a token's market cap crosses your threshold. PRO=5 rules, ULTRA=25.
294
+
295
+ | Tool | Description |
296
+ |---|---|
297
+ | `madeonsol_price_alerts_list` | List your price alert rules |
298
+ | `madeonsol_price_alerts_create` | Create a dip/recovery alert. Returns `webhook_secret` once — store it |
299
+ | `madeonsol_price_alerts_get` | Get one alert rule by ID |
300
+ | `madeonsol_price_alerts_update` | Update fields or toggle `is_active` |
301
+ | `madeonsol_price_alerts_delete` | Delete permanently |
302
+
303
+ ### Scout Leaderboard & KOL Consensus *(new in 1.9)*
304
+
305
+ | Tool | Tier | Description |
306
+ |---|---|---|
307
+ | `madeonsol_scout_leaderboard` | PRO+ | Top scout-tier KOLs ranked by first-touch follow-on rate, win rate, and ROI |
308
+ | `madeonsol_kol_consensus` | PRO+ | Tokens with the strongest KOL agreement signal — weighted by scout score and recent PnL |
309
+ | `madeonsol_peak_history` | PRO+ | Historical peak-density windows for a token — every coordination spike with KOL breakdown |
310
+ | `madeonsol_coordination_history` | PRO+ | Global coordination event log with token, KOL count, score, and outcome |
311
+
312
+ ### Wallet Derived Stats *(new in 1.9)*
313
+
314
+ `madeonsol_wallet_stats` now returns a `stats` object with derived fields: `win_rate` (0-1), `roi`, `verdict` ("strong" | "profitable" | "neutral" | "losing"), and `biggest_miss` (token with the highest post-exit gain the wallet missed).
315
+
316
+ ### Streaming & Webhooks
317
+
318
+ | Tool | Description |
319
+ |---|---|
320
+ | `madeonsol_stream_token` | Get a 24h WebSocket token for KOL/deployer streaming and DEX trade stream — PRO/ULTRA. Channels now also include `token:locks` (new lock/vesting contracts, event `token:lock`) and `token:fee_claims` (pump.fun fee events, event `token:fee_claim`) |
321
+ | `madeonsol_stream_sessions_list` | List your live WebSocket sessions — `id`, `service`, `tier`, `channels`, `connected_at`, `remote_ip`, `messages_sent` — PRO/ULTRA |
322
+ | `madeonsol_stream_session_kill` | Evict a live WebSocket session by id to free its connection slot (e.g. a ghost socket) — PRO/ULTRA |
323
+ | `madeonsol_create_webhook` | Register a webhook for real-time push notifications — PRO/ULTRA |
324
+ | `madeonsol_list_webhooks` | List your registered webhooks — PRO/ULTRA |
325
+ | `madeonsol_delete_webhook` | Delete a webhook by ID — PRO/ULTRA |
326
+ | `madeonsol_test_webhook` | Send a test payload to verify a webhook — PRO/ULTRA |
327
+
328
+ ### General
329
+
330
+ | Tool | Description |
331
+ |---|---|
332
+ | `madeonsol_discovery` | List all endpoints and prices (free, no auth) |
333
+ | `madeonsol_me` | Inspect your account — tier, daily/burst quota state, remaining requests, subscription expiry, per-feature usage (webhooks, copy-trade wallets, coordination rules, etc.). Self-throttle without parsing rate-limit headers. |
334
+
335
+ ## Tiers
336
+
337
+ | Tier | Price | Wallets tracked | Requests/day |
338
+ |------|-------|-----------------|--------------|
339
+ | BASIC (free) | $0 | 10 | 200 |
340
+ | PRO | €43/mo (€430/yr) ≈ $49 | 50 | 10,000 |
341
+ | ULTRA | €131/mo (€1310/yr) ≈ $149 | 100 + WS events | 100,000 |
342
+ | BUSINESS | €400/mo (€4000/yr) ≈ $449 | 500 + WS events | 500,000 |
343
+
344
+ Free tier returns the full REST response shape on every endpoint — real wallets, TX signatures, full precision. Paid tiers unlock webhooks, WebSockets, rule engines, and ULTRA-only data depth. Get a key at [madeonsol.com/pricing](https://madeonsol.com/pricing).
345
+
346
+ ## Also Available
347
+
348
+ | Platform | Package |
349
+ |---|---|
350
+ | TypeScript SDK | [`madeonsol`](https://www.npmjs.com/package/madeonsol) on npm |
351
+ | Rust SDK | [`madeonsol`](https://crates.io/crates/madeonsol) on crates.io |
352
+ | Python (LangChain, CrewAI) | [`madeonsol-x402`](https://pypi.org/project/madeonsol-x402/) on PyPI |
353
+ | ElizaOS | [`@madeonsol/plugin-madeonsol`](https://www.npmjs.com/package/@madeonsol/plugin-madeonsol) |
354
+ | Solana Agent Kit | [`solana-agent-kit-plugin-madeonsol`](https://www.npmjs.com/package/solana-agent-kit-plugin-madeonsol) |
355
+
356
+ ## License
357
+
358
+ MIT
package/dist/index.js CHANGED
@@ -575,7 +575,7 @@ function registerTools(server) {
575
575
  }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ webhook_id }) => ({
576
576
  content: [{ type: "text", text: await restQuery("POST", "/webhooks/test", { webhook_id }) }],
577
577
  }));
578
- server.tool("madeonsol_stream_token", "Generate a 24h WebSocket streaming token. Includes ws_url for KOL/deployer streaming (Pro/Ultra) and dex_ws_url for all-DEX trade streaming (Ultra only).", {}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async () => ({
578
+ server.tool("madeonsol_stream_token", "Generate a 24h WebSocket streaming token. Includes ws_url for KOL/deployer streaming (Pro/Ultra) and dex_ws_url for all-DEX trade streaming (Ultra only). PRO+ channels now also include token:locks (event token:lock — every NEW Streamflow / Jupiter Lock / Bonfida lock or vesting contract) and token:fee_claims (event token:fee_claim — every pump.fun fee event: distributions to shareholders, social/X claims, config changes, creator transfers).", {}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async () => ({
579
579
  content: [{ type: "text", text: await restQuery("POST", "/stream/token") }],
580
580
  }));
581
581
  server.tool("madeonsol_stream_sessions_list", "List your live WebSocket streaming sessions. Returns sessions[] (each with id, service 'ws-streaming'|'dex-stream', tier, channels[], connected_at, remote_ip, messages_sent) and count. Use it to see which connections are holding your per-tier socket slots before evicting a ghost with madeonsol_stream_session_kill. PRO/ULTRA only.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async () => ({
@@ -678,6 +678,82 @@ function registerTools(server) {
678
678
  server.tool("madeonsol_token_holders", "Live holder census + concentration for a Solana token — WHO HOLDS NOW (madeonsol_token_cap_table is who bought first). Read live from the ledger at confirmed: every token account of the mint (mint-scoped getProgramAccounts), merged per owner, ranks 1–100 retained. concentration.holder_count is EXACT — distinct non-zero owners minus the excluded pools/curves/burns — and is null ONLY when the provider refuses the census for a mega-cap (TRUMP/JUP/BONK class): then source.method=getTokenLargestAccounts, source.census_fallback_reason is set and only the top-20 view is served; it is NEVER estimated from trades. Every disclosed owner carries labels[] from MadeOnSol wallet intelligence — deployer / kol / early_buyer / buyer / bundle / bot / dump_cluster (+ kol_name, early_buyer_rank, bot_confidence, historical_win_rate); an EMPTY labels[] means unknown to us, NOT verified clean. Liquidity pools, bonding curves, vaults and burn addresses are EXCLUDED from the circulating denominator and NAMED in excluded[] with reason = pool (dex + pool_address set) | bonding_curve (pump.fun/LaunchLab) | burn | program_account (off-curve owner we could not attribute); concentration splits them into pool_pct / burned_pct / program_pct (over TOTAL supply), while top1/top10/top20/top50/top100_share and deployer/kol/early_buyer/bundle/bot/dump_cluster_pct are over circulating (supply minus excluded). amount_raw / supply_raw / circulating_raw are raw u64 returned as decimal STRINGS — never coerce to a float. Disclosure is tier-gated: PRO ranks 1–10, ULTRA 1–50, BUSINESS 1–100 (the maths is tier-independent). Large established tokens take 5–30 s to enumerate upstream: the first call may return HTTP 503 with error_kind=holder_scan_in_progress and retry_after_seconds=20 — the scan keeps running and is cached, so retry after ~20 s and the answer is instant. 404 not_a_mint = not a mint on-chain; 503 holder_rpc_unavailable (retry 15 s) = we fail closed rather than guess. PRO+ — BASIC receives HTTP 403.", { mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({
679
679
  content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/holders`) }],
680
680
  }));
681
+ server.tool("madeonsol_token_locks", "Token locks & vesting on ONE Solana mint — every on-chain lock / vesting contract from Streamflow, Jupiter Lock and Bonfida token-vesting, decoded from the locker programs' account state, plus a summary. Answers 'did the team lock, how much, until when, and can they pull it'. Each contract row: lock_account, program (streamflow | jupiter_lock | bonfida_vesting), kind (lock = whole amount at one date | vesting = cliff and/or periodic release), status (active | completed | cancelled | closed — derived at request time), sender (the locker; null for Bonfida), recipient, name, the schedule (start_at / cliff_at / end_at, period_seconds, continuous = per-second stream, amount_per_period_*, cliff_amount_*, perpetual), the terms (cancelable_by_sender — the locker can cancel, so funds are locked against the RECIPIENT not the locker; cancelable_by_recipient, transferable, can_topup) and a LIVE-derived view: locked_* (still locked right now), unlocked_*, withdrawn_* (claimed), claimable_* (unlocked but not withdrawn), next_unlock {at, kind cliff|period|final|tranche, amount}. summary: lock_count (exact), complete (false when the mint has >5000 contracts — totals then cover the newest 5000, rows_considered), active_count, by_program, by_kind, distinct_lockers, locked / deposited totals, unlocking_7d_* and unlocking_30d_* forward schedule, the nearest next_unlock across all contracts, active_cancelable_by_sender. Every *_raw amount is a base-unit digit STRING — never coerce to a float; ui (locked, amount…), *_usd and *_pct_of_supply are null when decimals / price are unknown (see token.facts_resolved). status/program filter the list only — the summary always covers all rows. LP LOCKS ARE NOT INCLUDED (this is token/vesting locks; LP locks are a separate feature). Poll for updates — claims/cancels are not pushed on the WebSocket. PRO+ — BASIC receives HTTP 403.", {
682
+ mint: z.string().describe("Token mint address (base58)"),
683
+ status: z.enum(["active", "completed", "cancelled", "closed"]).optional().describe("Filter the list by derived status (summary always covers all rows)"),
684
+ program: z.enum(["streamflow", "jupiter_lock", "bonfida_vesting"]).optional().describe("Filter by locker program"),
685
+ limit: z.number().min(1).max(500).default(200).describe("Max contracts to return (1-500, default 200)"),
686
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint, status, program, limit }) => {
687
+ const qs = new URLSearchParams();
688
+ if (status)
689
+ qs.set("status", status);
690
+ if (program)
691
+ qs.set("program", program);
692
+ if (limit != null)
693
+ qs.set("limit", String(limit));
694
+ const query = qs.toString() ? `?${qs.toString()}` : "";
695
+ return { content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/locks${query}`) }] };
696
+ });
697
+ server.tool("madeonsol_token_locks_feed", "Cross-token feed of NEW token lock / vesting contracts — who just locked tokens, of what mint, how much, until when — newest first, across ALL mints, from Streamflow, Jupiter Lock and Bonfida vesting. Each row has the same shape as a madeonsol_token_locks contract (lock_account, program, kind, status, sender, recipient, amount_* / locked_* / claimable_*, schedule, terms, next_unlock, created_at, tx_signature) plus token {symbol, name, decimals, price_usd, market_cap_usd}. Poll with since= (cursor = pagination.next_since) for new contracts, before= (pagination.next_before) to page back, or subscribe to the WebSocket channel 'token:locks' (event type 'token:lock', PRO+ stream token) for a push the moment the contract lands on-chain. Filters: mint, sender, recipient, program (streamflow | jupiter_lock | bonfida_vesting), kind (lock | vesting), status, min_usd (deposited amount ≥, needs a known price), min_pct_of_supply — the last three post-filter with a ×4 over-fetch, so a page may come back short. Backfilled Jupiter Lock rows have no on-chain creation time (created_at_estimated=true) and are EXCLUDED by default — include_estimated='1' to include them. Base-unit amounts are digit STRINGS; ui/usd/pct null when unknown. LP locks NOT included. PRO+ — BASIC receives HTTP 403.", {
698
+ since: z.string().optional().describe("ISO 8601 — only contracts created after this instant (use pagination.next_since to poll)"),
699
+ before: z.string().optional().describe("ISO 8601 — page back: only contracts created before this instant (pagination.next_before)"),
700
+ mint: z.string().optional().describe("Filter by token mint"),
701
+ sender: z.string().optional().describe("Filter by locker / creator wallet"),
702
+ recipient: z.string().optional().describe("Filter by recipient wallet"),
703
+ program: z.enum(["streamflow", "jupiter_lock", "bonfida_vesting"]).optional().describe("Filter by locker program"),
704
+ kind: z.enum(["lock", "vesting"]).optional().describe("lock = whole amount at one date; vesting = cliff and/or periodic release"),
705
+ status: z.enum(["active", "completed", "cancelled", "closed"]).optional().describe("Filter by derived status"),
706
+ min_usd: z.number().min(0).optional().describe("Deposited amount ≥ this USD value (needs a known price; post-filter)"),
707
+ min_pct_of_supply: z.number().min(0).max(100).optional().describe("Deposited amount ≥ this % of supply (post-filter)"),
708
+ include_estimated: z.enum(["1", "0", "true", "false"]).optional().describe("'1' to include backfilled Jupiter Lock rows with an estimated created_at (excluded by default)"),
709
+ limit: z.number().min(1).max(100).default(50).describe("Rows per page (1-100, default 50)"),
710
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async (params) => {
711
+ const qs = new URLSearchParams();
712
+ for (const [k, v] of Object.entries(params))
713
+ if (v !== undefined && v !== null)
714
+ qs.set(k, String(v));
715
+ const query = qs.toString() ? `?${qs.toString()}` : "";
716
+ return { content: [{ type: "text", text: await restQuery("GET", `/tokens/locks${query}`) }] };
717
+ });
718
+ server.tool("madeonsol_token_unlocks", "Upcoming token UNLOCK EVENTS across all active lock / vesting contracts inside a window — cliffs, periodic releases (hourly or coarser) and final unlocks — i.e. which tokens have locked supply hitting the market this week, how much, from whose lock. One entry per active contract = its NEXT unlock event in the window: unlock_at, in_seconds, event (cliff | period | final | tranche), amount_raw / amount / amount_usd / amount_pct_of_supply for that event, plus window_amount_* = that contract's TOTAL release over the whole window, mint, token {symbol, name, decimals, price_usd, market_cap_usd} and lock (a subset of the madeonsol_token_locks row: lock_account, program, kind, sender, recipient, cancelable_by_sender…). Continuous per-second streams (Streamflow payroll) contribute only their cliff / final events. within = 1h | 6h | 24h | 3d | 7d | 14d | 30d | 90d (default 7d); sort = soonest (default) | largest_usd | largest_pct; filter by mint / program / kind / min_usd (next-event amount ≥, needs a known price) / min_pct_of_supply. Response: window {within, from, to}, unlocks[], pagination {limit, count, total_in_window, has_more}. Base-unit amounts are digit STRINGS; ui/usd/pct null when decimals or price are unknown; prices implying a market cap > $100B are treated as phantom → usd null. Token/vesting locks only — LP locks not included. PRO+ — BASIC receives HTTP 403.", {
719
+ within: z.enum(["1h", "6h", "24h", "3d", "7d", "14d", "30d", "90d"]).default("7d").describe("Look-ahead window (default 7d)"),
720
+ mint: z.string().optional().describe("Filter by token mint"),
721
+ program: z.enum(["streamflow", "jupiter_lock", "bonfida_vesting"]).optional().describe("Filter by locker program"),
722
+ kind: z.enum(["lock", "vesting"]).optional().describe("lock | vesting"),
723
+ min_usd: z.number().min(0).optional().describe("Next-event amount ≥ this USD value (needs a known price)"),
724
+ min_pct_of_supply: z.number().min(0).max(100).optional().describe("Next-event amount ≥ this % of supply"),
725
+ sort: z.enum(["soonest", "largest_usd", "largest_pct"]).default("soonest").describe("Ordering (default soonest)"),
726
+ limit: z.number().min(1).max(200).default(50).describe("Rows per page (1-200, default 50)"),
727
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async (params) => {
728
+ const qs = new URLSearchParams();
729
+ for (const [k, v] of Object.entries(params))
730
+ if (v !== undefined && v !== null)
731
+ qs.set(k, String(v));
732
+ const query = qs.toString() ? `?${qs.toString()}` : "";
733
+ return { content: [{ type: "text", text: await restQuery("GET", `/tokens/unlocks${query}`) }] };
734
+ });
735
+ server.tool("madeonsol_token_fee_shares", "pump.fun creator-fee SHARING on one coin — who receives what share of its creator fees. Decodes the on-chain SharingConfig of the pump_fees program (PDA ['sharing-config', mint]): config {sharing_config, admin, admin_revoked, status, version, is_default (true = 100% to the admin/creator — a REAL answer, not 'no data'), redirected_bps / redirected_pct (share going to non-admin addresses), social_bps / social_pct, shareholders[] {address, share_bps, share_pct, is_admin (the config admin, normally the coin creator), is_social_pda (the address is a pump_fees SocialFeePda — fees earmarked for a platform identity such as an X account), social {platform (2 = X), platform_label, user_id (the platform-native NUMERIC id, not the handle), lifetime_claimed_raw / lifetime_claimed / lifetime_claimed_usd, last_claimed_at}, received_raw / received / received_usd, payout_count, last_payout_at}, source ('stream' = our table, which only stores NON-default configs; 'chain' = live PDA read), updated_at}. config is null with config_error set only when the live read failed on every RPC endpoint. Plus quote {symbol, decimals, sol_usd}, distributions {count, total_raw / total / total_usd, last_at, recipients[] (per-recipient received totals), past_recipients[] (no longer in the split), payouts_considered, payouts_truncated}, history[] (config created / updated / reset, creator transferred — newest first) and recent_distributions[] {at, tx_signature, amount_*, shareholders[], actor}. Amounts are in quote base units (SOL lamports unless a stable-quoted coin) as digit STRINGS; ui/usd null when unknown. EVENT HISTORY (distributions, history) STARTS 2026-08-17 — the config itself is current on-chain state. Use madeonsol_token_fee_claims for the cross-token event feed. PRO+ — BASIC receives HTTP 403.", { mint: z.string().describe("pump.fun coin mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({
736
+ content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/fee-shares`) }],
737
+ }));
738
+ server.tool("madeonsol_token_fee_claims", "pump.fun FEE-EVENT feed, newest first, across all coins: every decoded pump_fees / pump event — type = distribution (creator fees paid out pro-rata to the SharingConfig shareholders, i.e. fees redirected to others, with payouts[] {address, share_bps, amount_raw, amount, amount_usd} per address) | social_claim (fees earmarked for a platform identity — social.platform 2 = X, social.user_id = the platform-native numeric id — claimed to a recipient wallet; mint is NULL) | shares_created / shares_updated / shares_reset (SharingConfig changes, with shareholders[] {address, share_bps}) | creator_transferred (creator role moved; recipient = new creator) | creator_claim (the plain creator vault claim — per CREATOR, carries NO mint; EXCLUDED unless requested via type=). Each event: id, type, at, tx_signature, slot, mint (null for social claims / creator claims), admin, actor (transaction signer), recipient, amount_raw (quote base units — SOL lamports unless a stable-quoted coin — as a digit STRING), amount, amount_usd, quote, social {platform, platform_label, user_id, pda}, shareholders, payouts, payload (full decoded Anchor event). Default 100%-to-creator configs and zero-amount distributions are NOT stored. Poll with since= (cursor = pagination.next_since), page back with before= (pagination.next_before), or subscribe to the WebSocket channel 'token:fee_claims' (event type 'token:fee_claim', PRO+ stream token) for a push the moment the tx confirms. Filters: type (comma list), mint, recipient (payout / claim recipient wallet, or new creator), actor, social_platform (raw platform id, 2 = X), social_user_id, min_sol (amount floor in SOL). HISTORY STARTS 2026-08-17. Use madeonsol_token_fee_shares for one coin's current split. PRO+ — BASIC receives HTTP 403.", {
739
+ type: z.string().optional().describe("Comma list of event types: distribution, social_claim, shares_created, shares_updated, shares_reset, creator_transferred, creator_claim (default: all except creator_claim)"),
740
+ mint: z.string().optional().describe("Filter by coin mint"),
741
+ recipient: z.string().optional().describe("Payout / claim recipient wallet, or the new creator for creator_transferred"),
742
+ actor: z.string().optional().describe("Transaction signer"),
743
+ social_platform: z.number().int().optional().describe("Raw social platform id (2 = X)"),
744
+ social_user_id: z.string().optional().describe("Platform-native numeric user id (not the handle)"),
745
+ min_sol: z.number().min(0).optional().describe("Amount floor in SOL"),
746
+ since: z.string().optional().describe("ISO 8601 — only events after this instant (use pagination.next_since to poll)"),
747
+ before: z.string().optional().describe("ISO 8601 — page back: only events before this instant (pagination.next_before)"),
748
+ limit: z.number().min(1).max(100).default(50).describe("Rows per page (1-100, default 50)"),
749
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async (params) => {
750
+ const qs = new URLSearchParams();
751
+ for (const [k, v] of Object.entries(params))
752
+ if (v !== undefined && v !== null)
753
+ qs.set(k, String(v));
754
+ const query = qs.toString() ? `?${qs.toString()}` : "";
755
+ return { content: [{ type: "text", text: await restQuery("GET", `/tokens/fee-claims${query}`) }] };
756
+ });
681
757
  server.tool("madeonsol_token_depth", "Per-pool price-impact / slippage for a token — answers 'how much SOL moves this token's price N%' and the impact of each buy size, per pool (NOT router-optimal). Each computable pool returns spot_price_sol, fee_pct, a quotes[] entry per requested SOL size (size_sol, tokens_out, avg_price_sol, price_impact_pct), and to_move_price — the SOL required to move price 1%/5%/10%. Constant-product AMMs are served from stream reserves (source=stream, with reserves_age_ms); pump.fun/bonk bonding curves from a LIVE read of the curve's virtual reserves (source=live_rpc). Pools that can't be priced honestly — concentrated CLMM/Orca/DLMM, Meteora-DBC curves, unclassified models — come back in unsupported_pools[] with a reason (e.g. concentrated_liquidity_depth_not_supported, curve_graduated_use_amm_pool) instead of a wrong number. primary_pool = deepest computable pool; found=false means no pools tracked. PRO/ULTRA only — BASIC receives HTTP 403.", {
682
758
  mint: z.string().describe("Token mint address (base58)"),
683
759
  sizes: z.array(z.number().gt(0).max(10000)).min(1).max(8).optional()
@@ -1134,6 +1210,11 @@ async function main() {
1134
1210
  { name: "madeonsol_alpha_linked", description: "Behaviorally linked wallets (co-bought 3+ tokens within 2s). ULTRA only." },
1135
1211
  { name: "madeonsol_token_cap_table", description: "First non-deployer early buyers for a token, enriched. PRO=10, ULTRA=20." },
1136
1212
  { name: "madeonsol_token_holders", description: "Live holder census + concentration — who holds NOW. Exact holder_count (null only if the provider refuses a mega-cap), labelled owners, pools/curves/burns excluded and named. PRO=10, ULTRA=50, BUSINESS=100 disclosed; 503 holder_scan_in_progress → retry in 20 s." },
1213
+ { name: "madeonsol_token_locks", description: "Token locks & vesting on a mint (Streamflow / Jupiter Lock / Bonfida) — every contract with live locked/claimable, schedule, cancelable-by-sender, plus 7d/30d unlock summary. LP locks not included. PRO+." },
1214
+ { name: "madeonsol_token_locks_feed", description: "Cross-token feed of NEW lock/vesting contracts, newest first; poll with next_since or subscribe to WS channel token:locks. PRO+." },
1215
+ { name: "madeonsol_token_unlocks", description: "Upcoming unlock EVENTS (cliff / period / final / tranche) across all active contracts inside 1h–90d — what locked supply hits the market, how much, from whose lock. PRO+." },
1216
+ { name: "madeonsol_token_fee_shares", description: "pump.fun creator-fee SharingConfig on a coin — shareholders (bps, is_admin, is_social_pda / X identity), redirected_bps, distributions rollup + config history (from 2026-08-17). PRO+." },
1217
+ { name: "madeonsol_token_fee_claims", description: "pump.fun fee-event feed — distributions to shareholders, social (X) claims, config changes, creator transfers; poll with next_since or WS channel token:fee_claims. History from 2026-08-17. PRO+." },
1137
1218
  { name: "madeonsol_token_buyer_quality", description: "0–100 buyer quality score for a token's first-buyer cohort." },
1138
1219
  { name: "madeonsol_token_depth", description: "Per-pool price impact / slippage — quotes per SOL buy size + SOL to move price 1%/5%/10%; unsupported pools flagged with a reason. PRO+." },
1139
1220
  { name: "madeonsol_token_candles", description: "Historical OHLCV price candles (1m–1d). PRO=OHLCV 30d; ULTRA=+net flow, liquidity delta, full history." },
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "1.23.0";
1
+ export declare const VERSION = "1.24.0";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // AUTO-GENERATED by ../gen-version.mjs (npm prebuild) from package.json. Do not edit.
2
- export const VERSION = "1.23.0";
2
+ export const VERSION = "1.24.0";
package/package.json CHANGED
@@ -1,87 +1,87 @@
1
- {
2
- "name": "mcp-server-madeonsol",
3
- "version": "1.23.0",
4
- "mcpName": "io.github.MadeOnSol/madeonsol",
5
- "description": "MCP server for MadeOnSol Solana KOL intelligence API — use from Claude, Cursor, or any MCP client. Free tier 200 req/day, no payment to start.",
6
- "type": "module",
7
- "bin": {
8
- "mcp-server-madeonsol": "dist/index.js"
9
- },
10
- "main": "dist/index.js",
11
- "files": [
12
- "dist",
13
- "README.md",
14
- "LICENSE",
15
- "glama.json"
16
- ],
17
- "scripts": {
18
- "prebuild": "node ../gen-version.mjs",
19
- "build": "tsc",
20
- "test": "vitest run",
21
- "preflight": "bash ../../scripts/preflight-publish.sh",
22
- "prepublishOnly": "npm run preflight && npm run build"
23
- },
24
- "keywords": [
25
- "mcp",
26
- "model-context-protocol",
27
- "mcp-server",
28
- "solana",
29
- "x402",
30
- "kol",
31
- "kol-tracker",
32
- "trading",
33
- "claude",
34
- "claude-desktop",
35
- "cursor",
36
- "windsurf",
37
- "ai-agent",
38
- "memecoin",
39
- "memecoin-tracker",
40
- "pumpfun",
41
- "deployer-hunter",
42
- "alpha",
43
- "alpha-bot",
44
- "smart-money",
45
- "copy-trading",
46
- "madeonsol"
47
- ],
48
- "license": "MIT",
49
- "repository": {
50
- "type": "git",
51
- "url": "https://github.com/madeonsol/mcp-server-madeonsol"
52
- },
53
- "homepage": "https://madeonsol.com/solana-api",
54
- "dependencies": {
55
- "@modelcontextprotocol/sdk": "^1.12.1",
56
- "zod": "^4.3.6"
57
- },
58
- "peerDependencies": {
59
- "@x402/fetch": "^2.8.0",
60
- "@x402/core": "^2.8.0",
61
- "@x402/svm": "^2.8.0",
62
- "@solana/kit": "^5.5.1",
63
- "@scure/base": "^2.0.0"
64
- },
65
- "peerDependenciesMeta": {
66
- "@x402/fetch": {
67
- "optional": true
68
- },
69
- "@x402/core": {
70
- "optional": true
71
- },
72
- "@x402/svm": {
73
- "optional": true
74
- },
75
- "@solana/kit": {
76
- "optional": true
77
- },
78
- "@scure/base": {
79
- "optional": true
80
- }
81
- },
82
- "devDependencies": {
83
- "@types/node": "^20",
84
- "typescript": "^5",
85
- "vitest": "^4.1.5"
86
- }
87
- }
1
+ {
2
+ "name": "mcp-server-madeonsol",
3
+ "version": "1.24.0",
4
+ "mcpName": "io.github.MadeOnSol/madeonsol",
5
+ "description": "MCP server for MadeOnSol Solana KOL intelligence API — use from Claude, Cursor, or any MCP client. Free tier 200 req/day, no payment to start.",
6
+ "type": "module",
7
+ "bin": {
8
+ "mcp-server-madeonsol": "dist/index.js"
9
+ },
10
+ "main": "dist/index.js",
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE",
15
+ "glama.json"
16
+ ],
17
+ "scripts": {
18
+ "prebuild": "node ../gen-version.mjs",
19
+ "build": "tsc",
20
+ "test": "vitest run",
21
+ "preflight": "bash ../../scripts/preflight-publish.sh",
22
+ "prepublishOnly": "npm run preflight && npm run build"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "model-context-protocol",
27
+ "mcp-server",
28
+ "solana",
29
+ "x402",
30
+ "kol",
31
+ "kol-tracker",
32
+ "trading",
33
+ "claude",
34
+ "claude-desktop",
35
+ "cursor",
36
+ "windsurf",
37
+ "ai-agent",
38
+ "memecoin",
39
+ "memecoin-tracker",
40
+ "pumpfun",
41
+ "deployer-hunter",
42
+ "alpha",
43
+ "alpha-bot",
44
+ "smart-money",
45
+ "copy-trading",
46
+ "madeonsol"
47
+ ],
48
+ "license": "MIT",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/madeonsol/mcp-server-madeonsol"
52
+ },
53
+ "homepage": "https://madeonsol.com/solana-api",
54
+ "dependencies": {
55
+ "@modelcontextprotocol/sdk": "^1.12.1",
56
+ "zod": "^4.3.6"
57
+ },
58
+ "peerDependencies": {
59
+ "@x402/fetch": "^2.8.0",
60
+ "@x402/core": "^2.8.0",
61
+ "@x402/svm": "^2.8.0",
62
+ "@solana/kit": "^5.5.1",
63
+ "@scure/base": "^2.0.0"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "@x402/fetch": {
67
+ "optional": true
68
+ },
69
+ "@x402/core": {
70
+ "optional": true
71
+ },
72
+ "@x402/svm": {
73
+ "optional": true
74
+ },
75
+ "@solana/kit": {
76
+ "optional": true
77
+ },
78
+ "@scure/base": {
79
+ "optional": true
80
+ }
81
+ },
82
+ "devDependencies": {
83
+ "@types/node": "^20",
84
+ "typescript": "^5",
85
+ "vitest": "^4.1.5"
86
+ }
87
+ }