madeonsol_copytrade_signals
Get recent copy-trade signals up to 7 days old from Solana KOL wallets. Filter by subscription ID, start time (ISO8601), or result limit.
Instructions
Recent fired copy-trade signals (up to 7 days). Filter by subscription_id, since (ISO8601), and limit (1–500).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| subscription_id | No | Filter to one rule | |
| since | No | ISO8601 timestamp — only signals fired at-or-after this time | |
| limit | No | Max signals to return (1–500) |
Implementation Reference
- src/index.ts:756-774 (registration)The tool 'madeonsol_copytrade_signals' is registered using server.tool() with schema params (subscription_id, since, limit) and a handler that calls the /api/v1/copytrade/signals endpoint via REST GET query.
server.tool( "madeonsol_copytrade_signals", "Recent fired copy-trade signals (up to 7 days). Filter by subscription_id, since (ISO8601), and limit (1–500).", { subscription_id: z.number().optional().describe("Filter to one rule"), since: z.string().optional().describe("ISO8601 timestamp — only signals fired at-or-after this time"), limit: z.number().min(1).max(500).default(50).describe("Max signals to return (1–500)"), }, { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }, async ({ subscription_id, since, limit }) => { const url = new URL(`${BASE_URL}/api/v1/copytrade/signals`); url.searchParams.set("limit", String(limit)); if (subscription_id !== undefined) url.searchParams.set("subscription_id", String(subscription_id)); if (since) url.searchParams.set("since", since); const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } }); const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`; return { content: [{ type: "text" as const, text }] }; } ); - src/index.ts:765-773 (handler)The handler function receives { subscription_id, since, limit }, builds a URL to /api/v1/copytrade/signals with query params, fetches it with the API key headers, and returns JSON text result.
async ({ subscription_id, since, limit }) => { const url = new URL(`${BASE_URL}/api/v1/copytrade/signals`); url.searchParams.set("limit", String(limit)); if (subscription_id !== undefined) url.searchParams.set("subscription_id", String(subscription_id)); if (since) url.searchParams.set("since", since); const res = await fetch(url.toString(), { headers: { "Content-Type": "application/json", ...apiKeyHeaders() } }); const text = res.ok ? JSON.stringify(await res.json(), null, 2) : `Error ${res.status}: ${await res.text().catch(() => "")}`; return { content: [{ type: "text" as const, text }] }; } - src/index.ts:759-763 (schema)Zod schema defines optional subscription_id (number), optional since (ISO8601 string), and limit (number 1-500, default 50).
{ subscription_id: z.number().optional().describe("Filter to one rule"), since: z.string().optional().describe("ISO8601 timestamp — only signals fired at-or-after this time"), limit: z.number().min(1).max(500).default(50).describe("Max signals to return (1–500)"), }, - src/index.ts:1066-1066 (registration)The tool is also listed in the Smithery server card metadata with its description.
{ name: "madeonsol_copytrade_signals", description: "Recent fired copy-trade signals (up to 7 days). PRO/ULTRA." },