Skip to main content
Glama
LamboPoewert

MadeOnSol — Solana memecoin intelligence

madeonsol_create_webhook

Register a webhook URL to get real-time push notifications for KOL trades and deployer alerts. Requires Pro/Ultra subscription.

Instructions

Register a webhook URL to receive real-time push notifications for KOL trades and deployer alerts. Requires Pro/Ultra subscription.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesHTTPS webhook URL to receive events
eventsYesEvent types to subscribe to
min_solNoOptional: minimum SOL amount filter (for kol:trade)
actionNoOptional: filter by buy or sell only
deployer_tierNoOptional: filter by deployer tiers, e.g. ['elite', 'good']

Implementation Reference

  • The handler function for madeonsol_create_webhook. It sends a POST request to /api/v1/webhooks with url, events, and optional filters (min_sol, action, deployer_tier) via the restQuery helper.
    async ({ url, events, min_sol, action, deployer_tier }) => {
      const filters: Record<string, unknown> = {};
      if (min_sol) filters.min_sol = min_sol;
      if (action) filters.action = action;
      if (deployer_tier) filters.deployer_tier = deployer_tier;
      return { content: [{ type: "text" as const, text: await restQuery("POST", "/webhooks", { url, events, filters }) }] };
    }
  • Zod schema for madeonsol_create_webhook: requires url (HTTPS), events (array of kol:trade|kol:coordination|deployer:alert|deployer:bond), and optional min_sol, action, deployer_tier.
    {
      url: z.string().url().describe("HTTPS webhook URL to receive events"),
      events: z.array(z.enum(["kol:trade", "kol:coordination", "deployer:alert", "deployer:bond"])).min(1).describe("Event types to subscribe to"),
      min_sol: z.number().optional().describe("Optional: minimum SOL amount filter (for kol:trade)"),
      action: z.enum(["buy", "sell"]).optional().describe("Optional: filter by buy or sell only"),
      deployer_tier: z.array(z.string()).optional().describe("Optional: filter by deployer tiers, e.g. ['elite', 'good']"),
    },
  • src/index.ts:470-488 (registration)
    Tool registration via server.tool() with name 'madeonsol_create_webhook', description, schema annotations, and the handler callback.
    server.tool(
      "madeonsol_create_webhook",
      "Register a webhook URL to receive real-time push notifications for KOL trades and deployer alerts. Requires Pro/Ultra subscription.",
      {
        url: z.string().url().describe("HTTPS webhook URL to receive events"),
        events: z.array(z.enum(["kol:trade", "kol:coordination", "deployer:alert", "deployer:bond"])).min(1).describe("Event types to subscribe to"),
        min_sol: z.number().optional().describe("Optional: minimum SOL amount filter (for kol:trade)"),
        action: z.enum(["buy", "sell"]).optional().describe("Optional: filter by buy or sell only"),
        deployer_tier: z.array(z.string()).optional().describe("Optional: filter by deployer tiers, e.g. ['elite', 'good']"),
      },
      webhookAnnotations,
      async ({ url, events, min_sol, action, deployer_tier }) => {
        const filters: Record<string, unknown> = {};
        if (min_sol) filters.min_sol = min_sol;
        if (action) filters.action = action;
        if (deployer_tier) filters.deployer_tier = deployer_tier;
        return { content: [{ type: "text" as const, text: await restQuery("POST", "/webhooks", { url, events, filters }) }] };
      }
    );
  • The restQuery helper function used by the handler to make REST API calls with authentication headers.
    async function restQuery(method: string, path: string, body?: unknown): Promise<string> {
      const headers: Record<string, string> = {
        "Content-Type": "application/json",
        ...apiKeyHeaders(),
      };
      const res = await fetch(`${BASE_URL}/api/v1${path}`, {
        method,
        headers,
        ...(body ? { body: JSON.stringify(body) } : {}),
      });
      if (!res.ok) {
        const text = await res.text().catch(() => "");
        return `Error ${res.status}: ${text}`;
      }
      return JSON.stringify(await res.json(), null, 2);
    }
Behavior3/5

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

Annotations already indicate mutation (readOnlyHint=false) and non-idempotence (idempotentHint=false). The description adds the subscription requirement but fails to disclose risk of duplicate webhooks, side effects, or required authentication beyond subscription. Minimal value added over annotations.

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?

Two concise sentences: first explains purpose and benefit, second adds a critical prerequisite. No redundant or filler content. Front-loaded with the core action.

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

Completeness3/5

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

The description is functional but lacks return value details (no output schema). It doesn't mention management via related tools (list, delete, test). Given the tool's complexity and sibling context, it could provide more guidance on expected behavior after creation.

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?

Input schema provides 100% parameter descriptions, and the tool description does not add extra meaning beyond the schema. Since schema coverage is high, a baseline of 3 is appropriate. No parameter-level enrichment in description.

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 clearly states the action ('Register a webhook URL') and the specific purpose ('receive real-time push notifications for KOL trades and deployer alerts'). It distinguishes from sibling webhook tools (delete, list, test) by being the creation operation, and from other alert creation tools by its subscription scope.

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

Usage Guidelines3/5

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

The description mentions the subscription prerequisite but does not explicitly guide when to use this tool versus siblings like 'madeonsol_coordination_alerts_create' or 'madeonsol_deployer_alerts'. No when-not or alternative references, leaving the agent to infer from event type options.

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