mcp-server-madeonsol 1.0.1 → 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 +13 -1
- package/dist/index.js +65 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -67,7 +67,7 @@ Add to MCP settings with the same command and env vars.
|
|
|
67
67
|
| Tool | Description |
|
|
68
68
|
|---|---|
|
|
69
69
|
| `madeonsol_kol_feed` | Real-time KOL trade feed (1,000+ wallets) |
|
|
70
|
-
| `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 |
|
|
71
71
|
| `madeonsol_kol_leaderboard` | KOL PnL and win rate rankings (180 days of history; periods: today, 7d, 30d, 90d, 180d) |
|
|
72
72
|
| `madeonsol_kol_pairs` | KOL affinity matrix — which KOLs co-trade the same tokens |
|
|
73
73
|
| `madeonsol_kol_hot_tokens` | KOL momentum tokens — accelerating buy interest |
|
|
@@ -122,6 +122,18 @@ Server-side rules that fire signals when a watched source wallet trades. Deliver
|
|
|
122
122
|
| `madeonsol_copytrade_delete` | Delete permanently |
|
|
123
123
|
| `madeonsol_copytrade_signals` | Recent fired signals (up to 7 days) |
|
|
124
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
|
+
|
|
125
137
|
### Streaming & Webhooks
|
|
126
138
|
|
|
127
139
|
| Tool | Description |
|
package/dist/index.js
CHANGED
|
@@ -97,18 +97,27 @@ function registerTools(server) {
|
|
|
97
97
|
params.strategy = strategy;
|
|
98
98
|
return { content: [{ type: "text", text: await query("/api/x402/kol/feed", params) }] };
|
|
99
99
|
});
|
|
100
|
-
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.", {
|
|
101
101
|
period: z.enum(["1h", "6h", "24h", "7d"]).default("24h").describe("Time period for coordination analysis"),
|
|
102
102
|
min_kols: z.number().min(2).max(50).default(3).describe("Minimum number of KOLs converging on the same token"),
|
|
103
103
|
limit: z.number().min(1).max(50).default(20).describe("Number of coordination signals to return"),
|
|
104
104
|
min_avg_winrate: z.number().optional().describe("PRO+: require cluster avg winrate_7d >= N (0-100)"),
|
|
105
105
|
unique_strategies: z.number().optional().describe("PRO+: require >= N distinct strategies in cluster"),
|
|
106
|
-
|
|
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 }) => {
|
|
107
110
|
const params = { period, min_kols, limit };
|
|
108
111
|
if (min_avg_winrate !== undefined)
|
|
109
112
|
params.min_avg_winrate = min_avg_winrate;
|
|
110
113
|
if (unique_strategies !== undefined)
|
|
111
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;
|
|
112
121
|
return { content: [{ type: "text", text: await query("/api/x402/kol/coordination", params) }] };
|
|
113
122
|
});
|
|
114
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).", {
|
|
@@ -451,6 +460,52 @@ function registerTools(server) {
|
|
|
451
460
|
const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
|
|
452
461
|
return { content: [{ type: "text", text }] };
|
|
453
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
|
+
}));
|
|
454
509
|
console.error("[madeonsol-mcp] Webhook & streaming tools enabled");
|
|
455
510
|
}
|
|
456
511
|
else {
|
|
@@ -495,7 +550,7 @@ async function main() {
|
|
|
495
550
|
res.end(JSON.stringify({
|
|
496
551
|
name: "madeonsol",
|
|
497
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.",
|
|
498
|
-
version: "1.
|
|
553
|
+
version: "1.1.0",
|
|
499
554
|
tools: [
|
|
500
555
|
{ name: "madeonsol_kol_feed", description: "Get real-time Solana KOL trades from 1,000+ tracked wallets." },
|
|
501
556
|
{ name: "madeonsol_kol_coordination", description: "Get KOL convergence signals — tokens multiple KOLs are accumulating." },
|
|
@@ -532,6 +587,11 @@ async function main() {
|
|
|
532
587
|
{ name: "madeonsol_copytrade_update", description: "Update a copy-trade rule. PRO/ULTRA." },
|
|
533
588
|
{ name: "madeonsol_copytrade_delete", description: "Delete a copy-trade rule. PRO/ULTRA." },
|
|
534
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." },
|
|
535
595
|
],
|
|
536
596
|
homepage: "https://madeonsol.com/solana-api",
|
|
537
597
|
repository: "https://github.com/LamboPoewert/mcp-server-madeonsol",
|
|
@@ -547,7 +607,7 @@ async function main() {
|
|
|
547
607
|
transport = new StreamableHTTPServerTransport({
|
|
548
608
|
sessionIdGenerator: undefined,
|
|
549
609
|
});
|
|
550
|
-
const server = new McpServer({ name: "madeonsol", version: "1.
|
|
610
|
+
const server = new McpServer({ name: "madeonsol", version: "1.1.0" });
|
|
551
611
|
registerTools(server);
|
|
552
612
|
await server.connect(transport);
|
|
553
613
|
}
|
|
@@ -585,7 +645,7 @@ async function main() {
|
|
|
585
645
|
}
|
|
586
646
|
else {
|
|
587
647
|
// Stdio transport for local use (Claude Desktop, Cursor, Claude Code)
|
|
588
|
-
const server = new McpServer({ name: "madeonsol", version: "1.
|
|
648
|
+
const server = new McpServer({ name: "madeonsol", version: "1.1.0" });
|
|
589
649
|
registerTools(server);
|
|
590
650
|
const transport = new StdioServerTransport();
|
|
591
651
|
await server.connect(transport);
|
package/package.json
CHANGED