mcp-server-madeonsol 1.0.0 → 1.1.0

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.
Files changed (3) hide show
  1. package/README.md +28 -2
  2. package/dist/index.js +68 -6
  3. package/package.json +2 -2
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):
@@ -53,7 +67,7 @@ Add to MCP settings with the same command and env vars.
53
67
  | Tool | Description |
54
68
  |---|---|
55
69
  | `madeonsol_kol_feed` | Real-time KOL trade feed (1,000+ wallets) |
56
- | `madeonsol_kol_coordination` | Multi-KOL convergence signals — tokens multiple KOLs are accumulating |
70
+ | `madeonsol_kol_coordination` | Multi-KOL convergence signals (v1.1) peak-density window, exit detection, 0-100 score |
57
71
  | `madeonsol_kol_leaderboard` | KOL PnL and win rate rankings (180 days of history; periods: today, 7d, 30d, 90d, 180d) |
58
72
  | `madeonsol_kol_pairs` | KOL affinity matrix — which KOLs co-trade the same tokens |
59
73
  | `madeonsol_kol_hot_tokens` | KOL momentum tokens — accelerating buy interest |
@@ -108,6 +122,18 @@ Server-side rules that fire signals when a watched source wallet trades. Deliver
108
122
  | `madeonsol_copytrade_delete` | Delete permanently |
109
123
  | `madeonsol_copytrade_signals` | Recent fired signals (up to 7 days) |
110
124
 
125
+ ### KOL Coordination Alerts (PRO/ULTRA — v1.1 push signals)
126
+
127
+ Real-time push alerts when a KOL cluster co-buys the same token. Fires within ~1s (pg_notify push). Delivered via WebSocket (`kol:coordination` channel, user-scoped) and/or HMAC-signed webhook.
128
+
129
+ | Tool | Description |
130
+ |---|---|
131
+ | `madeonsol_coordination_alerts_list` | List your rules (PRO=5, ULTRA=20) |
132
+ | `madeonsol_coordination_alerts_create` | Create a rule. Returns `webhook_secret` once — store it |
133
+ | `madeonsol_coordination_alerts_get` | Get one rule |
134
+ | `madeonsol_coordination_alerts_update` | Update fields or toggle `is_active` |
135
+ | `madeonsol_coordination_alerts_delete` | Delete permanently |
136
+
111
137
  ### Streaming & Webhooks
112
138
 
113
139
  | Tool | Description |
@@ -130,7 +156,7 @@ Server-side rules that fire signals when a watched source wallet trades. Deliver
130
156
  |------|-------|-----------------|--------------|
131
157
  | BASIC | Free | 10 | 200 |
132
158
  | PRO | $49/mo | 50 | 10,000 |
133
- | ULTRA | $199/mo | 100 + WS events | 100,000 |
159
+ | ULTRA | $149/mo | 100 + WS events | 100,000 |
134
160
 
135
161
  Get a key at [madeonsol.com/developer](https://madeonsol.com/developer).
136
162
 
package/dist/index.js CHANGED
@@ -42,7 +42,9 @@ async function initAuth() {
42
42
  console.error("[madeonsol-mcp] x402 setup failed:", err);
43
43
  }
44
44
  }
45
- console.error("[madeonsol-mcp] No auth configured. Set MADEONSOL_API_KEY (get one free at madeonsol.com/developer) 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");
46
48
  }
47
49
  async function query(path, params) {
48
50
  // API key uses /api/v1/ endpoints; x402 uses /api/x402/
@@ -95,18 +97,27 @@ function registerTools(server) {
95
97
  params.strategy = strategy;
96
98
  return { content: [{ type: "text", text: await query("/api/x402/kol/feed", params) }] };
97
99
  });
98
- server.tool("madeonsol_kol_coordination", "Get KOL convergence signals — tokens being accumulated by multiple KOLs simultaneously. PRO+ adds cluster quality filters.", {
100
+ server.tool("madeonsol_kol_coordination", "KOL convergence signals (v1.1) — tokens being accumulated by multiple KOLs. Response includes peak_kols/peak_buys (busiest window slice), exited_count (net-flow-negative wallets), and a 0-100 coordination_score. Blacklist filters WIF/BONK/stables by default.", {
99
101
  period: z.enum(["1h", "6h", "24h", "7d"]).default("24h").describe("Time period for coordination analysis"),
100
102
  min_kols: z.number().min(2).max(50).default(3).describe("Minimum number of KOLs converging on the same token"),
101
103
  limit: z.number().min(1).max(50).default(20).describe("Number of coordination signals to return"),
102
104
  min_avg_winrate: z.number().optional().describe("PRO+: require cluster avg winrate_7d >= N (0-100)"),
103
105
  unique_strategies: z.number().optional().describe("PRO+: require >= N distinct strategies in cluster"),
104
- }, readOnlyAnnotations, async ({ period, min_kols, limit, min_avg_winrate, unique_strategies }) => {
106
+ include_majors: z.boolean().optional().describe("v1.1: include major memecoins (WIF/BONK/POPCAT). Default false."),
107
+ window_minutes: z.number().min(1).max(60).optional().describe("v1.1: peak-density window (1-60). Default 15."),
108
+ min_score: z.number().min(0).max(100).optional().describe("v1.1: minimum composite coordination_score (0-100)."),
109
+ }, readOnlyAnnotations, async ({ period, min_kols, limit, min_avg_winrate, unique_strategies, include_majors, window_minutes, min_score }) => {
105
110
  const params = { period, min_kols, limit };
106
111
  if (min_avg_winrate !== undefined)
107
112
  params.min_avg_winrate = min_avg_winrate;
108
113
  if (unique_strategies !== undefined)
109
114
  params.unique_strategies = unique_strategies;
115
+ if (include_majors !== undefined)
116
+ params.include_majors = include_majors ? "true" : "false";
117
+ if (window_minutes !== undefined)
118
+ params.window_minutes = window_minutes;
119
+ if (min_score !== undefined)
120
+ params.min_score = min_score;
110
121
  return { content: [{ type: "text", text: await query("/api/x402/kol/coordination", params) }] };
111
122
  });
112
123
  server.tool("madeonsol_kol_leaderboard", "Get KOL performance rankings by PnL and win rate. PRO+ can sort by alternative axes (winrate/roi/profit_factor/early_entry).", {
@@ -449,6 +460,52 @@ function registerTools(server) {
449
460
  const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
450
461
  return { content: [{ type: "text", text }] };
451
462
  });
463
+ // ── Coordination alerts (PRO/ULTRA, v1.1) ──
464
+ server.tool("madeonsol_coordination_alerts_list", "List your coordination alert rules. PRO=5 rules, ULTRA=20.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async () => ({
465
+ content: [{ type: "text", text: await restQuery("GET", "/kol/coordination/alerts") }],
466
+ }));
467
+ server.tool("madeonsol_coordination_alerts_create", "Create a coordination alert rule. Fires within ~1s when a KOL cluster meets thresholds (peak-density scored). Delivered via WebSocket (kol:coordination channel) and/or HMAC-signed webhook. Returns webhook_secret ONCE when delivery_mode includes 'webhook' — store it.", {
468
+ name: z.string().optional().describe("Optional label"),
469
+ min_kols: z.number().min(2).max(50).optional().describe("Minimum distinct KOLs in the window (default 3)"),
470
+ window_minutes: z.number().min(1).max(60).optional().describe("Peak-density window size in minutes (default 15)"),
471
+ min_score: z.number().min(0).max(100).optional().describe("Minimum composite score 0-100 (default 60)"),
472
+ include_majors: z.boolean().optional().describe("Include WIF/BONK/POPCAT etc. Default false."),
473
+ cooldown_min: z.number().min(1).optional().describe("Silence per (rule, token) in minutes (default 60)"),
474
+ score_jump_break: z.number().min(1).max(100).optional().describe("Re-fire early when score jumps by N points vs last fire (default 10)"),
475
+ delivery_mode: z.enum(["websocket", "webhook", "both"]).optional().describe("Where to deliver fires"),
476
+ webhook_url: z.string().url().optional().describe("Required when delivery_mode includes 'webhook'"),
477
+ }, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (args) => {
478
+ const body = {};
479
+ for (const [k, v] of Object.entries(args))
480
+ if (v !== undefined)
481
+ body[k] = v;
482
+ return { content: [{ type: "text", text: await restQuery("POST", "/kol/coordination/alerts", body) }] };
483
+ });
484
+ server.tool("madeonsol_coordination_alerts_get", "Get one coordination alert rule by id.", { id: z.string().describe("Rule UUID") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ id }) => ({
485
+ content: [{ type: "text", text: await restQuery("GET", `/kol/coordination/alerts/${encodeURIComponent(id)}`) }],
486
+ }));
487
+ server.tool("madeonsol_coordination_alerts_update", "Update fields on a coordination alert rule, including is_active toggle.", {
488
+ id: z.string().describe("Rule UUID"),
489
+ name: z.string().nullable().optional(),
490
+ min_kols: z.number().min(2).max(50).optional(),
491
+ window_minutes: z.number().min(1).max(60).optional(),
492
+ min_score: z.number().min(0).max(100).optional(),
493
+ include_majors: z.boolean().optional(),
494
+ cooldown_min: z.number().min(1).optional(),
495
+ score_jump_break: z.number().min(1).max(100).optional(),
496
+ delivery_mode: z.enum(["websocket", "webhook", "both"]).optional(),
497
+ webhook_url: z.string().url().nullable().optional(),
498
+ is_active: z.boolean().optional(),
499
+ }, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ id, ...patch }) => {
500
+ const body = {};
501
+ for (const [k, v] of Object.entries(patch))
502
+ if (v !== undefined)
503
+ body[k] = v;
504
+ return { content: [{ type: "text", text: await restQuery("PATCH", `/kol/coordination/alerts/${encodeURIComponent(id)}`, body) }] };
505
+ });
506
+ server.tool("madeonsol_coordination_alerts_delete", "Delete a coordination alert rule permanently.", { id: z.string().describe("Rule UUID") }, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ id }) => ({
507
+ content: [{ type: "text", text: await restQuery("DELETE", `/kol/coordination/alerts/${encodeURIComponent(id)}`) }],
508
+ }));
452
509
  console.error("[madeonsol-mcp] Webhook & streaming tools enabled");
453
510
  }
454
511
  else {
@@ -493,7 +550,7 @@ async function main() {
493
550
  res.end(JSON.stringify({
494
551
  name: "madeonsol",
495
552
  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.",
496
- version: "1.0.0",
553
+ version: "1.1.0",
497
554
  tools: [
498
555
  { name: "madeonsol_kol_feed", description: "Get real-time Solana KOL trades from 1,000+ tracked wallets." },
499
556
  { name: "madeonsol_kol_coordination", description: "Get KOL convergence signals — tokens multiple KOLs are accumulating." },
@@ -530,6 +587,11 @@ async function main() {
530
587
  { name: "madeonsol_copytrade_update", description: "Update a copy-trade rule. PRO/ULTRA." },
531
588
  { name: "madeonsol_copytrade_delete", description: "Delete a copy-trade rule. PRO/ULTRA." },
532
589
  { name: "madeonsol_copytrade_signals", description: "Recent fired copy-trade signals (up to 7 days). PRO/ULTRA." },
590
+ { name: "madeonsol_coordination_alerts_list", description: "List your KOL coordination alert rules. PRO/ULTRA." },
591
+ { name: "madeonsol_coordination_alerts_create", description: "Create a coordination alert rule (push via WS + webhook, <1s latency). PRO/ULTRA." },
592
+ { name: "madeonsol_coordination_alerts_get", description: "Get one coordination alert rule. PRO/ULTRA." },
593
+ { name: "madeonsol_coordination_alerts_update", description: "Update fields on a coordination alert rule. PRO/ULTRA." },
594
+ { name: "madeonsol_coordination_alerts_delete", description: "Delete a coordination alert rule. PRO/ULTRA." },
533
595
  ],
534
596
  homepage: "https://madeonsol.com/solana-api",
535
597
  repository: "https://github.com/LamboPoewert/mcp-server-madeonsol",
@@ -545,7 +607,7 @@ async function main() {
545
607
  transport = new StreamableHTTPServerTransport({
546
608
  sessionIdGenerator: undefined,
547
609
  });
548
- const server = new McpServer({ name: "madeonsol", version: "1.0.0" });
610
+ const server = new McpServer({ name: "madeonsol", version: "1.1.0" });
549
611
  registerTools(server);
550
612
  await server.connect(transport);
551
613
  }
@@ -583,7 +645,7 @@ async function main() {
583
645
  }
584
646
  else {
585
647
  // Stdio transport for local use (Claude Desktop, Cursor, Claude Code)
586
- const server = new McpServer({ name: "madeonsol", version: "1.0.0" });
648
+ const server = new McpServer({ name: "madeonsol", version: "1.1.0" });
587
649
  registerTools(server);
588
650
  const transport = new StdioServerTransport();
589
651
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-server-madeonsol",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
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
+ }