mcp-server-madeonsol 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +429 -427
- package/dist/index.js +52 -26
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/glama.json +5 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -440,7 +440,7 @@ function registerTools(server) {
|
|
|
440
440
|
return JSON.stringify(await res.json(), null, 2);
|
|
441
441
|
}
|
|
442
442
|
if (hasRestAuth) {
|
|
443
|
-
server.tool("madeonsol_wallet_tracker_watchlist", "List your tracked wallets with labels and remaining watchlist capacity.
|
|
443
|
+
server.tool("madeonsol_wallet_tracker_watchlist", "List your tracked wallets with labels and remaining watchlist capacity. PRO 50, ULTRA 100, BUSINESS 500 wallets (the Free tier has no wallet tracker).", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async () => ({
|
|
444
444
|
content: [{ type: "text", text: await walletTrackerRequest("GET", "/wallet-tracker/watchlist") }],
|
|
445
445
|
}));
|
|
446
446
|
server.tool("madeonsol_wallet_tracker_add", "Add a Solana wallet to your watchlist. Returns 409 if already tracked or limit reached.", {
|
|
@@ -463,13 +463,15 @@ function registerTools(server) {
|
|
|
463
463
|
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ wallet_address, label }) => ({
|
|
464
464
|
content: [{ type: "text", text: await walletTrackerRequest("PATCH", `/wallet-tracker/watchlist/${encodeURIComponent(wallet_address)}`, { label }) }],
|
|
465
465
|
}));
|
|
466
|
-
server.tool("madeonsol_wallet_tracker_trades", "Historical swap and transfer events for all your watched wallets.
|
|
466
|
+
server.tool("madeonsol_wallet_tracker_trades", "Historical swap and transfer events for all your watched wallets (PRO+). Returns { events[], count, ordered_by, next_cursor, next_cursor_slot }; each event has wallet_address, label, event_type, action (buy/sell on swaps, null on transfers), token_mint/symbol/name, sol_amount, token_amount, tx_signature, block_time (ingest clock), slot (chain order), replayed, ingested_at. Page with before_slot = next_cursor_slot (order=slot, the default) or before = next_cursor (order=block_time).", {
|
|
467
467
|
wallet: z.string().optional().describe("Filter to a specific wallet address"),
|
|
468
|
-
action: z.enum(["buy", "sell"
|
|
468
|
+
action: z.enum(["buy", "sell"]).optional().describe("Swaps only: buy or sell. Transfers have action null; select them with event_type='transfer'"),
|
|
469
469
|
event_type: z.enum(["swap", "transfer"]).optional().describe("Filter by event type: swap (token trade) or transfer (SOL moved)"),
|
|
470
470
|
limit: z.number().min(1).max(200).default(50).describe("Max results (1–200)"),
|
|
471
|
-
|
|
472
|
-
|
|
471
|
+
order: z.enum(["slot", "block_time"]).optional().describe("Sort by on-chain slot (default on a first page) or by block_time, the ingest clock (default when 'before' is passed)"),
|
|
472
|
+
before_slot: z.number().int().optional().describe("Cursor for order=slot: next_cursor_slot of the previous page"),
|
|
473
|
+
before: z.number().optional().describe("Legacy cursor for order=block_time: next_cursor of the previous page"),
|
|
474
|
+
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ wallet, action, event_type, limit, order, before_slot, before }) => {
|
|
473
475
|
const params = { limit };
|
|
474
476
|
if (wallet)
|
|
475
477
|
params.wallet = wallet;
|
|
@@ -477,6 +479,10 @@ function registerTools(server) {
|
|
|
477
479
|
params.action = action;
|
|
478
480
|
if (event_type)
|
|
479
481
|
params.event_type = event_type;
|
|
482
|
+
if (order)
|
|
483
|
+
params.order = order;
|
|
484
|
+
if (before_slot !== undefined)
|
|
485
|
+
params.before_slot = before_slot;
|
|
480
486
|
if (before !== undefined)
|
|
481
487
|
params.before = before;
|
|
482
488
|
const url = new URL(`${BASE_URL}/api/v1/wallet-tracker/trades`);
|
|
@@ -634,10 +640,11 @@ function registerTools(server) {
|
|
|
634
640
|
body.is_active = is_active;
|
|
635
641
|
return { content: [{ type: "text", text: await restQuery("PATCH", `/webhooks/${id}`, body) }] };
|
|
636
642
|
});
|
|
637
|
-
server.tool("madeonsol_test_webhook", "Send a sample event payload to a webhook URL to verify it works. Returns status code and
|
|
643
|
+
server.tool("madeonsol_test_webhook", "Send a sample event payload to a webhook URL to verify it works. Returns status code, response time and (newer servers) the event type sampled.", {
|
|
638
644
|
webhook_id: z.number().describe("ID of the webhook to test"),
|
|
639
|
-
|
|
640
|
-
|
|
645
|
+
event: z.string().optional().describe("Which of the webhook's subscribed events to sample (e.g. 'kol:trade', 'wallet_tracker:event'). Omit for the first subscribed event; an unsubscribed event is answered with 400."),
|
|
646
|
+
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ webhook_id, event }) => ({
|
|
647
|
+
content: [{ type: "text", text: await restQuery("POST", "/webhooks/test", event ? { webhook_id, event } : { webhook_id }) }],
|
|
641
648
|
}));
|
|
642
649
|
server.tool("madeonsol_stream_token", "Get your WebSocket streaming token. Stream tokens NEVER EXPIRE: every call returns the same token until your subscription lapses or you pass rotate=true, which replaces it (the previous value keeps working for 60 s). expires_at / next_refresh_at are always null (kept for wire compatibility); the response also carries rotated (boolean) and lifetime (string). The server never rotates on its own and never sends token_refresh unless you rotated; a 4001 close means 'mint again', never a timer. Authenticate the handshake with 'Authorization: Bearer <token>' (?token= still works, masked in logs). Includes ws_url for KOL/deployer streaming (Pro/Ultra) and dex_ws_url for all-DEX trade streaming (Ultra only). PRO+ channels now also include token:locks (event token:lock — every NEW Streamflow / Jupiter Lock / Bonfida lock or vesting contract) and token:fee_claims (event token:fee_claim — every pump.fun fee event: distributions to shareholders, social/X claims, config changes, creator transfers) and token:surges (events token:surge — a token < 30 min old running >= 3x / 6x / 8x its launch MC, tier early / strong / breakout, each once per mint, sustained — and token:revival — no trade candle for >= 24 h, then confirmed buys on the tape; every frame carries tape / kol / early_buyers / deployer / risk_flags[]; subscribe filters kinds[], tiers[], launchpads[], exclude_flags[], min_mc_usd / max_mc_usd, deployer_tier[]).", { rotate: z.boolean().optional().describe("Replace the current token with a new one (the old value keeps working for 60 s). Default false — returns the existing token.") }, { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ rotate }) => ({
|
|
643
650
|
content: [{ type: "text", text: await restQuery("POST", "/stream/token", rotate ? { rotate: true } : undefined) }],
|
|
@@ -971,22 +978,33 @@ function registerTools(server) {
|
|
|
971
978
|
server.tool("madeonsol_token_batch", "Bulk lookup of up to 50 mints in one request. Returns the same per-mint shape as madeonsol_token_get. DB queries batched with IN(...); dex-stream + RPC fan-outs run in parallel. ~10-20× cheaper than N sequential calls — ideal for sniper pipelines scoring many tokens at once.", { mints: z.array(z.string()).min(1).max(50).describe("1–50 base58 Solana token mints") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ mints }) => ({
|
|
972
979
|
content: [{ type: "text", text: await restQuery("POST", "/token/batch", { mints }) }],
|
|
973
980
|
}));
|
|
974
|
-
// ── Copy-Trade rules (PRO
|
|
975
|
-
|
|
981
|
+
// ── Copy-Trade rules (PRO+) ──
|
|
982
|
+
//
|
|
983
|
+
// Tier limits (rules per account, source wallets per rule) are enforced by
|
|
984
|
+
// the SERVER per tier: copytradeLimits() in the API (PRO 3×5, ULTRA 20×50,
|
|
985
|
+
// BUSINESS 100×250, ENTERPRISE = BUSINESS). The schema below only carries the
|
|
986
|
+
// structural ceiling so it never rejects a valid request from the highest
|
|
987
|
+
// tier before the server can answer; a smaller tier gets the server's 400.
|
|
988
|
+
const COPYTRADE_SOURCE_WALLETS_MAX = 250;
|
|
989
|
+
const COPYTRADE_SCOPE_NOTE = "source_wallets must be wallets MadeOnSol tracks as KOLs (the roster at GET /api/v1/kol/wallets): any valid Solana address is accepted into a rule, but signals fire only for trades by tracked KOL wallets, so an untracked wallet never produces a signal.";
|
|
990
|
+
const MC_BAND_NOTE = "Market-cap band in USD (0 to 1e12, min <= max) on the source trade's market cap at trade time; when a bound is set, trades with an unknown market cap are dropped.";
|
|
991
|
+
server.tool("madeonsol_copytrade_list", "List your copy-trade rules. Rule limits: PRO 3, ULTRA 20, BUSINESS 100 (Enterprise follows Business).", {}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async () => ({
|
|
976
992
|
content: [{ type: "text", text: await restQuery("GET", "/copytrade/subscriptions") }],
|
|
977
993
|
}));
|
|
978
|
-
server.tool("madeonsol_copytrade_create",
|
|
979
|
-
source_wallets: z.array(z.string()).min(1).max(
|
|
980
|
-
sizing_amount: z.number().describe("
|
|
994
|
+
server.tool("madeonsol_copytrade_create", `Create a copy-trade rule. Returns webhook_secret ONCE on creation when delivery_mode includes 'webhook' — store it to verify HMAC signatures. Source wallets per rule: PRO 5, ULTRA 50, BUSINESS 250 (Enterprise follows Business); the server enforces your tier's limit. Responses may carry source_wallets_tracked / source_wallets_untracked and warnings[] (code untracked_source_wallets or source_wallet_tracking_unavailable). ${COPYTRADE_SCOPE_NOTE}`, {
|
|
995
|
+
source_wallets: z.array(z.string()).min(1).max(COPYTRADE_SOURCE_WALLETS_MAX).describe("Tracked KOL wallets to mirror (base58). Per-rule limit depends on tier (PRO 5, ULTRA 50, BUSINESS 250); the server rejects more than yours."),
|
|
996
|
+
sizing_amount: z.number().describe("SOL when sizing_mode is 'fixed'; otherwise a multiplier / fraction of the source size (0.25 = a quarter), never a percent"),
|
|
981
997
|
name: z.string().optional().describe("Optional human label"),
|
|
982
998
|
min_trade_sol: z.number().optional().describe("Minimum source-wallet trade size to fire a signal"),
|
|
983
|
-
only_action: z.enum(["buy", "sell", "both"]).optional().describe("
|
|
984
|
-
sizing_mode: z.enum(["fixed", "proportional", "percent_source"]).optional().describe("
|
|
999
|
+
only_action: z.enum(["buy", "sell", "both"]).optional().describe("Which side fires a signal (default 'buy' when omitted)"),
|
|
1000
|
+
sizing_mode: z.enum(["fixed", "proportional", "percent_source"]).optional().describe("'fixed' = sizing_amount SOL; 'proportional' and 'percent_source' both = source size × sizing_amount (default 'fixed')"),
|
|
985
1001
|
delivery_mode: z.enum(["webhook", "websocket", "both"]).optional().describe("Where to deliver fired signals"),
|
|
986
1002
|
webhook_url: z.string().url().optional().describe("Required when delivery_mode includes 'webhook'"),
|
|
1003
|
+
min_mc_usd: z.number().min(0).max(1e12).nullable().optional().describe(`Lower bound. ${MC_BAND_NOTE}`),
|
|
1004
|
+
max_mc_usd: z.number().min(0).max(1e12).nullable().optional().describe(`Upper bound. ${MC_BAND_NOTE}`),
|
|
987
1005
|
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (args) => {
|
|
988
1006
|
const body = { source_wallets: args.source_wallets, sizing_amount: args.sizing_amount };
|
|
989
|
-
for (const k of ["name", "min_trade_sol", "only_action", "sizing_mode", "delivery_mode", "webhook_url"]) {
|
|
1007
|
+
for (const k of ["name", "min_trade_sol", "only_action", "sizing_mode", "delivery_mode", "webhook_url", "min_mc_usd", "max_mc_usd"]) {
|
|
990
1008
|
if (args[k] !== undefined)
|
|
991
1009
|
body[k] = args[k];
|
|
992
1010
|
}
|
|
@@ -995,10 +1013,10 @@ function registerTools(server) {
|
|
|
995
1013
|
server.tool("madeonsol_copytrade_get", "Get one copy-trade rule by id.", { id: z.number().describe("Subscription id") }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ id }) => ({
|
|
996
1014
|
content: [{ type: "text", text: await restQuery("GET", `/copytrade/subscriptions/${id}`) }],
|
|
997
1015
|
}));
|
|
998
|
-
server.tool("madeonsol_copytrade_update",
|
|
1016
|
+
server.tool("madeonsol_copytrade_update", `Update fields on a copy-trade rule, including is_active toggle. Omit a field to leave it unchanged; pass null to clear an MC bound. If this update sets a webhook_url on a rule that had no signing secret yet (e.g. a websocket-only rule), the response returns webhook_secret ONCE — store it; an existing secret is never re-shown. Responses may carry source_wallets_tracked / source_wallets_untracked and warnings[] (code untracked_source_wallets or source_wallet_tracking_unavailable): tell the user which wallets can never fire. ${COPYTRADE_SCOPE_NOTE}`, {
|
|
999
1017
|
id: z.number().describe("Subscription id"),
|
|
1000
1018
|
name: z.string().nullable().optional(),
|
|
1001
|
-
source_wallets: z.array(z.string()).optional(),
|
|
1019
|
+
source_wallets: z.array(z.string()).min(1).max(COPYTRADE_SOURCE_WALLETS_MAX).optional().describe("Replaces the rule's wallets. Per-rule limit depends on tier (PRO 5, ULTRA 50, BUSINESS 250)."),
|
|
1002
1020
|
min_trade_sol: z.number().optional(),
|
|
1003
1021
|
only_action: z.enum(["buy", "sell", "both"]).optional(),
|
|
1004
1022
|
sizing_mode: z.enum(["fixed", "proportional", "percent_source"]).optional(),
|
|
@@ -1006,6 +1024,8 @@ function registerTools(server) {
|
|
|
1006
1024
|
delivery_mode: z.enum(["webhook", "websocket", "both"]).optional(),
|
|
1007
1025
|
webhook_url: z.string().url().nullable().optional(),
|
|
1008
1026
|
is_active: z.boolean().optional(),
|
|
1027
|
+
min_mc_usd: z.number().min(0).max(1e12).nullable().optional().describe(`Lower bound (null clears it). ${MC_BAND_NOTE}`),
|
|
1028
|
+
max_mc_usd: z.number().min(0).max(1e12).nullable().optional().describe(`Upper bound (null clears it). ${MC_BAND_NOTE}`),
|
|
1009
1029
|
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ id, ...patch }) => {
|
|
1010
1030
|
const body = {};
|
|
1011
1031
|
for (const [k, v] of Object.entries(patch)) {
|
|
@@ -1017,17 +1037,23 @@ function registerTools(server) {
|
|
|
1017
1037
|
server.tool("madeonsol_copytrade_delete", "Delete a copy-trade rule permanently.", { id: z.number().describe("Subscription id") }, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ id }) => ({
|
|
1018
1038
|
content: [{ type: "text", text: await restQuery("DELETE", `/copytrade/subscriptions/${id}`) }],
|
|
1019
1039
|
}));
|
|
1020
|
-
server.tool("madeonsol_copytrade_signals", "Recent fired copy-trade signals (up to 7 days). Filter by subscription_id, since (ISO8601),
|
|
1040
|
+
server.tool("madeonsol_copytrade_signals", "Recent fired copy-trade signals (up to 7 days). Filter by subscription_id, since (ISO8601), limit (1–500), and min_mc_usd / max_mc_usd on the source trade's market cap.", {
|
|
1021
1041
|
subscription_id: z.number().optional().describe("Filter to one rule"),
|
|
1022
1042
|
since: z.string().optional().describe("ISO8601 timestamp — only signals fired at-or-after this time"),
|
|
1023
1043
|
limit: z.number().min(1).max(500).default(50).describe("Max signals to return (1–500)"),
|
|
1024
|
-
|
|
1044
|
+
min_mc_usd: z.number().min(0).max(1e12).optional().describe("Keep signals whose source trade's market cap (USD) was at least this; drops unknown-MC signals"),
|
|
1045
|
+
max_mc_usd: z.number().min(0).max(1e12).optional().describe("Keep signals whose source trade's market cap (USD) was at most this; drops unknown-MC signals"),
|
|
1046
|
+
}, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ subscription_id, since, limit, min_mc_usd, max_mc_usd }) => {
|
|
1025
1047
|
const url = new URL(`${BASE_URL}/api/v1/copytrade/signals`);
|
|
1026
1048
|
url.searchParams.set("limit", String(limit));
|
|
1027
1049
|
if (subscription_id !== undefined)
|
|
1028
1050
|
url.searchParams.set("subscription_id", String(subscription_id));
|
|
1029
1051
|
if (since)
|
|
1030
1052
|
url.searchParams.set("since", since);
|
|
1053
|
+
if (min_mc_usd !== undefined)
|
|
1054
|
+
url.searchParams.set("min_mc_usd", String(min_mc_usd));
|
|
1055
|
+
if (max_mc_usd !== undefined)
|
|
1056
|
+
url.searchParams.set("max_mc_usd", String(max_mc_usd));
|
|
1031
1057
|
const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } });
|
|
1032
1058
|
const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`;
|
|
1033
1059
|
return { content: [{ type: "text", text }] };
|
|
@@ -1349,12 +1375,12 @@ async function main() {
|
|
|
1349
1375
|
{ name: "madeonsol_tokens_batch_risk", description: "Bulk rug-risk/safety scoring for up to 50 mints — same shape as madeonsol_token_risk + as_of; untracked mints don't fail the batch. PRO+." },
|
|
1350
1376
|
{ name: "madeonsol_token_get", description: "Comprehensive per-mint snapshot: price, MC, volume, deployer, KOL, age, blacklist." },
|
|
1351
1377
|
{ name: "madeonsol_token_batch", description: "Bulk token snapshot for up to 50 mints — ~10-20× cheaper than N sequential calls." },
|
|
1352
|
-
{ name: "madeonsol_copytrade_list", description: "List your copy-trade rules. PRO
|
|
1353
|
-
{ name: "madeonsol_copytrade_create", description: "Create a copy-trade rule with webhook + WS delivery. PRO
|
|
1354
|
-
{ name: "madeonsol_copytrade_get", description: "Get one copy-trade rule. PRO
|
|
1355
|
-
{ name: "madeonsol_copytrade_update", description: "Update a copy-trade rule. PRO
|
|
1356
|
-
{ name: "madeonsol_copytrade_delete", description: "Delete a copy-trade rule. PRO
|
|
1357
|
-
{ name: "madeonsol_copytrade_signals", description: "Recent fired copy-trade signals (up to 7 days). PRO
|
|
1378
|
+
{ name: "madeonsol_copytrade_list", description: "List your copy-trade rules. PRO+." },
|
|
1379
|
+
{ name: "madeonsol_copytrade_create", description: "Create a copy-trade rule with webhook + WS delivery. PRO+." },
|
|
1380
|
+
{ name: "madeonsol_copytrade_get", description: "Get one copy-trade rule. PRO+." },
|
|
1381
|
+
{ name: "madeonsol_copytrade_update", description: "Update a copy-trade rule. PRO+." },
|
|
1382
|
+
{ name: "madeonsol_copytrade_delete", description: "Delete a copy-trade rule. PRO+." },
|
|
1383
|
+
{ name: "madeonsol_copytrade_signals", description: "Recent fired copy-trade signals (up to 7 days). PRO+." },
|
|
1358
1384
|
{ name: "madeonsol_kol_first_touches", description: "Recent first-KOL-touch events on tokens — backtested scout signal. Filterable by scout tier S/A/B/C, KOL winrate, token age, mint suffix." },
|
|
1359
1385
|
{ name: "madeonsol_first_touch_subscriptions_list", description: "List your first-touch webhook subscriptions. ULTRA only." },
|
|
1360
1386
|
{ name: "madeonsol_first_touch_subscriptions_create", description: "Create a first-touch webhook subscription with HMAC signing. ULTRA only." },
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "3.0
|
|
1
|
+
export declare const VERSION = "3.1.0";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// AUTO-GENERATED by ../gen-version.mjs (npm prebuild) from package.json. Do not edit.
|
|
2
|
-
export const VERSION = "3.0
|
|
2
|
+
export const VERSION = "3.1.0";
|
package/glama.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
],
|
|
6
6
|
"display_name": "MadeOnSol — Solana memecoin intelligence",
|
|
7
7
|
"description": "Real-time Solana memecoin trading intelligence — track 2,000+ KOL wallets with sub-second latency on paid keys and x402 (free-tier live feeds are 5-min delayed), score 85,000+ reputation-profiled Pump.fun deployers out of 1.2M+ indexed, surface multi-KOL coordination signals, run server-side copy-trade rules, and stream every DEX trade across 14 programs. Backtested first-touch scout signal (S-tier scouts attract ≥3 follow-on KOLs ~50% of the time vs 14% baseline). Free tier 200 requests per day (live feeds 5-min delayed), no payment to start; auth via msk_ API key or x402 micropayments.",
|
|
8
|
-
"version": "3.0
|
|
8
|
+
"version": "3.1.0",
|
|
9
9
|
"homepage": "https://madeonsol.com/solana-api",
|
|
10
10
|
"repository": "https://github.com/madeonsol/mcp-server-madeonsol",
|
|
11
11
|
"license": "MIT",
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
},
|
|
131
131
|
{
|
|
132
132
|
"name": "madeonsol_wallet_tracker_watchlist",
|
|
133
|
-
"description": "List tracked wallets and remaining capacity (
|
|
133
|
+
"description": "List tracked wallets and remaining capacity (Pro 50 / Ultra 100 / Business 500)."
|
|
134
134
|
},
|
|
135
135
|
{
|
|
136
136
|
"name": "madeonsol_wallet_tracker_add",
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
},
|
|
143
143
|
{
|
|
144
144
|
"name": "madeonsol_wallet_tracker_trades",
|
|
145
|
-
"description": "Historical swap/transfer events for watched wallets (120-day retention)."
|
|
145
|
+
"description": "Historical swap/transfer events for watched wallets (120-day retention). action buy|sell (swaps only), order slot|block_time, before_slot cursor."
|
|
146
146
|
},
|
|
147
147
|
{
|
|
148
148
|
"name": "madeonsol_wallet_tracker_summary",
|
|
@@ -322,7 +322,7 @@
|
|
|
322
322
|
},
|
|
323
323
|
{
|
|
324
324
|
"name": "madeonsol_copytrade_create",
|
|
325
|
-
"description": "Create a copy-trade rule with webhook + WS delivery (HMAC-signed)."
|
|
325
|
+
"description": "Create a copy-trade rule with webhook + WS delivery (HMAC-signed). Optional MC band min_mc_usd/max_mc_usd; signals fire only for tracked KOL wallets."
|
|
326
326
|
},
|
|
327
327
|
{
|
|
328
328
|
"name": "madeonsol_copytrade_get",
|
|
@@ -338,7 +338,7 @@
|
|
|
338
338
|
},
|
|
339
339
|
{
|
|
340
340
|
"name": "madeonsol_copytrade_signals",
|
|
341
|
-
"description": "Recent fired copy-trade signals (up to 7 days, 1-500)."
|
|
341
|
+
"description": "Recent fired copy-trade signals (up to 7 days, 1-500). Optional min_mc_usd/max_mc_usd."
|
|
342
342
|
},
|
|
343
343
|
{
|
|
344
344
|
"name": "madeonsol_coordination_alerts_list",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-server-madeonsol",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"mcpName": "io.github.MadeOnSol/madeonsol",
|
|
5
5
|
"description": "MCP server for MadeOnSol Solana KOL intelligence API — use from Claude, Cursor, or any MCP client. Free tier 200 req/day (live feeds 5-min delayed; paid is real-time), no payment to start.",
|
|
6
6
|
"type": "module",
|