bykaranteli-mcp 0.31.0 → 0.33.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/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  Notable changes to the `bykaranteli-mcp` package. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Dates are UTC and come from the git tag of each release (the version commit where no tag exists). The tool count is the number of tools the server registers in that release.
4
4
 
5
+ ## [0.33.0] - 2026-10-07
6
+
7
+ 67 tools.
8
+
9
+ ### Added
10
+
11
+ - Provenance: every answer whose route has a chart twin carries `chart_url` (the SuperChart address that opens on the same symbol, period and layers) and `chart_image_url` (a 1200 x 630 PNG of that view) next to `source_page` and `api_path`. Routes with a twin: series, the liquidation map and liquidation routes, options, funding and the funding heatmap, open interest, positioning, ETF flows and Hyperliquid whales.
12
+
13
+ ## [0.32.0] - 2026-10-06
14
+
15
+ 67 tools.
16
+
17
+ ### Changed
18
+
19
+ - `get_etf_flows`: `asset` accepts `XRP` next to `BTC`, `ETH` and `SOL` and returns the US spot XRP ETF daily rows (net inflow, total net assets, cumulative inflow since launch, value traded, in USD). The description gives each asset's first day (BTC and ETH since 2025-05-20, SOL since 2025-10-28, XRP since 2026-09-08) instead of one history length for all.
20
+
5
21
  ## [0.31.0] - 2026-09-30
6
22
 
7
23
  67 tools.
package/README.md CHANGED
@@ -73,7 +73,7 @@ Requires Node.js 18 or newer.
73
73
  | `get_liquidation_leaderboard` | "What was the biggest liquidation today?", "When do liquidations cluster, Asia or US hours?" |
74
74
  | `get_insurance_funds` | "How big is the Binance insurance fund?", "Did any exchange insurance fund shrink this week?" |
75
75
  | `get_tokenized_stocks` | "How much tokenized Tesla exists onchain?", "Which tokenized stock trades furthest from the real share?", "Which price valued this wrapper's supply?" (`price_source`, `totals.priced_by`) |
76
- | `get_etf_flows` | "Did the Bitcoin ETFs buy or sell yesterday?", "Cumulative ETH ETF inflow?" |
76
+ | `get_etf_flows` | "Did the Bitcoin ETFs buy or sell yesterday?", "Cumulative ETH ETF inflow?", "XRP ETF flows this week?" |
77
77
  | `get_cot_positioning` | "Are hedge funds long or short Bitcoin?", "What did the COT report show?" |
78
78
  | `get_options_snapshot` | "Where are the BTC option walls?", "What is DVOL / the zero-gamma level?" |
79
79
  | `get_coinbase_premium` | "Are US investors buying Bitcoin?", "What does the basis trade pay?" |
@@ -2,6 +2,10 @@ export declare const PROOF_URL = "https://bykaranteli.com/proof";
2
2
  export type ProvenanceCoverage = "full" | "sampled" | "mixed";
3
3
  export type Provenance = {
4
4
  source_page: string;
5
+ /** The SuperChart address that opens on what this answer holds, when the route has a chart twin (2026-10-07). */
6
+ chart_url?: string;
7
+ /** A PNG of that chart view (1200 x 630, candles, heatmap, prints), for clients that show images. */
8
+ chart_image_url?: string;
5
9
  api_path: string;
6
10
  /** The answer's own timestamp (generatedAt, generated_at, as_of); null when the route does not stamp one. */
7
11
  generated_at: string | null;
@@ -15,6 +19,7 @@ export type Provenance = {
15
19
  };
16
20
  /** The site page a route's numbers are shown on. */
17
21
  export declare function pageForApiPath(path: string): string;
22
+ export declare function chartUrlForApiPath(path: string): string | null;
18
23
  export declare function buildProvenance(data: unknown, at: {
19
24
  apiPath: string;
20
25
  sourcePage: string;
@@ -50,6 +50,43 @@ function venueId(item) {
50
50
  const id = str(item.exchange) ?? str(item.venue_id) ?? str(item.id) ?? str(item.key) ?? str(item.venue);
51
51
  return id && VENUE_TOKEN.test(id) ? id : undefined;
52
52
  }
53
+ /* Chart block phase 2 (2026-10-07): the SuperChart address that shows what an answer holds, so an agent can hand the
54
+ * reader a chart that opens on the same symbol, period and layers (chart-url-state.ts keys: s, p, panes, heat, pr,
55
+ * lv). Null for routes with no chart twin. The symbol defaults to BTCUSDT when the query names none. */
56
+ const CHART_BASE = "https://bykaranteli.com/chart";
57
+ function chartSymbol(q) {
58
+ const raw = (q.get("symbol") ?? q.get("coin") ?? q.get("currency") ?? q.get("asset") ?? "BTC").toUpperCase().replace(/[^A-Z0-9]/g, "");
59
+ if (!raw)
60
+ return "BTCUSDT";
61
+ return /USDT$|USD$|PERP$/.test(raw) ? raw : `${raw}USDT`;
62
+ }
63
+ export function chartUrlForApiPath(path) {
64
+ const [clean, query = ""] = path.split("?");
65
+ const q = new URLSearchParams(query);
66
+ const s = chartSymbol(q);
67
+ if (clean === "/api/series" || clean.startsWith("/api/series/")) {
68
+ const metric = (q.get("metric") ?? "price").toLowerCase();
69
+ const period = q.get("period") ?? "1h";
70
+ const panes = metric === "price" || metric === "volume" ? "" : `&panes=${encodeURIComponent(metric)}`;
71
+ return `${CHART_BASE}?s=${s}&p=${encodeURIComponent(period)}${panes}&heat=1&pr=1`;
72
+ }
73
+ if (clean.startsWith("/api/liqmap/") || clean.startsWith("/api/public/liqmap") || clean.startsWith("/api/public/liquidations") || clean.startsWith("/api/public/liquidation-cascades")) {
74
+ return `${CHART_BASE}?s=${s}&panes=liquidations,oi&heat=1&pr=1`;
75
+ }
76
+ if (clean.startsWith("/api/public/options"))
77
+ return `${CHART_BASE}?s=${s}&panes=oi&lv=1&heat=1&pr=0`;
78
+ if (clean.startsWith("/api/public/funding") || clean.startsWith("/api/public/heatmap"))
79
+ return `${CHART_BASE}?s=${s}&panes=funding,oi&heat=1&pr=0`;
80
+ if (clean.startsWith("/api/public/oi"))
81
+ return `${CHART_BASE}?s=${s}&panes=oi,funding&heat=1&pr=0`;
82
+ if (clean.startsWith("/api/public/positioning") || clean.startsWith("/api/public/long-short"))
83
+ return `${CHART_BASE}?s=${s}&panes=long_short,top_traders&heat=0&pr=0`;
84
+ if (clean.startsWith("/api/public/etf"))
85
+ return `${CHART_BASE}?s=${s}&p=1d&panes=etf_flow&heat=0&pr=0`;
86
+ if (clean.startsWith("/api/public/hyperliquid-whales"))
87
+ return `${CHART_BASE}?s=${s}&panes=whale_net,oi&heat=1&pr=1`;
88
+ return null;
89
+ }
53
90
  export function buildProvenance(data, at) {
54
91
  const d = isRec(data) ? data : {};
55
92
  const meta = isRec(d.meta) ? d.meta : {};
@@ -115,6 +152,7 @@ export function buildProvenance(data, at) {
115
152
  const since = str(d.recorded_since) ?? str(d.history_since) ?? str(meta.recorded_since) ?? str(meta.history_since);
116
153
  return {
117
154
  source_page: at.sourcePage,
155
+ ...(chartUrlForApiPath(at.apiPath) ? { chart_url: chartUrlForApiPath(at.apiPath), chart_image_url: chartUrlForApiPath(at.apiPath).replace("/chart?", "/api/og/chart?") } : {}),
118
156
  api_path: at.apiPath,
119
157
  generated_at: str(d.generatedAt) ?? str(d.generated_at) ?? str(d.as_of) ?? str(d.asOf) ?? str(meta.generatedAt) ?? str(meta.generated_at) ?? str(meta.as_of) ?? null,
120
158
  fetched_at: at.fetchedAt,
package/dist/tools.js CHANGED
@@ -242,10 +242,10 @@ export function registerByKaranteliTools(server, options) {
242
242
  }
243
243
  });
244
244
  server.registerTool("get_etf_flows", {
245
- title: "US spot Bitcoin and Ethereum ETF daily flows",
246
- description: "Call this when the user asks about Bitcoin, Ethereum or Solana spot ETF flows: daily net inflows or outflows, cumulative flow since launch, or total net assets of the US spot ETFs (IBIT, FBTC, ETHA and the rest). Returns one row per finalized US trading day and asset with net inflow, total net assets, cumulative inflow and value traded, all in USD. About 14 months of history.",
245
+ title: "US spot Bitcoin, Ethereum, Solana and XRP ETF daily flows",
246
+ description: "Call this when the user asks about Bitcoin, Ethereum, Solana or XRP spot ETF flows: daily net inflows or outflows, cumulative flow since launch, or total net assets of the US spot ETFs (IBIT, FBTC, ETHA, XRPC and the rest). Returns one row per finalized US trading day and asset with net inflow, total net assets, cumulative inflow since launch and value traded, all in USD. History by asset: BTC and ETH since 2025-05-20, SOL since 2025-10-28, XRP since 2026-09-08.",
247
247
  inputSchema: {
248
- asset: z.enum(["BTC", "ETH", "SOL"]).optional().describe("Filter to one asset (BTC, ETH or SOL, SOL since 2026-09-02). Omit for all."),
248
+ asset: z.enum(["BTC", "ETH", "SOL", "XRP"]).optional().describe("Filter to one asset (BTC, ETH, SOL or XRP). Omit for all."),
249
249
  days: z.number().int().min(1).max(400).optional().describe("How many most recent trading days to return (default 10)."),
250
250
  },
251
251
  annotations: READ_ONLY,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bykaranteli-mcp",
3
- "version": "0.31.0",
3
+ "version": "0.33.0",
4
4
  "description": "MCP server for live crypto derivatives data from bykaranteli.com: funding rates, funding arbitrage, open interest pressure, liquidations, options, ETF flows, Fear & Greed and BTC dominance. 67 read-only and account tools (the alert and watchlist tools act on your own account), free account key, paid depth via plans or x402.",
5
5
  "type": "module",
6
6
  "bin": {