madeonsol_kol_coordination
Detect tokens with multiple KOL accumulations using a coordination score, peak activity window, and market cap context to identify early cluster formations.
Instructions
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.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Time period for coordination analysis | 24h |
| min_kols | No | Minimum number of KOLs converging on the same token | |
| limit | No | Number of coordination signals to return | |
| min_avg_winrate | No | PRO+: require cluster avg winrate_7d >= N (0-100) | |
| unique_strategies | No | PRO+: require >= N distinct strategies in cluster | |
| include_majors | No | v1.1: include major memecoins (WIF/BONK/POPCAT). Default false. | |
| window_minutes | No | v1.1: peak-density window (1-60). Default 15. | |
| min_score | No | v1.1: minimum composite coordination_score (0-100). |
Implementation Reference
- src/index.ts:114-137 (registration)Tool registration for 'madeonsol_kol_coordination' using server.tool() — defines the tool name, description, Zod schema, and handler callback.
server.tool( "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.", { period: z.enum(["1h", "6h", "24h", "7d"]).default("24h").describe("Time period for coordination analysis"), min_kols: z.number().min(2).max(50).default(3).describe("Minimum number of KOLs converging on the same token"), limit: z.number().min(1).max(50).default(20).describe("Number of coordination signals to return"), min_avg_winrate: z.number().optional().describe("PRO+: require cluster avg winrate_7d >= N (0-100)"), unique_strategies: z.number().optional().describe("PRO+: require >= N distinct strategies in cluster"), include_majors: z.boolean().optional().describe("v1.1: include major memecoins (WIF/BONK/POPCAT). Default false."), window_minutes: z.number().min(1).max(60).optional().describe("v1.1: peak-density window (1-60). Default 15."), min_score: z.number().min(0).max(100).optional().describe("v1.1: minimum composite coordination_score (0-100)."), }, readOnlyAnnotations, async ({ period, min_kols, limit, min_avg_winrate, unique_strategies, include_majors, window_minutes, min_score }) => { const params: Record<string, string | number> = { period, min_kols, limit }; if (min_avg_winrate !== undefined) params.min_avg_winrate = min_avg_winrate; if (unique_strategies !== undefined) params.unique_strategies = unique_strategies; if (include_majors !== undefined) params.include_majors = include_majors ? "true" : "false"; if (window_minutes !== undefined) params.window_minutes = window_minutes; if (min_score !== undefined) params.min_score = min_score; return { content: [{ type: "text" as const, text: await query("/api/x402/kol/coordination", params) }] }; } ); - src/index.ts:128-137 (handler)Handler function that collects parameters and calls query('/api/x402/kol/coordination', params) to fetch KOL convergence signals from the MadeOnSol API.
async ({ period, min_kols, limit, min_avg_winrate, unique_strategies, include_majors, window_minutes, min_score }) => { const params: Record<string, string | number> = { period, min_kols, limit }; if (min_avg_winrate !== undefined) params.min_avg_winrate = min_avg_winrate; if (unique_strategies !== undefined) params.unique_strategies = unique_strategies; if (include_majors !== undefined) params.include_majors = include_majors ? "true" : "false"; if (window_minutes !== undefined) params.window_minutes = window_minutes; if (min_score !== undefined) params.min_score = min_score; return { content: [{ type: "text" as const, text: await query("/api/x402/kol/coordination", params) }] }; } ); - src/index.ts:117-126 (schema)Zod input schema for the tool: period (1h/6h/24h/7d), min_kols (2-50), limit (1-50), and optional PRO+ filters (min_avg_winrate, unique_strategies, include_majors, window_minutes, min_score).
{ period: z.enum(["1h", "6h", "24h", "7d"]).default("24h").describe("Time period for coordination analysis"), min_kols: z.number().min(2).max(50).default(3).describe("Minimum number of KOLs converging on the same token"), limit: z.number().min(1).max(50).default(20).describe("Number of coordination signals to return"), min_avg_winrate: z.number().optional().describe("PRO+: require cluster avg winrate_7d >= N (0-100)"), unique_strategies: z.number().optional().describe("PRO+: require >= N distinct strategies in cluster"), include_majors: z.boolean().optional().describe("v1.1: include major memecoins (WIF/BONK/POPCAT). Default false."), window_minutes: z.number().min(1).max(60).optional().describe("v1.1: peak-density window (1-60). Default 15."), min_score: z.number().min(0).max(100).optional().describe("v1.1: minimum composite coordination_score (0-100)."), }, - src/index.ts:60-80 (helper)The query() helper function used by the handler to make authenticated HTTP requests to the MadeOnSol API, handling x402 vs API-key auth and routing to /api/v1/ vs /api/x402/ paths.
async function query(path: string, params?: Record<string, string | number>) { // API key uses /api/v1/ endpoints; x402 uses /api/x402/ const apiPath = authMode === "x402" || authMode === "none" ? path : path.replace("/api/x402/", "/api/v1/"); const url = new URL(apiPath, BASE_URL); if (params) { for (const [k, v] of Object.entries(params)) { if (v !== undefined) url.searchParams.set(k, String(v)); } } const headers = apiKeyHeaders(); const res = authMode === "x402" ? await paidFetch(url.toString()) : await fetch(url.toString(), { headers }); if (!res.ok) { const body = await res.text().catch(() => ""); return `Error ${res.status}: ${body}`; } return JSON.stringify(await res.json(), null, 2); }