pulse_cohort_summary
Get behavioral cohort analysis for wallets tracked on Hyperliquid. View PnL and size tiers with wallet count, average PnL, win rate, and total volume.
Instructions
Get behavioral cohort analysis across every tracked wallet on Hyperliquid. Returns PnL tiers (money_printer, smart_money, grinder, humble_earner, exit_liquidity, semi_rekt, full_rekt, giga_rekt) and size tiers (leviathan, tidal_whale, whale, etc). Each tier shows wallet count, avg PnL, avg win rate, and total volume. This is unique intelligence nobody else has. For the current tracked-wallet total, call pulse_global_stats first.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| useToonFormat | No | Return data in compact toon format (default: true). Set to false for standard JSON. |
Implementation Reference
- src/index.ts:394-402 (registration)Registration of the pulse_cohort_summary tool via server.registerTool(). Maps to API endpoint /pulse/cohorts/summary. Accepts only useToonFormat input.
// ══════════════════════════════════════════════════════════ if (shouldRegister("pulse_cohort_summary")) server.registerTool( "pulse_cohort_summary", { description: "Get behavioral cohort analysis across every tracked wallet on Hyperliquid. Returns PnL tiers (money_printer, smart_money, grinder, humble_earner, exit_liquidity, semi_rekt, full_rekt, giga_rekt) and size tiers (leviathan, tidal_whale, whale, etc). Each tier shows wallet count, avg PnL, avg win rate, and total volume. This is unique intelligence nobody else has. For the current tracked-wallet total, call pulse_global_stats first.", inputSchema: { useToonFormat: useToonFormatSchema }, }, async ({ useToonFormat }) => toolResult(await callAPI(useToonFormat, "/pulse/cohorts/summary")) ); - src/index.ts:401-401 (handler)Handler function for pulse_cohort_summary. Calls the API at /pulse/cohorts/summary with optional toon format encoding and wraps result via toolResult().
async ({ useToonFormat }) => toolResult(await callAPI(useToonFormat, "/pulse/cohorts/summary")) - src/index.ts:399-399 (schema)Input schema for pulse_cohort_summary. Only accepts a single optional boolean 'useToonFormat' (default true) for compact toon format output.
inputSchema: { useToonFormat: useToonFormatSchema }, - src/index.ts:94-166 (helper)Generic API helper used by the handler to make HTTP requests to the Coinversa backend with timeout, retry logic, and error handling.
async function callAPI(useToon: boolean, path: string, params?: Record<string, string>): Promise<any> { const url = new URL(`${BASE}${path}`); if (params) { Object.entries(params).forEach(([key, value]) => { if (value !== undefined && value !== "") { url.searchParams.set(key, value); } }); } let lastError: Error | null = null; for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) { try { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); const headers: Record<string, string> = {}; if (API_KEY) headers["X-API-Key"] = API_KEY; const response = await fetch(url.toString(), { headers, signal: controller.signal, }); clearTimeout(timeout); if (response.status === 429) { // Rate limited — retry after delay if (attempt < MAX_RETRIES) { await new Promise((r) => setTimeout(r, RETRY_DELAY_MS * (attempt + 1))); continue; } throw new Error("Rate limit exceeded. Please wait a moment and try again."); } if (response.status === 404) { throw new Error("Not found. The requested resource does not exist — check the address or symbol."); } if (response.status === 401) { throw new Error("Invalid API key. Check your COINVERSAA_API_KEY environment variable."); } if (!response.ok) { const body = await response.json().catch(() => null); const msg = body?.error || response.statusText; throw new Error(`Request failed (${response.status}): ${msg}`); } const data = await response.json(); return useToon ? toonEncode(data) : data; } catch (err: any) { if (err.name === "AbortError") { lastError = new Error("Request timed out after 30 seconds. The server may be under heavy load — try again."); } else if (err.cause?.code === "ECONNREFUSED" || err.cause?.code === "ENOTFOUND") { lastError = new Error("Cannot connect to the Coinversa API. Check your COINVERSAA_API_URL setting and network connection."); } else { lastError = err; } // Retry on transient network errors if (attempt < MAX_RETRIES && (err.name === "AbortError" || err.cause?.code === "ECONNRESET")) { await new Promise((r) => setTimeout(r, RETRY_DELAY_MS * (attempt + 1))); continue; } throw lastError; } } throw lastError || new Error("Request failed after retries"); }