Skip to main content
Glama
LamboPoewert

MadeOnSol — Solana memecoin intelligence

madeonsol_kol_coordination

Read-onlyIdempotent

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

TableJSON Schema
NameRequiredDescriptionDefault
periodNoTime period for coordination analysis24h
min_kolsNoMinimum number of KOLs converging on the same token
limitNoNumber of coordination signals to return
min_avg_winrateNoPRO+: require cluster avg winrate_7d >= N (0-100)
unique_strategiesNoPRO+: require >= N distinct strategies in cluster
include_majorsNov1.1: include major memecoins (WIF/BONK/POPCAT). Default false.
window_minutesNov1.1: peak-density window (1-60). Default 15.
min_scoreNov1.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) }] };
      }
    );
  • 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) }] };
      }
    );
  • 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)."),
    },
  • 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);
    }
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint. The description adds substantive behavioral context: default blacklist of stables/majors, response fields (peak_kols, exited_count, coordination_score, market caps), and version info. This goes beyond annotations by detailing what the tool returns and filtering behavior.

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 front-loaded with the purpose, then efficiently lists response fields, filtering defaults, and version info in two sentences. No superfluous words; each phrase adds value. It is concise yet comprehensive for a tool of this complexity.

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 no output schema, the description adequately covers the response fields (peak_kols, coordination_score, market caps) and default filtering. It could mention sort order or whether the list is deterministic, but the `limit` parameter implies top signals. Overall, it is sufficient for typical use.

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?

Schema description coverage is 100% with each parameter having a clear description. The description does not add significant meaning beyond what the schema already provides. For example, 'period' is described in the schema, and the description does not elaborate further. The baseline of 3 is appropriate since the schema handles semantics well.

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 begins with a specific verb phrase 'KOL convergence signals' and elaborates with what the tool does: tokens accumulated by multiple KOLs. It clearly distinguishes from siblings like madeonsol_kol_feed (individual actions) and madeonsol_kol_hot_tokens (ranking) by focusing on multiple KOLs converging.

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 implicitly differentiates from sibling tools by specifying 'convergence' and response fields (coordination_score, market cap data). It mentions the default blacklist and optional inclusion of majors, providing context for when to adjust parameters. However, it does not explicitly state when not to use this tool or name alternative tools.

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/LamboPoewert/mcp-server-madeonsol'

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