Skip to main content
Glama
Coinversaa

Coinversaa Pulse

Official

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

TableJSON Schema
NameRequiredDescriptionDefault
useToonFormatNoReturn 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"))
    );
  • 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"))
  • Input schema for pulse_cohort_summary. Only accepts a single optional boolean 'useToonFormat' (default true) for compact toon format output.
    inputSchema: { useToonFormat: useToonFormatSchema },
  • 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");
    }
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must fully disclose behavior. It transparently lists the output structure (PnL tiers, size tiers, and their attributes). However, it does not mention data freshness, update frequency, or any potential side effects. For a read-only analysis tool, the description is largely sufficient but could be enhanced with temporal context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with only three sentences. It front-loads the primary action ('Get behavioral cohort analysis'), immediately explains the return data, and ends with a helpful cross-reference. Every sentence adds value without verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has a single optional parameter and no output schema, the description does a good job of explaining the return structure and providing a useful sibling reference. However, it could be more complete by mentioning any time range (e.g., all-time vs recent) or how the cohorts are defined, which would further aid the agent's decision-making.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one parameter (useToonFormat) with 100% description coverage in the schema; the tool description adds no additional meaning beyond the schema's existing description. According to the guidelines, when schema coverage is high (>80%), a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it returns 'behavioral cohort analysis across every tracked wallet on Hyperliquid' with detailed breakdowns of PnL tiers and size tiers, including wallet count, avg PnL, avg win rate, and total volume. This clearly distinguishes it from sibling tools like pulse_cohort_history or pulse_cohort_positions, which focus on history or positions rather than a summary snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises that to get the current tracked-wallet total, one should call pulse_global_stats first, providing a clear prerequisite. It also claims the data is 'unique intelligence nobody else has,' implying there is no alternative for this specific analysis. However, it does not explicitly state when to use this tool over others or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Coinversaa/mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server