mcp-server-madeonsol 0.9.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,6 +4,20 @@ MCP server for [MadeOnSol](https://madeonsol.com) Solana KOL intelligence API. U
4
4
 
5
5
  > Real-time Solana trading intelligence: track 1,000+ KOL wallets with <3s latency, score 6,700+ Pump.fun deployers by reputation, detect multi-KOL coordination signals, monitor any Solana wallet for swaps and transfers, and stream every DEX trade. Free tier: 200 requests/day at [madeonsol.com/developer](https://madeonsol.com/developer) — no credit card required.
6
6
 
7
+ ## Quick start (10 seconds)
8
+
9
+ ```bash
10
+ npm install -g mcp-server-madeonsol
11
+ ```
12
+
13
+ Add to `claude_desktop_config.json` or Cursor MCP settings (free key: https://madeonsol.com/developer):
14
+
15
+ ```json
16
+ { "mcpServers": { "madeonsol": { "command": "mcp-server-madeonsol", "env": { "MADEONSOL_API_KEY": "msk_..." } } } }
17
+ ```
18
+
19
+ Restart Claude Desktop and ask: *"What are KOLs buying right now?"*
20
+
7
21
  ## Authentication
8
22
 
9
23
  Two options (in priority order):
@@ -13,6 +27,8 @@ Two options (in priority order):
13
27
  | **MadeOnSol API key** (recommended) | `MADEONSOL_API_KEY` | Developers — [get a free key](https://madeonsol.com/developer) |
14
28
  | x402 micropayments | `SVM_PRIVATE_KEY` | AI agents with Solana wallets |
15
29
 
30
+ > **v1.0 breaking change:** RapidAPI auth (`RAPIDAPI_KEY`) has been removed. The MadeOnSol RapidAPI marketplace was retired on 2026-04-19. Get a free `msk_` key at [madeonsol.com/developer](https://madeonsol.com/developer).
31
+
16
32
  ## Install
17
33
 
18
34
  ```bash
@@ -76,6 +92,36 @@ Add to MCP settings with the same command and env vars.
76
92
  | `madeonsol_wallet_tracker_trades` | Historical swap/transfer events for watched wallets (120-day retention) |
77
93
  | `madeonsol_wallet_tracker_summary` | Per-wallet stats: swap counts, SOL bought/sold, last event |
78
94
 
95
+ ### Alpha Wallet Intelligence
96
+
97
+ Scored from 47,000+ early-buyer records (wallets seen in the first 20 buyers of Pump.fun tokens).
98
+
99
+ | Tool | Tier | Description |
100
+ |---|---|---|
101
+ | `madeonsol_alpha_leaderboard` | BASIC+ | Top profitable early-buyer wallets. BASIC=25 (truncated), PRO=100, ULTRA=500 + bot signals |
102
+ | `madeonsol_alpha_wallet` | ULTRA | Full per-token breakdown + bot_signals array |
103
+ | `madeonsol_alpha_linked` | ULTRA | Wallets behaviorally linked (co-bought 3+ tokens within 2s) |
104
+
105
+ ### Token Quality
106
+
107
+ | Tool | Tier | Description |
108
+ |---|---|---|
109
+ | `madeonsol_token_cap_table` | PRO+ | First non-deployer early buyers, enriched with PnL/KOL/bot flags. PRO=10, ULTRA=20 |
110
+ | `madeonsol_token_buyer_quality` | BASIC+ | 0–100 buyer-quality score (5-min cached). BASIC=score+signal only |
111
+
112
+ ### Copy-Trade Rules (PRO/ULTRA)
113
+
114
+ Server-side rules that fire signals when a watched source wallet trades. Delivered via webhook (HMAC-signed) and/or WebSocket.
115
+
116
+ | Tool | Description |
117
+ |---|---|
118
+ | `madeonsol_copytrade_list` | List your rules |
119
+ | `madeonsol_copytrade_create` | Create a rule. Returns `webhook_secret` once — store it |
120
+ | `madeonsol_copytrade_get` | Get one rule |
121
+ | `madeonsol_copytrade_update` | Update fields or toggle `is_active` |
122
+ | `madeonsol_copytrade_delete` | Delete permanently |
123
+ | `madeonsol_copytrade_signals` | Recent fired signals (up to 7 days) |
124
+
79
125
  ### Streaming & Webhooks
80
126
 
81
127
  | Tool | Description |
@@ -98,7 +144,7 @@ Add to MCP settings with the same command and env vars.
98
144
  |------|-------|-----------------|--------------|
99
145
  | BASIC | Free | 10 | 200 |
100
146
  | PRO | $49/mo | 50 | 10,000 |
101
- | ULTRA | $199/mo | 100 + WS events | 100,000 |
147
+ | ULTRA | $149/mo | 100 + WS events | 100,000 |
102
148
 
103
149
  Get a key at [madeonsol.com/developer](https://madeonsol.com/developer).
104
150
 
package/dist/index.js CHANGED
@@ -6,7 +6,6 @@ import { z } from "zod";
6
6
  import { createServer } from "node:http";
7
7
  const BASE_URL = process.env.MADEONSOL_API_URL || "https://madeonsol.com";
8
8
  const MADEONSOL_API_KEY = process.env.MADEONSOL_API_KEY; // Native key from madeonsol.com/developer
9
- const RAPIDAPI_KEY = process.env.RAPIDAPI_KEY; // RapidAPI subscription key
10
9
  const PRIVATE_KEY = process.env.SVM_PRIVATE_KEY; // x402 micropayments (for AI agents)
11
10
  const PORT = parseInt(process.env.PORT || "3100", 10);
12
11
  const MODE = process.env.MCP_TRANSPORT || "stdio"; // "stdio" or "http"
@@ -16,12 +15,6 @@ function apiKeyHeaders() {
16
15
  if (authMode === "madeonsol") {
17
16
  return { Authorization: `Bearer ${MADEONSOL_API_KEY}` };
18
17
  }
19
- if (authMode === "rapidapi") {
20
- return {
21
- "x-rapidapi-key": RAPIDAPI_KEY,
22
- "x-rapidapi-host": "madeonsol-solana-kol-tracker-tools-api.p.rapidapi.com",
23
- };
24
- }
25
18
  return {};
26
19
  }
27
20
  async function initAuth() {
@@ -30,11 +23,6 @@ async function initAuth() {
30
23
  console.error("[madeonsol-mcp] Using MadeOnSol API key (Bearer auth)");
31
24
  return;
32
25
  }
33
- if (RAPIDAPI_KEY) {
34
- authMode = "rapidapi";
35
- console.error("[madeonsol-mcp] Using RapidAPI key");
36
- return;
37
- }
38
26
  if (PRIVATE_KEY) {
39
27
  try {
40
28
  const { wrapFetchWithPayment } = await import("@x402/fetch");
@@ -54,10 +42,12 @@ async function initAuth() {
54
42
  console.error("[madeonsol-mcp] x402 setup failed:", err);
55
43
  }
56
44
  }
57
- console.error("[madeonsol-mcp] No auth configured. Set MADEONSOL_API_KEY (get one free at madeonsol.com/developer), RAPIDAPI_KEY, or SVM_PRIVATE_KEY.");
45
+ console.error("\n[madeonsol-mcp] No auth configured every tool call will fail.\n" +
46
+ " → Get a free MADEONSOL_API_KEY (200 req/day, no card) at https://madeonsol.com/developer\n" +
47
+ " → Or set SVM_PRIVATE_KEY for x402 micropayments.\n");
58
48
  }
59
49
  async function query(path, params) {
60
- // API key and RapidAPI auth use /api/v1/ endpoints; x402 uses /api/x402/
50
+ // API key uses /api/v1/ endpoints; x402 uses /api/x402/
61
51
  const apiPath = authMode === "x402" || authMode === "none"
62
52
  ? path
63
53
  : path.replace("/api/x402/", "/api/v1/");
@@ -155,8 +145,7 @@ function registerTools(server) {
155
145
  wallet: z.string().describe("KOL wallet address (base58)"),
156
146
  period: z.enum(["7d", "30d"]).default("30d").describe("Time period: 7d or 30d"),
157
147
  }, readOnlyAnnotations, async ({ wallet, period }) => {
158
- const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
159
- if (hasRestAuth) {
148
+ if (authMode === "madeonsol") {
160
149
  const headers = { ...apiKeyHeaders() };
161
150
  const res = await fetch(`${BASE_URL}/api/v1/kol/${wallet}/timing?period=${period}`, { headers });
162
151
  if (!res.ok) {
@@ -165,13 +154,12 @@ function registerTools(server) {
165
154
  }
166
155
  return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
167
156
  }
168
- return { content: [{ type: "text", text: "KOL timing requires API key or RapidAPI key auth." }] };
157
+ return { content: [{ type: "text", text: "KOL timing requires MADEONSOL_API_KEY (msk_) get one free at madeonsol.com/developer." }] };
169
158
  });
170
159
  server.tool("madeonsol_deployer_trajectory", "Deployer skill curve — streaks, rolling bond rate, improvement trend, and deployment cadence for a Pump.fun deployer.", {
171
160
  wallet: z.string().describe("Deployer wallet address (base58)"),
172
161
  }, readOnlyAnnotations, async ({ wallet }) => {
173
- const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
174
- if (hasRestAuth) {
162
+ if (authMode === "madeonsol") {
175
163
  const headers = { ...apiKeyHeaders() };
176
164
  const res = await fetch(`${BASE_URL}/api/v1/deployer-hunter/${wallet}/trajectory`, { headers });
177
165
  if (!res.ok) {
@@ -180,7 +168,7 @@ function registerTools(server) {
180
168
  }
181
169
  return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
182
170
  }
183
- return { content: [{ type: "text", text: "Deployer trajectory requires API key or RapidAPI key auth (Pro/Ultra)." }] };
171
+ return { content: [{ type: "text", text: "Deployer trajectory requires MADEONSOL_API_KEY (msk_, Pro/Ultra) get one at madeonsol.com/developer." }] };
184
172
  });
185
173
  server.tool("madeonsol_kol_hot_tokens", "KOL momentum tokens — tokens with accelerating KOL buy interest, early signals before coordination triggers. PRO+ adds buyer-quality filters.", {
186
174
  period: z.enum(["1h", "6h"]).default("6h").describe("Time period: 1h or 6h"),
@@ -224,8 +212,7 @@ function registerTools(server) {
224
212
  wallet: z.string().describe("KOL wallet address (base58)"),
225
213
  period: z.enum(["7d", "30d", "90d", "180d"]).default("30d").describe("Time period for PnL calculation"),
226
214
  }, readOnlyAnnotations, async ({ wallet, period }) => {
227
- const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
228
- if (hasRestAuth) {
215
+ if (authMode === "madeonsol") {
229
216
  const headers = { ...apiKeyHeaders() };
230
217
  const res = await fetch(`${BASE_URL}/api/v1/kol/${wallet}/pnl?period=${period}`, { headers });
231
218
  if (!res.ok) {
@@ -234,7 +221,7 @@ function registerTools(server) {
234
221
  }
235
222
  return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
236
223
  }
237
- return { content: [{ type: "text", text: "KOL PnL requires API key or RapidAPI key auth." }] };
224
+ return { content: [{ type: "text", text: "KOL PnL requires MADEONSOL_API_KEY (msk_) get one free at madeonsol.com/developer." }] };
238
225
  });
239
226
  server.tool("madeonsol_kol_trending_tokens", "Tokens ranked by KOL buy volume — pure capital-flow signal. Sub-hour periods (5m/15m/30m) require PRO/ULTRA.", {
240
227
  period: z.enum(["5m", "15m", "30m", "1h", "2h", "4h", "12h"]).default("1h").describe("Time window"),
@@ -250,7 +237,7 @@ function registerTools(server) {
250
237
  });
251
238
  // ── Wallet Tracker tools (REST auth only — all mutating operations) ──
252
239
  {
253
- const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
240
+ const hasRestAuth = authMode === "madeonsol";
254
241
  async function walletTrackerRequest(method, path, body) {
255
242
  const headers = { "Content-Type": "application/json", ...apiKeyHeaders() };
256
243
  const res = await fetch(`${BASE_URL}/api/v1${path}`, {
@@ -320,11 +307,11 @@ function registerTools(server) {
320
307
  console.error("[madeonsol-mcp] Wallet tracker tools enabled");
321
308
  }
322
309
  else {
323
- console.error("[madeonsol-mcp] Wallet tracker tools disabled (requires MADEONSOL_API_KEY or RAPIDAPI_KEY)");
310
+ console.error("[madeonsol-mcp] Wallet tracker tools disabled (requires MADEONSOL_API_KEY)");
324
311
  }
325
312
  }
326
- // ── Webhook & Streaming tools (require API key or RapidAPI key — Pro/Ultra tier) ──
327
- const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
313
+ // ── Webhook & Streaming tools (require MadeOnSol API key — Pro/Ultra tier) ──
314
+ const hasRestAuth = authMode === "madeonsol";
328
315
  if (hasRestAuth) {
329
316
  async function restQuery(method, path, body) {
330
317
  const headers = {
@@ -375,10 +362,99 @@ function registerTools(server) {
375
362
  server.tool("madeonsol_stream_token", "Generate a 24h WebSocket streaming token. Includes ws_url for KOL/deployer streaming (Pro/Ultra) and dex_ws_url for all-DEX trade streaming (Ultra only).", {}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async () => ({
376
363
  content: [{ type: "text", text: await restQuery("POST", "/stream/token") }],
377
364
  }));
365
+ // ── Alpha wallet intelligence ──
366
+ server.tool("madeonsol_alpha_leaderboard", "Top statistically profitable early-buyer wallets, scored from 47,000+ early-buyer records. BASIC=25 (truncated), PRO=100, ULTRA=500 + bot signals.", {
367
+ period: z.enum(["7d", "30d", "all"]).default("30d").describe("Time window"),
368
+ min_tokens: z.number().min(1).max(20).default(5).describe("Minimum tokens traded by wallet (1-20)"),
369
+ sort: z.enum(["win_rate", "pnl", "roi"]).default("win_rate").describe("Sort axis"),
370
+ exclude_bots: z.boolean().default(true).describe("Exclude wallets flagged as bots"),
371
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ period, min_tokens, sort, exclude_bots }) => {
372
+ const params = { period, min_tokens, sort, exclude_bots: exclude_bots ? "true" : "false" };
373
+ const url = new URL(`${BASE_URL}/api/v1/alpha/leaderboard`);
374
+ for (const [k, v] of Object.entries(params))
375
+ url.searchParams.set(k, String(v));
376
+ const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } });
377
+ const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
378
+ return { content: [{ type: "text", text }] };
379
+ });
380
+ server.tool("madeonsol_alpha_wallet", "Full alpha profile for one wallet — per-token breakdown + bot_signals array. ULTRA only.", { wallet: z.string().describe("Wallet address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ wallet }) => ({
381
+ content: [{ type: "text", text: await restQuery("GET", `/alpha/${encodeURIComponent(wallet)}`) }],
382
+ }));
383
+ server.tool("madeonsol_alpha_linked", "Wallets behaviorally linked to a target wallet (co-bought 3+ tokens within 2 seconds). ULTRA only.", { wallet: z.string().describe("Wallet address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ wallet }) => ({
384
+ content: [{ type: "text", text: await restQuery("GET", `/alpha/${encodeURIComponent(wallet)}/linked`) }],
385
+ }));
386
+ // ── Token quality ──
387
+ server.tool("madeonsol_token_cap_table", "First non-deployer early buyers for a token, enriched with PnL, KOL identity, and bot flags. PRO=top 10 (truncated wallets), ULTRA=top 20 (full). BASIC: 403.", { mint: z.string().describe("Token mint address (base58)") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mint }) => ({
388
+ content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/cap-table`) }],
389
+ }));
390
+ 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 }) => ({
391
+ content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/buyer-quality`) }],
392
+ }));
393
+ // ── Copy-Trade rules (PRO/ULTRA) ──
394
+ server.tool("madeonsol_copytrade_list", "List your copy-trade rules. PRO=3 rules, ULTRA=20 rules.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async () => ({
395
+ content: [{ type: "text", text: await restQuery("GET", "/copytrade/subscriptions") }],
396
+ }));
397
+ server.tool("madeonsol_copytrade_create", "Create a copy-trade rule. Returns webhook_secret ONCE on creation when delivery_mode includes 'webhook' — store it to verify HMAC signatures. PRO=5 source_wallets/rule, ULTRA=50.", {
398
+ source_wallets: z.array(z.string()).min(1).max(50).describe("Wallets to mirror (base58)"),
399
+ sizing_amount: z.number().describe("Amount used by the chosen sizing_mode"),
400
+ name: z.string().optional().describe("Optional human label"),
401
+ min_trade_sol: z.number().optional().describe("Minimum source-wallet trade size to fire a signal"),
402
+ only_action: z.enum(["buy", "sell", "both"]).optional().describe("Filter to one side (default 'both')"),
403
+ sizing_mode: z.enum(["fixed", "proportional", "percent_source"]).optional().describe("How sizing_amount is interpreted"),
404
+ delivery_mode: z.enum(["webhook", "websocket", "both"]).optional().describe("Where to deliver fired signals"),
405
+ webhook_url: z.string().url().optional().describe("Required when delivery_mode includes 'webhook'"),
406
+ }, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (args) => {
407
+ const body = { source_wallets: args.source_wallets, sizing_amount: args.sizing_amount };
408
+ for (const k of ["name", "min_trade_sol", "only_action", "sizing_mode", "delivery_mode", "webhook_url"]) {
409
+ if (args[k] !== undefined)
410
+ body[k] = args[k];
411
+ }
412
+ return { content: [{ type: "text", text: await restQuery("POST", "/copytrade/subscriptions", body) }] };
413
+ });
414
+ server.tool("madeonsol_copytrade_get", "Get one copy-trade rule by id.", { id: z.number().describe("Subscription id") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ id }) => ({
415
+ content: [{ type: "text", text: await restQuery("GET", `/copytrade/subscriptions/${id}`) }],
416
+ }));
417
+ server.tool("madeonsol_copytrade_update", "Update fields on a copy-trade rule, including is_active toggle.", {
418
+ id: z.number().describe("Subscription id"),
419
+ name: z.string().nullable().optional(),
420
+ source_wallets: z.array(z.string()).optional(),
421
+ min_trade_sol: z.number().optional(),
422
+ only_action: z.enum(["buy", "sell", "both"]).optional(),
423
+ sizing_mode: z.enum(["fixed", "proportional", "percent_source"]).optional(),
424
+ sizing_amount: z.number().optional(),
425
+ delivery_mode: z.enum(["webhook", "websocket", "both"]).optional(),
426
+ webhook_url: z.string().url().nullable().optional(),
427
+ is_active: z.boolean().optional(),
428
+ }, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ id, ...patch }) => {
429
+ const body = {};
430
+ for (const [k, v] of Object.entries(patch)) {
431
+ if (v !== undefined)
432
+ body[k] = v;
433
+ }
434
+ return { content: [{ type: "text", text: await restQuery("PATCH", `/copytrade/subscriptions/${id}`, body) }] };
435
+ });
436
+ server.tool("madeonsol_copytrade_delete", "Delete a copy-trade rule permanently.", { id: z.number().describe("Subscription id") }, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ id }) => ({
437
+ content: [{ type: "text", text: await restQuery("DELETE", `/copytrade/subscriptions/${id}`) }],
438
+ }));
439
+ server.tool("madeonsol_copytrade_signals", "Recent fired copy-trade signals (up to 7 days). Filter by subscription_id, since (ISO8601), and limit (1–500).", {
440
+ subscription_id: z.number().optional().describe("Filter to one rule"),
441
+ since: z.string().optional().describe("ISO8601 timestamp — only signals fired at-or-after this time"),
442
+ limit: z.number().min(1).max(500).default(50).describe("Max signals to return (1–500)"),
443
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ subscription_id, since, limit }) => {
444
+ const url = new URL(`${BASE_URL}/api/v1/copytrade/signals`);
445
+ url.searchParams.set("limit", String(limit));
446
+ if (subscription_id !== undefined)
447
+ url.searchParams.set("subscription_id", String(subscription_id));
448
+ if (since)
449
+ url.searchParams.set("since", since);
450
+ const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } });
451
+ const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
452
+ return { content: [{ type: "text", text }] };
453
+ });
378
454
  console.error("[madeonsol-mcp] Webhook & streaming tools enabled");
379
455
  }
380
456
  else {
381
- console.error("[madeonsol-mcp] Webhook/streaming tools disabled (requires MADEONSOL_API_KEY or RAPIDAPI_KEY)");
457
+ console.error("[madeonsol-mcp] Webhook/streaming tools disabled (requires MADEONSOL_API_KEY)");
382
458
  }
383
459
  // Prompts — pre-built analysis templates
384
460
  server.prompt("solana_kol_analysis", "Analyze current Solana KOL trading activity — what are smart money wallets buying and selling?", { period: z.string().default("24h").describe("Time period: 1h, 6h, 24h, or 7d") }, ({ period }) => ({
@@ -418,8 +494,8 @@ async function main() {
418
494
  res.writeHead(200, { "Content-Type": "application/json" });
419
495
  res.end(JSON.stringify({
420
496
  name: "madeonsol",
421
- description: "Solana KOL trading intelligence and deployer analytics. Real-time data from 1,000+ KOL wallets and 4000+ Pump.fun deployers. Supports API key, RapidAPI, or x402 micropayments.",
422
- version: "0.1.0",
497
+ description: "Solana KOL trading intelligence and deployer analytics. Real-time data from 1,000+ KOL wallets, 6,700+ Pump.fun deployers, 47,000+ scored alpha wallets, copy-trade rules, and wallet tracker. Supports MadeOnSol API key (msk_) or x402 micropayments.",
498
+ version: "1.0.0",
423
499
  tools: [
424
500
  { name: "madeonsol_kol_feed", description: "Get real-time Solana KOL trades from 1,000+ tracked wallets." },
425
501
  { name: "madeonsol_kol_coordination", description: "Get KOL convergence signals — tokens multiple KOLs are accumulating." },
@@ -445,6 +521,17 @@ async function main() {
445
521
  { name: "madeonsol_wallet_tracker_remove", description: "Remove a wallet from your watchlist." },
446
522
  { name: "madeonsol_wallet_tracker_trades", description: "Historical swap/transfer events for watched wallets." },
447
523
  { name: "madeonsol_wallet_tracker_summary", description: "Per-wallet stats: swap counts, SOL bought/sold." },
524
+ { name: "madeonsol_alpha_leaderboard", description: "Top profitable early-buyer wallets — 47,000+ scored. BASIC=25, PRO=100, ULTRA=500." },
525
+ { name: "madeonsol_alpha_wallet", description: "Full alpha profile + bot signals for one wallet. ULTRA only." },
526
+ { name: "madeonsol_alpha_linked", description: "Behaviorally linked wallets (co-bought 3+ tokens within 2s). ULTRA only." },
527
+ { name: "madeonsol_token_cap_table", description: "First non-deployer early buyers for a token, enriched. PRO=10, ULTRA=20." },
528
+ { name: "madeonsol_token_buyer_quality", description: "0–100 buyer quality score for a token's first-buyer cohort." },
529
+ { name: "madeonsol_copytrade_list", description: "List your copy-trade rules. PRO/ULTRA." },
530
+ { name: "madeonsol_copytrade_create", description: "Create a copy-trade rule with webhook + WS delivery. PRO/ULTRA." },
531
+ { name: "madeonsol_copytrade_get", description: "Get one copy-trade rule. PRO/ULTRA." },
532
+ { name: "madeonsol_copytrade_update", description: "Update a copy-trade rule. PRO/ULTRA." },
533
+ { name: "madeonsol_copytrade_delete", description: "Delete a copy-trade rule. PRO/ULTRA." },
534
+ { name: "madeonsol_copytrade_signals", description: "Recent fired copy-trade signals (up to 7 days). PRO/ULTRA." },
448
535
  ],
449
536
  homepage: "https://madeonsol.com/solana-api",
450
537
  repository: "https://github.com/LamboPoewert/mcp-server-madeonsol",
@@ -460,7 +547,7 @@ async function main() {
460
547
  transport = new StreamableHTTPServerTransport({
461
548
  sessionIdGenerator: undefined,
462
549
  });
463
- const server = new McpServer({ name: "madeonsol", version: "0.1.0" });
550
+ const server = new McpServer({ name: "madeonsol", version: "1.0.0" });
464
551
  registerTools(server);
465
552
  await server.connect(transport);
466
553
  }
@@ -498,7 +585,7 @@ async function main() {
498
585
  }
499
586
  else {
500
587
  // Stdio transport for local use (Claude Desktop, Cursor, Claude Code)
501
- const server = new McpServer({ name: "madeonsol", version: "0.1.0" });
588
+ const server = new McpServer({ name: "madeonsol", version: "1.0.0" });
502
589
  registerTools(server);
503
590
  const transport = new StdioServerTransport();
504
591
  await server.connect(transport);
package/glama.json CHANGED
@@ -1,54 +1,49 @@
1
1
  {
2
2
  "name": "mcp-server-madeonsol",
3
3
  "display_name": "MadeOnSol",
4
- "description": "Solana KOL trading intelligence and deployer analytics. Real-time data from 950+ KOL wallets and 6,700+ Pump.fun deployers. Supports free API key, RapidAPI, or x402 micropayments.",
5
- "version": "0.3.0",
4
+ "description": "Solana KOL trading intelligence and deployer analytics. Real-time data from 1,000+ KOL wallets, 6,700+ Pump.fun deployers, 47,000+ scored alpha wallets, server-side copy-trade rules, and wallet tracker. Supports free MadeOnSol API key (msk_) or x402 micropayments.",
5
+ "version": "1.0.0",
6
6
  "homepage": "https://madeonsol.com/solana-api",
7
7
  "repository": "https://github.com/LamboPoewert/mcp-server-madeonsol",
8
8
  "license": "MIT",
9
9
  "categories": ["blockchain", "finance", "web3"],
10
- "tags": ["solana", "kol", "trading", "x402", "micropayments", "defi", "api", "deployer", "pump-fun"],
10
+ "tags": ["solana", "kol", "trading", "x402", "micropayments", "defi", "api", "deployer", "pump-fun", "copy-trade"],
11
11
  "tools": [
12
- {
13
- "name": "madeonsol_kol_feed",
14
- "description": "Get real-time Solana KOL trades from 950+ tracked wallets."
15
- },
16
- {
17
- "name": "madeonsol_kol_coordination",
18
- "description": "Get KOL convergence signals tokens multiple KOLs are accumulating."
19
- },
20
- {
21
- "name": "madeonsol_kol_leaderboard",
22
- "description": "Get KOL performance rankings by PnL and win rate."
23
- },
24
- {
25
- "name": "madeonsol_deployer_alerts",
26
- "description": "Get elite Pump.fun deployer alerts with KOL enrichment."
27
- },
28
- {
29
- "name": "madeonsol_discovery",
30
- "description": "List all available endpoints with prices. Free, no auth required."
31
- },
32
- {
33
- "name": "madeonsol_create_webhook",
34
- "description": "Register a webhook for real-time push notifications. Pro/Ultra."
35
- },
36
- {
37
- "name": "madeonsol_list_webhooks",
38
- "description": "List your registered webhooks. Pro/Ultra."
39
- },
40
- {
41
- "name": "madeonsol_delete_webhook",
42
- "description": "Delete a webhook by ID. Pro/Ultra."
43
- },
44
- {
45
- "name": "madeonsol_test_webhook",
46
- "description": "Send a test payload to verify a webhook. Pro/Ultra."
47
- },
48
- {
49
- "name": "madeonsol_stream_token",
50
- "description": "Get a 24h WebSocket streaming token. Pro/Ultra."
51
- }
12
+ { "name": "madeonsol_kol_feed", "description": "Get real-time Solana KOL trades from 1,000+ tracked wallets." },
13
+ { "name": "madeonsol_kol_coordination", "description": "Get KOL convergence signals — tokens multiple KOLs are accumulating." },
14
+ { "name": "madeonsol_kol_leaderboard", "description": "Get KOL performance rankings by PnL and win rate." },
15
+ { "name": "madeonsol_deployer_alerts", "description": "Get Pump.fun deployer alerts with KOL enrichment." },
16
+ { "name": "madeonsol_kol_pairs", "description": "KOL affinity matrix — which KOLs co-trade the same tokens." },
17
+ { "name": "madeonsol_kol_timing", "description": "KOL entry/exit timing profile. Pro/Ultra." },
18
+ { "name": "madeonsol_deployer_trajectory", "description": "Deployer skill curvestreaks, trend. Pro/Ultra." },
19
+ { "name": "madeonsol_kol_hot_tokens", "description": "KOL momentum tokens — accelerating buy interest." },
20
+ { "name": "madeonsol_kol_pnl", "description": "Deep per-wallet PnL: equity curve, risk metrics, positions." },
21
+ { "name": "madeonsol_kol_trending_tokens", "description": "Tokens ranked by KOL buy volume (5m–12h windows)." },
22
+ { "name": "madeonsol_kol_token_entry_order", "description": "Ranked KOL first-buyers for a specific token." },
23
+ { "name": "madeonsol_kol_compare_wallets", "description": "Side-by-side comparison of 2-5 KOL wallets (overlap in PRO+)." },
24
+ { "name": "madeonsol_kol_alerts_recent", "description": "Unified live KOL alert feed: clusters, fresh buys, heating-up." },
25
+ { "name": "madeonsol_discovery", "description": "List all available endpoints with prices. Free, no auth required." },
26
+ { "name": "madeonsol_create_webhook", "description": "Register a webhook for real-time push notifications. Pro/Ultra." },
27
+ { "name": "madeonsol_list_webhooks", "description": "List your registered webhooks. Pro/Ultra." },
28
+ { "name": "madeonsol_delete_webhook", "description": "Delete a webhook by ID. Pro/Ultra." },
29
+ { "name": "madeonsol_test_webhook", "description": "Send a test payload to verify a webhook. Pro/Ultra." },
30
+ { "name": "madeonsol_stream_token", "description": "Get a 24h WebSocket streaming token. Pro/Ultra." },
31
+ { "name": "madeonsol_wallet_tracker_watchlist", "description": "List your tracked wallets and remaining capacity." },
32
+ { "name": "madeonsol_wallet_tracker_add", "description": "Add a wallet to your watchlist." },
33
+ { "name": "madeonsol_wallet_tracker_remove", "description": "Remove a wallet from your watchlist." },
34
+ { "name": "madeonsol_wallet_tracker_trades", "description": "Historical swap/transfer events for watched wallets." },
35
+ { "name": "madeonsol_wallet_tracker_summary", "description": "Per-wallet stats: swap counts, SOL bought/sold." },
36
+ { "name": "madeonsol_alpha_leaderboard", "description": "Top profitable early-buyer wallets — 47,000+ scored. BASIC=25, PRO=100, ULTRA=500." },
37
+ { "name": "madeonsol_alpha_wallet", "description": "Full alpha profile + bot signals for one wallet. ULTRA only." },
38
+ { "name": "madeonsol_alpha_linked", "description": "Behaviorally linked wallets (co-bought 3+ tokens within 2s). ULTRA only." },
39
+ { "name": "madeonsol_token_cap_table", "description": "First non-deployer early buyers for a token, enriched. PRO=10, ULTRA=20." },
40
+ { "name": "madeonsol_token_buyer_quality", "description": "0–100 buyer quality score for a token's first-buyer cohort." },
41
+ { "name": "madeonsol_copytrade_list", "description": "List your copy-trade rules. PRO/ULTRA." },
42
+ { "name": "madeonsol_copytrade_create", "description": "Create a copy-trade rule with webhook + WS delivery. PRO/ULTRA." },
43
+ { "name": "madeonsol_copytrade_get", "description": "Get one copy-trade rule. PRO/ULTRA." },
44
+ { "name": "madeonsol_copytrade_update", "description": "Update a copy-trade rule. PRO/ULTRA." },
45
+ { "name": "madeonsol_copytrade_delete", "description": "Delete a copy-trade rule. PRO/ULTRA." },
46
+ { "name": "madeonsol_copytrade_signals", "description": "Recent fired copy-trade signals (up to 7 days). PRO/ULTRA." }
52
47
  ],
53
48
  "transports": ["stdio", "http"],
54
49
  "runtime": "node"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-server-madeonsol",
3
- "version": "0.9.0",
3
+ "version": "1.0.1",
4
4
  "mcpName": "io.github.lambopoewert/madeonsol",
5
5
  "description": "MCP server for MadeOnSol Solana KOL intelligence API — use from Claude, Cursor, or any MCP client",
6
6
  "type": "module",
@@ -42,4 +42,4 @@
42
42
  "@solana/kit": ">=2.0.0",
43
43
  "@scure/base": ">=1.0.0"
44
44
  }
45
- }
45
+ }