madeonsol_deployer_alerts
Get real-time Pump.fun deployer alerts enriched with KOL buy data. Filter by deployer tier, alert type, priority, or minimum KOL buys to reduce noise.
Instructions
Get real-time alerts from Pump.fun deployers with KOL buy enrichment. Filters: deployer tier, alert_type, priority, and min_kol_buys to gate out noise. Cursor-paginated via 'before' (preferred over 'offset' at scale).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of deployer alerts to return (1-100) | |
| offset | No | Legacy offset pagination (prefer 'before' for polling) | |
| before | No | Cursor — ISO 8601 timestamp; returns alerts strictly older than this. Pass next_before from the previous response. | |
| since | No | Only alerts after this ISO 8601 timestamp. | |
| tier | No | Filter by deployer tier. PRO/ULTRA only — BASIC callers receive HTTP 403. | |
| alert_type | No | Filter by alert_type (e.g. 'new_deploy', 'bonded'). | |
| priority | No | Filter by alert priority. | |
| min_kol_buys | No | Only alerts where at least N KOLs bought the token (1-100). |
Implementation Reference
- src/index.ts:159-183 (registration)Registration of the 'madeonsol_deployer_alerts' tool on the MCP server via server.tool(), including input schema (Zod) and the handler function.
server.tool( "madeonsol_deployer_alerts", "Get real-time alerts from Pump.fun deployers with KOL buy enrichment. Filters: deployer tier, alert_type, priority, and min_kol_buys to gate out noise. Cursor-paginated via 'before' (preferred over 'offset' at scale).", { limit: z.number().min(1).max(100).default(10).describe("Number of deployer alerts to return (1-100)"), offset: z.number().min(0).default(0).describe("Legacy offset pagination (prefer 'before' for polling)"), before: z.string().optional().describe("Cursor — ISO 8601 timestamp; returns alerts strictly older than this. Pass next_before from the previous response."), since: z.string().optional().describe("Only alerts after this ISO 8601 timestamp."), tier: z.enum(["elite", "good", "moderate", "rising", "cold"]).optional().describe("Filter by deployer tier. PRO/ULTRA only — BASIC callers receive HTTP 403."), alert_type: z.string().optional().describe("Filter by alert_type (e.g. 'new_deploy', 'bonded')."), priority: z.enum(["high", "medium", "low"]).optional().describe("Filter by alert priority."), min_kol_buys: z.number().min(1).max(100).optional().describe("Only alerts where at least N KOLs bought the token (1-100)."), }, readOnlyAnnotations, async ({ limit, offset, before, since, tier, alert_type, priority, min_kol_buys }) => { const params: Record<string, string | number> = { limit, offset }; if (before) params.before = before; if (since) params.since = since; if (tier) params.tier = tier; if (alert_type) params.alert_type = alert_type; if (priority) params.priority = priority; if (min_kol_buys !== undefined) params.min_kol_buys = min_kol_buys; return { content: [{ type: "text" as const, text: await query("/api/x402/deployer-hunter/alerts", params) }] }; } ); - src/index.ts:173-182 (handler)Handler function that constructs the API request parameters and calls the query() helper to fetch deployer alerts from the backend.
async ({ limit, offset, before, since, tier, alert_type, priority, min_kol_buys }) => { const params: Record<string, string | number> = { limit, offset }; if (before) params.before = before; if (since) params.since = since; if (tier) params.tier = tier; if (alert_type) params.alert_type = alert_type; if (priority) params.priority = priority; if (min_kol_buys !== undefined) params.min_kol_buys = min_kol_buys; return { content: [{ type: "text" as const, text: await query("/api/x402/deployer-hunter/alerts", params) }] }; } - src/index.ts:162-171 (schema)Input schema defined with Zod — validates limit (1-100, default 10), offset (default 0), before cursor, since timestamp, tier enum, alert_type string, priority enum, and min_kol_buys number.
{ limit: z.number().min(1).max(100).default(10).describe("Number of deployer alerts to return (1-100)"), offset: z.number().min(0).default(0).describe("Legacy offset pagination (prefer 'before' for polling)"), before: z.string().optional().describe("Cursor — ISO 8601 timestamp; returns alerts strictly older than this. Pass next_before from the previous response."), since: z.string().optional().describe("Only alerts after this ISO 8601 timestamp."), tier: z.enum(["elite", "good", "moderate", "rising", "cold"]).optional().describe("Filter by deployer tier. PRO/ULTRA only — BASIC callers receive HTTP 403."), alert_type: z.string().optional().describe("Filter by alert_type (e.g. 'new_deploy', 'bonded')."), priority: z.enum(["high", "medium", "low"]).optional().describe("Filter by alert priority."), min_kol_buys: z.number().min(1).max(100).optional().describe("Only alerts where at least N KOLs bought the token (1-100)."), }, - src/index.ts:60-80 (helper)The query() helper function used by the handler to make the actual HTTP request to the MadeOnSol API (either /api/x402/ or /api/v1/ depending on auth mode).
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); }