mcp-server-madeonsol 0.4.0 → 0.6.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/LICENSE +21 -21
- package/README.md +61 -78
- package/dist/index.js +82 -141
- package/glama.json +35 -55
- package/package.json +49 -45
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,78 +1,61 @@
|
|
|
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
|
-
| Tool | Description |
|
|
63
|
-
|---|---|
|
|
64
|
-
| `madeonsol_stream_token` | Get 24h WebSocket token for KOL/deployer streaming and DEX trade stream |
|
|
65
|
-
| Webhook CRUD tools | Create, list, update, delete, test webhooks |
|
|
66
|
-
|
|
67
|
-
## Also Available
|
|
68
|
-
|
|
69
|
-
| Platform | Package |
|
|
70
|
-
|---|---|
|
|
71
|
-
| TypeScript SDK | [`madeonsol-x402`](https://www.npmjs.com/package/madeonsol-x402) |
|
|
72
|
-
| Python (LangChain, CrewAI) | [`madeonsol-x402`](https://github.com/LamboPoewert/madeonsol-python) on PyPI |
|
|
73
|
-
| ElizaOS | [`@madeonsol/plugin-madeonsol`](https://www.npmjs.com/package/@madeonsol/plugin-madeonsol) |
|
|
74
|
-
| Solana Agent Kit | [`solana-agent-kit-plugin-madeonsol`](https://www.npmjs.com/package/solana-agent-kit-plugin-madeonsol) |
|
|
75
|
-
|
|
76
|
-
## License
|
|
77
|
-
|
|
78
|
-
MIT
|
|
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
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g mcp-server-madeonsol @x402/fetch @x402/svm @x402/core @solana/kit @scure/base
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Configure
|
|
12
|
+
|
|
13
|
+
### Claude Desktop
|
|
14
|
+
|
|
15
|
+
Add to `claude_desktop_config.json`:
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"mcpServers": {
|
|
20
|
+
"madeonsol": {
|
|
21
|
+
"command": "mcp-server-madeonsol",
|
|
22
|
+
"env": {
|
|
23
|
+
"SVM_PRIVATE_KEY": "your_solana_private_key_base58"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Cursor
|
|
31
|
+
|
|
32
|
+
Add to MCP settings with the same command and env vars.
|
|
33
|
+
|
|
34
|
+
## Tools
|
|
35
|
+
|
|
36
|
+
| Tool | Price | Description |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `madeonsol_kol_feed` | $0.005 | Real-time KOL trade feed (946 wallets) |
|
|
39
|
+
| `madeonsol_kol_coordination` | $0.02 | Multi-KOL convergence signals |
|
|
40
|
+
| `madeonsol_kol_leaderboard` | $0.005 | KOL PnL and win rate rankings |
|
|
41
|
+
| `madeonsol_deployer_alerts` | $0.01 | Elite Pump.fun deployer launches |
|
|
42
|
+
| `madeonsol_discovery` | Free | List all endpoints and prices |
|
|
43
|
+
|
|
44
|
+
## How It Works
|
|
45
|
+
|
|
46
|
+
The server uses the x402 payment protocol. Each tool call triggers a USDC micropayment on Solana. Your wallet needs SOL (for fees) and USDC.
|
|
47
|
+
|
|
48
|
+
Without `SVM_PRIVATE_KEY`, tools return payment requirement info instead of data.
|
|
49
|
+
|
|
50
|
+
## Also Available
|
|
51
|
+
|
|
52
|
+
| Platform | Package |
|
|
53
|
+
|---|---|
|
|
54
|
+
| TypeScript SDK | [`madeonsol-x402`](https://www.npmjs.com/package/madeonsol-x402) |
|
|
55
|
+
| Python (LangChain, CrewAI) | [`madeonsol-x402`](https://github.com/LamboPoewert/madeonsol-python) on PyPI |
|
|
56
|
+
| ElizaOS | [`@madeonsol/plugin-madeonsol`](https://www.npmjs.com/package/@madeonsol/plugin-madeonsol) |
|
|
57
|
+
| Solana Agent Kit | [`solana-agent-kit-plugin-madeonsol`](https://www.npmjs.com/package/solana-agent-kit-plugin-madeonsol) |
|
|
58
|
+
|
|
59
|
+
## License
|
|
60
|
+
|
|
61
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -5,73 +5,41 @@ 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 RAPIDAPI_KEY = process.env.RAPIDAPI_KEY; //
|
|
10
|
-
const PRIVATE_KEY = process.env.SVM_PRIVATE_KEY; // x402 micropayments (for AI agents)
|
|
8
|
+
const PRIVATE_KEY = process.env.SVM_PRIVATE_KEY;
|
|
9
|
+
const RAPIDAPI_KEY = process.env.RAPIDAPI_KEY; // For webhook/streaming features (Pro/Ultra)
|
|
11
10
|
const PORT = parseInt(process.env.PORT || "3100", 10);
|
|
12
11
|
const MODE = process.env.MCP_TRANSPORT || "stdio"; // "stdio" or "http"
|
|
13
|
-
let authMode = "none";
|
|
14
12
|
let paidFetch = fetch;
|
|
15
|
-
function
|
|
16
|
-
if (
|
|
17
|
-
|
|
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)");
|
|
13
|
+
async function initPayment() {
|
|
14
|
+
if (!PRIVATE_KEY) {
|
|
15
|
+
console.error("[madeonsol-mcp] No SVM_PRIVATE_KEY — tools will return 402 payment info");
|
|
31
16
|
return;
|
|
32
17
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
18
|
+
try {
|
|
19
|
+
const { wrapFetchWithPayment } = await import("@x402/fetch");
|
|
20
|
+
const { x402Client } = await import("@x402/core/client");
|
|
21
|
+
const { ExactSvmScheme } = await import("@x402/svm/exact/client");
|
|
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}`);
|
|
37
29
|
}
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error("[madeonsol-mcp] x402 setup failed:", err);
|
|
56
32
|
}
|
|
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.");
|
|
58
33
|
}
|
|
59
34
|
async function query(path, params) {
|
|
60
|
-
|
|
61
|
-
const apiPath = authMode === "x402" || authMode === "none"
|
|
62
|
-
? path
|
|
63
|
-
: path.replace("/api/x402/", "/api/v1/");
|
|
64
|
-
const url = new URL(apiPath, BASE_URL);
|
|
35
|
+
const url = new URL(path, BASE_URL);
|
|
65
36
|
if (params) {
|
|
66
37
|
for (const [k, v] of Object.entries(params)) {
|
|
67
38
|
if (v !== undefined)
|
|
68
39
|
url.searchParams.set(k, String(v));
|
|
69
40
|
}
|
|
70
41
|
}
|
|
71
|
-
const
|
|
72
|
-
const res = authMode === "x402"
|
|
73
|
-
? await paidFetch(url.toString())
|
|
74
|
-
: await fetch(url.toString(), { headers });
|
|
42
|
+
const res = await paidFetch(url.toString());
|
|
75
43
|
if (!res.ok) {
|
|
76
44
|
const body = await res.text().catch(() => "");
|
|
77
45
|
return `Error ${res.status}: ${body}`;
|
|
@@ -80,7 +48,7 @@ async function query(path, params) {
|
|
|
80
48
|
}
|
|
81
49
|
function registerTools(server) {
|
|
82
50
|
const readOnlyAnnotations = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true };
|
|
83
|
-
server.tool("madeonsol_kol_feed", "Get real-time Solana KOL trades from
|
|
51
|
+
server.tool("madeonsol_kol_feed", "Get real-time Solana KOL trades from 946 tracked wallets. Costs $0.005 USDC per request via x402.", {
|
|
84
52
|
limit: z.number().min(1).max(100).default(10).describe("Number of trades to return (1-100)"),
|
|
85
53
|
action: z.enum(["buy", "sell"]).optional().describe("Filter by trade type: buy or sell"),
|
|
86
54
|
kol: z.string().optional().describe("Filter by specific KOL wallet address (base58)"),
|
|
@@ -92,87 +60,41 @@ function registerTools(server) {
|
|
|
92
60
|
params.kol = kol;
|
|
93
61
|
return { content: [{ type: "text", text: await query("/api/x402/kol/feed", params) }] };
|
|
94
62
|
});
|
|
95
|
-
server.tool("madeonsol_kol_coordination", "Get KOL convergence signals — tokens being accumulated by multiple KOLs simultaneously.", {
|
|
63
|
+
server.tool("madeonsol_kol_coordination", "Get KOL convergence signals — tokens being accumulated by multiple KOLs simultaneously. Costs $0.02 USDC per request via x402.", {
|
|
96
64
|
period: z.enum(["1h", "6h", "24h", "7d"]).default("24h").describe("Time period for coordination analysis"),
|
|
97
65
|
min_kols: z.number().min(2).max(50).default(3).describe("Minimum number of KOLs converging on the same token"),
|
|
98
66
|
limit: z.number().min(1).max(50).default(20).describe("Number of coordination signals to return"),
|
|
99
67
|
}, readOnlyAnnotations, async ({ period, min_kols, limit }) => ({
|
|
100
68
|
content: [{ type: "text", text: await query("/api/x402/kol/coordination", { period, min_kols, limit }) }],
|
|
101
69
|
}));
|
|
102
|
-
server.tool("madeonsol_kol_leaderboard", "Get KOL performance rankings by PnL and win rate.", {
|
|
70
|
+
server.tool("madeonsol_kol_leaderboard", "Get KOL performance rankings by PnL and win rate. Costs $0.005 USDC per request via x402.", {
|
|
103
71
|
period: z.enum(["today", "7d", "30d"]).default("7d").describe("Time period for leaderboard: today, 7d, or 30d"),
|
|
104
72
|
limit: z.number().min(1).max(50).default(20).describe("Number of KOLs to return in ranking"),
|
|
105
73
|
}, readOnlyAnnotations, async ({ period, limit }) => ({
|
|
106
74
|
content: [{ type: "text", text: await query("/api/x402/kol/leaderboard", { period, limit }) }],
|
|
107
75
|
}));
|
|
108
|
-
server.tool("madeonsol_deployer_alerts", "Get real-time alerts from Pump.fun deployers with KOL buy enrichment.
|
|
76
|
+
server.tool("madeonsol_deployer_alerts", "Get real-time alerts from elite Pump.fun deployers with KOL buy enrichment. Costs $0.01 USDC per request via x402.", {
|
|
109
77
|
limit: z.number().min(1).max(100).default(10).describe("Number of deployer alerts to return (1-100)"),
|
|
110
78
|
offset: z.number().min(0).default(0).describe("Pagination offset for deployer alerts"),
|
|
111
|
-
|
|
112
|
-
|
|
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 }) }],
|
|
79
|
+
}, readOnlyAnnotations, async ({ limit, offset }) => ({
|
|
80
|
+
content: [{ type: "text", text: await query("/api/x402/deployer-hunter/alerts", { limit, offset }) }],
|
|
159
81
|
}));
|
|
160
|
-
server.tool("madeonsol_discovery", "List all available MadeOnSol API endpoints with prices and parameter docs. Free, no
|
|
82
|
+
server.tool("madeonsol_discovery", "List all available MadeOnSol x402 API endpoints with prices and parameter docs. Free, no payment required.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async () => {
|
|
161
83
|
const res = await fetch(new URL("/api/x402", BASE_URL).toString());
|
|
162
84
|
const data = await res.json();
|
|
163
85
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
164
86
|
});
|
|
165
|
-
// ── Webhook & Streaming tools (require
|
|
166
|
-
|
|
167
|
-
|
|
87
|
+
// ── Webhook & Streaming tools (require RAPIDAPI_KEY env var) ──
|
|
88
|
+
if (RAPIDAPI_KEY) {
|
|
89
|
+
const restHeaders = {
|
|
90
|
+
"Content-Type": "application/json",
|
|
91
|
+
"x-rapidapi-key": RAPIDAPI_KEY,
|
|
92
|
+
"x-rapidapi-host": "madeonsol-solana-kol-tracker-tools-api.p.rapidapi.com",
|
|
93
|
+
};
|
|
168
94
|
async function restQuery(method, path, body) {
|
|
169
|
-
const headers = {
|
|
170
|
-
"Content-Type": "application/json",
|
|
171
|
-
...apiKeyHeaders(),
|
|
172
|
-
};
|
|
173
95
|
const res = await fetch(`${BASE_URL}/api/v1${path}`, {
|
|
174
96
|
method,
|
|
175
|
-
headers,
|
|
97
|
+
headers: restHeaders,
|
|
176
98
|
...(body ? { body: JSON.stringify(body) } : {}),
|
|
177
99
|
});
|
|
178
100
|
if (!res.ok) {
|
|
@@ -182,7 +104,7 @@ function registerTools(server) {
|
|
|
182
104
|
return JSON.stringify(await res.json(), null, 2);
|
|
183
105
|
}
|
|
184
106
|
const webhookAnnotations = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true };
|
|
185
|
-
server.tool("madeonsol_create_webhook", "Register a webhook URL to receive real-time push notifications for KOL trades and deployer alerts. Requires Pro/Ultra
|
|
107
|
+
server.tool("madeonsol_create_webhook", "Register a webhook URL to receive real-time push notifications for KOL trades and deployer alerts. Requires RapidAPI Pro/Ultra.", {
|
|
186
108
|
url: z.string().url().describe("HTTPS webhook URL to receive events"),
|
|
187
109
|
events: z.array(z.enum(["kol:trade", "kol:coordination", "deployer:alert", "deployer:bond"])).min(1).describe("Event types to subscribe to"),
|
|
188
110
|
min_sol: z.number().optional().describe("Optional: minimum SOL amount filter (for kol:trade)"),
|
|
@@ -198,7 +120,7 @@ function registerTools(server) {
|
|
|
198
120
|
filters.deployer_tier = deployer_tier;
|
|
199
121
|
return { content: [{ type: "text", text: await restQuery("POST", "/webhooks", { url, events, filters }) }] };
|
|
200
122
|
});
|
|
201
|
-
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
|
+
server.tool("madeonsol_list_webhooks", "List all your registered webhooks with delivery status and failure counts. Requires RAPIDAPI_KEY env var.", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async () => ({
|
|
202
124
|
content: [{ type: "text", text: await restQuery("GET", "/webhooks") }],
|
|
203
125
|
}));
|
|
204
126
|
server.tool("madeonsol_delete_webhook", "Delete a webhook by ID. Permanently removes the webhook and its delivery history.", {
|
|
@@ -211,13 +133,42 @@ function registerTools(server) {
|
|
|
211
133
|
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ webhook_id }) => ({
|
|
212
134
|
content: [{ type: "text", text: await restQuery("POST", "/webhooks/test", { webhook_id }) }],
|
|
213
135
|
}));
|
|
214
|
-
server.tool("madeonsol_stream_token", "Generate a
|
|
136
|
+
server.tool("madeonsol_stream_token", "Generate a 24-hour WebSocket streaming token for real-time event streaming. Connect to wss://madeonsol.com/ws/v1/stream?token=TOKEN", {}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async () => ({
|
|
215
137
|
content: [{ type: "text", text: await restQuery("POST", "/stream/token") }],
|
|
216
138
|
}));
|
|
217
|
-
|
|
139
|
+
// ── Alpha wallet intelligence tools ──
|
|
140
|
+
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.", {
|
|
141
|
+
period: z.enum(["7d", "30d", "all"]).default("all").describe("Time period: 7d, 30d, or all"),
|
|
142
|
+
min_tokens: z.number().min(1).max(20).default(5).describe("Minimum tokens traded to qualify (1-20)"),
|
|
143
|
+
sort: z.enum(["win_rate", "pnl", "roi"]).default("win_rate").describe("Sort by win_rate, pnl, or roi"),
|
|
144
|
+
exclude_bots: z.enum(["true", "false"]).default("true").describe("Exclude medium/high bot-confidence wallets"),
|
|
145
|
+
}, readOnlyAnnotations, async ({ period, min_tokens, sort, exclude_bots }) => ({
|
|
146
|
+
content: [{ type: "text", text: await restQuery("GET", `/alpha/leaderboard?period=${period}&min_tokens=${min_tokens}&sort=${sort}&exclude_bots=${exclude_bots}`) }],
|
|
147
|
+
}));
|
|
148
|
+
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.", {
|
|
149
|
+
wallet: z.string().describe("Solana wallet address (base58)"),
|
|
150
|
+
}, readOnlyAnnotations, async ({ wallet }) => ({
|
|
151
|
+
content: [{ type: "text", text: await restQuery("GET", `/alpha/${encodeURIComponent(wallet)}`) }],
|
|
152
|
+
}));
|
|
153
|
+
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.", {
|
|
154
|
+
wallet: z.string().describe("Solana wallet address to find linked wallets for"),
|
|
155
|
+
}, readOnlyAnnotations, async ({ wallet }) => ({
|
|
156
|
+
content: [{ type: "text", text: await restQuery("GET", `/alpha/${encodeURIComponent(wallet)}/linked`) }],
|
|
157
|
+
}));
|
|
158
|
+
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.", {
|
|
159
|
+
mint: z.string().describe("Token mint address (base58)"),
|
|
160
|
+
}, readOnlyAnnotations, async ({ mint }) => ({
|
|
161
|
+
content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/cap-table`) }],
|
|
162
|
+
}));
|
|
163
|
+
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.", {
|
|
164
|
+
mint: z.string().describe("Token mint address (base58)"),
|
|
165
|
+
}, readOnlyAnnotations, async ({ mint }) => ({
|
|
166
|
+
content: [{ type: "text", text: await restQuery("GET", `/tokens/${encodeURIComponent(mint)}/buyer-quality`) }],
|
|
167
|
+
}));
|
|
168
|
+
console.error("[madeonsol-mcp] Webhook, streaming & alpha tools enabled (RAPIDAPI_KEY set)");
|
|
218
169
|
}
|
|
219
170
|
else {
|
|
220
|
-
console.error("[madeonsol-mcp]
|
|
171
|
+
console.error("[madeonsol-mcp] No RAPIDAPI_KEY — webhook/streaming/alpha tools disabled");
|
|
221
172
|
}
|
|
222
173
|
// Prompts — pre-built analysis templates
|
|
223
174
|
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 }) => ({
|
|
@@ -240,7 +191,7 @@ function registerTools(server) {
|
|
|
240
191
|
});
|
|
241
192
|
}
|
|
242
193
|
async function main() {
|
|
243
|
-
await
|
|
194
|
+
await initPayment();
|
|
244
195
|
if (MODE === "http") {
|
|
245
196
|
// HTTP transport for hosted environments (Smithery, etc.)
|
|
246
197
|
const httpServer = createServer();
|
|
@@ -257,23 +208,19 @@ async function main() {
|
|
|
257
208
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
258
209
|
res.end(JSON.stringify({
|
|
259
210
|
name: "madeonsol",
|
|
260
|
-
description: "Solana KOL trading intelligence and deployer analytics. Real-time data from
|
|
211
|
+
description: "Solana KOL trading intelligence and deployer analytics via x402 micropayments. Real-time data from 946 KOL wallets and 4000+ Pump.fun deployers.",
|
|
261
212
|
version: "0.1.0",
|
|
262
213
|
tools: [
|
|
263
|
-
{ name: "madeonsol_kol_feed", description: "Get real-time Solana KOL trades from
|
|
264
|
-
{ name: "madeonsol_kol_coordination", description: "Get KOL convergence signals — tokens multiple KOLs are accumulating." },
|
|
265
|
-
{ name: "madeonsol_kol_leaderboard", description: "Get KOL performance rankings by PnL and win rate." },
|
|
266
|
-
{ name: "madeonsol_deployer_alerts", description: "Get elite Pump.fun deployer alerts with KOL enrichment." },
|
|
267
|
-
{ name: "madeonsol_kol_pairs", description: "KOL affinity matrix — which KOLs co-trade the same tokens." },
|
|
268
|
-
{ name: "madeonsol_kol_timing", description: "KOL entry/exit timing profile. Pro/Ultra." },
|
|
269
|
-
{ name: "madeonsol_deployer_trajectory", description: "Deployer skill curve — streaks, trend. Pro/Ultra." },
|
|
270
|
-
{ name: "madeonsol_kol_hot_tokens", description: "KOL momentum tokens — accelerating buy interest." },
|
|
214
|
+
{ name: "madeonsol_kol_feed", description: "Get real-time Solana KOL trades from 946 tracked wallets. $0.005 USDC/req." },
|
|
215
|
+
{ name: "madeonsol_kol_coordination", description: "Get KOL convergence signals — tokens multiple KOLs are accumulating. $0.02 USDC/req." },
|
|
216
|
+
{ name: "madeonsol_kol_leaderboard", description: "Get KOL performance rankings by PnL and win rate. $0.005 USDC/req." },
|
|
217
|
+
{ name: "madeonsol_deployer_alerts", description: "Get elite Pump.fun deployer alerts with KOL enrichment. $0.01 USDC/req." },
|
|
271
218
|
{ name: "madeonsol_discovery", description: "List all available endpoints with prices. Free." },
|
|
272
|
-
{ name: "madeonsol_create_webhook", description: "Register a webhook for real-time push notifications.
|
|
273
|
-
{ name: "madeonsol_list_webhooks", description: "List your registered webhooks.
|
|
274
|
-
{ name: "madeonsol_delete_webhook", description: "Delete a webhook by ID.
|
|
275
|
-
{ name: "madeonsol_test_webhook", description: "Send a test payload to verify a webhook.
|
|
276
|
-
{ name: "madeonsol_stream_token", description: "Get a 24h WebSocket streaming token.
|
|
219
|
+
{ name: "madeonsol_create_webhook", description: "Register a webhook for real-time push notifications. Requires RAPIDAPI_KEY." },
|
|
220
|
+
{ name: "madeonsol_list_webhooks", description: "List your registered webhooks. Requires RAPIDAPI_KEY." },
|
|
221
|
+
{ name: "madeonsol_delete_webhook", description: "Delete a webhook by ID. Requires RAPIDAPI_KEY." },
|
|
222
|
+
{ name: "madeonsol_test_webhook", description: "Send a test payload to verify a webhook. Requires RAPIDAPI_KEY." },
|
|
223
|
+
{ name: "madeonsol_stream_token", description: "Get a 24h WebSocket streaming token. Requires RAPIDAPI_KEY." },
|
|
277
224
|
],
|
|
278
225
|
homepage: "https://madeonsol.com/solana-api",
|
|
279
226
|
repository: "https://github.com/LamboPoewert/mcp-server-madeonsol",
|
|
@@ -315,14 +262,8 @@ async function main() {
|
|
|
315
262
|
res.writeHead(404);
|
|
316
263
|
res.end("Not found");
|
|
317
264
|
});
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
// misconfigured firewall rule. Override with HOST=0.0.0.0 if you ever need
|
|
321
|
-
// to expose it directly (e.g. for hosted environments behind a separate
|
|
322
|
-
// reverse proxy).
|
|
323
|
-
const HOST = process.env.HOST || "127.0.0.1";
|
|
324
|
-
httpServer.listen(PORT, HOST, () => {
|
|
325
|
-
console.error(`[madeonsol-mcp] HTTP server listening on ${HOST}:${PORT}`);
|
|
265
|
+
httpServer.listen(PORT, () => {
|
|
266
|
+
console.error(`[madeonsol-mcp] HTTP server listening on port ${PORT}`);
|
|
326
267
|
});
|
|
327
268
|
}
|
|
328
269
|
else {
|
package/glama.json
CHANGED
|
@@ -1,55 +1,35 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "mcp-server-madeonsol",
|
|
3
|
-
"display_name": "MadeOnSol",
|
|
4
|
-
"description": "Solana KOL trading intelligence and deployer analytics. Real-time data from
|
|
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
|
-
|
|
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
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-server-madeonsol",
|
|
3
|
+
"display_name": "MadeOnSol",
|
|
4
|
+
"description": "Solana KOL trading intelligence and deployer analytics via x402 micropayments. Real-time data from 946 KOL wallets and 4000+ Pump.fun deployers.",
|
|
5
|
+
"version": "0.1.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 946 tracked wallets. $0.005 USDC/req."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "madeonsol_kol_coordination",
|
|
18
|
+
"description": "Get KOL convergence signals — tokens multiple KOLs are accumulating. $0.02 USDC/req."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "madeonsol_kol_leaderboard",
|
|
22
|
+
"description": "Get KOL performance rankings by PnL and win rate. $0.005 USDC/req."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "madeonsol_deployer_alerts",
|
|
26
|
+
"description": "Get elite Pump.fun deployer alerts with KOL enrichment. $0.01 USDC/req."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "madeonsol_discovery",
|
|
30
|
+
"description": "List all available endpoints with prices. Free."
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"transports": ["stdio", "http"],
|
|
34
|
+
"runtime": "node"
|
|
35
|
+
}
|
package/package.json
CHANGED
|
@@ -1,45 +1,49 @@
|
|
|
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
|
|
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
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-server-madeonsol",
|
|
3
|
+
"version": "0.6.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
|
+
"@scure/base": ">=1.0.0",
|
|
40
|
+
"@solana/kit": ">=2.0.0",
|
|
41
|
+
"@x402/core": ">=0.1.0",
|
|
42
|
+
"@x402/fetch": ">=0.1.0",
|
|
43
|
+
"@x402/svm": ">=0.1.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^25.6.0",
|
|
47
|
+
"typescript": "^5.9.3"
|
|
48
|
+
}
|
|
49
|
+
}
|