mcp-server-madeonsol 1.18.0 → 1.20.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
@@ -13,6 +13,10 @@ MCP server for [MadeOnSol](https://madeonsol.com) Solana KOL intelligence API. U
13
13
 
14
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
15
 
16
+ > **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`.
17
+ >
18
+ > **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.
19
+ >
16
20
  > **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.
17
21
  >
18
22
  > **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`).
@@ -91,6 +95,7 @@ Building an autonomous agent? Skip the signup. Point a **funded Solana wallet**
91
95
  How it works:
92
96
 
93
97
  - 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.
98
+ - 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).
94
99
  - 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.
95
100
  - Install the x402 peer deps alongside the server (only required for this mode):
96
101
 
@@ -174,7 +179,7 @@ Pre-confirm pump.fun deploy feed reconstructed from shred-level (**deshred**) da
174
179
 
175
180
  | Tool | Description |
176
181
  |---|---|
177
- | `madeonsol_sniper_recent` | Newest-first deshred deploy feed. Pro: elite/good · Ultra: all tiers. `watchlist: true` (Ultra) narrows to your custom deployer watchlist |
182
+ | `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 |
178
183
  | `madeonsol_sniper_by_deployer` | Deshred deploys for a single deployer wallet (Ultra) |
179
184
 
180
185
  ### Wallet Tracker
@@ -191,7 +196,8 @@ Pre-confirm pump.fun deploy feed reconstructed from shred-level (**deshred**) da
191
196
 
192
197
  | Tool | Description |
193
198
  |---|---|
194
- | `madeonsol_wallet_stats` | Aggregate 90d stats + cross-product flags (is_kol, is_alpha_tracked + bot_confidence + win_rate + net_pnl, is_deployer + tokens_deployed) — quick sizing-up of an unknown wallet |
199
+ | `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 |
200
+ | `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 |
195
201
  | `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 |
196
202
  | `madeonsol_wallet_positions` | Open positions only — lighter slice of /pnl. Shares the same cache. |
197
203
  | `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. |
@@ -217,12 +223,14 @@ Scored from 1M+ early-buyer records (wallets seen in the first 20 buyers of Pump
217
223
  | `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` |
218
224
  | `madeonsol_token_cap_table` | PRO+ | First non-deployer early buyers, enriched with PnL/KOL/bot flags. PRO=10, ULTRA=20 |
219
225
  | `madeonsol_token_buyer_quality` | All | 0–100 buyer-quality score + full breakdown (5-min cached) |
220
- | `madeonsol_token_risk` | PRO+ | Transparent 0–100 rug-risk/safety score with `band`, explainable `factors[]`, and raw `inputs` |
226
+ | `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`) |
221
227
  | `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 |
222
228
  | `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) |
229
+ | `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` |
223
230
  | `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 |
224
231
  | `madeonsol_token_candles` | PRO+ | Historical OHLCV candles (1m–1d). PRO=OHLCV 30d; ULTRA=+net flow, liquidity delta, MEV volume, full history |
225
232
  | `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 |
233
+ | `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 |
226
234
 
227
235
  ### Copy-Trade Rules (PRO/ULTRA)
228
236
 
package/dist/index.d.ts CHANGED
File without changes
package/dist/index.js CHANGED
@@ -210,20 +210,11 @@ function registerTools(server) {
210
210
  }
211
211
  return { content: [{ type: "text", text: "KOL timing requires MADEONSOL_API_KEY (msk_) — get one free at madeonsol.com/pricing." }] };
212
212
  });
213
- server.tool("madeonsol_deployer_trajectory", "Deployer skill curve — streaks, rolling bond rate, improvement trend, and deployment cadence for a Pump.fun deployer.", {
213
+ server.tool("madeonsol_deployer_trajectory", "Deployer skill curve — streaks, rolling bond rate, improvement trend, and deployment cadence for a Pump.fun deployer. Works with an msk_ key (Pro/Ultra) or keyless via x402 ($0.01/call).", {
214
214
  wallet: z.string().describe("Deployer wallet address (base58)"),
215
- }, readOnlyAnnotations, async ({ wallet }) => {
216
- if (authMode === "madeonsol") {
217
- const headers = { ...apiKeyHeaders() };
218
- const res = await fetch(`${BASE_URL}/api/v1/deployer-hunter/${wallet}/trajectory`, { headers });
219
- if (!res.ok) {
220
- const body = await res.text().catch(() => "");
221
- return { content: [{ type: "text", text: `Error ${res.status}: ${body}` }] };
222
- }
223
- return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
224
- }
225
- return { content: [{ type: "text", text: "Deployer trajectory requires MADEONSOL_API_KEY (msk_, Pro/Ultra) — get one at madeonsol.com/pricing." }] };
226
- });
215
+ }, readOnlyAnnotations, async ({ wallet }) => ({
216
+ content: [{ type: "text", text: await query(`/api/x402/deployer-hunter/${encodeURIComponent(wallet)}/trajectory`) }],
217
+ }));
227
218
  server.tool("madeonsol_kol_hot_tokens", "KOL momentum tokens — tokens with accelerating KOL buy interest, early signals before coordination triggers. PRO+ adds buyer-quality filters.", {
228
219
  period: z.enum(["1h", "6h"]).default("6h").describe("Time period: 1h or 6h"),
229
220
  min_kols: z.number().min(1).max(20).default(1).describe("Minimum KOL buyers to include a token"),
@@ -284,30 +275,23 @@ function registerTools(server) {
284
275
  }, readOnlyAnnotations, async ({ period, min_kols, limit }) => ({
285
276
  content: [{ type: "text", text: await query("/api/x402/kol/tokens/trending", { period, min_kols, limit }) }],
286
277
  }));
287
- server.tool("madeonsol_sniper_recent", "Deshred pre-confirm pump.fun deploy feed — new launches surface ~500ms before they confirm on-chain (reconstructed from shred-level data). PRO sees elite/good deployers; ULTRA sees every tier. Requires a Pro/Ultra msk_ API key.", {
278
+ server.tool("madeonsol_sniper_recent", "Deshred pre-confirm pump.fun deploy feed — new launches surface ~500ms before they confirm on-chain (reconstructed from shred-level data). Each deploy now carries footprint — the slot-window snipe rollup ({ buys, buyers, sol, supply_pct|null, sniper_wallet_buys, data_available, as_of } | null; buys in slots deploy-1..deploy+3). footprint is null for deploys younger than the ~10-min settle window or outside the trade-pipeline write-gate — absent, not zero. PRO (msk_ key) sees elite/good deployers; ULTRA sees every tier; also callable keyless via x402 ($0.01/call, elite/good scope).", {
288
279
  deployer_tier: z.enum(["elite", "good", "moderate", "rising", "cold", "unranked"]).optional().describe("Filter by deployer reputation tier (ULTRA)"),
289
280
  min_bond_rate: z.number().min(0).max(1).optional().describe("Minimum deployer lifetime bond rate (0-1)"),
290
281
  since: z.string().optional().describe("ISO-8601 — only deploys detected after this timestamp"),
291
- watchlist: z.boolean().optional().describe("ULTRA: narrow to your custom deployer watchlist (any tier)"),
282
+ watchlist: z.boolean().optional().describe("ULTRA (msk_ key only): narrow to your custom deployer watchlist (any tier)"),
292
283
  limit: z.number().min(1).max(200).default(50).describe("Max results"),
293
284
  }, readOnlyAnnotations, async ({ deployer_tier, min_bond_rate, since, watchlist, limit }) => {
294
- if (authMode !== "madeonsol")
295
- return { content: [{ type: "text", text: "Sniper feed requires MADEONSOL_API_KEY (msk_, Pro/Ultra) — get one at madeonsol.com/pricing." }] };
296
- const qs = new URLSearchParams({ limit: String(limit) });
285
+ const params = { limit };
297
286
  if (deployer_tier)
298
- qs.set("deployer_tier", deployer_tier);
287
+ params.deployer_tier = deployer_tier;
299
288
  if (min_bond_rate != null)
300
- qs.set("min_bond_rate", String(min_bond_rate));
289
+ params.min_bond_rate = min_bond_rate;
301
290
  if (since)
302
- qs.set("since", since);
291
+ params.since = since;
303
292
  if (watchlist)
304
- qs.set("watchlist", "true");
305
- const res = await fetch(`${BASE_URL}/api/v1/sniper/recent?${qs}`, { headers: apiKeyHeaders() });
306
- if (!res.ok) {
307
- const body = await res.text().catch(() => "");
308
- return { content: [{ type: "text", text: `Error ${res.status}: ${body}` }] };
309
- }
310
- return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
293
+ params.watchlist = "true";
294
+ return { content: [{ type: "text", text: await query("/api/x402/sniper/recent", params) }] };
311
295
  });
312
296
  server.tool("madeonsol_sniper_by_deployer", "Deshred pre-confirm deploys filtered to a single deployer wallet — audit a deployer's recent launches before tracking them. ULTRA only.", {
313
297
  wallet: z.string().describe("Deployer wallet address (base58)"),
@@ -322,7 +306,7 @@ function registerTools(server) {
322
306
  }
323
307
  return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
324
308
  });
325
- server.tool("madeonsol_discovery", "List all available MadeOnSol API endpoints with prices and parameter docs. Free, no auth required.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async () => {
309
+ server.tool("madeonsol_discovery", "List all available MadeOnSol API endpoints with prices and parameter docs. Free, no auth required. The keyless x402 catalog now covers 25 endpoints — recent 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).", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async () => {
326
310
  const res = await fetch(new URL("/api/x402", BASE_URL).toString());
327
311
  const data = await res.json();
328
312
  return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
@@ -397,7 +381,7 @@ function registerTools(server) {
397
381
  return { content: [{ type: "text", text }] };
398
382
  });
399
383
  // ── Universal wallet endpoints (PRO+, any wallet — not just curated KOLs) ──
400
- server.tool("madeonsol_wallet_stats", "Aggregate stats for any Solana wallet over the last 90 days plus cross-product flags (is_kol, is_alpha_tracked with bot_confidence + win_rate + net_pnl, is_deployer with tokens_deployed + bonding_rate). Use this before drilling into PnL to size up an unknown wallet quickly. PRO+.", {
384
+ server.tool("madeonsol_wallet_stats", "Aggregate stats for any Solana wallet over the last 90 days plus cross-product flags (is_kol, is_alpha_tracked with bot_confidence + win_rate + net_pnl, is_deployer with tokens_deployed + bonding_rate). flags now also carries reputation flags — is_sniper, is_bundler, is_dumper — plus a dump_cluster block ({ dump_cohorts, runner_cohorts, total_cohorts, as_of } | null). bot_confidence is a string enum 'none'|'low'|'medium'|'high' (null when not alpha-tracked; earlier versions documented it as a number and it always serialized null — fixed). Scope caveat: reputation flags are pump.fun-pipeline scoped — false = not observed, NOT verified clean; is_bundler is lifetime, is_dumper is a rolling 42d window. Use this before drilling into PnL to size up an unknown wallet quickly. PRO+.", {
401
385
  address: z.string().describe("Solana wallet address (base58)"),
402
386
  }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ address }) => {
403
387
  const res = await fetch(`${BASE_URL}/api/v1/wallet/${encodeURIComponent(address)}`, {
@@ -461,8 +445,13 @@ function registerTools(server) {
461
445
  const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
462
446
  return { content: [{ type: "text", text }] };
463
447
  });
448
+ server.tool("madeonsol_wallet_batch_classify", "Bulk wallet 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 the wallet isn't alpha-tracked), and dump_cluster ({ dump_cohorts, runner_cohorts, total_cohorts, as_of } | null). Same semantics as the flags block on madeonsol_wallet_stats. IMPORTANT scope caveat: all three reputation flags derive from the pump.fun trade pipeline — false means 'not observed', NOT verified clean. is_sniper is behavior-updated (~12min cron) and can clear if the wallet reforms; is_bundler is a LIFETIME flag (bought >1 token in the same block, ever); is_dumper uses a rolling 42-day window (recomputed daily, up to ~48h stale). Response: { wallets[], count, as_of }. PRO/ULTRA only.", {
449
+ wallets: z.array(z.string()).min(1).max(100).describe("1-100 base58 Solana wallet addresses"),
450
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ wallets }) => ({
451
+ content: [{ type: "text", text: await walletTrackerRequest("POST", "/wallet/batch/classify", { wallets }) }],
452
+ }));
464
453
  console.error("[madeonsol-mcp] Wallet tracker tools enabled");
465
- console.error("[madeonsol-mcp] Universal wallet tools enabled (stats / pnl / positions / holdings / trades)");
454
+ console.error("[madeonsol-mcp] Universal wallet tools enabled (stats / pnl / positions / holdings / trades / batch classify)");
466
455
  }
467
456
  else {
468
457
  console.error("[madeonsol-mcp] Wallet tracker tools disabled (requires MADEONSOL_API_KEY)");
@@ -608,7 +597,7 @@ function registerTools(server) {
608
597
  server.tool("madeonsol_token_buyer_quality", "0–100 buyer-quality score for a token's first-buyer cohort. 5-min cached. Full breakdown on all tiers, incl. dump_cluster_count (3+ dump-cluster wallets in the first-20 → 94% historical dump rate vs 61% base) and recycled_early_buyer_count.", { mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({
609
598
  content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/buyer-quality`) }],
610
599
  }));
611
- server.tool("madeonsol_token_risk", "Transparent 0–100 token rug-risk/safety score (higher = riskier). Returns a band (safe/caution/danger), an explainable factors[] array (mint authority, freeze authority, liquidity, transfer fee, token-2022, burn, launch cohort, deployer bond rate, KOL signal, blacklist) each with status/points/detail, and the raw inputs that produced the score. PRO/ULTRA only — BASIC receives HTTP 403.", { mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({
600
+ server.tool("madeonsol_token_risk", "Transparent 0–100 token rug-risk/safety score (higher = riskier). Returns a band (safe/caution/danger), an explainable factors[] array (mint authority, freeze authority, liquidity, transfer fee, token-2022, burn, launch cohort, deployer bond rate, KOL signal, blacklist) each with status/points/detail, and the raw inputs that produced the score. inputs now includes sniper_footprint — the slot-window launch-snipe rollup ({ buys, buyers, sol, supply_pct|null, sniper_wallet_buys, data_available, as_of } | null; buys landing in slots deploy-1..deploy+3). data_available=false means the mint isn't observable in the trade pipeline — NOT zero snipes; null means no rollup yet. Also returns a top-level dev block (deployer self-activity, null when the mint has no deployer-pipeline row): wallet, launchpad, deployed_at, create-tx self-buy snapshot (buy_sol / buy_tokens / buy_supply_pct), post-create rollup (bought_tokens_after — catches the same-second-separate-tx dev buy — 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). PRO/ULTRA only — BASIC receives HTTP 403.", { mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({
612
601
  content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/risk`) }],
613
602
  }));
614
603
  server.tool("madeonsol_token_bundle", "Bundle-cohort holdings for a token — which same-slot bundle wallets bought it and how much of supply they still hold (held_pct_of_supply). Rug/insider signal. 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).", { mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({
@@ -617,6 +606,18 @@ function registerTools(server) {
617
606
  server.tool("madeonsol_token_pools", "Per-venue liquidity map for a Solana token — every DEX pool it trades in (pump.fun/PumpSwap/Raydium/Meteora/Orca) with per-pool liquidity, live vs parked (is_active), plus a summary (total liquidity, pool/DEX counts, primary/deepest pool, top_pool_share_pct concentration). Shows WHERE liquidity sits and how fragmented it is, vs the single aggregate number from the token endpoint.", { mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({
618
607
  content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/pools`) }],
619
608
  }));
609
+ 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.", {
610
+ mint: z.string().describe("Token mint address (base58)"),
611
+ sizes: z.array(z.number().gt(0).max(10000)).min(1).max(8).optional()
612
+ .describe("SOL buy sizes to quote (max 8, each >0 and ≤10000). Default [0.5, 1, 5, 10]"),
613
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint, sizes }) => {
614
+ const qs = new URLSearchParams();
615
+ if (sizes && sizes.length > 0)
616
+ qs.set("sizes", sizes.join(","));
617
+ const query = qs.toString();
618
+ const path = `/tokens/${encodeURIComponent(mint)}/depth${query ? `?${query}` : ""}`;
619
+ return { content: [{ type: "text", text: await restQuery("GET", path) }] };
620
+ });
620
621
  server.tool("madeonsol_deployer_history", "A pump.fun deployer's daily reputation time-series (bonding_rate, recent_bond_rate, tier, avg_peak_mc per day). Lets an agent answer 'was this deployer elite AT THE TIME it launched token X?' — backtest deployer signals without look-ahead bias.", {
621
622
  wallet: z.string().describe("Deployer wallet address (base58)"),
622
623
  limit: z.number().min(1).max(365).default(90).describe("Number of daily snapshots to return (1-365, default 90)"),
@@ -659,6 +660,31 @@ function registerTools(server) {
659
660
  const path = `/tokens/${encodeURIComponent(mint)}/flow${query ? `?${query}` : ""}`;
660
661
  return { content: [{ type: "text", text: await restQuery("GET", path) }] };
661
662
  });
663
+ server.tool("madeonsol_token_trades", "Mint-scoped trade tape — cursor-paginated raw trades for one token, newest first (the backfill/history complement to the live DEX firehose stream). Each trade: tx_signature, wallet_address, action (buy|sell), sol_amount, token_amount, price_sol|null, price_usd|null, early_buyer_rank|null, slot|null, block_time (unix sec), traded_at (ISO). Filters: action, wallet, since/until (unix seconds — defaults to FULL history, not 90d). Pass next_cursor from the previous response to page older trades; has_more tells you when to stop. Coverage honesty: capture starts 2026-04-12 and is pump.fun-pipeline scoped — the response carries coverage.history_start + coverage.scope so agents can reason about gaps. PRO/ULTRA only.", {
664
+ mint: z.string().describe("Token mint address (base58)"),
665
+ limit: z.number().min(1).max(500).default(100).describe("Trades per page (1-500, default 100)"),
666
+ cursor: z.string().optional().describe("Cursor from previous response's next_cursor field"),
667
+ action: z.enum(["buy", "sell"]).optional().describe("Filter to buys or sells only"),
668
+ wallet: z.string().optional().describe("Filter to a single wallet address (base58)"),
669
+ since: z.number().optional().describe("Unix epoch seconds — default full history (2026-04-12 onward)"),
670
+ until: z.number().optional().describe("Unix epoch seconds — default now"),
671
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint, limit, cursor, action, wallet, since, until }) => {
672
+ const url = new URL(`${BASE_URL}/api/v1/tokens/${encodeURIComponent(mint)}/trades`);
673
+ url.searchParams.set("limit", String(limit));
674
+ if (cursor)
675
+ url.searchParams.set("cursor", cursor);
676
+ if (action)
677
+ url.searchParams.set("action", action);
678
+ if (wallet)
679
+ url.searchParams.set("wallet", wallet);
680
+ if (since !== undefined)
681
+ url.searchParams.set("since", String(since));
682
+ if (until !== undefined)
683
+ url.searchParams.set("until", String(until));
684
+ const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } });
685
+ const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
686
+ return { content: [{ type: "text", text }] };
687
+ });
662
688
  server.tool("madeonsol_tokens_batch_buyer_quality", "Bulk buyer-quality scoring for up to 50 mints in one call. Shares the 5-min LRU cache with the single-mint endpoint — already-warm mints return at ~zero cost. Response includes cache_hits counter.", { mints: z.array(z.string()).min(1).max(50).describe("1–50 base58 Solana token mints") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mints }) => ({
663
689
  content: [{ type: "text", text: await restQuery("POST", "/tokens/batch/buyer-quality", { mints }) }],
664
690
  }));
@@ -1019,7 +1045,8 @@ async function main() {
1019
1045
  { name: "madeonsol_wallet_tracker_remove", description: "Remove a wallet from your watchlist." },
1020
1046
  { name: "madeonsol_wallet_tracker_trades", description: "Historical swap/transfer events for watched wallets." },
1021
1047
  { name: "madeonsol_wallet_tracker_summary", description: "Per-wallet stats: swap counts, SOL bought/sold." },
1022
- { name: "madeonsol_wallet_stats", description: "Aggregate stats + cross-product flags (is_kol/alpha/deployer) for any Solana wallet. PRO+." },
1048
+ { name: "madeonsol_wallet_stats", description: "Aggregate stats + cross-product flags (is_kol/alpha/deployer, is_sniper/is_bundler/is_dumper + dump_cluster) for any Solana wallet. PRO+." },
1049
+ { name: "madeonsol_wallet_batch_classify", description: "Bulk reputation flags for 1-100 wallets in one call — is_sniper/is_bundler/is_dumper/is_kol, bot_confidence, dump_cluster. PRO+." },
1023
1050
  { name: "madeonsol_wallet_pnl", description: "Full FIFO cost-basis PnL for any wallet: realized + unrealized, profit factor, drawdown, daily curve, closed + open positions. PRO+." },
1024
1051
  { name: "madeonsol_wallet_positions", description: "Open positions only for any wallet — lighter slice of /pnl. Live unrealized SOL from mc-tracker. PRO+." },
1025
1052
  { name: "madeonsol_wallet_trades", description: "Cursor-paginated raw trades for any wallet. Filter by action / token_mint / time window. PRO+." },
@@ -1028,7 +1055,9 @@ async function main() {
1028
1055
  { name: "madeonsol_alpha_linked", description: "Behaviorally linked wallets (co-bought 3+ tokens within 2s). ULTRA only." },
1029
1056
  { name: "madeonsol_token_cap_table", description: "First non-deployer early buyers for a token, enriched. PRO=10, ULTRA=20." },
1030
1057
  { name: "madeonsol_token_buyer_quality", description: "0–100 buyer quality score for a token's first-buyer cohort." },
1058
+ { 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+." },
1031
1059
  { name: "madeonsol_token_candles", description: "Historical OHLCV price candles (1m–1d). PRO=OHLCV 30d; ULTRA=+net flow, liquidity delta, full history." },
1060
+ { name: "madeonsol_token_trades", description: "Mint-scoped trade tape — cursor-paginated raw trades for one token, full history from 2026-04-12. PRO+." },
1032
1061
  { name: "madeonsol_tokens_batch_buyer_quality", description: "Bulk buyer-quality scoring for up to 50 mints. Shares the LRU cache." },
1033
1062
  { name: "madeonsol_tokens_batch_risk", description: "Bulk rug-risk/safety scoring for up to 50 mints — same shape as madeonsol_token_risk + as_of; untracked mints don't fail the batch. PRO+." },
1034
1063
  { name: "madeonsol_token_get", description: "Comprehensive per-mint snapshot: price, MC, volume, deployer, KOL, age, blacklist." },
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "1.18.0";
1
+ export declare const VERSION = "1.20.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.18.0";
2
+ export const VERSION = "1.20.0";
package/glama.json CHANGED
@@ -1,13 +1,19 @@
1
1
  {
2
2
  "name": "mcp-server-madeonsol",
3
- "maintainers": ["madeonsol"],
3
+ "maintainers": [
4
+ "madeonsol"
5
+ ],
4
6
  "display_name": "MadeOnSol — Solana memecoin intelligence",
5
- "description": "Real-time Solana memecoin trading intelligence — track 1,000+ KOL wallets with <3s latency, score 15,500+ Pump.fun deployers, surface multi-KOL coordination signals, run server-side copy-trade rules, and stream every DEX trade across 14 programs. Backtested first-touch scout signal (S-tier scouts attract ≥3 follow-on KOLs ~50% of the time vs 14% baseline). Free tier 200 requests per day; auth via msk_ API key or x402 micropayments.",
6
- "version": "1.16.0",
7
+ "description": "Real-time Solana memecoin trading intelligence — track 1,000+ KOL wallets with <3s latency, score 15,500+ Pump.fun deployers, surface multi-KOL coordination signals, run server-side copy-trade rules, and stream every DEX trade across 14 programs. Backtested first-touch scout signal (S-tier scouts attract ≥3 follow-on KOLs ~50% of the time vs 14% baseline). Free tier 200 requests per day, no payment to start; auth via msk_ API key or x402 micropayments. New customers get a 5-day free trial of Pro or Ultra by card — nothing charged during the trial, cancel anytime.",
8
+ "version": "1.20.0",
7
9
  "homepage": "https://madeonsol.com/solana-api",
8
10
  "repository": "https://github.com/madeonsol/mcp-server-madeonsol",
9
11
  "license": "MIT",
10
- "categories": ["blockchain", "finance", "web3"],
12
+ "categories": [
13
+ "blockchain",
14
+ "finance",
15
+ "web3"
16
+ ],
11
17
  "tags": [
12
18
  "mcp",
13
19
  "claude",
@@ -30,62 +36,238 @@
30
36
  "api"
31
37
  ],
32
38
  "tools": [
33
- { "name": "madeonsol_kol_feed", "description": "Real-time Solana KOL trade feed from 1,000+ tracked wallets." },
34
- { "name": "madeonsol_kol_coordination", "description": "Multi-KOL convergence with 0-100 score, peak-density window, exits." },
35
- { "name": "madeonsol_kol_first_touches", "description": "First-KOL-touch events backtested scout signal, filter by tier S/A/B/C." },
36
- { "name": "madeonsol_kol_leaderboard", "description": "KOL PnL + win-rate rankings over today, 7d, 30d, 90d, 180d." },
37
- { "name": "madeonsol_kol_pairs", "description": "KOL affinity matrix — which KOLs co-trade the same tokens." },
38
- { "name": "madeonsol_kol_hot_tokens", "description": "KOL momentum tokens — accelerating buy interest." },
39
- { "name": "madeonsol_kol_trending_tokens", "description": "Tokens ranked by KOL buy volume across 5m–12h windows." },
40
- { "name": "madeonsol_kol_token_entry_order", "description": "Ranked KOL first-buyers for a specific token." },
41
- { "name": "madeonsol_kol_compare_wallets", "description": "Side-by-side comparison of 2-5 KOL wallets with overlap analysis." },
42
- { "name": "madeonsol_kol_alerts_recent", "description": "Unified live KOL alert feed: clusters, fresh buys, heating-up wallets." },
43
- { "name": "madeonsol_kol_pnl", "description": "Deep per-wallet PnL: equity curve, risk metrics, closed + open positions." },
44
- { "name": "madeonsol_kol_timing", "description": "KOL entry/exit timing profile — average hold, win rate by hour." },
45
- { "name": "madeonsol_deployer_alerts", "description": "Pump.fun deployer alerts with KOL enrichment, filter by tier." },
46
- { "name": "madeonsol_deployer_trajectory", "description": "Deployer skill curve — streaks, rolling bond rate, trend." },
47
- { "name": "madeonsol_alpha_leaderboard", "description": "Top profitable early-buyer wallets 25,000+ scored, up to 500 on ULTRA." },
48
- { "name": "madeonsol_alpha_wallet", "description": "Full alpha profile + bot-signal flags for one wallet." },
49
- { "name": "madeonsol_alpha_linked", "description": "Behaviorally linked wallets (co-bought 3+ tokens within 2s)." },
50
- { "name": "madeonsol_tokens_list", "description": "Filtered token directory — MC band, liquidity, MEV-share, velocity, primary DEX, authority flags, momentum/trending sorts." },
51
- { "name": "madeonsol_almost_bonded", "description": "Pre-bond pump.fun tokens near graduation, ranked by velocity (Δprogress/min) — progress, eta, stalled, deployer tier." },
52
- { "name": "madeonsol_token_get", "description": "Single token detail — MC, holders, velocity, MEV-share, history age." },
53
- { "name": "madeonsol_token_batch", "description": "Bulk token detail fetch — up to 50 mints per call." },
54
- { "name": "madeonsol_token_cap_table", "description": "First non-deployer early buyers for a token, enriched with PnL/KOL/bot flags." },
55
- { "name": "madeonsol_token_buyer_quality", "description": "0-100 buyer-quality score for a token's first-buyer cohort." },
56
- { "name": "madeonsol_tokens_batch_buyer_quality", "description": "Bulk buyer-quality scoring — up to 50 mints per call." },
57
- { "name": "madeonsol_tokens_batch_risk", "description": "Bulk rug-risk/safety scoring — up to 50 mints per call, same shape as madeonsol_token_risk + as_of; untracked mints don't fail the batch." },
58
- { "name": "madeonsol_wallet_tracker_watchlist", "description": "List tracked wallets and remaining capacity (Free 10 / Pro 50 / Ultra 100)." },
59
- { "name": "madeonsol_wallet_tracker_add", "description": "Add a wallet to your watchlist with optional label." },
60
- { "name": "madeonsol_wallet_tracker_remove", "description": "Remove a wallet from your watchlist." },
61
- { "name": "madeonsol_wallet_tracker_trades", "description": "Historical swap/transfer events for watched wallets (120-day retention)." },
62
- { "name": "madeonsol_wallet_tracker_summary", "description": "Per-wallet stats: swap counts, SOL bought/sold, last event." },
63
- { "name": "madeonsol_copytrade_list", "description": "List your copy-trade rules." },
64
- { "name": "madeonsol_copytrade_create", "description": "Create a copy-trade rule with webhook + WS delivery (HMAC-signed)." },
65
- { "name": "madeonsol_copytrade_get", "description": "Get one copy-trade rule." },
66
- { "name": "madeonsol_copytrade_update", "description": "Update or toggle a copy-trade rule." },
67
- { "name": "madeonsol_copytrade_delete", "description": "Delete a copy-trade rule." },
68
- { "name": "madeonsol_copytrade_signals", "description": "Recent fired copy-trade signals (up to 7 days, 1-500)." },
69
- { "name": "madeonsol_coordination_alerts_list", "description": "List your KOL coordination alert rules (PRO=5, ULTRA=20)." },
70
- { "name": "madeonsol_coordination_alerts_create", "description": "Create a coordination alert rule — pg_notify push, sub-second delivery." },
71
- { "name": "madeonsol_coordination_alerts_get", "description": "Get one coordination alert rule." },
72
- { "name": "madeonsol_coordination_alerts_update", "description": "Update or toggle a coordination alert rule." },
73
- { "name": "madeonsol_coordination_alerts_delete", "description": "Delete a coordination alert rule." },
74
- { "name": "madeonsol_first_touch_subscriptions_list", "description": "List your first-touch webhook subscriptions (ULTRA, up to 10)." },
75
- { "name": "madeonsol_first_touch_subscriptions_create", "description": "Create a first-touch webhook subscription push on every S-tier scout buy." },
76
- { "name": "madeonsol_first_touch_subscriptions_get", "description": "Get one first-touch subscription." },
77
- { "name": "madeonsol_first_touch_subscriptions_update", "description": "Update or toggle a first-touch subscription." },
78
- { "name": "madeonsol_first_touch_subscriptions_delete", "description": "Delete a first-touch subscription." },
79
- { "name": "madeonsol_create_webhook", "description": "Register a webhook for real-time push notifications (PRO/ULTRA)." },
80
- { "name": "madeonsol_list_webhooks", "description": "List your registered webhooks (PRO/ULTRA)." },
81
- { "name": "madeonsol_delete_webhook", "description": "Delete a webhook by ID (PRO/ULTRA)." },
82
- { "name": "madeonsol_test_webhook", "description": "Send a test payload to verify a webhook (PRO/ULTRA)." },
83
- { "name": "madeonsol_stream_token", "description": "Issue a 24h WebSocket streaming token (Pro/Ultra). Includes dex_ws_url on ULTRA." },
84
- { "name": "madeonsol_stream_sessions_list", "description": "List live WebSocket streaming sessions — id, service, tier, channels, connected_at, messages_sent (Pro/Ultra)." },
85
- { "name": "madeonsol_stream_session_kill", "description": "Evict a live WebSocket streaming session by id — frees its connection slot (Pro/Ultra)." },
86
- { "name": "madeonsol_me", "description": "Account/quota introspection — tier, remaining requests, per-feature usage." },
87
- { "name": "madeonsol_discovery", "description": "List all available endpoints with x402 prices (free, no auth)." }
39
+ {
40
+ "name": "madeonsol_kol_feed",
41
+ "description": "Real-time Solana KOL trade feed from 1,000+ tracked wallets."
42
+ },
43
+ {
44
+ "name": "madeonsol_kol_coordination",
45
+ "description": "Multi-KOL convergence with 0-100 score, peak-density window, exits."
46
+ },
47
+ {
48
+ "name": "madeonsol_kol_first_touches",
49
+ "description": "First-KOL-touch events backtested scout signal, filter by tier S/A/B/C."
50
+ },
51
+ {
52
+ "name": "madeonsol_kol_leaderboard",
53
+ "description": "KOL PnL + win-rate rankings over today, 7d, 30d, 90d, 180d."
54
+ },
55
+ {
56
+ "name": "madeonsol_kol_pairs",
57
+ "description": "KOL affinity matrix which KOLs co-trade the same tokens."
58
+ },
59
+ {
60
+ "name": "madeonsol_kol_hot_tokens",
61
+ "description": "KOL momentum tokens accelerating buy interest."
62
+ },
63
+ {
64
+ "name": "madeonsol_kol_trending_tokens",
65
+ "description": "Tokens ranked by KOL buy volume across 5m–12h windows."
66
+ },
67
+ {
68
+ "name": "madeonsol_kol_token_entry_order",
69
+ "description": "Ranked KOL first-buyers for a specific token."
70
+ },
71
+ {
72
+ "name": "madeonsol_kol_compare_wallets",
73
+ "description": "Side-by-side comparison of 2-5 KOL wallets with overlap analysis."
74
+ },
75
+ {
76
+ "name": "madeonsol_kol_alerts_recent",
77
+ "description": "Unified live KOL alert feed: clusters, fresh buys, heating-up wallets."
78
+ },
79
+ {
80
+ "name": "madeonsol_kol_pnl",
81
+ "description": "Deep per-wallet PnL: equity curve, risk metrics, closed + open positions."
82
+ },
83
+ {
84
+ "name": "madeonsol_kol_timing",
85
+ "description": "KOL entry/exit timing profile average hold, win rate by hour."
86
+ },
87
+ {
88
+ "name": "madeonsol_deployer_alerts",
89
+ "description": "Pump.fun deployer alerts with KOL enrichment, filter by tier."
90
+ },
91
+ {
92
+ "name": "madeonsol_deployer_trajectory",
93
+ "description": "Deployer skill curve streaks, rolling bond rate, trend."
94
+ },
95
+ {
96
+ "name": "madeonsol_alpha_leaderboard",
97
+ "description": "Top profitable early-buyer wallets — 25,000+ scored, up to 500 on ULTRA."
98
+ },
99
+ {
100
+ "name": "madeonsol_alpha_wallet",
101
+ "description": "Full alpha profile + bot-signal flags for one wallet."
102
+ },
103
+ {
104
+ "name": "madeonsol_alpha_linked",
105
+ "description": "Behaviorally linked wallets (co-bought 3+ tokens within 2s)."
106
+ },
107
+ {
108
+ "name": "madeonsol_tokens_list",
109
+ "description": "Filtered token directory — MC band, liquidity, MEV-share, velocity, primary DEX, authority flags, momentum/trending sorts."
110
+ },
111
+ {
112
+ "name": "madeonsol_almost_bonded",
113
+ "description": "Pre-bond pump.fun tokens near graduation, ranked by velocity (Δprogress/min) — progress, eta, stalled, deployer tier."
114
+ },
115
+ {
116
+ "name": "madeonsol_token_get",
117
+ "description": "Single token detail — MC, holders, velocity, MEV-share, history age."
118
+ },
119
+ {
120
+ "name": "madeonsol_token_batch",
121
+ "description": "Bulk token detail fetch — up to 50 mints per call."
122
+ },
123
+ {
124
+ "name": "madeonsol_token_cap_table",
125
+ "description": "First non-deployer early buyers for a token, enriched with PnL/KOL/bot flags."
126
+ },
127
+ {
128
+ "name": "madeonsol_token_buyer_quality",
129
+ "description": "0-100 buyer-quality score for a token's first-buyer cohort."
130
+ },
131
+ {
132
+ "name": "madeonsol_tokens_batch_buyer_quality",
133
+ "description": "Bulk buyer-quality scoring — up to 50 mints per call."
134
+ },
135
+ {
136
+ "name": "madeonsol_tokens_batch_risk",
137
+ "description": "Bulk rug-risk/safety scoring — up to 50 mints per call, same shape as madeonsol_token_risk + as_of; untracked mints don't fail the batch."
138
+ },
139
+ {
140
+ "name": "madeonsol_token_trades",
141
+ "description": "Mint-scoped trade tape — cursor-paginated raw trades for one token, full history from 2026-04-12, pump.fun-pipeline scoped. PRO+."
142
+ },
143
+ {
144
+ "name": "madeonsol_wallet_tracker_watchlist",
145
+ "description": "List tracked wallets and remaining capacity (Free 10 / Pro 50 / Ultra 100)."
146
+ },
147
+ {
148
+ "name": "madeonsol_wallet_tracker_add",
149
+ "description": "Add a wallet to your watchlist with optional label."
150
+ },
151
+ {
152
+ "name": "madeonsol_wallet_tracker_remove",
153
+ "description": "Remove a wallet from your watchlist."
154
+ },
155
+ {
156
+ "name": "madeonsol_wallet_tracker_trades",
157
+ "description": "Historical swap/transfer events for watched wallets (120-day retention)."
158
+ },
159
+ {
160
+ "name": "madeonsol_wallet_tracker_summary",
161
+ "description": "Per-wallet stats: swap counts, SOL bought/sold, last event."
162
+ },
163
+ {
164
+ "name": "madeonsol_wallet_batch_classify",
165
+ "description": "Bulk reputation flags for 1-100 wallets in one call — is_sniper/is_bundler/is_dumper/is_kol, bot_confidence (none/low/medium/high), dump_cluster cohorts. PRO+."
166
+ },
167
+ {
168
+ "name": "madeonsol_copytrade_list",
169
+ "description": "List your copy-trade rules."
170
+ },
171
+ {
172
+ "name": "madeonsol_copytrade_create",
173
+ "description": "Create a copy-trade rule with webhook + WS delivery (HMAC-signed)."
174
+ },
175
+ {
176
+ "name": "madeonsol_copytrade_get",
177
+ "description": "Get one copy-trade rule."
178
+ },
179
+ {
180
+ "name": "madeonsol_copytrade_update",
181
+ "description": "Update or toggle a copy-trade rule."
182
+ },
183
+ {
184
+ "name": "madeonsol_copytrade_delete",
185
+ "description": "Delete a copy-trade rule."
186
+ },
187
+ {
188
+ "name": "madeonsol_copytrade_signals",
189
+ "description": "Recent fired copy-trade signals (up to 7 days, 1-500)."
190
+ },
191
+ {
192
+ "name": "madeonsol_coordination_alerts_list",
193
+ "description": "List your KOL coordination alert rules (PRO=5, ULTRA=20)."
194
+ },
195
+ {
196
+ "name": "madeonsol_coordination_alerts_create",
197
+ "description": "Create a coordination alert rule — pg_notify push, sub-second delivery."
198
+ },
199
+ {
200
+ "name": "madeonsol_coordination_alerts_get",
201
+ "description": "Get one coordination alert rule."
202
+ },
203
+ {
204
+ "name": "madeonsol_coordination_alerts_update",
205
+ "description": "Update or toggle a coordination alert rule."
206
+ },
207
+ {
208
+ "name": "madeonsol_coordination_alerts_delete",
209
+ "description": "Delete a coordination alert rule."
210
+ },
211
+ {
212
+ "name": "madeonsol_first_touch_subscriptions_list",
213
+ "description": "List your first-touch webhook subscriptions (ULTRA, up to 10)."
214
+ },
215
+ {
216
+ "name": "madeonsol_first_touch_subscriptions_create",
217
+ "description": "Create a first-touch webhook subscription — push on every S-tier scout buy."
218
+ },
219
+ {
220
+ "name": "madeonsol_first_touch_subscriptions_get",
221
+ "description": "Get one first-touch subscription."
222
+ },
223
+ {
224
+ "name": "madeonsol_first_touch_subscriptions_update",
225
+ "description": "Update or toggle a first-touch subscription."
226
+ },
227
+ {
228
+ "name": "madeonsol_first_touch_subscriptions_delete",
229
+ "description": "Delete a first-touch subscription."
230
+ },
231
+ {
232
+ "name": "madeonsol_create_webhook",
233
+ "description": "Register a webhook for real-time push notifications (PRO/ULTRA)."
234
+ },
235
+ {
236
+ "name": "madeonsol_list_webhooks",
237
+ "description": "List your registered webhooks (PRO/ULTRA)."
238
+ },
239
+ {
240
+ "name": "madeonsol_delete_webhook",
241
+ "description": "Delete a webhook by ID (PRO/ULTRA)."
242
+ },
243
+ {
244
+ "name": "madeonsol_test_webhook",
245
+ "description": "Send a test payload to verify a webhook (PRO/ULTRA)."
246
+ },
247
+ {
248
+ "name": "madeonsol_stream_token",
249
+ "description": "Issue a 24h WebSocket streaming token (Pro/Ultra). Includes dex_ws_url on ULTRA."
250
+ },
251
+ {
252
+ "name": "madeonsol_stream_sessions_list",
253
+ "description": "List live WebSocket streaming sessions — id, service, tier, channels, connected_at, messages_sent (Pro/Ultra)."
254
+ },
255
+ {
256
+ "name": "madeonsol_stream_session_kill",
257
+ "description": "Evict a live WebSocket streaming session by id — frees its connection slot (Pro/Ultra)."
258
+ },
259
+ {
260
+ "name": "madeonsol_me",
261
+ "description": "Account/quota introspection — tier, remaining requests, per-feature usage."
262
+ },
263
+ {
264
+ "name": "madeonsol_discovery",
265
+ "description": "List all available endpoints with x402 prices (free, no auth)."
266
+ }
267
+ ],
268
+ "transports": [
269
+ "stdio",
270
+ "http"
88
271
  ],
89
- "transports": ["stdio", "http"],
90
272
  "runtime": "node"
91
273
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "mcp-server-madeonsol",
3
- "version": "1.18.0",
3
+ "version": "1.20.0",
4
4
  "mcpName": "io.github.MadeOnSol/madeonsol",
5
- "description": "MCP server for MadeOnSol Solana KOL intelligence API — use from Claude, Cursor, or any MCP client",
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; new customers get a 5-day free trial of Pro or Ultra by card.",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "mcp-server-madeonsol": "dist/index.js"