madeonsol_kol_hot_tokens
Identify tokens with increasing KOL buyer interest as early signals. Filter by buyer quality and strategy diversity with PRO+ options.
Instructions
KOL momentum tokens — tokens with accelerating KOL buy interest, early signals before coordination triggers. PRO+ adds buyer-quality filters.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Time period: 1h or 6h | 6h |
| min_kols | No | Minimum KOL buyers to include a token | |
| limit | No | Number of hot tokens to return | |
| min_avg_winrate | No | PRO+: require avg winrate_7d of buyers >= N (0-100) | |
| unique_strategies | No | PRO+: require >= N distinct strategies among buyers |
Implementation Reference
- src/index.ts:236-253 (handler)The full tool definition including handler function for 'madeonsol_kol_hot_tokens'. It calls query('/api/x402/kol/tokens/hot') with period, min_kols, limit, and optional PRO+ filters min_avg_winrate and unique_strategies.
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.", { period: z.enum(["1h", "6h"]).default("6h").describe("Time period: 1h or 6h"), min_kols: z.number().min(1).max(20).default(1).describe("Minimum KOL buyers to include a token"), limit: z.number().min(1).max(50).default(20).describe("Number of hot tokens to return"), min_avg_winrate: z.number().optional().describe("PRO+: require avg winrate_7d of buyers >= N (0-100)"), unique_strategies: z.number().optional().describe("PRO+: require >= N distinct strategies among buyers"), }, readOnlyAnnotations, async ({ period, min_kols, limit, min_avg_winrate, unique_strategies }) => { 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; return { content: [{ type: "text" as const, text: await query("/api/x402/kol/tokens/hot", params) }] }; } ); - src/index.ts:239-245 (schema)Zod input schema for the tool: period (1h|6h), min_kols (1-20), limit (1-50), and optional PRO+ params min_avg_winrate and unique_strategies.
{ period: z.enum(["1h", "6h"]).default("6h").describe("Time period: 1h or 6h"), min_kols: z.number().min(1).max(20).default(1).describe("Minimum KOL buyers to include a token"), limit: z.number().min(1).max(50).default(20).describe("Number of hot tokens to return"), min_avg_winrate: z.number().optional().describe("PRO+: require avg winrate_7d of buyers >= N (0-100)"), unique_strategies: z.number().optional().describe("PRO+: require >= N distinct strategies among buyers"), }, - src/index.ts:236-253 (registration)Tool registration via server.tool('madeonsol_kol_hot_tokens', ...) inside the registerTools function.
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.", { period: z.enum(["1h", "6h"]).default("6h").describe("Time period: 1h or 6h"), min_kols: z.number().min(1).max(20).default(1).describe("Minimum KOL buyers to include a token"), limit: z.number().min(1).max(50).default(20).describe("Number of hot tokens to return"), min_avg_winrate: z.number().optional().describe("PRO+: require avg winrate_7d of buyers >= N (0-100)"), unique_strategies: z.number().optional().describe("PRO+: require >= N distinct strategies among buyers"), }, readOnlyAnnotations, async ({ period, min_kols, limit, min_avg_winrate, unique_strategies }) => { 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; return { content: [{ type: "text" as const, text: await query("/api/x402/kol/tokens/hot", params) }] }; } ); - src/index.ts:60-80 (helper)The query() helper function used by the handler to make authenticated API calls to the MadeOnSol backend.
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); }