mcp-server-madeonsol 0.7.0 → 0.8.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/LICENSE +21 -21
- package/README.md +116 -64
- package/dist/index.js +246 -81
- package/glama.json +55 -35
- package/package.json +45 -49
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 MadeOnSol
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 MadeOnSol
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,64 +1,116 @@
|
|
|
1
|
-
# mcp-server-madeonsol
|
|
2
|
-
|
|
3
|
-
MCP server for [MadeOnSol](https://madeonsol.com) Solana KOL intelligence API. Use from Claude Desktop, Cursor, or any MCP-compatible client.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
##
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
1
|
+
# mcp-server-madeonsol
|
|
2
|
+
|
|
3
|
+
MCP server for [MadeOnSol](https://madeonsol.com) Solana KOL intelligence API. Use from Claude Desktop, Cursor, or any MCP-compatible client.
|
|
4
|
+
|
|
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
|
+
|
|
7
|
+
## Authentication
|
|
8
|
+
|
|
9
|
+
Two options (in priority order):
|
|
10
|
+
|
|
11
|
+
| Method | Env var | Best for |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| **MadeOnSol API key** (recommended) | `MADEONSOL_API_KEY` | Developers — [get a free key](https://madeonsol.com/developer) |
|
|
14
|
+
| x402 micropayments | `SVM_PRIVATE_KEY` | AI agents with Solana wallets |
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g mcp-server-madeonsol
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
> x402 peer deps (`@x402/fetch @x402/svm @x402/core @solana/kit @scure/base`) are only needed when using `SVM_PRIVATE_KEY`.
|
|
23
|
+
|
|
24
|
+
## Configure
|
|
25
|
+
|
|
26
|
+
### Claude Desktop
|
|
27
|
+
|
|
28
|
+
Add to `claude_desktop_config.json`:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"madeonsol": {
|
|
34
|
+
"command": "mcp-server-madeonsol",
|
|
35
|
+
"env": {
|
|
36
|
+
"MADEONSOL_API_KEY": "msk_your_api_key_here"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Cursor
|
|
44
|
+
|
|
45
|
+
Add to MCP settings with the same command and env vars.
|
|
46
|
+
|
|
47
|
+
## Tools
|
|
48
|
+
|
|
49
|
+
### KOL Intelligence
|
|
50
|
+
|
|
51
|
+
| Tool | Description |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `madeonsol_kol_feed` | Real-time KOL trade feed (1,000+ wallets) |
|
|
54
|
+
| `madeonsol_kol_coordination` | Multi-KOL convergence signals — tokens multiple KOLs are accumulating |
|
|
55
|
+
| `madeonsol_kol_leaderboard` | KOL PnL and win rate rankings (180 days of history; periods: today, 7d, 30d, 90d, 180d) |
|
|
56
|
+
| `madeonsol_kol_pairs` | KOL affinity matrix — which KOLs co-trade the same tokens |
|
|
57
|
+
| `madeonsol_kol_hot_tokens` | KOL momentum tokens — accelerating buy interest |
|
|
58
|
+
| `madeonsol_kol_trending_tokens` | Tokens ranked by KOL buy volume (5m–12h windows). Sub-hour periods PRO/ULTRA only. |
|
|
59
|
+
| `madeonsol_kol_pnl` | Deep per-wallet PnL: equity curve, risk metrics, closed + open positions. BASIC=summary, PRO=+curve+closed, ULTRA=+open. |
|
|
60
|
+
| `madeonsol_kol_timing` | KOL entry/exit timing profile — PRO/ULTRA |
|
|
61
|
+
|
|
62
|
+
### Deployer Hunter
|
|
63
|
+
|
|
64
|
+
| Tool | Description |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `madeonsol_deployer_alerts` | Pump.fun deployer launches with KOL enrichment. PRO/ULTRA: filter by tier (elite/good/moderate/rising/cold). |
|
|
67
|
+
| `madeonsol_deployer_trajectory` | Deployer skill curve — streaks, rolling bond rate, trend — PRO/ULTRA |
|
|
68
|
+
|
|
69
|
+
### Wallet Tracker
|
|
70
|
+
|
|
71
|
+
| Tool | Description |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `madeonsol_wallet_tracker_watchlist` | List your tracked wallets and remaining capacity (BASIC: 10, PRO: 50, ULTRA: 100) |
|
|
74
|
+
| `madeonsol_wallet_tracker_add` | Add a wallet to your watchlist |
|
|
75
|
+
| `madeonsol_wallet_tracker_remove` | Remove a wallet from your watchlist |
|
|
76
|
+
| `madeonsol_wallet_tracker_trades` | Historical swap/transfer events for watched wallets (120-day retention) |
|
|
77
|
+
| `madeonsol_wallet_tracker_summary` | Per-wallet stats: swap counts, SOL bought/sold, last event |
|
|
78
|
+
|
|
79
|
+
### Streaming & Webhooks
|
|
80
|
+
|
|
81
|
+
| Tool | Description |
|
|
82
|
+
|---|---|
|
|
83
|
+
| `madeonsol_stream_token` | Get a 24h WebSocket token for KOL/deployer streaming and DEX trade stream — PRO/ULTRA |
|
|
84
|
+
| `madeonsol_create_webhook` | Register a webhook for real-time push notifications — PRO/ULTRA |
|
|
85
|
+
| `madeonsol_list_webhooks` | List your registered webhooks — PRO/ULTRA |
|
|
86
|
+
| `madeonsol_delete_webhook` | Delete a webhook by ID — PRO/ULTRA |
|
|
87
|
+
| `madeonsol_test_webhook` | Send a test payload to verify a webhook — PRO/ULTRA |
|
|
88
|
+
|
|
89
|
+
### General
|
|
90
|
+
|
|
91
|
+
| Tool | Description |
|
|
92
|
+
|---|---|
|
|
93
|
+
| `madeonsol_discovery` | List all endpoints and prices (free, no auth) |
|
|
94
|
+
|
|
95
|
+
## Tiers
|
|
96
|
+
|
|
97
|
+
| Tier | Price | Wallets tracked | Requests/day |
|
|
98
|
+
|------|-------|-----------------|--------------|
|
|
99
|
+
| BASIC | Free | 10 | 200 |
|
|
100
|
+
| PRO | $49/mo | 50 | 10,000 |
|
|
101
|
+
| ULTRA | $199/mo | 100 + WS events | 100,000 |
|
|
102
|
+
|
|
103
|
+
Get a key at [madeonsol.com/developer](https://madeonsol.com/developer).
|
|
104
|
+
|
|
105
|
+
## Also Available
|
|
106
|
+
|
|
107
|
+
| Platform | Package |
|
|
108
|
+
|---|---|
|
|
109
|
+
| TypeScript SDK | [`madeonsol`](https://www.npmjs.com/package/madeonsol) on npm |
|
|
110
|
+
| Python (LangChain, CrewAI) | [`madeonsol-x402`](https://pypi.org/project/madeonsol-x402/) on PyPI |
|
|
111
|
+
| ElizaOS | [`@madeonsol/plugin-madeonsol`](https://www.npmjs.com/package/@madeonsol/plugin-madeonsol) |
|
|
112
|
+
| Solana Agent Kit | [`solana-agent-kit-plugin-madeonsol`](https://www.npmjs.com/package/solana-agent-kit-plugin-madeonsol) |
|
|
113
|
+
|
|
114
|
+
## License
|
|
115
|
+
|
|
116
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -5,41 +5,73 @@ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/
|
|
|
5
5
|
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
|
-
const
|
|
9
|
-
const
|
|
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
|
+
const PRIVATE_KEY = process.env.SVM_PRIVATE_KEY; // x402 micropayments (for AI agents)
|
|
10
11
|
const PORT = parseInt(process.env.PORT || "3100", 10);
|
|
11
12
|
const MODE = process.env.MCP_TRANSPORT || "stdio"; // "stdio" or "http"
|
|
13
|
+
let authMode = "none";
|
|
12
14
|
let paidFetch = fetch;
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
|
|
15
|
+
function apiKeyHeaders() {
|
|
16
|
+
if (authMode === "madeonsol") {
|
|
17
|
+
return { Authorization: `Bearer ${MADEONSOL_API_KEY}` };
|
|
18
|
+
}
|
|
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
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
async function initAuth() {
|
|
28
|
+
if (MADEONSOL_API_KEY) {
|
|
29
|
+
authMode = "madeonsol";
|
|
30
|
+
console.error("[madeonsol-mcp] Using MadeOnSol API key (Bearer auth)");
|
|
16
31
|
return;
|
|
17
32
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const { createKeyPairSignerFromBytes } = await import("@solana/kit");
|
|
23
|
-
const { base58 } = await import("@scure/base");
|
|
24
|
-
const signer = await createKeyPairSignerFromBytes(base58.decode(PRIVATE_KEY));
|
|
25
|
-
const client = new x402Client();
|
|
26
|
-
client.register("solana:*", new ExactSvmScheme(signer));
|
|
27
|
-
paidFetch = wrapFetchWithPayment(fetch, client);
|
|
28
|
-
console.error(`[madeonsol-mcp] x402 payments enabled, wallet: ${signer.address}`);
|
|
33
|
+
if (RAPIDAPI_KEY) {
|
|
34
|
+
authMode = "rapidapi";
|
|
35
|
+
console.error("[madeonsol-mcp] Using RapidAPI key");
|
|
36
|
+
return;
|
|
29
37
|
}
|
|
30
|
-
|
|
31
|
-
|
|
38
|
+
if (PRIVATE_KEY) {
|
|
39
|
+
try {
|
|
40
|
+
const { wrapFetchWithPayment } = await import("@x402/fetch");
|
|
41
|
+
const { x402Client } = await import("@x402/core/client");
|
|
42
|
+
const { ExactSvmScheme } = await import("@x402/svm/exact/client");
|
|
43
|
+
const { createKeyPairSignerFromBytes } = await import("@solana/kit");
|
|
44
|
+
const { base58 } = await import("@scure/base");
|
|
45
|
+
const signer = await createKeyPairSignerFromBytes(base58.decode(PRIVATE_KEY));
|
|
46
|
+
const client = new x402Client();
|
|
47
|
+
client.register("solana:*", new ExactSvmScheme(signer));
|
|
48
|
+
paidFetch = wrapFetchWithPayment(fetch, client);
|
|
49
|
+
authMode = "x402";
|
|
50
|
+
console.error(`[madeonsol-mcp] x402 payments enabled, wallet: ${signer.address}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.error("[madeonsol-mcp] x402 setup failed:", err);
|
|
55
|
+
}
|
|
32
56
|
}
|
|
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.");
|
|
33
58
|
}
|
|
34
59
|
async function query(path, params) {
|
|
35
|
-
|
|
60
|
+
// API key and RapidAPI auth use /api/v1/ endpoints; x402 uses /api/x402/
|
|
61
|
+
const apiPath = authMode === "x402" || authMode === "none"
|
|
62
|
+
? path
|
|
63
|
+
: path.replace("/api/x402/", "/api/v1/");
|
|
64
|
+
const url = new URL(apiPath, BASE_URL);
|
|
36
65
|
if (params) {
|
|
37
66
|
for (const [k, v] of Object.entries(params)) {
|
|
38
67
|
if (v !== undefined)
|
|
39
68
|
url.searchParams.set(k, String(v));
|
|
40
69
|
}
|
|
41
70
|
}
|
|
42
|
-
const
|
|
71
|
+
const headers = apiKeyHeaders();
|
|
72
|
+
const res = authMode === "x402"
|
|
73
|
+
? await paidFetch(url.toString())
|
|
74
|
+
: await fetch(url.toString(), { headers });
|
|
43
75
|
if (!res.ok) {
|
|
44
76
|
const body = await res.text().catch(() => "");
|
|
45
77
|
return `Error ${res.status}: ${body}`;
|
|
@@ -48,7 +80,7 @@ async function query(path, params) {
|
|
|
48
80
|
}
|
|
49
81
|
function registerTools(server) {
|
|
50
82
|
const readOnlyAnnotations = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true };
|
|
51
|
-
server.tool("madeonsol_kol_feed", "Get real-time Solana KOL trades from
|
|
83
|
+
server.tool("madeonsol_kol_feed", "Get real-time Solana KOL trades from 1,000+ tracked wallets.", {
|
|
52
84
|
limit: z.number().min(1).max(100).default(10).describe("Number of trades to return (1-100)"),
|
|
53
85
|
action: z.enum(["buy", "sell"]).optional().describe("Filter by trade type: buy or sell"),
|
|
54
86
|
kol: z.string().optional().describe("Filter by specific KOL wallet address (base58)"),
|
|
@@ -60,40 +92,185 @@ function registerTools(server) {
|
|
|
60
92
|
params.kol = kol;
|
|
61
93
|
return { content: [{ type: "text", text: await query("/api/x402/kol/feed", params) }] };
|
|
62
94
|
});
|
|
63
|
-
server.tool("madeonsol_kol_coordination", "Get KOL convergence signals — tokens being accumulated by multiple KOLs simultaneously.
|
|
95
|
+
server.tool("madeonsol_kol_coordination", "Get KOL convergence signals — tokens being accumulated by multiple KOLs simultaneously.", {
|
|
64
96
|
period: z.enum(["1h", "6h", "24h", "7d"]).default("24h").describe("Time period for coordination analysis"),
|
|
65
97
|
min_kols: z.number().min(2).max(50).default(3).describe("Minimum number of KOLs converging on the same token"),
|
|
66
98
|
limit: z.number().min(1).max(50).default(20).describe("Number of coordination signals to return"),
|
|
67
99
|
}, readOnlyAnnotations, async ({ period, min_kols, limit }) => ({
|
|
68
100
|
content: [{ type: "text", text: await query("/api/x402/kol/coordination", { period, min_kols, limit }) }],
|
|
69
101
|
}));
|
|
70
|
-
server.tool("madeonsol_kol_leaderboard", "Get KOL performance rankings by PnL and win rate.
|
|
102
|
+
server.tool("madeonsol_kol_leaderboard", "Get KOL performance rankings by PnL and win rate.", {
|
|
71
103
|
period: z.enum(["today", "7d", "30d"]).default("7d").describe("Time period for leaderboard: today, 7d, or 30d"),
|
|
72
104
|
limit: z.number().min(1).max(50).default(20).describe("Number of KOLs to return in ranking"),
|
|
73
105
|
}, readOnlyAnnotations, async ({ period, limit }) => ({
|
|
74
106
|
content: [{ type: "text", text: await query("/api/x402/kol/leaderboard", { period, limit }) }],
|
|
75
107
|
}));
|
|
76
|
-
server.tool("madeonsol_deployer_alerts", "Get real-time alerts from
|
|
108
|
+
server.tool("madeonsol_deployer_alerts", "Get real-time alerts from Pump.fun deployers with KOL buy enrichment. PRO/ULTRA subscribers can filter by deployer tier (elite/good/moderate/rising/cold).", {
|
|
77
109
|
limit: z.number().min(1).max(100).default(10).describe("Number of deployer alerts to return (1-100)"),
|
|
78
110
|
offset: z.number().min(0).default(0).describe("Pagination offset for deployer alerts"),
|
|
79
|
-
|
|
80
|
-
|
|
111
|
+
tier: z.enum(["elite", "good", "moderate", "rising", "cold"]).optional().describe("Filter by deployer tier. PRO/ULTRA only — BASIC callers receive HTTP 403."),
|
|
112
|
+
}, readOnlyAnnotations, async ({ limit, offset, tier }) => ({
|
|
113
|
+
content: [{ type: "text", text: await query("/api/x402/deployer-hunter/alerts", { limit, offset, ...(tier ? { tier } : {}) }) }],
|
|
114
|
+
}));
|
|
115
|
+
server.tool("madeonsol_kol_pairs", "KOL affinity matrix — discover which KOLs frequently co-trade the same tokens within a time window.", {
|
|
116
|
+
period: z.enum(["7d", "30d"]).default("7d").describe("Time period: 7d or 30d"),
|
|
117
|
+
min_shared: z.number().min(1).max(20).default(3).describe("Minimum number of shared tokens to qualify as a pair"),
|
|
118
|
+
limit: z.number().min(1).max(50).default(20).describe("Number of KOL pairs to return"),
|
|
119
|
+
}, readOnlyAnnotations, async ({ period, min_shared, limit }) => ({
|
|
120
|
+
content: [{ type: "text", text: await query("/api/x402/kol/pairs", { period, min_shared, limit }) }],
|
|
121
|
+
}));
|
|
122
|
+
server.tool("madeonsol_kol_timing", "KOL entry/exit timing profile — hold duration, exit speed, and activity patterns for a specific KOL.", {
|
|
123
|
+
wallet: z.string().describe("KOL wallet address (base58)"),
|
|
124
|
+
period: z.enum(["7d", "30d"]).default("30d").describe("Time period: 7d or 30d"),
|
|
125
|
+
}, readOnlyAnnotations, async ({ wallet, period }) => {
|
|
126
|
+
const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
|
|
127
|
+
if (hasRestAuth) {
|
|
128
|
+
const headers = { ...apiKeyHeaders() };
|
|
129
|
+
const res = await fetch(`${BASE_URL}/api/v1/kol/${wallet}/timing?period=${period}`, { headers });
|
|
130
|
+
if (!res.ok) {
|
|
131
|
+
const body = await res.text().catch(() => "");
|
|
132
|
+
return { content: [{ type: "text", text: `Error ${res.status}: ${body}` }] };
|
|
133
|
+
}
|
|
134
|
+
return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
|
|
135
|
+
}
|
|
136
|
+
return { content: [{ type: "text", text: "KOL timing requires API key or RapidAPI key auth." }] };
|
|
137
|
+
});
|
|
138
|
+
server.tool("madeonsol_deployer_trajectory", "Deployer skill curve — streaks, rolling bond rate, improvement trend, and deployment cadence for a Pump.fun deployer.", {
|
|
139
|
+
wallet: z.string().describe("Deployer wallet address (base58)"),
|
|
140
|
+
}, readOnlyAnnotations, async ({ wallet }) => {
|
|
141
|
+
const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
|
|
142
|
+
if (hasRestAuth) {
|
|
143
|
+
const headers = { ...apiKeyHeaders() };
|
|
144
|
+
const res = await fetch(`${BASE_URL}/api/v1/deployer-hunter/${wallet}/trajectory`, { headers });
|
|
145
|
+
if (!res.ok) {
|
|
146
|
+
const body = await res.text().catch(() => "");
|
|
147
|
+
return { content: [{ type: "text", text: `Error ${res.status}: ${body}` }] };
|
|
148
|
+
}
|
|
149
|
+
return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
|
|
150
|
+
}
|
|
151
|
+
return { content: [{ type: "text", text: "Deployer trajectory requires API key or RapidAPI key auth (Pro/Ultra)." }] };
|
|
152
|
+
});
|
|
153
|
+
server.tool("madeonsol_kol_hot_tokens", "KOL momentum tokens — tokens with accelerating KOL buy interest, early signals before coordination triggers.", {
|
|
154
|
+
period: z.enum(["1h", "6h"]).default("6h").describe("Time period: 1h or 6h"),
|
|
155
|
+
min_kols: z.number().min(1).max(20).default(1).describe("Minimum KOL buyers to include a token"),
|
|
156
|
+
limit: z.number().min(1).max(50).default(20).describe("Number of hot tokens to return"),
|
|
157
|
+
}, readOnlyAnnotations, async ({ period, min_kols, limit }) => ({
|
|
158
|
+
content: [{ type: "text", text: await query("/api/x402/kol/tokens/hot", { period, min_kols, limit }) }],
|
|
159
|
+
}));
|
|
160
|
+
server.tool("madeonsol_kol_pnl", "Deep per-wallet PnL breakdown — realized PnL, win rate, profit factor, max drawdown, daily equity curve, closed/open positions. BASIC: summary only. PRO: + curve + closed. ULTRA: + open positions.", {
|
|
161
|
+
wallet: z.string().describe("KOL wallet address (base58)"),
|
|
162
|
+
period: z.enum(["7d", "30d", "90d", "180d"]).default("30d").describe("Time period for PnL calculation"),
|
|
163
|
+
}, readOnlyAnnotations, async ({ wallet, period }) => {
|
|
164
|
+
const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
|
|
165
|
+
if (hasRestAuth) {
|
|
166
|
+
const headers = { ...apiKeyHeaders() };
|
|
167
|
+
const res = await fetch(`${BASE_URL}/api/v1/kol/${wallet}/pnl?period=${period}`, { headers });
|
|
168
|
+
if (!res.ok) {
|
|
169
|
+
const body = await res.text().catch(() => "");
|
|
170
|
+
return { content: [{ type: "text", text: `Error ${res.status}: ${body}` }] };
|
|
171
|
+
}
|
|
172
|
+
return { content: [{ type: "text", text: JSON.stringify(await res.json(), null, 2) }] };
|
|
173
|
+
}
|
|
174
|
+
return { content: [{ type: "text", text: "KOL PnL requires API key or RapidAPI key auth." }] };
|
|
175
|
+
});
|
|
176
|
+
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.", {
|
|
177
|
+
period: z.enum(["5m", "15m", "30m", "1h", "2h", "4h", "12h"]).default("1h").describe("Time window"),
|
|
178
|
+
min_kols: z.number().min(1).max(20).default(1).describe("Minimum KOL buyers"),
|
|
179
|
+
limit: z.number().min(1).max(50).default(20).describe("Number of trending tokens to return"),
|
|
180
|
+
}, readOnlyAnnotations, async ({ period, min_kols, limit }) => ({
|
|
181
|
+
content: [{ type: "text", text: await query("/api/x402/kol/tokens/trending", { period, min_kols, limit }) }],
|
|
81
182
|
}));
|
|
82
|
-
server.tool("madeonsol_discovery", "List all available MadeOnSol
|
|
183
|
+
server.tool("madeonsol_discovery", "List all available MadeOnSol API endpoints with prices and parameter docs. Free, no auth required.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async () => {
|
|
83
184
|
const res = await fetch(new URL("/api/x402", BASE_URL).toString());
|
|
84
185
|
const data = await res.json();
|
|
85
186
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
86
187
|
});
|
|
87
|
-
// ──
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
"
|
|
92
|
-
|
|
188
|
+
// ── Wallet Tracker tools (REST auth only — all mutating operations) ──
|
|
189
|
+
{
|
|
190
|
+
const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
|
|
191
|
+
async function walletTrackerRequest(method, path, body) {
|
|
192
|
+
const headers = { "Content-Type": "application/json", ...apiKeyHeaders() };
|
|
193
|
+
const res = await fetch(`${BASE_URL}/api/v1${path}`, {
|
|
194
|
+
method,
|
|
195
|
+
headers,
|
|
196
|
+
...(body ? { body: JSON.stringify(body) } : {}),
|
|
197
|
+
});
|
|
198
|
+
if (!res.ok) {
|
|
199
|
+
const text = await res.text().catch(() => "");
|
|
200
|
+
return `Error ${res.status}: ${text}`;
|
|
201
|
+
}
|
|
202
|
+
return JSON.stringify(await res.json(), null, 2);
|
|
203
|
+
}
|
|
204
|
+
if (hasRestAuth) {
|
|
205
|
+
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 () => ({
|
|
206
|
+
content: [{ type: "text", text: await walletTrackerRequest("GET", "/wallet-tracker/watchlist") }],
|
|
207
|
+
}));
|
|
208
|
+
server.tool("madeonsol_wallet_tracker_add", "Add a Solana wallet to your watchlist. Returns 409 if already tracked or limit reached.", {
|
|
209
|
+
wallet_address: z.string().describe("Solana wallet address (base58) to track"),
|
|
210
|
+
label: z.string().optional().describe("Optional human-readable label for this wallet"),
|
|
211
|
+
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ wallet_address, label }) => {
|
|
212
|
+
const body = { wallet_address };
|
|
213
|
+
if (label)
|
|
214
|
+
body.label = label;
|
|
215
|
+
return { content: [{ type: "text", text: await walletTrackerRequest("POST", "/wallet-tracker/watchlist", body) }] };
|
|
216
|
+
});
|
|
217
|
+
server.tool("madeonsol_wallet_tracker_remove", "Remove a wallet from your watchlist.", {
|
|
218
|
+
wallet_address: z.string().describe("Solana wallet address to remove from watchlist"),
|
|
219
|
+
}, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ wallet_address }) => ({
|
|
220
|
+
content: [{ type: "text", text: await walletTrackerRequest("DELETE", `/wallet-tracker/watchlist/${encodeURIComponent(wallet_address)}`) }],
|
|
221
|
+
}));
|
|
222
|
+
server.tool("madeonsol_wallet_tracker_trades", "Historical swap and transfer events for all your watched wallets. BASIC: truncated wallets, no tx_signature.", {
|
|
223
|
+
wallet: z.string().optional().describe("Filter to a specific wallet address"),
|
|
224
|
+
action: z.enum(["buy", "sell", "transfer_in", "transfer_out"]).optional().describe("Filter by action type"),
|
|
225
|
+
event_type: z.enum(["swap", "transfer"]).optional().describe("Filter by event type: swap (token trade) or transfer (SOL moved)"),
|
|
226
|
+
limit: z.number().min(1).max(200).default(50).describe("Max results (1–200)"),
|
|
227
|
+
before: z.number().optional().describe("Pagination cursor: block_time of the last event from previous page"),
|
|
228
|
+
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ wallet, action, event_type, limit, before }) => {
|
|
229
|
+
const params = { limit };
|
|
230
|
+
if (wallet)
|
|
231
|
+
params.wallet = wallet;
|
|
232
|
+
if (action)
|
|
233
|
+
params.action = action;
|
|
234
|
+
if (event_type)
|
|
235
|
+
params.event_type = event_type;
|
|
236
|
+
if (before !== undefined)
|
|
237
|
+
params.before = before;
|
|
238
|
+
const url = new URL(`${BASE_URL}/api/v1/wallet-tracker/trades`);
|
|
239
|
+
for (const [k, v] of Object.entries(params))
|
|
240
|
+
url.searchParams.set(k, String(v));
|
|
241
|
+
const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } });
|
|
242
|
+
const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
|
|
243
|
+
return { content: [{ type: "text", text }] };
|
|
244
|
+
});
|
|
245
|
+
server.tool("madeonsol_wallet_tracker_summary", "Per-wallet stats: swap counts, SOL bought/sold, and last activity time across your watchlist.", {
|
|
246
|
+
period: z.enum(["24h", "7d", "30d"]).default("7d").describe("Time window for stats"),
|
|
247
|
+
wallet: z.string().optional().describe("Filter to a specific wallet address"),
|
|
248
|
+
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ period, wallet }) => {
|
|
249
|
+
const url = new URL(`${BASE_URL}/api/v1/wallet-tracker/summary`);
|
|
250
|
+
url.searchParams.set("period", period);
|
|
251
|
+
if (wallet)
|
|
252
|
+
url.searchParams.set("wallet", wallet);
|
|
253
|
+
const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } });
|
|
254
|
+
const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
|
|
255
|
+
return { content: [{ type: "text", text }] };
|
|
256
|
+
});
|
|
257
|
+
console.error("[madeonsol-mcp] Wallet tracker tools enabled");
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.error("[madeonsol-mcp] Wallet tracker tools disabled (requires MADEONSOL_API_KEY or RAPIDAPI_KEY)");
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// ── Webhook & Streaming tools (require API key or RapidAPI key — Pro/Ultra tier) ──
|
|
264
|
+
const hasRestAuth = authMode === "madeonsol" || authMode === "rapidapi";
|
|
265
|
+
if (hasRestAuth) {
|
|
93
266
|
async function restQuery(method, path, body) {
|
|
267
|
+
const headers = {
|
|
268
|
+
"Content-Type": "application/json",
|
|
269
|
+
...apiKeyHeaders(),
|
|
270
|
+
};
|
|
94
271
|
const res = await fetch(`${BASE_URL}/api/v1${path}`, {
|
|
95
272
|
method,
|
|
96
|
-
headers
|
|
273
|
+
headers,
|
|
97
274
|
...(body ? { body: JSON.stringify(body) } : {}),
|
|
98
275
|
});
|
|
99
276
|
if (!res.ok) {
|
|
@@ -103,7 +280,7 @@ function registerTools(server) {
|
|
|
103
280
|
return JSON.stringify(await res.json(), null, 2);
|
|
104
281
|
}
|
|
105
282
|
const webhookAnnotations = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true };
|
|
106
|
-
server.tool("madeonsol_create_webhook", "Register a webhook URL to receive real-time push notifications for KOL trades and deployer alerts. Requires
|
|
283
|
+
server.tool("madeonsol_create_webhook", "Register a webhook URL to receive real-time push notifications for KOL trades and deployer alerts. Requires Pro/Ultra subscription.", {
|
|
107
284
|
url: z.string().url().describe("HTTPS webhook URL to receive events"),
|
|
108
285
|
events: z.array(z.enum(["kol:trade", "kol:coordination", "deployer:alert", "deployer:bond"])).min(1).describe("Event types to subscribe to"),
|
|
109
286
|
min_sol: z.number().optional().describe("Optional: minimum SOL amount filter (for kol:trade)"),
|
|
@@ -119,7 +296,7 @@ function registerTools(server) {
|
|
|
119
296
|
filters.deployer_tier = deployer_tier;
|
|
120
297
|
return { content: [{ type: "text", text: await restQuery("POST", "/webhooks", { url, events, filters }) }] };
|
|
121
298
|
});
|
|
122
|
-
server.tool("madeonsol_list_webhooks", "List all your registered webhooks with delivery status and failure counts.
|
|
299
|
+
server.tool("madeonsol_list_webhooks", "List all your registered webhooks with delivery status and failure counts.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async () => ({
|
|
123
300
|
content: [{ type: "text", text: await restQuery("GET", "/webhooks") }],
|
|
124
301
|
}));
|
|
125
302
|
server.tool("madeonsol_delete_webhook", "Delete a webhook by ID. Permanently removes the webhook and its delivery history.", {
|
|
@@ -132,42 +309,13 @@ function registerTools(server) {
|
|
|
132
309
|
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ webhook_id }) => ({
|
|
133
310
|
content: [{ type: "text", text: await restQuery("POST", "/webhooks/test", { webhook_id }) }],
|
|
134
311
|
}));
|
|
135
|
-
server.tool("madeonsol_stream_token", "Generate a
|
|
312
|
+
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 () => ({
|
|
136
313
|
content: [{ type: "text", text: await restQuery("POST", "/stream/token") }],
|
|
137
314
|
}));
|
|
138
|
-
|
|
139
|
-
server.tool("madeonsol_alpha_leaderboard", "Get a leaderboard of statistically profitable Solana wallets ranked by win rate, PnL, or ROI. Scored from 47,000+ early buyers tracked across Pump.fun tokens. BASIC: 25 results. PRO: 100. ULTRA: 500 + behavioral signals.", {
|
|
140
|
-
period: z.enum(["7d", "30d", "all"]).default("all").describe("Time period: 7d, 30d, or all"),
|
|
141
|
-
min_tokens: z.number().min(1).max(20).default(5).describe("Minimum tokens traded to qualify (1-20)"),
|
|
142
|
-
sort: z.enum(["win_rate", "pnl", "roi"]).default("win_rate").describe("Sort by win_rate, pnl, or roi"),
|
|
143
|
-
exclude_bots: z.enum(["true", "false"]).default("true").describe("Exclude medium/high bot-confidence wallets"),
|
|
144
|
-
}, readOnlyAnnotations, async ({ period, min_tokens, sort, exclude_bots }) => ({
|
|
145
|
-
content: [{ type: "text", text: await restQuery("GET", `/alpha/leaderboard?period=${period}&min_tokens=${min_tokens}&sort=${sort}&exclude_bots=${exclude_bots}`) }],
|
|
146
|
-
}));
|
|
147
|
-
server.tool("madeonsol_alpha_wallet", "Full alpha profile for a single wallet — per-token trade history, win rate, realized PnL, and bot_signals array explaining the confidence rating. ULTRA only.", {
|
|
148
|
-
wallet: z.string().describe("Solana wallet address (base58)"),
|
|
149
|
-
}, readOnlyAnnotations, async ({ wallet }) => ({
|
|
150
|
-
content: [{ type: "text", text: await restQuery("GET", `/alpha/${encodeURIComponent(wallet)}`) }],
|
|
151
|
-
}));
|
|
152
|
-
server.tool("madeonsol_alpha_linked", "Find wallets behaviorally linked to a target wallet — co-bought 3+ of the same tokens within a 2-second window (likely same actor or coordinated group). Returns similarity scores. ULTRA only.", {
|
|
153
|
-
wallet: z.string().describe("Solana wallet address to find linked wallets for"),
|
|
154
|
-
}, readOnlyAnnotations, async ({ wallet }) => ({
|
|
155
|
-
content: [{ type: "text", text: await restQuery("GET", `/alpha/${encodeURIComponent(wallet)}/linked`) }],
|
|
156
|
-
}));
|
|
157
|
-
server.tool("madeonsol_token_cap_table", "Get the first 10-20 non-deployer early buyers for a token mint, enriched with historical win rates, PnL, KOL identity, and bundle flags. Includes a buyer quality summary. BASIC: 403. PRO: top 10. ULTRA: top 20.", {
|
|
158
|
-
mint: z.string().describe("Token mint address (base58)"),
|
|
159
|
-
}, readOnlyAnnotations, async ({ mint }) => ({
|
|
160
|
-
content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/cap-table`) }],
|
|
161
|
-
}));
|
|
162
|
-
server.tool("madeonsol_token_buyer_quality", "Get a 0-100 buyer quality score for a token's early-buyer cohort. Signal: positive (>60), neutral (40-60), negative (<40). BASIC: score + signal only. PRO/ULTRA: + full breakdown. Cached 5 minutes per mint.", {
|
|
163
|
-
mint: z.string().describe("Token mint address (base58)"),
|
|
164
|
-
}, readOnlyAnnotations, async ({ mint }) => ({
|
|
165
|
-
content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/buyer-quality`) }],
|
|
166
|
-
}));
|
|
167
|
-
console.error("[madeonsol-mcp] Webhook, streaming & alpha tools enabled (MADEONSOL_API_KEY set)");
|
|
315
|
+
console.error("[madeonsol-mcp] Webhook & streaming tools enabled");
|
|
168
316
|
}
|
|
169
317
|
else {
|
|
170
|
-
console.error("[madeonsol-mcp]
|
|
318
|
+
console.error("[madeonsol-mcp] Webhook/streaming tools disabled (requires MADEONSOL_API_KEY or RAPIDAPI_KEY)");
|
|
171
319
|
}
|
|
172
320
|
// Prompts — pre-built analysis templates
|
|
173
321
|
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 }) => ({
|
|
@@ -190,7 +338,7 @@ function registerTools(server) {
|
|
|
190
338
|
});
|
|
191
339
|
}
|
|
192
340
|
async function main() {
|
|
193
|
-
await
|
|
341
|
+
await initAuth();
|
|
194
342
|
if (MODE === "http") {
|
|
195
343
|
// HTTP transport for hosted environments (Smithery, etc.)
|
|
196
344
|
const httpServer = createServer();
|
|
@@ -207,19 +355,30 @@ async function main() {
|
|
|
207
355
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
208
356
|
res.end(JSON.stringify({
|
|
209
357
|
name: "madeonsol",
|
|
210
|
-
description: "Solana KOL trading intelligence and deployer analytics
|
|
358
|
+
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.",
|
|
211
359
|
version: "0.1.0",
|
|
212
360
|
tools: [
|
|
213
|
-
{ name: "madeonsol_kol_feed", description: "Get real-time Solana KOL trades from
|
|
214
|
-
{ name: "madeonsol_kol_coordination", description: "Get KOL convergence signals — tokens multiple KOLs are accumulating.
|
|
215
|
-
{ name: "madeonsol_kol_leaderboard", description: "Get KOL performance rankings by PnL and win rate.
|
|
216
|
-
{ name: "madeonsol_deployer_alerts", description: "Get elite Pump.fun deployer alerts with KOL enrichment.
|
|
361
|
+
{ name: "madeonsol_kol_feed", description: "Get real-time Solana KOL trades from 1,000+ tracked wallets." },
|
|
362
|
+
{ name: "madeonsol_kol_coordination", description: "Get KOL convergence signals — tokens multiple KOLs are accumulating." },
|
|
363
|
+
{ name: "madeonsol_kol_leaderboard", description: "Get KOL performance rankings by PnL and win rate." },
|
|
364
|
+
{ name: "madeonsol_deployer_alerts", description: "Get elite Pump.fun deployer alerts with KOL enrichment." },
|
|
365
|
+
{ name: "madeonsol_kol_pairs", description: "KOL affinity matrix — which KOLs co-trade the same tokens." },
|
|
366
|
+
{ name: "madeonsol_kol_timing", description: "KOL entry/exit timing profile. Pro/Ultra." },
|
|
367
|
+
{ name: "madeonsol_deployer_trajectory", description: "Deployer skill curve — streaks, trend. Pro/Ultra." },
|
|
368
|
+
{ name: "madeonsol_kol_hot_tokens", description: "KOL momentum tokens — accelerating buy interest." },
|
|
369
|
+
{ name: "madeonsol_kol_pnl", description: "Deep per-wallet PnL: equity curve, risk metrics, positions." },
|
|
370
|
+
{ name: "madeonsol_kol_trending_tokens", description: "Tokens ranked by KOL buy volume (5m–12h windows)." },
|
|
217
371
|
{ name: "madeonsol_discovery", description: "List all available endpoints with prices. Free." },
|
|
218
|
-
{ name: "madeonsol_create_webhook", description: "Register a webhook for real-time push notifications.
|
|
219
|
-
{ name: "madeonsol_list_webhooks", description: "List your registered webhooks.
|
|
220
|
-
{ name: "madeonsol_delete_webhook", description: "Delete a webhook by ID.
|
|
221
|
-
{ name: "madeonsol_test_webhook", description: "Send a test payload to verify a webhook.
|
|
222
|
-
{ name: "madeonsol_stream_token", description: "Get a 24h WebSocket streaming token.
|
|
372
|
+
{ name: "madeonsol_create_webhook", description: "Register a webhook for real-time push notifications. Pro/Ultra." },
|
|
373
|
+
{ name: "madeonsol_list_webhooks", description: "List your registered webhooks. Pro/Ultra." },
|
|
374
|
+
{ name: "madeonsol_delete_webhook", description: "Delete a webhook by ID. Pro/Ultra." },
|
|
375
|
+
{ name: "madeonsol_test_webhook", description: "Send a test payload to verify a webhook. Pro/Ultra." },
|
|
376
|
+
{ name: "madeonsol_stream_token", description: "Get a 24h WebSocket streaming token. Pro/Ultra." },
|
|
377
|
+
{ name: "madeonsol_wallet_tracker_watchlist", description: "List your tracked wallets and remaining capacity." },
|
|
378
|
+
{ name: "madeonsol_wallet_tracker_add", description: "Add a wallet to your watchlist." },
|
|
379
|
+
{ name: "madeonsol_wallet_tracker_remove", description: "Remove a wallet from your watchlist." },
|
|
380
|
+
{ name: "madeonsol_wallet_tracker_trades", description: "Historical swap/transfer events for watched wallets." },
|
|
381
|
+
{ name: "madeonsol_wallet_tracker_summary", description: "Per-wallet stats: swap counts, SOL bought/sold." },
|
|
223
382
|
],
|
|
224
383
|
homepage: "https://madeonsol.com/solana-api",
|
|
225
384
|
repository: "https://github.com/LamboPoewert/mcp-server-madeonsol",
|
|
@@ -261,8 +420,14 @@ async function main() {
|
|
|
261
420
|
res.writeHead(404);
|
|
262
421
|
res.end("Not found");
|
|
263
422
|
});
|
|
264
|
-
|
|
265
|
-
|
|
423
|
+
// Bind to 127.0.0.1 only — defense in depth. UFW already blocks the port
|
|
424
|
+
// externally, but binding to all interfaces would expose the server to any
|
|
425
|
+
// misconfigured firewall rule. Override with HOST=0.0.0.0 if you ever need
|
|
426
|
+
// to expose it directly (e.g. for hosted environments behind a separate
|
|
427
|
+
// reverse proxy).
|
|
428
|
+
const HOST = process.env.HOST || "127.0.0.1";
|
|
429
|
+
httpServer.listen(PORT, HOST, () => {
|
|
430
|
+
console.error(`[madeonsol-mcp] HTTP server listening on ${HOST}:${PORT}`);
|
|
266
431
|
});
|
|
267
432
|
}
|
|
268
433
|
else {
|
package/glama.json
CHANGED
|
@@ -1,35 +1,55 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "mcp-server-madeonsol",
|
|
3
|
-
"display_name": "MadeOnSol",
|
|
4
|
-
"description": "Solana KOL trading intelligence and deployer analytics
|
|
5
|
-
"version": "0.
|
|
6
|
-
"homepage": "https://madeonsol.com/solana-api",
|
|
7
|
-
"repository": "https://github.com/LamboPoewert/mcp-server-madeonsol",
|
|
8
|
-
"license": "MIT",
|
|
9
|
-
"categories": ["blockchain", "finance", "web3"],
|
|
10
|
-
"tags": ["solana", "kol", "trading", "x402", "micropayments", "defi"],
|
|
11
|
-
"tools": [
|
|
12
|
-
{
|
|
13
|
-
"name": "madeonsol_kol_feed",
|
|
14
|
-
"description": "Get real-time Solana KOL trades from
|
|
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."
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-server-madeonsol",
|
|
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",
|
|
6
|
+
"homepage": "https://madeonsol.com/solana-api",
|
|
7
|
+
"repository": "https://github.com/LamboPoewert/mcp-server-madeonsol",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"categories": ["blockchain", "finance", "web3"],
|
|
10
|
+
"tags": ["solana", "kol", "trading", "x402", "micropayments", "defi", "api", "deployer", "pump-fun"],
|
|
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
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"transports": ["stdio", "http"],
|
|
54
|
+
"runtime": "node"
|
|
55
|
+
}
|
package/package.json
CHANGED
|
@@ -1,49 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "mcp-server-madeonsol",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"mcpName": "io.github.lambopoewert/madeonsol",
|
|
5
|
-
"description": "MCP server for MadeOnSol Solana KOL intelligence API — use from Claude, Cursor, or any MCP client",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"bin": {
|
|
8
|
-
"mcp-server-madeonsol": "dist/index.js"
|
|
9
|
-
},
|
|
10
|
-
"main": "dist/index.js",
|
|
11
|
-
"files": [
|
|
12
|
-
"dist",
|
|
13
|
-
"README.md",
|
|
14
|
-
"LICENSE",
|
|
15
|
-
"glama.json"
|
|
16
|
-
],
|
|
17
|
-
"scripts": {
|
|
18
|
-
"build": "tsc",
|
|
19
|
-
"prepublishOnly": ""
|
|
20
|
-
},
|
|
21
|
-
"keywords": [
|
|
22
|
-
"mcp",
|
|
23
|
-
"solana",
|
|
24
|
-
"x402",
|
|
25
|
-
"kol",
|
|
26
|
-
"trading",
|
|
27
|
-
"claude",
|
|
28
|
-
"cursor"
|
|
29
|
-
],
|
|
30
|
-
"license": "MIT",
|
|
31
|
-
"repository": {
|
|
32
|
-
"type": "git",
|
|
33
|
-
"url": "https://github.com/LamboPoewert/mcp-server-madeonsol"
|
|
34
|
-
},
|
|
35
|
-
"dependencies": {
|
|
36
|
-
"@modelcontextprotocol/sdk": "^1.12.1"
|
|
37
|
-
},
|
|
38
|
-
"peerDependencies": {
|
|
39
|
-
"@
|
|
40
|
-
"@
|
|
41
|
-
"@x402/
|
|
42
|
-
"@
|
|
43
|
-
"@
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
"@types/node": "^25.6.0",
|
|
47
|
-
"typescript": "^5.9.3"
|
|
48
|
-
}
|
|
49
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-server-madeonsol",
|
|
3
|
+
"version": "0.8.1",
|
|
4
|
+
"mcpName": "io.github.lambopoewert/madeonsol",
|
|
5
|
+
"description": "MCP server for MadeOnSol Solana KOL intelligence API — use from Claude, Cursor, or any MCP client",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mcp-server-madeonsol": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE",
|
|
15
|
+
"glama.json"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"prepublishOnly": ""
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"solana",
|
|
24
|
+
"x402",
|
|
25
|
+
"kol",
|
|
26
|
+
"trading",
|
|
27
|
+
"claude",
|
|
28
|
+
"cursor"
|
|
29
|
+
],
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/LamboPoewert/mcp-server-madeonsol"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@modelcontextprotocol/sdk": "^1.12.1"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@x402/fetch": ">=0.1.0",
|
|
40
|
+
"@x402/core": ">=0.1.0",
|
|
41
|
+
"@x402/svm": ">=0.1.0",
|
|
42
|
+
"@solana/kit": ">=2.0.0",
|
|
43
|
+
"@scure/base": ">=1.0.0"
|
|
44
|
+
}
|
|
45
|
+
}
|