@sharpe-terminal/mcp-server 1.2.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/dist/tools.js ADDED
@@ -0,0 +1,861 @@
1
+ import { z } from "zod";
2
+ import { FUTURES_CHARTS } from "./resources.js";
3
+ // -- Tool schemas (Zod shapes for McpServer.tool()) --
4
+ const FUTURES_CHART_IDS = FUTURES_CHARTS.map((chart) => chart.id);
5
+ export const fundingRatesSchema = {
6
+ type: z
7
+ .enum(["current", "accumulated", "history"])
8
+ .default("current")
9
+ .describe("Type of funding rate data. 'current' = latest snapshot across exchanges, 'accumulated' = cumulative rates over 7d/30d/90d/1y, 'history' = time-series for a single coin."),
10
+ coin: z
11
+ .string()
12
+ .optional()
13
+ .describe("Base coin ticker (e.g. BTC, ETH, SOL). Filters results to this base coin across all exchanges. Required for type=history; optional for current/accumulated."),
14
+ days: z
15
+ .number()
16
+ .min(1)
17
+ .max(1095)
18
+ .default(30)
19
+ .optional()
20
+ .describe("Number of days of history to retrieve (type=history only). Range: 1-1095."),
21
+ };
22
+ export const futuresDataSchema = {
23
+ chart: z
24
+ .enum(FUTURES_CHART_IDS)
25
+ .describe("Chart identifier. See sharpe://charts/futures for the valid IDs and descriptions."),
26
+ coin: z
27
+ .string()
28
+ .default("BTC")
29
+ .optional()
30
+ .describe("Base coin ticker (e.g. BTC, ETH, SOL)."),
31
+ timeframe: z
32
+ .enum(["1W", "2W", "1M", "3M", "6M", "1Y", "3Y"])
33
+ .default("3M")
34
+ .optional()
35
+ .describe("Lookback window for the data."),
36
+ exchanges: z
37
+ .string()
38
+ .optional()
39
+ .describe("Comma-separated list of exchanges to include (e.g. Binance,Bybit,OKX,Deribit,Hyperliquid)."),
40
+ };
41
+ export const futuresCoinsSchema = {};
42
+ export const correlationMatrixSchema = {
43
+ period: z
44
+ .enum(["30d", "90d", "1y", "3y"])
45
+ .default("30d")
46
+ .optional()
47
+ .describe("Lookback period for correlation calculation."),
48
+ ids: z
49
+ .string()
50
+ .optional()
51
+ .describe("Comma-separated list of crypto asset IDs (e.g. bitcoin,ethereum,solana). If omitted, returns the default set of top assets."),
52
+ };
53
+ export const arbitrageSpotPerpSchema = {
54
+ exchange: z
55
+ .string()
56
+ .default("all")
57
+ .optional()
58
+ .describe('Filter by exchange name (e.g. Binance, Bybit, OKX), or "all" for all exchanges.'),
59
+ direction: z
60
+ .enum(["all", "long", "short"])
61
+ .default("all")
62
+ .optional()
63
+ .describe("Filter by trade direction."),
64
+ };
65
+ export const arbitrageCrossExchangeSchema = {
66
+ exchanges: z
67
+ .string()
68
+ .optional()
69
+ .describe("Comma-separated list of exchanges to compare (e.g. Binance,Bybit,OKX)."),
70
+ };
71
+ export const arbitrageScannerSchema = {
72
+ coin: z
73
+ .string()
74
+ .optional()
75
+ .describe("Optional base coin ticker, e.g. BTC, ETH, SOL."),
76
+ exchanges: z
77
+ .string()
78
+ .optional()
79
+ .describe("Comma-separated exchange filter, e.g. Binance,Bybit,OKX."),
80
+ minApr: z
81
+ .number()
82
+ .optional()
83
+ .describe("Minimum APR or carry edge in percentage points."),
84
+ minOiUsd: z
85
+ .number()
86
+ .min(0)
87
+ .optional()
88
+ .describe("Minimum open interest in USD."),
89
+ minDepthUsd: z
90
+ .number()
91
+ .min(0)
92
+ .optional()
93
+ .describe("Minimum executable depth in USD when available."),
94
+ notional: z
95
+ .number()
96
+ .positive()
97
+ .default(10000)
98
+ .optional()
99
+ .describe("Position notional in USD. Default 10000."),
100
+ limit: z
101
+ .number()
102
+ .int()
103
+ .min(1)
104
+ .max(1000)
105
+ .default(100)
106
+ .optional()
107
+ .describe("Maximum number of rows to return."),
108
+ cursor: z.string().optional().describe("Cursor for the next page."),
109
+ };
110
+ // The CEX spot-transfer route validates only these 7 fields; minOiUsd is
111
+ // silently ignored there, so it is dropped from this dedicated schema.
112
+ export const cexSpotTransferScannerSchema = {
113
+ coin: arbitrageScannerSchema.coin,
114
+ exchanges: arbitrageScannerSchema.exchanges,
115
+ minApr: arbitrageScannerSchema.minApr,
116
+ minDepthUsd: arbitrageScannerSchema.minDepthUsd,
117
+ notional: arbitrageScannerSchema.notional,
118
+ limit: arbitrageScannerSchema.limit,
119
+ cursor: arbitrageScannerSchema.cursor,
120
+ };
121
+ export const heatmapSchema = {
122
+ mode: z
123
+ .enum(["coins", "narratives", "ecosystems"])
124
+ .default("coins")
125
+ .optional()
126
+ .describe("Heatmap grouping mode."),
127
+ category: z
128
+ .string()
129
+ .default("top-100")
130
+ .optional()
131
+ .describe("Category filter (e.g. top-100, defi, layer-1, memes)."),
132
+ };
133
+ export const dexScreenerDataSchema = {
134
+ category: z
135
+ .enum(["volume", "trending", "gainers", "losers", "new_pairs"])
136
+ .default("trending")
137
+ .optional()
138
+ .describe("DEX Screener category."),
139
+ network: z.string().optional().describe("Optional chain/network slug."),
140
+ phrase: z.string().optional().describe("Optional search phrase."),
141
+ limit: z.number().min(1).max(100).default(50).optional(),
142
+ };
143
+ export const dexScreenerSecuritySchema = {
144
+ address: z.string().describe("Token contract address."),
145
+ chainId: z.number().int().positive().describe("Codex network ID."),
146
+ };
147
+ export const tokenScannerSchema = {
148
+ mode: z
149
+ .enum(["hot", "new-runners", "alpha-drops", "ai-top", "top-new"])
150
+ .default("hot")
151
+ .optional()
152
+ .describe("Token scanner mode."),
153
+ chains: z
154
+ .string()
155
+ .optional()
156
+ .describe("Comma-separated Dexscreener chain IDs."),
157
+ chain: z.string().optional().describe("Single chain for top-new mode."),
158
+ profile: z
159
+ .enum(["discovery", "balanced", "strict", "custom"])
160
+ .optional()
161
+ .describe("Scanner profile."),
162
+ limit: z.number().min(1).max(200).default(50).optional(),
163
+ minLiquidityUsd: z.number().min(0).optional(),
164
+ minVolumeH24: z.number().min(0).optional(),
165
+ minTxnsH1: z.number().min(0).optional(),
166
+ maxAgeHours: z.number().min(0).optional(),
167
+ };
168
+ export const rugCheckSecuritySchema = {
169
+ address: z.string().describe("Token contract address."),
170
+ chainId: z.number().int().positive().describe("Chain/network ID."),
171
+ };
172
+ export const rugCheckTrendingSchema = {
173
+ limit: z.number().min(1).max(100).default(50).optional(),
174
+ };
175
+ export const stablecoinsSchema = {
176
+ type: z
177
+ .enum(["overview", "detail", "yields"])
178
+ .default("overview")
179
+ .optional()
180
+ .describe("Payload type."),
181
+ slug: z.string().optional().describe("Stablecoin slug for detail mode."),
182
+ };
183
+ export const mindshareSchema = {
184
+ tokens: z
185
+ .enum(["true", "false"])
186
+ .optional()
187
+ .describe("Set to true for token rows."),
188
+ narrative: z.string().optional().describe("Optional narrative slug."),
189
+ historical: z
190
+ .enum(["true", "false"])
191
+ .optional()
192
+ .describe("Set to true for historical snapshots."),
193
+ timeframe: z
194
+ .enum(["1W", "1M", "3M", "6M", "1Y", "3Y"])
195
+ .optional()
196
+ .describe("Historical timeframe."),
197
+ window: z
198
+ .enum(["now", "24h", "7d", "30d"])
199
+ .optional()
200
+ .describe("Rolling snapshot window."),
201
+ };
202
+ export const webTrafficSchema = {
203
+ type: z
204
+ .enum(["exchange", "coin", "narrative"])
205
+ .optional()
206
+ .describe("Entity type."),
207
+ mode: z
208
+ .enum(["rankings", "trends", "snapshots", "market"])
209
+ .optional()
210
+ .describe("Payload mode."),
211
+ tf: z
212
+ .enum(["7d", "30d", "90d", "1y", "3y", "all"])
213
+ .optional()
214
+ .describe("Lookback window."),
215
+ entities: z.string().optional().describe("Comma-separated entity IDs."),
216
+ sub: z
217
+ .enum(["trending", "categories", "global"])
218
+ .optional()
219
+ .describe("Market sub-mode when mode=market."),
220
+ };
221
+ export const katanaSchema = {};
222
+ export const narrativesSchema = {
223
+ narrative: z
224
+ .string()
225
+ .optional()
226
+ .describe("Narrative slug to filter by (e.g. layer-1, layer-2, defi, ai-agents, defai, depin, desci, gaming, dex, cex, lending, memes, nfts, oracles, privacy, rwa, stablecoins, restaking, liquid-staking, modular, socialfi, intent). Omit for all narratives."),
227
+ correlation: z
228
+ .string()
229
+ .optional()
230
+ .describe('Set to "true" to include correlation data between the narrative\'s tokens.'),
231
+ timeframe: z.string().optional().describe("Timeframe for correlation data."),
232
+ };
233
+ export const ecosystemsSchema = {
234
+ ecosystem: z
235
+ .string()
236
+ .optional()
237
+ .describe("Ecosystem slug to filter by (e.g. ethereum, solana, bnb-chain, arbitrum, base, bitcoin, avalanche, optimism, cosmos, polkadot, sui, aptos, ton, tron). Omit for all ecosystems."),
238
+ excludeNative: z
239
+ .string()
240
+ .optional()
241
+ .describe('Set to "true" to exclude the native token from aggregated metrics (e.g. exclude ETH from Ethereum ecosystem stats).'),
242
+ correlation: z
243
+ .string()
244
+ .optional()
245
+ .describe('Set to "true" to include correlation data between the ecosystem\'s tokens.'),
246
+ timeframe: z.string().optional().describe("Timeframe for correlation data."),
247
+ };
248
+ export const memecoinsSchema = {
249
+ narrative: z
250
+ .string()
251
+ .optional()
252
+ .describe("Memecoin narrative slug (e.g. dog-coins, cat-coins, frog-coins, ai-memes, trump-coins). Omit for all narratives."),
253
+ historical: z
254
+ .enum(["24h", "7d", "30d", "1y"])
255
+ .optional()
256
+ .describe("Include historical time-series data for the specified window."),
257
+ coinHistory: z
258
+ .enum(["24h", "7d", "1m", "1y"])
259
+ .optional()
260
+ .describe("In narrative detail mode, include top-coin price history."),
261
+ };
262
+ export const memecoinLaunchesSchema = {
263
+ chains: z
264
+ .string()
265
+ .optional()
266
+ .describe("Comma-separated chain ids, e.g. solana,base,bsc,ethereum."),
267
+ days: z.number().min(1).max(30).optional().describe("Launch age window."),
268
+ limit: z.number().min(1).max(200).optional().describe("Maximum rows."),
269
+ profile: z
270
+ .enum(["discovery", "balanced", "strict"])
271
+ .optional()
272
+ .describe("Screening profile for liquidity, volume, and transaction gates."),
273
+ };
274
+ export const newsSchema = {
275
+ limit: z
276
+ .number()
277
+ .min(1)
278
+ .max(500)
279
+ .default(200)
280
+ .optional()
281
+ .describe("Maximum number of articles to return (1-500)."),
282
+ category: z
283
+ .string()
284
+ .optional()
285
+ .describe("Filter by news category. Accepted: all, crypto, tradfi, macro, geopolitics, research, ai."),
286
+ coin: z
287
+ .string()
288
+ .optional()
289
+ .describe("Filter by canonical coin slug (e.g. bitcoin, ethereum, solana)."),
290
+ since: z
291
+ .string()
292
+ .optional()
293
+ .describe("ISO 8601 timestamp. Only return articles published after this time."),
294
+ offset: z
295
+ .number()
296
+ .int()
297
+ .min(0)
298
+ .optional()
299
+ .describe("Offset for pagination; skip this many articles before returning results."),
300
+ };
301
+ export const curatedNewsSchema = {
302
+ limit: z
303
+ .number()
304
+ .min(1)
305
+ .max(100)
306
+ .default(20)
307
+ .optional()
308
+ .describe("Maximum number of curated stories to return (1-100)."),
309
+ category: z
310
+ .enum(["all", "crypto", "ai", "markets", "geopolitics"])
311
+ .optional()
312
+ .describe("Filter by category: all, crypto, ai, markets, geopolitics."),
313
+ cursor: z
314
+ .string()
315
+ .optional()
316
+ .describe("Pagination cursor (ISO date or 'date|id') from a previous response."),
317
+ };
318
+ export const marketOverviewSchema = {};
319
+ export const pricePredictionSchema = {
320
+ coin: z
321
+ .string()
322
+ .optional()
323
+ .describe("Canonical coin slug (e.g. bitcoin, ethereum, solana)."),
324
+ };
325
+ export const searchMarketCapSchema = {
326
+ q: z
327
+ .string()
328
+ .min(2)
329
+ .max(100)
330
+ .describe("Search query (2-100 characters). Can be a coin name or ticker."),
331
+ };
332
+ export const gemFinderSchema = {
333
+ limit: z
334
+ .number()
335
+ .min(1)
336
+ .max(1000)
337
+ .default(100)
338
+ .optional()
339
+ .describe("Maximum number of tokens to return (1-1000)."),
340
+ };
341
+ export const derivativesOverviewSchema = {};
342
+ export const apiCoverageSchema = {};
343
+ const listingExchangeIds = [
344
+ "binance",
345
+ "okx",
346
+ "bybit",
347
+ "gateio",
348
+ "mexc",
349
+ "bitget",
350
+ "kucoin",
351
+ "bingx",
352
+ "bitmart",
353
+ "deepcoin",
354
+ "coinbase",
355
+ "kraken",
356
+ "crypto_com",
357
+ "upbit",
358
+ "bithumb",
359
+ "htx",
360
+ "bitfinex",
361
+ "bitstamp",
362
+ "gemini",
363
+ "bitmex",
364
+ "deribit",
365
+ "phemex",
366
+ "lbank",
367
+ "bitrue",
368
+ "coinex",
369
+ "backpack",
370
+ "hashkey",
371
+ "whitebit",
372
+ "toobit",
373
+ "hyperliquid",
374
+ "aster",
375
+ "dydx",
376
+ "aevo",
377
+ ];
378
+ export const listingsDataSchema = {
379
+ narrative: z
380
+ .string()
381
+ .optional()
382
+ .describe("Filter to a single narrative slug (e.g. 'ai-agents', 'memes', 'layer-1', 'rwa', 'defi'). Uses the Sharpe narrative taxonomy."),
383
+ exchange: z
384
+ .enum(listingExchangeIds)
385
+ .optional()
386
+ .describe("Filter to a single exchange."),
387
+ };
388
+ export const listingsRecentSchema = {
389
+ narrative: z
390
+ .string()
391
+ .optional()
392
+ .describe("Filter to a single narrative slug."),
393
+ exchange: z
394
+ .enum(listingExchangeIds)
395
+ .optional()
396
+ .describe("Filter to a single exchange."),
397
+ venue_type: z
398
+ .enum(["cex", "perp_dex", "dex"])
399
+ .optional()
400
+ .describe("Optional event-feed venue filter."),
401
+ market_type: z
402
+ .enum(["spot", "perp", "futures", "options", "margin"])
403
+ .optional()
404
+ .describe("Optional event-feed market filter."),
405
+ event_type: z
406
+ .enum(["listing", "delisting", "suspension", "resumption", "prelaunch"])
407
+ .optional()
408
+ .describe("Optional event type filter. Defaults remain recent listings."),
409
+ asset_class: z
410
+ .enum([
411
+ "token",
412
+ "spot_pair",
413
+ "perp_contract",
414
+ "futures_contract",
415
+ "options_contract",
416
+ ])
417
+ .optional()
418
+ .describe("Optional event-feed asset-class filter."),
419
+ status: z
420
+ .enum([
421
+ "announced",
422
+ "scheduled",
423
+ "live",
424
+ "completed",
425
+ "cancelled",
426
+ "needs_review",
427
+ ])
428
+ .optional()
429
+ .describe("Optional event status filter."),
430
+ confidence: z
431
+ .enum(["authoritative", "high", "medium", "low", "proxy", "manual"])
432
+ .optional()
433
+ .describe("Optional source confidence filter."),
434
+ from: z.string().optional().describe("ISO date/datetime lower bound."),
435
+ to: z.string().optional().describe("ISO date/datetime upper bound."),
436
+ days: z
437
+ .number()
438
+ .int()
439
+ .min(1)
440
+ .max(365)
441
+ .default(90)
442
+ .optional()
443
+ .describe("Lookback window in days. Default 90."),
444
+ limit: z
445
+ .number()
446
+ .int()
447
+ .min(1)
448
+ .max(1000)
449
+ .default(200)
450
+ .optional()
451
+ .describe("Max rows returned. Default 200."),
452
+ cursor: z
453
+ .string()
454
+ .optional()
455
+ .describe("Cursor returned by event feed pages."),
456
+ };
457
+ export const listingsEventsSchema = {
458
+ exchange: z
459
+ .enum(listingExchangeIds)
460
+ .optional()
461
+ .describe("Filter to a single exchange or perp DEX."),
462
+ venue_type: z
463
+ .enum(["cex", "perp_dex", "dex"])
464
+ .optional()
465
+ .describe("Filter by venue type."),
466
+ market_type: z
467
+ .enum(["spot", "perp", "futures", "options", "margin"])
468
+ .optional()
469
+ .describe("Filter by market type."),
470
+ event_type: z
471
+ .enum(["listing", "delisting", "suspension", "resumption", "prelaunch"])
472
+ .optional()
473
+ .describe("Filter by listing lifecycle event type."),
474
+ asset_class: z
475
+ .enum([
476
+ "token",
477
+ "spot_pair",
478
+ "perp_contract",
479
+ "futures_contract",
480
+ "options_contract",
481
+ ])
482
+ .optional()
483
+ .describe("Filter by listed instrument class."),
484
+ status: z
485
+ .enum([
486
+ "announced",
487
+ "scheduled",
488
+ "live",
489
+ "completed",
490
+ "cancelled",
491
+ "needs_review",
492
+ ])
493
+ .optional()
494
+ .describe("Filter by event status."),
495
+ narrative: z.string().optional().describe("Filter by Sharpe narrative slug."),
496
+ confidence: z
497
+ .enum(["authoritative", "high", "medium", "low", "proxy", "manual"])
498
+ .optional()
499
+ .describe("Filter by source confidence."),
500
+ from: z.string().optional().describe("ISO date/datetime lower bound."),
501
+ to: z.string().optional().describe("ISO date/datetime upper bound."),
502
+ days: z
503
+ .number()
504
+ .int()
505
+ .min(1)
506
+ .max(365)
507
+ .default(90)
508
+ .optional()
509
+ .describe("Lookback window in days. Default 90."),
510
+ limit: z
511
+ .number()
512
+ .int()
513
+ .min(1)
514
+ .max(1000)
515
+ .default(200)
516
+ .optional()
517
+ .describe("Max rows returned. Default 200."),
518
+ cursor: z.string().optional().describe("Cursor for the next page."),
519
+ };
520
+ export const listingsExchangesSchema = {
521
+ venue_type: z
522
+ .enum(["cex", "perp_dex", "dex"])
523
+ .optional()
524
+ .describe("Filter exchange coverage by venue type."),
525
+ market_type: z
526
+ .enum(["spot", "perp", "futures", "options", "margin"])
527
+ .optional()
528
+ .describe("Filter exchange coverage by supported market type."),
529
+ enabled: z
530
+ .enum(["true", "false"])
531
+ .optional()
532
+ .describe("Filter to enabled or disabled connectors."),
533
+ };
534
+ export const signalScoreSchema = {
535
+ limit: z
536
+ .number()
537
+ .int()
538
+ .min(1)
539
+ .max(500)
540
+ .default(100)
541
+ .optional()
542
+ .describe("Maximum number of scored coins to return. Default 100."),
543
+ min_score: z
544
+ .number()
545
+ .min(0)
546
+ .max(10)
547
+ .default(0)
548
+ .optional()
549
+ .describe("Minimum 0-10 risk/pressure score to include."),
550
+ };
551
+ // get_pump_dump adds a manipulation-lifecycle phase filter on top of the shared
552
+ // signal-score params. get_insider_selling stays on signalScoreSchema (no phase).
553
+ // Fields are listed explicitly (not spread from signalScoreSchema) so the docs and
554
+ // closed-loop schema-field parsers can see limit/min_score/phase.
555
+ export const pumpDumpSchema = {
556
+ limit: z
557
+ .number()
558
+ .int()
559
+ .min(1)
560
+ .max(500)
561
+ .default(100)
562
+ .optional()
563
+ .describe("Maximum number of scored coins to return. Default 100."),
564
+ min_score: z
565
+ .number()
566
+ .min(0)
567
+ .max(10)
568
+ .default(0)
569
+ .optional()
570
+ .describe("Minimum 0-10 risk/pressure score to include."),
571
+ phase: z
572
+ .enum(["setup", "markup", "distribution", "dump", "dumping"])
573
+ .optional()
574
+ .describe("Filter to one manipulation lifecycle phase."),
575
+ };
576
+ export const TOOL_DEFS = [
577
+ {
578
+ name: "get_funding_rates",
579
+ description: "Get perpetual funding rates across all supported exchanges. Returns current snapshots, accumulated rates over multiple windows, or per-coin historical rates. The coin parameter filters to a single base coin in any mode (required for history).",
580
+ schema: fundingRatesSchema,
581
+ apiPath: "/api/v1/funding/rates",
582
+ fallbackPath: "/api/funding/rates",
583
+ // The free /api/funding/rates endpoint ignores the `coin` param for
584
+ // current/accumulated modes. Filter client-side so the target rows
585
+ // survive MAX_ITEMS truncation.
586
+ postProcess: (data, args) => {
587
+ const coin = args.coin;
588
+ const type = args.type;
589
+ if (typeof coin !== "string" || coin === "" || type === "history") {
590
+ return data;
591
+ }
592
+ if (!Array.isArray(data)) {
593
+ return data;
594
+ }
595
+ const needle = coin.toUpperCase();
596
+ return data.filter((row) => typeof row === "object" &&
597
+ row !== null &&
598
+ String(row.base_coin ?? "").toUpperCase() === needle);
599
+ },
600
+ },
601
+ {
602
+ name: "get_futures_data",
603
+ description: "Get futures chart data including open interest, volume, funding rate history, liquidations, long/short ratios, basis, term structure, and OHLCV.",
604
+ schema: futuresDataSchema,
605
+ apiPath: "/api/v1/futures/data",
606
+ fallbackPath: "/api/futures/data",
607
+ },
608
+ {
609
+ name: "get_futures_coins",
610
+ description: "Get the list of coins with futures data available, including capability flags for open interest, liquidations, and long/short ratios per exchange.",
611
+ schema: futuresCoinsSchema,
612
+ apiPath: "/api/v1/futures/coins",
613
+ fallbackPath: "/api/futures/coins",
614
+ },
615
+ {
616
+ name: "get_correlation_matrix",
617
+ description: "Get a price correlation matrix for crypto assets over a specified period. Useful for portfolio analysis and diversification.",
618
+ schema: correlationMatrixSchema,
619
+ apiPath: "/api/v1/correlation/matrix",
620
+ fallbackPath: "/api/correlation/matrix",
621
+ },
622
+ {
623
+ name: "get_arbitrage_spot_perp",
624
+ description: "Get current spot-perpetual funding rate arbitrage opportunities across exchanges. Shows the spread between spot and perp prices that can be captured via basis trading.",
625
+ schema: arbitrageSpotPerpSchema,
626
+ apiPath: "/api/v1/arbitrage/spot-perp",
627
+ fallbackPath: "/api/arbitrage/spot-perp",
628
+ },
629
+ {
630
+ name: "get_arbitrage_cross_exchange",
631
+ description: "Get cross-exchange price discrepancies and arbitrage opportunities. Shows where the same asset trades at different prices across exchanges.",
632
+ schema: arbitrageCrossExchangeSchema,
633
+ apiPath: "/api/v1/arbitrage/cross-exchange",
634
+ fallbackPath: "/api/arbitrage/cross-exchange",
635
+ },
636
+ {
637
+ name: "get_arbitrage_dated_futures_basis",
638
+ description: "Get cash-and-carry arbitrage rows for buying spot and selling dated futures, ranked by net annualized basis after fees.",
639
+ schema: arbitrageScannerSchema,
640
+ apiPath: "/api/v1/arbitrage/dated-futures-basis",
641
+ fallbackPath: "/api/arbitrage/dated-futures-basis",
642
+ },
643
+ {
644
+ name: "get_arbitrage_futures_calendar_spread",
645
+ description: "Get near-versus-far dated futures calendar spread rows with forward yield, curve direction, and net roll APY.",
646
+ schema: arbitrageScannerSchema,
647
+ apiPath: "/api/v1/arbitrage/futures-calendar-spread",
648
+ fallbackPath: "/api/arbitrage/futures-calendar-spread",
649
+ },
650
+ {
651
+ name: "get_arbitrage_perp_dated_carry",
652
+ description: "Get perp funding versus dated futures basis carry rows, comparing expected funding to expiry against locked dated basis.",
653
+ schema: arbitrageScannerSchema,
654
+ apiPath: "/api/v1/arbitrage/perp-dated-carry",
655
+ fallbackPath: "/api/arbitrage/perp-dated-carry",
656
+ },
657
+ {
658
+ name: "get_arbitrage_cex_spot_transfer",
659
+ description: "Get live CEX spot-transfer arbitrage rows after common network, fee, status, depth, slippage, and spread-lifetime checks.",
660
+ schema: cexSpotTransferScannerSchema,
661
+ apiPath: "/api/v1/arbitrage/cex-spot-transfer",
662
+ fallbackPath: "/api/arbitrage/cex-spot-transfer",
663
+ },
664
+ {
665
+ name: "get_heatmap",
666
+ description: "Get market heatmap data for coins, narratives, or ecosystems. Visualizes relative performance across the market.",
667
+ schema: heatmapSchema,
668
+ apiPath: "/api/v1/heatmap/data",
669
+ fallbackPath: "/api/heatmap/data",
670
+ },
671
+ {
672
+ name: "get_dexscreener_data",
673
+ description: "Get live DEX Screener rows by category, network, or search phrase. Use this for pair-level discovery across DEX markets. Requires API key (SHARPE_API_KEY) — not available on the free tier.",
674
+ schema: dexScreenerDataSchema,
675
+ apiPath: "/api/v1/dexscreener/data",
676
+ fallbackPath: "/api/v1/dexscreener/data",
677
+ },
678
+ {
679
+ name: "get_dexscreener_security",
680
+ description: "Get token contract security signals for a DEX Screener token by address and chain ID.",
681
+ schema: dexScreenerSecuritySchema,
682
+ apiPath: "/api/v1/dexscreener/security",
683
+ fallbackPath: "/api/dexscreener/security",
684
+ },
685
+ {
686
+ name: "get_token_scanner",
687
+ description: "Run read-only token scanner modes: hot tokens, new runners, alpha drops, AI tokens, or top new pairs. Requires API key (SHARPE_API_KEY) — not available on the free tier.",
688
+ schema: tokenScannerSchema,
689
+ apiPath: "/api/v1/token-scanner/scan",
690
+ fallbackPath: "/api/v1/token-scanner/scan",
691
+ },
692
+ {
693
+ name: "get_rug_check_security",
694
+ description: "Get rug-check token contract security and liquidity risk signals.",
695
+ schema: rugCheckSecuritySchema,
696
+ apiPath: "/api/v1/rug-check/security",
697
+ fallbackPath: "/api/rug-check/security",
698
+ },
699
+ {
700
+ name: "get_rug_check_trending",
701
+ description: "Get trending tokens suitable for rug-check review.",
702
+ schema: rugCheckTrendingSchema,
703
+ apiPath: "/api/v1/rug-check/trending",
704
+ fallbackPath: "/api/rug-check/trending",
705
+ },
706
+ {
707
+ name: "get_narratives",
708
+ description: "Get narrative-level market data (L1, L2, DeFi, AI Agents, DePIN, RWA, Gaming, etc.) including market cap, volume, performance, and social metrics.",
709
+ schema: narrativesSchema,
710
+ apiPath: "/api/v1/narratives/data",
711
+ fallbackPath: "/api/narratives/data",
712
+ },
713
+ {
714
+ name: "get_ecosystems",
715
+ description: "Get ecosystem-level market data (Ethereum, Solana, BNB, Arbitrum, Base, etc.) including market cap, volume, TVL, and performance metrics.",
716
+ schema: ecosystemsSchema,
717
+ apiPath: "/api/v1/ecosystems/data",
718
+ fallbackPath: "/api/ecosystems/data",
719
+ },
720
+ {
721
+ name: "get_memecoins",
722
+ description: "Get memecoin narrative data across grouped categories (Dog, Cat, Frog, AI, Solana, Base, Pump.fun, etc.) with market cap, market share, volume, performance, and freshness fields.",
723
+ schema: memecoinsSchema,
724
+ apiPath: "/api/v1/memecoins/data",
725
+ fallbackPath: "/api/memecoins/data",
726
+ },
727
+ {
728
+ name: "get_memecoin_launches",
729
+ description: "Get recently launched memecoin pairs screened by age, liquidity, volume, and transaction count.",
730
+ schema: memecoinLaunchesSchema,
731
+ apiPath: "/api/v1/memecoins/launches",
732
+ fallbackPath: "/api/memecoins/launches",
733
+ },
734
+ {
735
+ name: "get_stablecoins",
736
+ description: "Get stablecoin overview, detail, or yield data including market cap, peg deviation, mechanism mix, and chain supply. Requires API key (SHARPE_API_KEY) — not available on the free tier.",
737
+ schema: stablecoinsSchema,
738
+ apiPath: "/api/v1/stablecoins/data",
739
+ fallbackPath: "/api/v1/stablecoins/data",
740
+ },
741
+ {
742
+ name: "get_mindshare",
743
+ description: "Get narrative mindshare rankings, token-level attention rows, rolling windows, or historical mindshare snapshots.",
744
+ schema: mindshareSchema,
745
+ apiPath: "/api/v1/mindshare/data",
746
+ fallbackPath: "/api/mindshare/data",
747
+ },
748
+ {
749
+ name: "get_web_traffic",
750
+ description: "Get attention rankings, search trends, social snapshots, or market-level traffic signals for exchanges, coins, and narratives.",
751
+ schema: webTrafficSchema,
752
+ apiPath: "/api/v1/web-traffic/data",
753
+ fallbackPath: "/api/web-traffic/data",
754
+ },
755
+ {
756
+ name: "get_katana",
757
+ description: "Get Katana Network TVL, token, holder, sentiment, pool, mover, and ecosystem analytics.",
758
+ schema: katanaSchema,
759
+ apiPath: "/api/v1/katana/data",
760
+ fallbackPath: "/api/products/katana/data",
761
+ },
762
+ {
763
+ name: "get_news",
764
+ description: "Get aggregated crypto news articles from multiple sources, with optional filtering by category or coin. Articles are deduplicated so only the best source per story is shown.",
765
+ schema: newsSchema,
766
+ apiPath: "/api/v1/news/feed",
767
+ fallbackPath: "/api/news/feed",
768
+ },
769
+ {
770
+ name: "get_curated_news",
771
+ description: "Get AI-curated crypto news highlights across crypto, AI, markets, and geopolitics. Updated every 15 minutes.",
772
+ schema: curatedNewsSchema,
773
+ apiPath: "/api/v1/news/curated",
774
+ fallbackPath: "/api/news/curated",
775
+ },
776
+ {
777
+ name: "get_market_overview",
778
+ description: "Get a broad market overview including total market cap, 24h volume, BTC dominance, top gainers/losers, and trending coins.",
779
+ schema: marketOverviewSchema,
780
+ apiPath: "/api/v1/tracker/market-overview",
781
+ fallbackPath: "/api/tracker/market-overview",
782
+ },
783
+ {
784
+ name: "get_price_prediction",
785
+ description: "Get ML-based price prediction data for a specified coin, including predicted price targets and confidence intervals.",
786
+ schema: pricePredictionSchema,
787
+ apiPath: "/api/v1/price-prediction/data",
788
+ fallbackPath: "/api/price-prediction/data",
789
+ },
790
+ {
791
+ name: "search_market_cap",
792
+ description: "Search for coins by name or ticker. Returns matching coins with market cap, price, and 24h change.",
793
+ schema: searchMarketCapSchema,
794
+ apiPath: "/api/v1/market-cap/search",
795
+ fallbackPath: "/api/market-cap/search",
796
+ },
797
+ {
798
+ name: "get_gem_finder",
799
+ description: "Get a curated list of low-cap, high-potential tokens identified by the gem finder algorithm.",
800
+ schema: gemFinderSchema,
801
+ apiPath: "/api/v1/gem-finder/data",
802
+ fallbackPath: "/api/gem-finder/data",
803
+ },
804
+ {
805
+ name: "get_derivatives_overview",
806
+ description: "Get a derivatives market overview including aggregated open interest, funding rates, and volume across top perpetual futures exchanges. Requires API key (SHARPE_API_KEY) — not available on the free tier.",
807
+ schema: derivativesOverviewSchema,
808
+ apiPath: "/api/v1/market/derivatives-overview",
809
+ fallbackPath: "/api/v1/market/derivatives-overview",
810
+ },
811
+ {
812
+ name: "get_api_coverage",
813
+ description: "Get public metadata about what data is available across all Sharpe Terminal products, including supported exchanges, coins, timeframes, and chart types. This coverage endpoint does not require an API key.",
814
+ schema: apiCoverageSchema,
815
+ apiPath: "/api/v1/meta/coverage",
816
+ fallbackPath: "/api/v1/meta/coverage",
817
+ },
818
+ {
819
+ name: "get_exchange_listings",
820
+ description: "Get the New Listings hub payload — weekly + monthly aggregated counts by narrative and exchange, plus the last-90-day recent listings. Optionally filter by narrative slug or single exchange. Useful for tracking where venues are adding listing slots.",
821
+ schema: listingsDataSchema,
822
+ apiPath: "/api/v1/listings/data",
823
+ fallbackPath: "/api/listings/data",
824
+ },
825
+ {
826
+ name: "get_recent_listings",
827
+ description: "Get a flat feed of recent token listings. Defaults remain backward-compatible with the legacy spot listing feed, and optional event filters can narrow by venue type, market type, event type, status, and source confidence.",
828
+ schema: listingsRecentSchema,
829
+ apiPath: "/api/v1/listings/recent",
830
+ fallbackPath: "/api/listings/recent",
831
+ },
832
+ {
833
+ name: "get_listing_events",
834
+ description: "Get canonical listing lifecycle events across CEXs and Perp DEXs, including Spot listings, Perp listings, delistings, suspensions, resumptions, scheduled trading starts, source URLs, and source confidence.",
835
+ schema: listingsEventsSchema,
836
+ apiPath: "/api/v1/listings/events",
837
+ fallbackPath: "/api/listings/events",
838
+ },
839
+ {
840
+ name: "get_listing_exchanges",
841
+ description: "Get the typed listing connector registry, including supported exchanges, venue types, market coverage, source documentation URLs, enabled status, polling group, and parser confidence.",
842
+ schema: listingsExchangesSchema,
843
+ apiPath: "/api/v1/listings/exchanges",
844
+ fallbackPath: "/api/listings/exchanges",
845
+ },
846
+ {
847
+ name: "get_insider_selling",
848
+ description: "Get insider selling pressure signals across crypto assets. Scores require cross-venue negative funding and combine OI, basis, CVD, sell-side flow, and supporting wallet/supply context.",
849
+ schema: signalScoreSchema,
850
+ apiPath: "/api/v1/insider-selling/data",
851
+ fallbackPath: "/api/insider-selling/data",
852
+ },
853
+ {
854
+ name: "get_pump_dump",
855
+ description: "Get pump-and-dump manipulation risk signals across crypto assets. Scores combine derivatives pressure, holder concentration, liquidity quality, DEX flow, and price behavior.",
856
+ schema: pumpDumpSchema,
857
+ apiPath: "/api/v1/pump-dump/data",
858
+ fallbackPath: "/api/pump-dump/data",
859
+ },
860
+ ];
861
+ //# sourceMappingURL=tools.js.map