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.
- package/README.md +28 -2
- package/dist/index.js +68 -6
- 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 —
|
|
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 | $
|
|
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
|
|
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", "
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
+
}
|