# madeonsol [Health: Active]

**Category:** 💰 Finance & Fintech  
**Repository:** https://github.com/madeonsol/mcp-server-madeonsol.git  
**GitHub Stars:** 2  
**npm Downloads (last month):** 1696  
**Views:** 2  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/madeonsol

## Description
Solana KOL trading intelligence & deployer analytics via x402 micropayments or API key.

## Tools
Capabilities this server exposes over MCP:

- **madeonsol_kol_feed** — Get real-time Solana KOL trades from 1,000+ tracked wallets. Each trade includes the token's market cap (USD) at the moment of trade — sourced from our in-memory price tracker, accurate to the millisecond, faster than Dexscreener spot. PRO+ adds size/age/strategy/winrate filters.
- **madeonsol_kol_coordination** — KOL convergence signals (v1.2) — tokens being accumulated by multiple KOLs. Response includes peak_kols/peak_buys (busiest window slice), exited_count (net-flow-negative wallets), 0-100 coordination_score, and (v1.2 / 2026-05-06) market_cap_usd_at_first_buy + market_cap_usd + last_price_usd so you can see whether the cluster formed at micro-cap or after the chart was already running. Blacklist filters WIF/BONK/stables by default.
- **madeonsol_kol_leaderboard** — Get KOL performance rankings by PnL and win rate. PRO+ can sort by alternative axes (winrate/volume/avg_roi/profit_factor/early_entry_pct/consistency).
- **madeonsol_deployer_alerts** — Get real-time alerts from Pump.fun deployers with KOL buy enrichment. Filters: deployer tier, alert_type, priority, and min_kol_buys to gate out noise. Cursor-paginated via 'before' (preferred over 'offset' at scale).
- **madeonsol_kol_pairs** — KOL affinity matrix — discover which KOLs frequently co-trade the same tokens within a time window.
- **madeonsol_kol_timing** — KOL entry/exit timing profile — hold duration, exit speed, and activity patterns for a specific KOL.
- **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).
- **madeonsol_deployer_stats** — Ecosystem-wide Pump.fun deployer stats — tracked_count (how many deployers we grade), signals_today, bonds_detected, the chain-wide bond_rate, and a per-tier count (elite/good/rising). Use this to size expectations before reading the leaderboard: a bond_rate of ~0.02 chain-wide is what makes an elite deployer's 0.30 meaningful. Requires an msk_ key.
- **madeonsol_deployer_leaderboard** — Pump.fun deployer reputation leaderboard, ranked by bonding rate, recent form, total bonded, or last deploy. Unranked deployers are excluded. IMPORTANT: compare bonding_rate (LIFETIME) against recent_bond_rate (ROLLING) — the gap between them is the signal, not either number alone; a deployer at 0.40 lifetime and 0.05 recent is cooling off. runner_rate (share of labeled tokens that ran rather than dumped) is only meaningful once labeled_tokens >= 3. Requires an msk_ key.
- **madeonsol_deployer_profile** — One Pump.fun deployer's profile. Returns is_deployer, deployer (tier, lifetime bonding_rate, recent_bond_rate, total_tokens_deployed, total_bonded, first_seen_at, last_deploy_at, avg_time_to_bond_minutes, runner_rate, labeled_tokens), pump_stats, pump_tokens and launchpad_tokens. NOTE: an untracked wallet returns HTTP 200 with is_deployer=false and deployer=null, NOT a 404, so check is_deployer and deployer.total_tokens_deployed before concluding anything about a wallet. Gate runner_rate on labeled_tokens >= 3. Requires an msk_ key.
- **madeonsol_deployer_tokens** — Every token deployed by one Pump.fun wallet, paginated — each row with deployed_at, bonded_at, time-to-bond and peak market cap. Use only_bonded to see just the graduations. Pair with madeonsol_deployer_profile to check whether a deployer's record comes from a few big winners or a consistent rate. Requires an msk_ key.
- **madeonsol_deployer_alert_stats** — Deployer alert volume over a lookback window, with bond-rate and market-cap-multiplier distributions (pct_2x / pct_5x / pct_10x / pct_50x, avg and best) broken out per tier. This is the tool for sizing and monitoring deployer-hunter usage, and for answering 'how often does an elite-tier alert actually 10x?' with a number instead of a guess. Requires an msk_ key.
- **madeonsol_deployer_best_tokens** — Best-performing recent tokens launched by RANKED (non-unranked) Pump.fun deployers, by peak market cap multiple over the alert price. Each row carries the deployer wallet and tier alongside mc_at_bond, peak_market_cap and mc_multiplier. Requires an msk_ key.
- **madeonsol_deployer_recent_bonds** — Tokens from tracked Pump.fun deployers that just graduated to Raydium, newest first, each with time_to_bond_minutes, mc_at_bond, peak market cap and the full deployer reputation block. POLL INCREMENTALLY: pass the previous response's next_since back as `since` to get only what bonded after it — do not re-fetch the whole window. Requires an msk_ key.
- **madeonsol_kol_hot_tokens** — KOL momentum tokens — tokens with accelerating KOL buy interest, early signals before coordination triggers. PRO+ adds buyer-quality filters.
- **madeonsol_kol_token_entry_order** — Ranked KOL first-buyers for a specific token, ordered by entry timestamp. PRO+ adds percentile_pnl_7d per entry.
- **madeonsol_kol_compare_wallets** — Side-by-side comparison of 2-5 KOL wallets — strategy, winrates, ROI, percentile. PRO+ adds 30d overlap tokens (bought by 2+ of the wallets).
- **madeonsol_kol_alerts_recent** — Live KOL alert feed — consensus clusters, fresh-token KOL buys, and heating-up wallets in one unified stream.
- **madeonsol_kol_pnl** — Deep per-wallet PnL breakdown — realized PnL, win rate, profit factor, max drawdown, daily equity curve, closed/open positions. BASIC: summary only. PRO: + curve + closed. ULTRA: + open positions.
- **madeonsol_kol_trending_tokens** — Tokens ranked by KOL buy volume — pure capital-flow signal. Sub-hour periods (5m/15m/30m) require PRO/ULTRA.
- **madeonsol_sniper_recent** — Early deploy instruction observations. Tier: ULTRA. ULTRA/BUSINESS/ENTERPRISE API key required; unavailable via x402. An observation is not proof of successful execution. No guaranteed lead time. Use action identity and separate execution status; footprint can be null.
- **madeonsol_sniper_by_deployer** — Early deploy observations filtered to one deployer wallet. Tier: ULTRA. BUSINESS and ENTERPRISE are also eligible; execution is initially unknown.
- **madeonsol_sniper_watchlist_list** — List your custom sniper watchlist (tracked deployer wallets, any tier). Tier: ULTRA. BUSINESS and ENTERPRISE are also eligible. Added 2026-09-10.
- **madeonsol_sniper_watchlist_add** — Add one or many deployer wallets to your sniper watchlist — narrows madeonsol_sniper_recent(watchlist:true) to just these. Tier: ULTRA. BUSINESS and ENTERPRISE are also eligible. Added 2026-09-10.
- **madeonsol_sniper_watchlist_remove** — Remove a deployer wallet from your sniper watchlist. Tier: ULTRA. BUSINESS and ENTERPRISE are also eligible. Added 2026-09-10.
- **madeonsol_discovery** — List all available MadeOnSol API endpoints with prices and parameter docs. Free, no auth required. Read the current keyless x402 catalog for available endpoints and prices. Examples: token candles ($0.01), almost-bonded ($0.01), top-traders ($0.02), cap-table ($0.02), token flow ($0.01), and deployer trajectory ($0.01).
- **madeonsol_wallet_tracker_watchlist** — List your tracked wallets with labels and remaining watchlist capacity. PRO 50, ULTRA 100, BUSINESS 500 wallets (the Free tier has no wallet tracker).
- **madeonsol_wallet_tracker_add** — Add a Solana wallet to your watchlist. Returns 409 if already tracked or limit reached.
- **madeonsol_wallet_tracker_remove** — Remove a wallet from your watchlist.
- **madeonsol_wallet_tracker_relabel** — Rename (or clear) the label on a wallet already in your watchlist. Added 2026-09-10.
- **madeonsol_wallet_tracker_trades** — Historical swap and transfer events for all your watched wallets (PRO+). Returns { events[], count, ordered_by, next_cursor, next_cursor_slot }; each event has wallet_address, label, event_type, action (buy/sell on swaps, null on transfers), token_mint/symbol/name, sol_amount, token_amount, tx_signature, block_time (ingest clock), slot (chain order), replayed, ingested_at. Page with before_slot = next_cursor_slot (order=slot, the default) or before = next_cursor (order=block_time).
- **madeonsol_wallet_tracker_summary** — Per-wallet stats: swap counts, SOL bought/sold, and last activity time across your watchlist.
- **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+.
- **madeonsol_wallet_pnl** — Full FIFO cost-basis PnL for any wallet: realized + unrealized SOL, profit factor, max drawdown, avg + median hold minutes, daily UTC PnL curve, closed positions sorted by pnl desc (with ROI %, hold time, win/loss), and open positions hydrated with live current prices from the market-cap tracker. Cached with dynamic TTL (5min active / 1h recent / 24h dormant). Cache hits don't count against your daily quota. Cost basis only observable inside the 90-day data window — overflow sells are silently discarded rather than fabricated. PRO+.
- **madeonsol_wallet_positions** — Open positions only for any wallet — lighter slice of madeonsol_wallet_pnl for use cases that don't need the full PnL summary or curve. Each position: token_mint, token_amount, cost_basis_sol, avg_entry_price_sol, current_price_sol (live from mc-tracker; null if delisted), current_value_sol, unrealized_sol, unrealized_pct, first_buy_at. Shares the /pnl cache. PRO+.
- **madeonsol_wallet_holdings** — Verified CURRENT on-chain holdings for any wallet — reads the wallet's actual SPL + Token-2022 token accounts and SOL balance directly from chain, enriches each with our price/MC/name/symbol, and computes transfer_delta (on-chain amount − trade-derived net position, which exposes non-swap flows: airdrops, insider funding, wallet-hopping). Distinct from madeonsol_wallet_positions (trade-derived FIFO): holdings = what the wallet actually holds right now. Returns { address, sol_balance, holdings[], summary (token_accounts, non_zero, returned, priced, total_value_usd, truncated), verified_at, trade_window_days, cache_hit, ttl_seconds }; each holding: mint, symbol, name, amount, amount_raw, decimals, token_program (spl|token2022), price_usd, value_usd, market_cap_usd, is_bonded, trade_derived_amount, transfer_delta. ULTRA only.
- **madeonsol_wallet_trades** — Cursor-paginated raw trades for any wallet. Filter by action (buy/sell), specific token_mint, time window via since/until (Unix seconds; default last 90 days). Cursor encodes (block_time, id) for stable DESC pagination — pass next_cursor from the previous response to fetch older trades. Limit 1-500 (default 100). Each trade carries price_sol/price_usd (THIS trade's executed price = sol_amount / token_amount, the trader's all-in rate incl. swap fee and any account rent) and market_price_sol/market_price_usd (the canonical pool price near that slot, shared by every trade in it) — added 2026-08-16, this route previously returned amounts and no price. PRO+.
- **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.
- **madeonsol_create_webhook** — Register a webhook URL to receive real-time push notifications for KOL trades and deployer alerts. Requires Pro/Ultra subscription.
- **madeonsol_list_webhooks** — List all your registered webhooks with delivery status and failure counts.
- **madeonsol_delete_webhook** — Delete a webhook by ID. Permanently removes the webhook and its delivery history.
- **madeonsol_update_webhook** — Update a webhook's URL, subscribed events, or active state. Only the fields you pass are changed. Added 2026-09-10.
- **madeonsol_test_webhook** — Send a sample event payload to a webhook URL to verify it works. Returns status code, response time and (newer servers) the event type sampled.
- **madeonsol_stream_token** — Get your WebSocket streaming token. Stream tokens NEVER EXPIRE: every call returns the same token until your subscription lapses or you pass rotate=true, which replaces it (the previous value keeps working for 60 s). expires_at / next_refresh_at are always null (kept for wire compatibility); the response also carries rotated (boolean) and lifetime (string). The server never rotates on its own and never sends token_refresh unless you rotated; a 4001 close means 'mint again', never a timer. Authenticate the handshake with 'Authorization: Bearer <token>' (?token= still works, masked in logs). 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) and token:surges (events token:surge — a token < 30 min old running >= 3x / 6x / 8x its launch MC, tier early / strong / breakout, each once per mint, sustained — and token:revival — no trade candle for >= 24 h, then confirmed buys on the tape; every frame carries tape / kol / early_buyers / deployer / risk_flags[]; subscribe filters kinds[], tiers[], launchpads[], exclude_flags[], min_mc_usd / max_mc_usd, deployer_tier[]).
- **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.
- **madeonsol_stream_session_kill** — Evict (force-disconnect) one live WebSocket streaming session by id — frees the connection slot it holds. Returns { evicted: true, id }; 404 { error, id } if no such live session, 400 if id is not a positive integer. PRO/ULTRA only.
- **madeonsol_me** — Inspect your MadeOnSol API account — current tier, daily/burst quota state, remaining requests, subscription expiry, and per-feature usage (webhooks, copy-trade wallets, coordination rules, etc.). Use to self-throttle without parsing rate-limit headers.
- **madeonsol_tokens_list** — Filtered, sortable token directory. Browse all tracked Solana tokens by market-cap band, liquidity floor, recent-activity window, primary DEX, authority/safety flags, and computed 1h volume / MEV-share / MC-change deltas. Default min_liq=2000 skips phantom-MC dust (low-liquidity pools producing absurd VWAP×supply products) — pass min_liq=0 to opt out. Computed filters (min_volume_1h_usd, max_mev_share_pct, mc_change_1h_min_pct, mc_change_1h_max_pct) over-fetch and post-filter — pagination.post_filtered=true on the response means page size may be < limit. PRO+ only.
- **madeonsol_almost_bonded** — Pre-bond pump.fun tokens approaching graduation, ranked by VELOCITY (Δprogress/min) — '95% and accelerating' beats '92% stalled'. Each token is enriched with its deployer's reputation tier. progress_pct comes from on-chain real_token_reserves depletion; velocity_pct_per_min is null until a 5-minute snapshot exists; eta_minutes is a linear projection from current velocity. Returns tokens[] with mint, symbol, name, progress_pct, velocity_pct_per_min, eta_minutes, stalled, real_sol_reserves, market_cap_usd, liquidity_usd, authorities_revoked, deployer_tier, age_minutes. PRO/ULTRA only.
- **madeonsol_alpha_leaderboard** — Top statistically profitable early-buyer wallets, scored from 25,000+ early-buyer records. BASIC=25 (truncated), PRO=100, ULTRA=500 + bot signals.
- **madeonsol_alpha_wallet** — Full alpha profile for one wallet — per-token breakdown + bot_signals array. ULTRA only.
- **madeonsol_alpha_linked** — Wallets behaviorally linked to a target wallet (co-bought 3+ tokens within 2 seconds). ULTRA only.
- **madeonsol_token_cap_table** — First non-deployer early buyers for a token, enriched with PnL, KOL identity, and bot flags. PRO=top 10 (truncated wallets), ULTRA=top 20 (full). BASIC: 403.
- **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.
- **madeonsol_token_risk** — Transparent 0–100 token risk score (higher = riskier): risk evidence for your own policy, not a verdict. Returns a band (enum values 'safe'/'caution'/'danger' label score ranges; they are not a safety guarantee), 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 transfer_status (suspected / none_detected / unknown; transferred_out is its deprecated boolean view). score_version v2 (2026-09-21): the LP factor is 'unknown' unless LP custody is verified — a token-supply burn (token_supply_burn_detected, alias burn_detected) is never LP evidence; assessment.unknown_inputs lists inputs that could not be observed (the band is then never 'safe') and assessment.not_assessed lists dimensions not measured for this token. A failed score-critical read returns HTTP 503 code risk_inputs_unavailable (retry) instead of a score. PRO/ULTRA only — BASIC receives HTTP 403.
- **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).
- **madeonsol_token_bundles** — Every coordinated buy cluster on a Solana token in a window, the launch bundle AND groups that buy together later (madeonsol_token_bundle only scores the first-20 cohort). A cluster = one slot where >= min_wallets distinct wallets bought. Per cluster: slot, at, minutes_after_launch + phase (launch = within 5 min of first sighting, else later), wallet_count, new_wallets (no earlier stored buy of the token), atomic_txs (transactions carrying 3+ of them = definitively coordinated), sol_volume, token_volume, wallets (<= 50) and exit (what those wallets have SOLD since, from the live bundle tracker: wallets sold / exited, sold_pct, realized_sol; null when the cluster is not followed). summary.baseline = buys per active slot (on busy tokens unrelated buyers share slots): evidence, not a verdict. Only STORED buys count (persistence floor 0.05 SOL / $3.50 stable leg; rows before 2026-06-17 have no slot). include_balances adds held_now for the 3 most recent clusters. 503 bundle_clusters_unavailable until the server function exists. PRO+.
- **madeonsol_token_bundle_share** — One 'bundled now' figure for a Solana token: bundled_pct_of_supply_now = share of supply held RIGHT NOW by every bundle wallet (the launch bundle UNION every coordinated cluster in the window, each wallet counted once), read from the chain. Null (with held_now.incomplete_reason) unless every wallet was read: never a partial sum. scope says launch_and_clusters or launch_cohort_only (clusters unavailable). Cached 30 s per (mint, window, min_wallets). Pair with the WS channel token:bundles to re-read on every new cluster or exit. PRO+.
- **madeonsol_kol_token_trades** — Every stored tracked-KOL trade on one Solana token in one payload, newest first (keyset paged with next_cursor + exact has_more): kol_name, wallet, action, sol_amount, token_amount, price and market cap at the trade, tx_signature, traded_at. Filters action, kol (wallet), since (ISO). Only stored trades count (persistence floor 0.05 SOL / $3.50, stated in note). BASIC: 5-min delayed, 20 rows; PRO+ real time.
- **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.
- **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 census is not served (provider refusal for a TRUMP/JUP/BONK-class mega-cap, a timeout, or balances adding up to more than the mint supply): 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.
- **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). PROVENANCE (2026-10-02): every row has provider {id, name, identity verified|compatible|unverified, compatible_with, website_url, lock_url} (Streamflow / Jupiter Lock / Bonfida are identified by program id = verified; lock_url is always null on Solana, no per-lock URL format is proven, never construct one), explorer {lock_account_url, creation_tx_url} (Solana Explorer, cite these as evidence), price_usd (the price behind every *_usd), seconds_until_end (0 once completed, null when perpetual or cancelled/closed) and seconds_until_next_unlock. Claims / cancels / closes / unlocks are pushed on WS token:locks only with filters.lifecycle:true; otherwise poll. PRO+ — BASIC receives HTTP 403.
- **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. Rows carry the same provider / explorer / price_usd / seconds_until_* fields as madeonsol_token_locks. Page back with cursor (pagination.next_cursor, strict keyset, no skips) rather than before. LP locks NOT included. PRO+ — BASIC receives HTTP 403.
- **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.
- **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.
- **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.
- **madeonsol_tokens_surges** — Token SURGES & REVIVALS — token momentum fires, newest first, across all mints. Two kinds share one row shape. kind=surge: a token < 30 min old whose market cap runs hard against its LAUNCH MC (pump.fun launch MC is ~28 SOL by construction, so the multiple is SOL-price-independent), in three tiers that each fire at most once per mint and are independent (a token can go straight to breakout): early (age <= 10 min, MC >= $12k, >= 3x launch) | strong (<= 30 min, >= $30k, >= 6x launch AND >= 2x the lowest sample of the last 3 min — it is climbing NOW) | breakout (<= 2 min, >= $45k, >= 8x). A tier must be SUSTAINED — hold on the current tick and on a sample >= 10 s older — and nothing fires before 20 s of age: a same-slot bundle marked straight to $475k at age 1 s is a spike, not a surge. If the engine first saw the token late (baseline_source=late, restart mid-life) the multiple is NOT applied (USD floor + velocity only). kind=revival: a token with NO 1-minute trade candle for >= 24 h that starts trading again, confirmed ONLY by the tape (>= 5 buys, >= $500 buy volume, MC >= 1.5x the pre-dormancy candle close — or >= 20 buys / >= $5k regardless), never by the price mark (a single dust buy into an empty pool marks MC up 300% and is not a revival); tier is null; one fire per dormancy episode (24 h re-fire guard). Hard GATES on both (not flags): liquidity >= $1.5k AND >= 2% of MC when known, MC <= $100B, and the MC gained must be PAID FOR — buy volume on the tape >= 3% x (MC - launch / pre-dormancy MC); a price mark in a spoof pool moves MC on ~$0 of volume. Every row: id, kind, tier, mint, symbol, name, launchpad (venue at birth), primary_dex (venue at fire time), fired_at, birth_at, birth_source (sniper = pre-confirm deshred deploy | deployer = confirmed create | first_seen = first observed trade, credible only on a launchpad curve), age_seconds, market_cap_usd, liquidity_usd, liquidity_to_mc_ratio, price_usd, baseline_mc_usd, baseline_source, mc_multiple, mc_change_3m_pct, dormant_hours / prev_mc_usd / mc_vs_prev_multiple (revival), peak_mc_usd, pct_of_peak, bonding_progress_pct, is_bonded; tape {since, available, source (candles | wallet_trades — the open minute candle lands only at rollover, so a < 90 s-old surge is measured on live wallet trades), buys, sells, trades, buy_volume_usd, sell_volume_usd, volume_usd, mev_volume_usd, unique_buyers / unique_wallets / trades_per_wallet (ONLY where the mint is in token_trades coverage — wallet_data_available=false otherwise, never an inferred zero)}; kol {buyers, buys, sells, names}; early_buyers {count, bundled (same-block), cohort_sol, sold, sniper_wallets}; deployer {wallet, tier, bonding_rate, total_bonded, total_deployed, runner_rate, labeled_tokens, recent}; mint_authority_revoked, freeze_authority_revoked, is_token_2022; risk_flags[] — THE HONEST HALF: bundled_launch (>= 3 same-block early buyers), few_buyers (< 8 unique buyers, else < 10 buys), wash_pattern (>= 4 trades/wallet across < 15 wallets), thin_liquidity (< $3k or < 3% of MC), cold_deployer, sniper_heavy (>= 3 sniper wallets in the cohort), early_buyers_exiting (>= 50% of a >= 5-wallet cohort sold), sell_pressure (sells > buys), no_tape_trades (price moved but no parsed swap on the tape — real but unmeasured), no_prior_price (revival with unknown pre-dormancy MC), mint_authority_active, transfer_fee. An EMPTY risk_flags means no flag raised, NOT verified clean — absence of data never produces a flag. Rows >= 65 min old carry outcome {mc_usd_1h_after, peak_mc_usd_1h_after, low_mc_usd_1h_after, mc_1h_multiple, peak_1h_multiple, priced_after_1h (false = no candle within the hour, the token stopped being priced — NOT zero)}; stats='1' adds stats.rows[] per (kind, tier) over `days`: fires, with_outcome, up_1h_pct, median_peak_multiple, p75_peak_multiple, median_mc_1h_multiple, doubled_1h_pct — out-of-sample by construction (the fire is recorded before the outcome exists); judge the tiers on these numbers, not on their names. Filters are DB-native (no over-fetch): kind, tier (400 with kind=revival), mint, launchpad, deployer_tier, min_mc_usd / max_mc_usd, min_buys, exclude_flags (comma list — rows carrying ANY are dropped; unknown flag -> 400 with known_flags[]), only_clean='1' (no flags at all). Cursors since= (pagination.next_since) / before= (pagination.next_before). The response echoes the live thresholds in definitions (surge / revival / shared / risk_flags / tiers — read straight from the rule engine, so they cannot drift). Pushed live on the WebSocket channel 'token:surges' (events 'token:surge' / 'token:revival', same object minus outcome; subscribe filters kinds[], tiers[], launchpads[], exclude_flags[], min_mc_usd / max_mc_usd, deployer_tier[]) and accepted by madeonsol_create_webhook as events token:surge / token:revival with the same filters. Retention 60 days. Keyed API only (no x402 route). PRO+ — BASIC receives HTTP 403.
- **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 pool with sufficient authoritative data for depth (see unsupported_pools[].reason; tracked pools may still be listed there). PRO/ULTRA only — BASIC receives HTTP 403.
- **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.
- **madeonsol_deployer_as_of** — A pump.fun deployer's reputation exactly as it stood on a given date — the latest write-on-change snapshot at or before it, so an agent backtests without look-ahead bias. snapshot.snapshot_date can predate the requested date (snapshots are write-on-change); snapshot.carried=true marks that. No snapshot at or before the date returns as_of:false, snapshot:null — nothing is ever synthesized. date must be >= 2026-04-07 and not in the future. PRO/ULTRA only — BASIC receives HTTP 403.
- **madeonsol_deployer_rewards** — pump.fun creator-fee rewards for a wallet, answered two ways that are never merged: collected (what actually reached the wallet — direct vault claims kept 90 days, social-handle claims, shareholder payouts on any token) and attributed (every payout on the tokens it deployed, split to_self/to_others + redirected_pct). Every money field is {sol, usdc, usd}; usd is null (never a silent 0) when a SOL amount exists and no SOL price was available. top_tokens/top_recipients (up to 10, USD-sorted) show where attributed fees went. Works for non-deployers too (is_deployer:false, attributed empty). PRO/ULTRA only — BASIC receives HTTP 403.
- **madeonsol_deployer_activity** — A wallet's deployer activity as one newest-first timeline: launches, dev_buy, dev_sell, dev_token_transfer_out, dev_token_transfer_in, creator transfers, fee claims, funding in and capital out. Realtime dev rows come from persisted dev_exit_events; transfer rows can expose counterparty_count / late_classified and recovered gap rows carry recovered:true (never delivered live; time_basis says whether at is chain block time or the original receive time). Read coverage.families.<family>.complete, retention_boundary / archive_required_before and plan.history before treating an empty range as 'nothing happened'. PRO has no linked-wallet identity projection; ULTRA+ may expose proven identity stitching when current. Paginate with pagination.next_cursor. PRO+ (BASIC receives HTTP 403).
- **madeonsol_token_candles** — Historical OHLCV price candles for a token, aggregated from the on-chain trade firehose. Each candle carries t/open/high/low/close/volume_usd/trades/market_cap_usd. Timeframes: 1m/5m/15m/1h/4h/1d. PRO=OHLCV, last 30 days only. ULTRA adds buy/sell volume + count splits, net flow, MEV volume, open/close liquidity, high/low MC, and full history. PRO/ULTRA only — BASIC receives HTTP 403.
- **madeonsol_token_flow** — Trade-flow aggregate for a token — an organic-vs-fake volume read over a 1h/24h window. Returns 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: high = a small set of wallets churning volume). PRO/ULTRA only — BASIC receives HTTP 403.
- **madeonsol_token_top_traders** — The wallets that made (or lost) the most on a token, ranked by realized PnL or ROI (up to 25 on PRO, 100 on ULTRA). Each trader enriched with KOL identity and alpha-wallet reputation (bot_confidence, historical win rate/PnL) so you can tell smart money from bots. Added 2026-09-10 — this tool was missing despite the endpoint existing on every other surface. PRO/ULTRA only.
- **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, market_price_sol|null, market_price_usd|null, early_buyer_rank|null, slot|null, block_time (unix sec), traded_at (ISO). TWO PRICES, and picking the wrong one gives wrong answers: price_sol is THIS trade's executed price (sol_amount / token_amount — the trader's all-in rate, including swap fee and any account rent, not the pool mid), while market_price_sol is the canonical pool price sampled near that slot and is SHARED by every trade in the slot. Use price_sol for cost basis, fills and PnL; use market_price_sol for a per-token price series independent of trade size and direction. 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.
- **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.
- **madeonsol_tokens_batch_risk** — Bulk token risk scoring (evidence, not a verdict) for up to 50 mints in one call — same per-mint shape as madeonsol_token_risk (0–100 score, band, explainable factors[], raw inputs) plus an as_of ISO timestamp. Untracked mints come back as { mint, error: 'not_tracked' } and do NOT fail the batch; per-mint failures come back as { mint, error: 'error' }. Response preserves de-duplicated input order and carries count (number of unique mints). Counts as ONE request against your quota. PRO/ULTRA only.
- **madeonsol_token_get** — Comprehensive per-mint snapshot: price (VWAP), market cap, 24h volume, deployer reputation, KOL smart-money activity, first_seen_at + age_seconds, and blacklist status — all in one call. ULTRA adds individual KOL wallet addresses in top_buyers[].
- **madeonsol_token_batch** — Bulk lookup of up to 50 mints in one request. Returns the same per-mint shape as madeonsol_token_get. DB queries batched with IN(...); dex-stream + RPC fan-outs run in parallel. ~10-20× cheaper than N sequential calls — ideal for sniper pipelines scoring many tokens at once.
- **madeonsol_copytrade_list** — List your copy-trade rules. Rule limits: PRO 3, ULTRA 20, BUSINESS 100 (Enterprise follows Business).
- **madeonsol_copytrade_create** — Create a copy-trade rule. Returns webhook_secret ONCE on creation when delivery_mode includes 'webhook' — store it to verify HMAC signatures. Source wallets per rule: PRO 5, ULTRA 50, BUSINESS 250 (Enterprise follows Business); the server enforces your tier's limit. Responses may carry source_wallets_tracked / source_wallets_untracked and warnings[] (code untracked_source_wallets or source_wallet_tracking_unavailable). Which source wallets fire depends on the server's engine, reported on every rule as source_admission: any_wallet = any valid Solana wallet fires (KOL or not; no Wallet Tracker entry or quota needed); kol_only (legacy) = only wallets MadeOnSol tracks as KOLs (GET /api/v1/kol/wallets) fire, other wallets are accepted but never produce a signal. operational_state says whether a rule can fire right now (eligible, or monitoring_pending / monitoring_unavailable / source_capacity_unavailable under any_wallet).
- **madeonsol_copytrade_get** — Get one copy-trade rule by id.
- **madeonsol_copytrade_update** — Update fields on a copy-trade rule, including is_active toggle. Omit a field to leave it unchanged; pass null to clear an MC bound. If this update sets a webhook_url on a rule that had no signing secret yet (e.g. a websocket-only rule), the response returns webhook_secret ONCE — store it; an existing secret is never re-shown. Responses may carry source_wallets_tracked / source_wallets_untracked and warnings[] (code untracked_source_wallets or source_wallet_tracking_unavailable): under source_admission kol_only, tell the user which wallets can never fire. Which source wallets fire depends on the server's engine, reported on every rule as source_admission: any_wallet = any valid Solana wallet fires (KOL or not; no Wallet Tracker entry or quota needed); kol_only (legacy) = only wallets MadeOnSol tracks as KOLs (GET /api/v1/kol/wallets) fire, other wallets are accepted but never produce a signal. operational_state says whether a rule can fire right now (eligible, or monitoring_pending / monitoring_unavailable / source_capacity_unavailable under any_wallet).
- **madeonsol_copytrade_delete** — Delete a copy-trade rule permanently.
- **madeonsol_copytrade_signals** — Recent fired copy-trade signals (up to 7 days). Filter by subscription_id, since (ISO8601), limit (1–500), and min_mc_usd / max_mc_usd on the source trade's market cap.
- **madeonsol_coordination_alerts_list** — List your coordination alert rules. PRO=5 rules, ULTRA=20.
- **madeonsol_coordination_alerts_create** — Create a coordination alert rule. Fires within ~1s when a KOL cluster meets thresholds (peak-density scored). Delivered via WebSocket (kol:coordination channel) and/or HMAC-signed webhook. Returns webhook_secret ONCE when delivery_mode includes 'webhook' — store it.
- **madeonsol_coordination_alerts_get** — Get one coordination alert rule by id.
- **madeonsol_coordination_alerts_update** — Update fields on a coordination alert rule, including is_active toggle.
- **madeonsol_coordination_alerts_delete** — Delete a coordination alert rule permanently.
- **madeonsol_kol_first_touches** — Recent first-KOL-touch events — every time a tracked KOL was the first to buy a token mint. Filterable by scout tier (S/A/B/C from mv_kol_scout_score), KOL winrate, token age, etc. Backtest: top scouts attract ≥3 follow-on KOLs within 4h ~50% of the time vs ~14% baseline. Median lead time before second KOL is 12s — for trading this signal, use the WebSocket channel rather than polling.
- **madeonsol_first_touch_subscriptions_list** — List your first-touch webhook subscriptions. ULTRA only.
- **madeonsol_first_touch_subscriptions_create** — Create a first-touch webhook subscription. ULTRA only — up to 10 active. Filters: kol (wallet), mint_suffix, min_first_buy_sol, min_scout_tier (S/A/B/C), min_n_touches. Returns webhook_secret ONCE — store it.
- **madeonsol_first_touch_subscriptions_get** — Get one first-touch subscription by id. ULTRA only.
- **madeonsol_first_touch_subscriptions_update** — Update fields on a first-touch subscription, including is_active toggle. ULTRA only.
- **madeonsol_first_touch_subscriptions_delete** — Delete a first-touch subscription permanently. ULTRA only.
- **madeonsol_price_alerts_list** — List your price alerts. PRO=5 alerts, ULTRA=25. Each alert monitors a token's MC for dip/recovery events.
- **madeonsol_price_alerts_create** — Create a price alert. Captures baseline MC from current token_prices. Fires when MC drops below baseline × (1 − drop_pct/100). Optional recovery_pct fires again on recovery. Returns webhook_secret ONCE — store it.
- **madeonsol_price_alerts_get** — Get one price alert by id.
- **madeonsol_price_alerts_update** — Update alert name, delivery mode, webhook URL, or is_active. Thresholds (drop_pct, recovery_pct) are immutable.
- **madeonsol_price_alerts_delete** — Delete a price alert and its event history.
- **madeonsol_price_alerts_events** — Fired price alert event history (30-day retention). Each event records the dip or recovery moment with actual MC values.
- **madeonsol_scout_leaderboard** — Scout leaderboard — top KOLs ranked by scout score, first-touch frequency, and swarm attraction rate (% of first-touched tokens that attract 3+ follow-on KOLs within 4h). PRO+ (was ULTRA until 2026-09-12).
- **madeonsol_coordination_history** — Coordination history — past coordination alert fires with token, coordination score, KOL count, and timing. PRO+ (was ULTRA until 2026-09-12).
- **madeonsol_kol_consensus** — KOL consensus on a specific token: total buyers/sellers, exit rate, net SOL flow, median entry MC. ULTRA adds individual buyer + exited wallet arrays.
- **madeonsol_peak_history** — Peak MC history for a token: all-time high MC, decline from peak %, MC at bond, MC at 1h/6h/24h/7d after bond, time-to-bond, and deploy/bond timestamps.
- **madeonsol_signal_performance** — Signal performance stats for a named signal — hit rate, sample size, median outcome, and confidence window. Use this to evaluate how well a signal (e.g. 'kol_coordination', 'first_touch') has been predicting token moves before acting on it.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "madeonsol": {
    "command": "npx",
    "args": ["-y","mcp-server-madeonsol"]
  }
}
```

## Documentation

## What madeonsol does

madeonsol exposes the MadeOnSol Solana KOL intelligence API through MCP. It focuses on tracked-wallet trading activity, KOL performance, token momentum, coordinated buying, and Pump.fun deployer behavior. Results can include market capitalization at trade time, wallet performance measures, deployer bonding statistics, token launch history, and alert metadata.

The service supports both keyless x402 pay-per-call access and API-key access. Paid tiers add capabilities such as advanced filtering, short time windows, deeper PnL data, and deployer analytics. Free-tier live feeds may be delayed, while paid keys provide lower-latency access for supported feeds.

## How it works

An MCP-compatible client invokes named tools, which query MadeOnSol endpoints and return structured results. The `madeonsol_discovery` tool lists available API endpoints, prices, and parameter documentation without authentication, helping an agent identify keyless x402 options.

KOL tools cover real-time trades from more than 1,000 tracked wallets, convergence between multiple KOLs, performance rankings, wallet affinity, entry and exit behavior, token momentum, and recent alerts. Deployer tools evaluate Pump.fun creators through bonding rates, recent form, token history, alert outcomes, and graduation activity.

Some workflows are incremental. For example, deployer recent-bond results provide a `next_since` value for polling only newly graduated tokens. Deployer alert results support cursor pagination, and wallet and sniper watchlists provide add, remove, relabel, and list operations where the account tier permits them.

## Setup and configuration

Use the published `mcp-server-madeonsol` package with an MCP client, or connect to the hosted agent-gateway endpoint at `https://madeonsol.com/api/agent-gateway/mcp` using a bearer API key. Claude Desktop and Cursor are named supported clients, and the package is intended for MCP-compatible clients generally.

For the optional Agent Intelligence Gateway, set `MADEONSOL_AGENT_GATEWAY_ENABLED=on` and provide a paid PRO-or-higher `MADEONSOL_API_KEY`. This adds `discover_opportunities`, `evaluate_token`, `inspect_wallet`, `inspect_deployer`, `evaluate_signal`, and `changes_since`. Gateway calls use the normal API quota and do not sign or pay x402 requests.

## Tools and capabilities

- Monitor KOL trades, hot tokens, trending tokens, recent alerts, and token entry order.
- Detect multi-KOL convergence with coordination scores and first-buy market capitalization.
- Compare wallets, inspect PnL, analyze timing, and rank KOL performance.
- Profile Pump.fun deployers, review their tokens, measure bonding behavior, and inspect recent bonds.
- Track deployer alert distributions, best-performing tokens, trajectories, and reputation leaderboards.
- Manage wallet-tracker and ULTRA-tier sniper watchlists.

## Limitations and notes

KOL and deployer features are tier-dependent. Several deployer tools require an `msk_` API key, while sniper observations require ULTRA, BUSINESS, or ENTERPRISE access and are unavailable through x402. A sniper observation is not proof of successful execution and does not guarantee lead time.

An untracked wallet returned by the deployer profile tool is represented with `is_deployer=false` and `deployer=null`, rather than a 404. `runner_rate` should be interpreted only when at least three tokens are labeled. Coordination results exclude WIF, BONK, and stablecoins by default.

The hosted agent-gateway endpoint uses bearer keys and does not implement MCP OAuth. The package's private loopback HTTP adapter should not be exposed as a public service.

_Full upstream README: https://allmcps.com/mcp/madeonsol/readme_

