madeonsol_token_buyer_quality
Scores a token's first-buyer cohort from 0 to 100. Basic tier provides signal; PRO/ULTRA offers full buyer-quality breakdown.
Instructions
0–100 buyer-quality score for a token's first-buyer cohort. 5-min cached. BASIC: score+signal only. PRO/ULTRA: full breakdown.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| mint | Yes | Token mint address (base58) |
Implementation Reference
- src/index.ts:634-642 (registration)Registration of the 'madeonsol_token_buyer_quality' tool using server.tool() — the MCP tool registration call.
server.tool( "madeonsol_token_buyer_quality", "0–100 buyer-quality score for a token's first-buyer cohort. 5-min cached. BASIC: score+signal only. PRO/ULTRA: full breakdown.", { mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({ content: [{ type: "text" as const, text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/buyer-quality`) }], }) ); - src/index.ts:639-642 (handler)Handler function: takes a 'mint' parameter, calls restQuery with GET to /tokens/{mint}/buyer-quality endpoint, returns the result as text content.
async ({ mint }) => ({ content: [{ type: "text" as const, text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/buyer-quality`) }], }) ); - src/index.ts:637-638 (schema)Input schema: accepts a single 'mint' parameter (string, base58 Solana token mint address) via Zod validation.
{ mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, - src/index.ts:361-451 (helper)Helper function 'restQuery' used by the handler to make authenticated REST API calls to MadeOnSol's /api/v1/ endpoints. It handles auth headers, JSON serialization, and error formatting.
server.tool( "madeonsol_wallet_tracker_watchlist", "List your tracked wallets with labels and remaining watchlist capacity. BASIC=10, PRO=50, ULTRA=100.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async () => ({ content: [{ type: "text" as const, text: await walletTrackerRequest("GET", "/wallet-tracker/watchlist") }], }) ); server.tool( "madeonsol_wallet_tracker_add", "Add a Solana wallet to your watchlist. Returns 409 if already tracked or limit reached.", { wallet_address: z.string().describe("Solana wallet address (base58) to track"), label: z.string().optional().describe("Optional human-readable label for this wallet"), }, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ wallet_address, label }) => { const body: Record<string, unknown> = { wallet_address }; if (label) body.label = label; return { content: [{ type: "text" as const, text: await walletTrackerRequest("POST", "/wallet-tracker/watchlist", body) }] }; } ); server.tool( "madeonsol_wallet_tracker_remove", "Remove a wallet from your watchlist.", { wallet_address: z.string().describe("Solana wallet address to remove from watchlist"), }, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ wallet_address }) => ({ content: [{ type: "text" as const, text: await walletTrackerRequest("DELETE", `/wallet-tracker/watchlist/${encodeURIComponent(wallet_address)}`) }], }) ); server.tool( "madeonsol_wallet_tracker_trades", "Historical swap and transfer events for all your watched wallets. BASIC: truncated wallets, no tx_signature.", { wallet: z.string().optional().describe("Filter to a specific wallet address"), action: z.enum(["buy", "sell", "transfer_in", "transfer_out"]).optional().describe("Filter by action type"), event_type: z.enum(["swap", "transfer"]).optional().describe("Filter by event type: swap (token trade) or transfer (SOL moved)"), limit: z.number().min(1).max(200).default(50).describe("Max results (1–200)"), before: z.number().optional().describe("Pagination cursor: block_time of the last event from previous page"), }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ wallet, action, event_type, limit, before }) => { const params: Record<string, string | number> = { limit }; if (wallet) params.wallet = wallet; if (action) params.action = action; if (event_type) params.event_type = event_type; if (before !== undefined) params.before = before; const url = new URL(`${BASE_URL}/api/v1/wallet-tracker/trades`); for (const [k, v] of Object.entries(params)) url.searchParams.set(k, String(v)); const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } }); const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`; return { content: [{ type: "text" as const, text }] }; } ); server.tool( "madeonsol_wallet_tracker_summary", "Per-wallet stats: swap counts, SOL bought/sold, and last activity time across your watchlist.", { period: z.enum(["24h", "7d", "30d"]).default("7d").describe("Time window for stats"), wallet: z.string().optional().describe("Filter to a specific wallet address"), }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ period, wallet }) => { const url = new URL(`${BASE_URL}/api/v1/wallet-tracker/summary`); url.searchParams.set("period", period); if (wallet) url.searchParams.set("wallet", wallet); const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } }); const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`; return { content: [{ type: "text" as const, text }] }; } ); console.error("[madeonsol-mcp] Wallet tracker tools enabled"); } else { console.error("[madeonsol-mcp] Wallet tracker tools disabled (requires MADEONSOL_API_KEY)"); } } // ── Webhook & Streaming tools (require MadeOnSol API key — Pro/Ultra tier) ── const hasRestAuth = authMode === "madeonsol"; if (hasRestAuth) { async function restQuery(method: string, path: string, body?: unknown): Promise<string> {