madeonsol_kol_timing
Analyzes a KOL's entry and exit timing, showing hold duration, exit speed, and activity patterns over 7 or 30 days.
Instructions
KOL entry/exit timing profile — hold duration, exit speed, and activity patterns for a specific KOL.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | Yes | KOL wallet address (base58) | |
| period | No | Time period: 7d or 30d | 30d |
Implementation Reference
- src/index.ts:207-215 (handler)The handler function for madeonsol_kol_timing. It accepts 'wallet' (base58 address) and 'period' (7d or 30d) parameters. When using a MadeOnSol API key, it fetches from /api/v1/kol/{wallet}/timing?period={period}. Otherwise returns an error message instructing the user to get an API key.
async ({ wallet, period }) => { if (authMode === "madeonsol") { const headers: Record<string, string> = { ...apiKeyHeaders() }; const res = await fetch(`${BASE_URL}/api/v1/kol/${wallet}/timing?period=${period}`, { headers }); if (!res.ok) { const body = await res.text().catch(() => ""); return { content: [{ type: "text" as const, text: `Error ${res.status}: ${body}` }] }; } return { content: [{ type: "text" as const, text: JSON.stringify(await res.json(), null, 2) }] }; } return { content: [{ type: "text" as const, text: "KOL timing requires MADEONSOL_API_KEY (msk_) — get one free at madeonsol.com/pricing." }] }; } - src/index.ts:202-205 (schema)Zod schema for madeonsol_kol_timing input: wallet (base58 string, required) and period (enum '7d' or '30d', defaults to '30d').
{ wallet: z.string().describe("KOL wallet address (base58)"), period: z.enum(["7d", "30d"]).default("30d").describe("Time period: 7d or 30d"), }, - src/index.ts:199-216 (registration)Registration of the 'madeonsol_kol_timing' tool on the McpServer via server.tool(), within the registerTools() function.
server.tool( "madeonsol_kol_timing", "KOL entry/exit timing profile — hold duration, exit speed, and activity patterns for a specific KOL.", { wallet: z.string().describe("KOL wallet address (base58)"), period: z.enum(["7d", "30d"]).default("30d").describe("Time period: 7d or 30d"), }, readOnlyAnnotations, async ({ wallet, period }) => { if (authMode === "madeonsol") { const headers: Record<string, string> = { ...apiKeyHeaders() }; const res = await fetch(`${BASE_URL}/api/v1/kol/${wallet}/timing?period=${period}`, { headers }); if (!res.ok) { const body = await res.text().catch(() => ""); return { content: [{ type: "text" as const, text: `Error ${res.status}: ${body}` }] }; } return { content: [{ type: "text" as const, text: JSON.stringify(await res.json(), null, 2) }] }; } return { content: [{ type: "text" as const, text: "KOL timing requires MADEONSOL_API_KEY (msk_) — get one free at madeonsol.com/pricing." }] }; } );