mcp-server-madeonsol 1.7.3 โ†’ 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +31 -2
  2. package/dist/index.js +61 -3
  3. package/package.json +7 -2
package/README.md CHANGED
@@ -2,10 +2,12 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/mcp-server-madeonsol?style=flat-square)](https://www.npmjs.com/package/mcp-server-madeonsol)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/mcp-server-madeonsol?style=flat-square)](https://www.npmjs.com/package/mcp-server-madeonsol)
5
+ [![Smithery](https://img.shields.io/badge/Smithery-listed-blueviolet?style=flat-square)](https://smithery.ai/servers/madeonsol/solana-kol-intelligence)
6
+ [![Glama](https://glama.ai/mcp/servers/LamboPoewert/mcp-server-madeonsol/badges/score.svg)](https://glama.ai/mcp/servers/LamboPoewert/mcp-server-madeonsol)
5
7
  [![MCP](https://img.shields.io/badge/MCP-compatible-blueviolet?style=flat-square)](https://modelcontextprotocol.io/)
6
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue?style=flat-square)](LICENSE)
7
9
 
8
- > ๐Ÿค– **[Use in Claude Desktop](#claude-desktop)** ยท ๐Ÿ–ฑ๏ธ **[Use in Cursor](#cursor)** ยท ๐Ÿ“š **[API docs](https://madeonsol.com/api-docs)** ยท ๐Ÿ’ฐ **[Free API key](https://madeonsol.com/pricing)**
10
+ > โšก **[Install via Smithery](#install-via-smithery-one-line)** ยท ๐Ÿค– **[Use in Claude Desktop](#claude-desktop)** ยท ๐Ÿ–ฑ๏ธ **[Use in Cursor](#cursor)** ยท ๐Ÿ“š **[API docs](https://madeonsol.com/api-docs)** ยท ๐Ÿ’ฐ **[Free API key](https://madeonsol.com/pricing)** ยท ๐Ÿ”Ž **[On Glama](https://glama.ai/mcp/servers/LamboPoewert/mcp-server-madeonsol)**
9
11
 
10
12
  MCP server for [MadeOnSol](https://madeonsol.com) Solana KOL intelligence API. Use from Claude Desktop, Cursor, or any MCP-compatible client.
11
13
 
@@ -13,7 +15,23 @@ MCP server for [MadeOnSol](https://madeonsol.com) Solana KOL intelligence API. U
13
15
 
14
16
  > **New in 1.7.0** *(2026-05-12)* โ€” Two new tools: **`madeonsol_me`** (account/quota introspection โ€” read tier, remaining requests, and per-feature usage without parsing rate-limit headers) and **`madeonsol_tokens_list`** (PRO+ filtered, sortable token directory โ€” MC band, liquidity floor, primary DEX, authority/safety flags, plus computed 1h volume / MEV-share / MC-change deltas). Token responses now expose **velocity / MEV-share** fields. Token directory defaults to **`min_liq=2000`** to skip phantom-MC dust โ€” pass `min_liq=0` to opt out. `/token/{mint}` now returns **structured 400 errors** (`code` / `reason` / `example` / `docs`) instead of plain strings. Deprecated `avg_entry_mc_usd` field fully removed from KOL/alpha leaderboards.
15
17
 
16
- ## Quick start (10 seconds)
18
+ ## Install via Smithery (one line)
19
+
20
+ [Smithery](https://smithery.ai/servers/madeonsol/solana-kol-intelligence) is the easiest path โ€” it writes the config for you and handles the install:
21
+
22
+ ```bash
23
+ npx -y smithery mcp add madeonsol/solana-kol-intelligence
24
+ ```
25
+
26
+ Smithery prompts for your `MADEONSOL_API_KEY` ([free at madeonsol.com/pricing](https://madeonsol.com/pricing)) and wires up Claude Desktop or your chosen MCP client. Restart the client and ask: *"What are KOLs buying right now?"*
27
+
28
+ You can also browse tools from the CLI:
29
+
30
+ ```bash
31
+ npx -y smithery tool get madeonsol/solana-kol-intelligence madeonsol_kol_feed
32
+ ```
33
+
34
+ ## Quick start โ€” manual config (10 seconds)
17
35
 
18
36
  ```bash
19
37
  npm install -g mcp-server-madeonsol
@@ -102,6 +120,17 @@ Add to MCP settings with the same command and env vars.
102
120
  | `madeonsol_wallet_tracker_trades` | Historical swap/transfer events for watched wallets (120-day retention) |
103
121
  | `madeonsol_wallet_tracker_summary` | Per-wallet stats: swap counts, SOL bought/sold, last event |
104
122
 
123
+ ### Universal Wallet *(new in 1.8 โ€” any wallet, not just curated KOLs, PRO+)*
124
+
125
+ | Tool | Description |
126
+ |---|---|
127
+ | `madeonsol_wallet_stats` | Aggregate 90d stats + cross-product flags (is_kol, is_alpha_tracked + bot_confidence + win_rate + net_pnl, is_deployer + tokens_deployed) โ€” quick sizing-up of an unknown wallet |
128
+ | `madeonsol_wallet_pnl` | Full FIFO cost-basis PnL: realized + unrealized SOL, profit factor, max drawdown, avg + median hold minutes, daily UTC PnL curve, closed + open positions hydrated with live mc-tracker prices |
129
+ | `madeonsol_wallet_positions` | Open positions only โ€” lighter slice of /pnl. Shares the same cache. |
130
+ | `madeonsol_wallet_trades` | Cursor-paginated raw trades with action / token / since-until filters |
131
+
132
+ Cached server-side with dynamic TTL (5min / 1h / 24h based on last activity). Cost basis observable only inside the 90-day window.
133
+
105
134
  ### Alpha Wallet Intelligence
106
135
 
107
136
  Scored from 47,000+ early-buyer records (wallets seen in the first 20 buyers of Pump.fun tokens).
package/dist/index.js CHANGED
@@ -334,7 +334,61 @@ function registerTools(server) {
334
334
  const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
335
335
  return { content: [{ type: "text", text }] };
336
336
  });
337
+ // โ”€โ”€ Universal wallet endpoints (PRO+, any wallet โ€” not just curated KOLs) โ”€โ”€
338
+ server.tool("madeonsol_wallet_stats", "Aggregate stats for any Solana wallet over the last 90 days plus cross-product flags (is_kol, is_alpha_tracked with bot_confidence + win_rate + net_pnl, is_deployer with tokens_deployed + bonding_rate). Use this before drilling into PnL to size up an unknown wallet quickly. PRO+.", {
339
+ address: z.string().describe("Solana wallet address (base58)"),
340
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ address }) => {
341
+ const res = await fetch(`${BASE_URL}/api/v1/wallet/${encodeURIComponent(address)}`, {
342
+ headers: { "Content-Type": "application/json", ...apiKeyHeaders() },
343
+ });
344
+ const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
345
+ return { content: [{ type: "text", text }] };
346
+ });
347
+ server.tool("madeonsol_wallet_pnl", "Full FIFO cost-basis PnL for any wallet: realized + unrealized SOL, profit factor, max drawdown, avg + median hold minutes, daily UTC PnL curve, closed positions sorted by pnl desc (with ROI %, hold time, win/loss), and open positions hydrated with live current prices from the market-cap tracker. Cached with dynamic TTL (5min active / 1h recent / 24h dormant). Cache hits don't count against your daily quota. Cost basis only observable inside the 90-day data window โ€” overflow sells are silently discarded rather than fabricated. PRO+.", {
348
+ address: z.string().describe("Solana wallet address (base58)"),
349
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ address }) => {
350
+ const res = await fetch(`${BASE_URL}/api/v1/wallet/${encodeURIComponent(address)}/pnl`, {
351
+ headers: { "Content-Type": "application/json", ...apiKeyHeaders() },
352
+ });
353
+ const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
354
+ return { content: [{ type: "text", text }] };
355
+ });
356
+ server.tool("madeonsol_wallet_positions", "Open positions only for any wallet โ€” lighter slice of madeonsol_wallet_pnl for use cases that don't need the full PnL summary or curve. Each position: token_mint, token_amount, cost_basis_sol, avg_entry_price_sol, current_price_sol (live from mc-tracker; null if delisted), current_value_sol, unrealized_sol, unrealized_pct, first_buy_at. Shares the /pnl cache. PRO+.", {
357
+ address: z.string().describe("Solana wallet address (base58)"),
358
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ address }) => {
359
+ const res = await fetch(`${BASE_URL}/api/v1/wallet/${encodeURIComponent(address)}/positions`, {
360
+ headers: { "Content-Type": "application/json", ...apiKeyHeaders() },
361
+ });
362
+ const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
363
+ return { content: [{ type: "text", text }] };
364
+ });
365
+ server.tool("madeonsol_wallet_trades", "Cursor-paginated raw trades for any wallet. Filter by action (buy/sell), specific token_mint, time window via since/until (Unix seconds; default last 90 days). Cursor encodes (block_time, id) for stable DESC pagination โ€” pass next_cursor from the previous response to fetch older trades. Limit 1-500 (default 100). PRO+.", {
366
+ address: z.string().describe("Solana wallet address (base58)"),
367
+ limit: z.number().min(1).max(500).default(100).describe("Trades per page (1-500)"),
368
+ cursor: z.string().optional().describe("Cursor from previous response's next_cursor field"),
369
+ action: z.enum(["buy", "sell"]).optional().describe("Filter to buys or sells only"),
370
+ token_mint: z.string().optional().describe("Filter to a single token mint"),
371
+ since: z.number().optional().describe("Unix epoch seconds โ€” default now-90d"),
372
+ until: z.number().optional().describe("Unix epoch seconds โ€” default now"),
373
+ }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ address, limit, cursor, action, token_mint, since, until }) => {
374
+ const url = new URL(`${BASE_URL}/api/v1/wallet/${encodeURIComponent(address)}/trades`);
375
+ url.searchParams.set("limit", String(limit));
376
+ if (cursor)
377
+ url.searchParams.set("cursor", cursor);
378
+ if (action)
379
+ url.searchParams.set("action", action);
380
+ if (token_mint)
381
+ url.searchParams.set("token_mint", token_mint);
382
+ if (since !== undefined)
383
+ url.searchParams.set("since", String(since));
384
+ if (until !== undefined)
385
+ url.searchParams.set("until", String(until));
386
+ const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } });
387
+ const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
388
+ return { content: [{ type: "text", text }] };
389
+ });
337
390
  console.error("[madeonsol-mcp] Wallet tracker tools enabled");
391
+ console.error("[madeonsol-mcp] Universal wallet tools enabled (stats / pnl / positions / trades)");
338
392
  }
339
393
  else {
340
394
  console.error("[madeonsol-mcp] Wallet tracker tools disabled (requires MADEONSOL_API_KEY)");
@@ -681,7 +735,7 @@ async function main() {
681
735
  res.end(JSON.stringify({
682
736
  name: "madeonsol",
683
737
  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.",
684
- version: "1.7.0",
738
+ version: "1.8.0",
685
739
  tools: [
686
740
  { name: "madeonsol_kol_feed", description: "Get real-time Solana KOL trades from 1,000+ tracked wallets." },
687
741
  { name: "madeonsol_kol_coordination", description: "Get KOL convergence signals โ€” tokens multiple KOLs are accumulating." },
@@ -709,6 +763,10 @@ async function main() {
709
763
  { name: "madeonsol_wallet_tracker_remove", description: "Remove a wallet from your watchlist." },
710
764
  { name: "madeonsol_wallet_tracker_trades", description: "Historical swap/transfer events for watched wallets." },
711
765
  { name: "madeonsol_wallet_tracker_summary", description: "Per-wallet stats: swap counts, SOL bought/sold." },
766
+ { name: "madeonsol_wallet_stats", description: "Aggregate stats + cross-product flags (is_kol/alpha/deployer) for any Solana wallet. PRO+." },
767
+ { name: "madeonsol_wallet_pnl", description: "Full FIFO cost-basis PnL for any wallet: realized + unrealized, profit factor, drawdown, daily curve, closed + open positions. PRO+." },
768
+ { name: "madeonsol_wallet_positions", description: "Open positions only for any wallet โ€” lighter slice of /pnl. Live unrealized SOL from mc-tracker. PRO+." },
769
+ { name: "madeonsol_wallet_trades", description: "Cursor-paginated raw trades for any wallet. Filter by action / token_mint / time window. PRO+." },
712
770
  { name: "madeonsol_alpha_leaderboard", description: "Top profitable early-buyer wallets โ€” 47,000+ scored. BASIC=25, PRO=100, ULTRA=500." },
713
771
  { name: "madeonsol_alpha_wallet", description: "Full alpha profile + bot signals for one wallet. ULTRA only." },
714
772
  { name: "madeonsol_alpha_linked", description: "Behaviorally linked wallets (co-bought 3+ tokens within 2s). ULTRA only." },
@@ -749,7 +807,7 @@ async function main() {
749
807
  transport = new StreamableHTTPServerTransport({
750
808
  sessionIdGenerator: undefined,
751
809
  });
752
- const server = new McpServer({ name: "madeonsol", version: "1.7.0" });
810
+ const server = new McpServer({ name: "madeonsol", version: "1.8.0" });
753
811
  registerTools(server);
754
812
  await server.connect(transport);
755
813
  }
@@ -787,7 +845,7 @@ async function main() {
787
845
  }
788
846
  else {
789
847
  // Stdio transport for local use (Claude Desktop, Cursor, Claude Code)
790
- const server = new McpServer({ name: "madeonsol", version: "1.7.0" });
848
+ const server = new McpServer({ name: "madeonsol", version: "1.8.0" });
791
849
  registerTools(server);
792
850
  const transport = new StdioServerTransport();
793
851
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-server-madeonsol",
3
- "version": "1.7.3",
3
+ "version": "1.8.0",
4
4
  "mcpName": "io.github.lambopoewert/madeonsol",
5
5
  "description": "MCP server for MadeOnSol Solana KOL intelligence API โ€” use from Claude, Cursor, or any MCP client",
6
6
  "type": "module",
@@ -49,7 +49,8 @@
49
49
  "url": "https://github.com/LamboPoewert/mcp-server-madeonsol"
50
50
  },
51
51
  "dependencies": {
52
- "@modelcontextprotocol/sdk": "^1.12.1"
52
+ "@modelcontextprotocol/sdk": "^1.12.1",
53
+ "zod": "^4.3.6"
53
54
  },
54
55
  "peerDependencies": {
55
56
  "@x402/fetch": ">=0.1.0",
@@ -57,5 +58,9 @@
57
58
  "@x402/svm": ">=0.1.0",
58
59
  "@solana/kit": ">=2.0.0",
59
60
  "@scure/base": ">=1.0.0"
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "^20",
64
+ "typescript": "^5"
60
65
  }
61
66
  }