hive-intelligence 1.10.0 → 1.11.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.
@@ -7836,9 +7836,8 @@ Don't use when:
7836
7836
  - You need token metadata (use coingecko_get_onchain_token_info)
7837
7837
 
7838
7838
  Error Handling:
7839
- - Returns 404 if network or token address not found
7839
+ - Returns 404 for tokens CoinGecko does not track traders for: wrapped native tokens (WETH, wSOL), stablecoins, and tokens created before 2023-09-01. Works on eth, base, solana and other networks for newer tokens.
7840
7840
  - Requires CoinGecko's Analyst plan or higher (a provider tier, not a Hive plan)
7841
- - Not all networks support trader tracking
7842
7841
  - Rate limited based on API plan`,
7843
7842
  inputSchema: {
7844
7843
  type: "object",
@@ -7877,7 +7876,7 @@ var handler79 = async (client2, args) => {
7877
7876
  if (error?.status === 404) {
7878
7877
  return asTextContentResult(
7879
7878
  {
7880
- error: `Invalid arguments: trader tracking is not available for ${address} on network "${network}" on the CoinGecko tier this account is on (404). Use coingecko_get_onchain_token_top_holders or get_token_top_holders for this token; traders are served on networks such as base.`,
7879
+ error: `Invalid arguments: CoinGecko does not track top traders for ${address} on "${network}" (404). It covers tokens created after 2023-09-01 and excludes wrapped native tokens and stablecoins. Use coingecko_get_onchain_token_top_holders or get_token_top_holders for this token.`,
7881
7880
  code: "VALIDATION_ERROR",
7882
7881
  suggestion: "Call coingecko_get_onchain_token_top_holders with the same network and address."
7883
7882
  },
@@ -8468,17 +8467,18 @@ var handler87 = async (client2, args) => asTextContentResult(
8468
8467
  var get_total_supply_chart_range_default = { metadata: metadata87, tool: tool87, handler: handler87 };
8469
8468
 
8470
8469
  // src/tools/insights/get-insights.ts
8470
+ var INSIGHTS_SOURCE_NOTE = "AI-generated summary written by CoinGecko; not verified by Hive.";
8471
8471
  var metadata88 = {
8472
8472
  resource: "insights",
8473
8473
  operation: "read",
8474
- tags: ["coingecko", "coins", "insights", "research", "enterprise"],
8474
+ tags: ["coingecko", "coins", "insights", "research", "ai-generated"],
8475
8475
  httpMethod: "get",
8476
8476
  httpPath: "/insights",
8477
8477
  operationId: "insights"
8478
8478
  };
8479
8479
  var tool88 = {
8480
8480
  name: "coingecko_get_coin_insights",
8481
- description: `Get CoinGecko's latest coin research insights. Requires a CoinGecko Enterprise API plan and returns a bounded page of at most 20 items.
8481
+ description: `Get CoinGecko's AI-generated coin insights: short summaries of market catalysts, sentiment, and fundamentals. CoinGecko's AI writes these; Hive does not verify them, so treat them as context and confirm facts with market data. Returns a bounded page of at most 20 items.
8482
8482
 
8483
8483
  Args:
8484
8484
  - page (integer, optional): Page number from 1 to 20. Default: 1.
@@ -8488,7 +8488,7 @@ Args:
8488
8488
  - to (string, optional): End date in YYYY-MM-DD format.
8489
8489
 
8490
8490
  Returns:
8491
- JSON array of recent CoinGecko insight records, bounded to the requested page and page size.
8491
+ { source_note, insights: [{ title, description, related_coin_ids, posted_at }] }, bounded to the requested page and page size.
8492
8492
 
8493
8493
  Examples:
8494
8494
  - Latest insights: {"page":1,"per_page":10}
@@ -8503,7 +8503,6 @@ Don't use when:
8503
8503
  - You need live prices or market rankings (use coingecko_get_coins_markets)
8504
8504
 
8505
8505
  Plan and freshness:
8506
- - CoinGecko marks this endpoint Enterprise-only.
8507
8506
  - CoinGecko documents a 60-second cache/update interval.
8508
8507
  - Insight publication time is supplied by CoinGecko; inspect each returned record before treating it as current.`,
8509
8508
  inputSchema: {
@@ -8556,10 +8555,398 @@ var handler88 = async (client2, args) => {
8556
8555
  from: args?.from,
8557
8556
  to: args?.to
8558
8557
  };
8559
- return asTextContentResult(await client2.get("/insights", { query }));
8558
+ const insights = await client2.get("/insights", { query });
8559
+ return asTextContentResult({ source_note: INSIGHTS_SOURCE_NOTE, insights });
8560
8560
  };
8561
8561
  var get_insights_default = { metadata: metadata88, tool: tool88, handler: handler88 };
8562
8562
 
8563
+ // src/tools/onchain/wallets/get-wallet-balances.ts
8564
+ var WALLET_BALANCE_NETWORKS = [
8565
+ "eth",
8566
+ "base",
8567
+ "bsc",
8568
+ "polygon_pos",
8569
+ "arbitrum",
8570
+ "optimism",
8571
+ "avax",
8572
+ "linea",
8573
+ "stable",
8574
+ "robinhood",
8575
+ "arc"
8576
+ ];
8577
+ var metadata89 = {
8578
+ resource: "onchain.wallets.balances",
8579
+ operation: "read",
8580
+ tags: [
8581
+ "coingecko",
8582
+ "onchain",
8583
+ "wallets",
8584
+ "balances",
8585
+ "portfolio",
8586
+ "geckoterminal"
8587
+ ],
8588
+ httpMethod: "get",
8589
+ httpPath: "/onchain/wallets/{address}/balances",
8590
+ operationId: "wallet-balances-address"
8591
+ };
8592
+ var tool89 = {
8593
+ name: "coingecko_get_onchain_wallet_balances",
8594
+ description: `Get a wallet's token balances with USD values and 24h price change across several EVM networks in one call.
8595
+
8596
+ Args:
8597
+ - address (string, required): EVM wallet address (0x\u2026).
8598
+ - networks (string, optional): Comma-separated GeckoTerminal network ids. Default: all supported (${WALLET_BALANCE_NETWORKS.join(",")}). EVM only; Solana is rejected.
8599
+ - page (integer, optional): Page number. Default 1.
8600
+ - per_page (integer, optional): Tokens per page, 1-100. Default 100.
8601
+
8602
+ Returns:
8603
+ data.attributes with total_value_usd, total_holdings, a per-network value breakdown, and balances sorted by value: network, address, token_type ("native" rows use 0xeeee\u2026eeee), symbol, decimals, balance (decimal string), price_usd, value_usd, h24_price_change_percentage, total_reserve_in_usd (pool liquidity behind the price). Numbers are strings.
8604
+
8605
+ Examples:
8606
+ - All supported networks: {"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}
8607
+ - Base only: {"address":"0x\u2026","networks":"base"}
8608
+
8609
+ Use when:
8610
+ - You need a priced multi-chain EVM portfolio in one call.
8611
+
8612
+ Don't use when:
8613
+ - The wallet is on Solana (use helius_get_wallet_balances).
8614
+ - You need realized or unrealized PnL (use get_wallet_pnl).
8615
+
8616
+ Notes:
8617
+ - value_usd uses DEX prices; a large value_usd with a small total_reserve_in_usd usually means an illiquid or spam token.`,
8618
+ inputSchema: {
8619
+ type: "object",
8620
+ properties: {
8621
+ address: {
8622
+ type: "string",
8623
+ minLength: 1,
8624
+ maxLength: 100,
8625
+ description: "EVM wallet address (0x\u2026). Required."
8626
+ },
8627
+ networks: {
8628
+ type: "string",
8629
+ maxLength: 200,
8630
+ description: `Comma-separated network ids. Default: ${WALLET_BALANCE_NETWORKS.join(",")}.`
8631
+ },
8632
+ page: {
8633
+ type: "integer",
8634
+ minimum: 1,
8635
+ maximum: 500,
8636
+ description: "Page number, 1-500. Default 1."
8637
+ },
8638
+ per_page: {
8639
+ type: "integer",
8640
+ minimum: 1,
8641
+ maximum: 100,
8642
+ description: "Tokens per page, 1-100. Default 100."
8643
+ }
8644
+ },
8645
+ required: ["address"],
8646
+ additionalProperties: false
8647
+ },
8648
+ annotations: VOLATILE_READ_ANNOTATIONS
8649
+ };
8650
+ var handler89 = async (client2, args) => {
8651
+ const address = String(args?.address ?? "").trim();
8652
+ const query = {
8653
+ networks: args?.networks ?? WALLET_BALANCE_NETWORKS.join(","),
8654
+ page: args?.page,
8655
+ per_page: args?.per_page ?? 100
8656
+ };
8657
+ return asTextContentResult(
8658
+ await client2.get(
8659
+ `/onchain/wallets/${encodeURIComponent(address)}/balances`,
8660
+ { query }
8661
+ )
8662
+ );
8663
+ };
8664
+ var get_wallet_balances_default = { metadata: metadata89, tool: tool89, handler: handler89 };
8665
+
8666
+ // src/tools/onchain/wallets/get-wallet-pnl.ts
8667
+ var metadata90 = {
8668
+ resource: "onchain.wallets.pnl",
8669
+ operation: "read",
8670
+ tags: [
8671
+ "coingecko",
8672
+ "onchain",
8673
+ "wallets",
8674
+ "pnl",
8675
+ "profitability",
8676
+ "geckoterminal"
8677
+ ],
8678
+ httpMethod: "get",
8679
+ httpPath: "/onchain/wallets/{address}/pnl",
8680
+ operationId: "wallet-pnl-address"
8681
+ };
8682
+ var tool90 = {
8683
+ name: "coingecko_get_onchain_wallet_pnl",
8684
+ description: `Get a wallet's realized and unrealized DEX trading PnL, in total, per network, and per token.
8685
+
8686
+ Args:
8687
+ - address (string, required): Wallet address.
8688
+ - networks (string, optional): Comma-separated GeckoTerminal network ids, all from one VM family (all EVM, or "solana"). Default: ${WALLET_BALANCE_NETWORKS.join(",")}. Any GeckoTerminal network is accepted.
8689
+ - page (integer, optional): Page number. Default 1.
8690
+ - per_page (integer, optional): Tokens per page, 1-300. Default 50.
8691
+
8692
+ Returns:
8693
+ data.attributes with total_realized_pnl_usd, total_unrealized_pnl_usd, total_tokens, a per-network breakdown, and token_stats rows: network, address, symbol, realized_pnl_usd, unrealized_pnl_usd, average_buy_price_usd, average_sell_price_usd, total_buy/sell_count, total_buy/sell_usd. Numbers are strings; unrealized_pnl_usd is null when the token is no longer held.
8694
+
8695
+ Examples:
8696
+ - EVM PnL: {"address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}
8697
+ - Solana PnL: {"address":"<base58>","networks":"solana"}
8698
+
8699
+ Use when:
8700
+ - You need to know whether a wallet trades profitably, or which tokens made or lost it money.
8701
+
8702
+ Don't use when:
8703
+ - You need current holdings (use get_wallet_balances).
8704
+ - You need the individual trades (use get_wallet_trades).
8705
+
8706
+ Notes:
8707
+ - PnL is computed from DEX trades CoinGecko indexes; CEX activity and OTC transfers are not counted.`,
8708
+ inputSchema: {
8709
+ type: "object",
8710
+ properties: {
8711
+ address: {
8712
+ type: "string",
8713
+ minLength: 1,
8714
+ maxLength: 100,
8715
+ description: "Wallet address. Required."
8716
+ },
8717
+ networks: {
8718
+ type: "string",
8719
+ maxLength: 200,
8720
+ description: `Comma-separated network ids from one VM family. Default: ${WALLET_BALANCE_NETWORKS.join(",")}.`
8721
+ },
8722
+ page: {
8723
+ type: "integer",
8724
+ minimum: 1,
8725
+ maximum: 500,
8726
+ description: "Page number, 1-500. Default 1."
8727
+ },
8728
+ per_page: {
8729
+ type: "integer",
8730
+ minimum: 1,
8731
+ maximum: 300,
8732
+ description: "Tokens per page, 1-300. Default 50."
8733
+ }
8734
+ },
8735
+ required: ["address"],
8736
+ additionalProperties: false
8737
+ },
8738
+ annotations: VOLATILE_READ_ANNOTATIONS
8739
+ };
8740
+ var handler90 = async (client2, args) => {
8741
+ const address = String(args?.address ?? "").trim();
8742
+ const query = {
8743
+ networks: args?.networks ?? WALLET_BALANCE_NETWORKS.join(","),
8744
+ page: args?.page,
8745
+ per_page: args?.per_page ?? 50
8746
+ };
8747
+ return asTextContentResult(
8748
+ await client2.get(`/onchain/wallets/${encodeURIComponent(address)}/pnl`, {
8749
+ query
8750
+ })
8751
+ );
8752
+ };
8753
+ var get_wallet_pnl_default = { metadata: metadata90, tool: tool90, handler: handler90 };
8754
+
8755
+ // src/tools/onchain/networks/wallets/get-wallet-trades.ts
8756
+ function walletWindowError(args) {
8757
+ if (args?.from == null === (args?.to == null)) return null;
8758
+ return asTextContentResult(
8759
+ {
8760
+ error: "Invalid arguments: pass both from and to (YYYY-MM-DD, at most 30 days apart), or neither for the last 7 days.",
8761
+ code: "VALIDATION_ERROR"
8762
+ },
8763
+ true
8764
+ );
8765
+ }
8766
+ var WALLET_WINDOW_PROPERTIES = {
8767
+ from: {
8768
+ type: "string",
8769
+ pattern: "^\\d{4}-\\d{2}-\\d{2}$",
8770
+ description: "Window start, YYYY-MM-DD. Send with to; window at most 30 days. Default: last 7 days."
8771
+ },
8772
+ to: {
8773
+ type: "string",
8774
+ pattern: "^\\d{4}-\\d{2}-\\d{2}$",
8775
+ description: "Window end, YYYY-MM-DD. Send with from."
8776
+ },
8777
+ cursor: {
8778
+ type: "string",
8779
+ maxLength: 500,
8780
+ description: "meta.next_cursor from the previous page. Omit for the first page."
8781
+ },
8782
+ per_page: {
8783
+ type: "integer",
8784
+ minimum: 1,
8785
+ maximum: 300,
8786
+ description: "Rows per page, 1-300. Default 100."
8787
+ }
8788
+ };
8789
+ var metadata91 = {
8790
+ resource: "onchain.networks.wallets.trades",
8791
+ operation: "read",
8792
+ tags: ["coingecko", "onchain", "wallets", "trades", "swaps", "geckoterminal"],
8793
+ httpMethod: "get",
8794
+ httpPath: "/onchain/networks/{network}/wallets/{address}/trades",
8795
+ operationId: "wallet-trades-address"
8796
+ };
8797
+ var tool91 = {
8798
+ name: "coingecko_get_onchain_wallet_trades",
8799
+ description: `Get a wallet's DEX buys and sells on one network, with USD prices at execution time.
8800
+
8801
+ Args:
8802
+ - network (string, required): GeckoTerminal network id, e.g. "eth", "base", "solana". Any GeckoTerminal network.
8803
+ - address (string, required): Wallet address.
8804
+ - from, to (string, optional): YYYY-MM-DD window, sent together, at most 30 days. Default: last 7 days.
8805
+ - cursor (string, optional): meta.next_cursor from the previous page.
8806
+ - per_page (integer, optional): 1-300. Default 100.
8807
+
8808
+ Returns:
8809
+ data rows with pool_address, pool_dex, kind (buy/sell), from/to_token_address, from/to_token_amount, price_from/to_in_usd, volume_in_usd, tx_hash, block_timestamp; meta.next_cursor (null on the last page). An empty data array means no DEX trades in the window.
8810
+
8811
+ Examples:
8812
+ - Last 7 days on Base: {"network":"base","address":"0x\u2026"}
8813
+ - September on Ethereum: {"network":"eth","address":"0x\u2026","from":"2026-09-01","to":"2026-09-30"}
8814
+
8815
+ Use when:
8816
+ - You need what a wallet bought and sold, and at what price.
8817
+
8818
+ Don't use when:
8819
+ - You need all token movements including plain transfers (use get_wallet_transfers).
8820
+ - You need the PnL summary (use get_wallet_pnl).`,
8821
+ inputSchema: {
8822
+ type: "object",
8823
+ properties: {
8824
+ network: {
8825
+ type: "string",
8826
+ minLength: 1,
8827
+ maxLength: 60,
8828
+ description: 'GeckoTerminal network id, e.g. "eth". Required.'
8829
+ },
8830
+ address: {
8831
+ type: "string",
8832
+ minLength: 1,
8833
+ maxLength: 100,
8834
+ description: "Wallet address. Required."
8835
+ },
8836
+ ...WALLET_WINDOW_PROPERTIES
8837
+ },
8838
+ required: ["network", "address"],
8839
+ additionalProperties: false
8840
+ },
8841
+ annotations: VOLATILE_READ_ANNOTATIONS
8842
+ };
8843
+ var handler91 = async (client2, args) => {
8844
+ const invalid2 = walletWindowError(args);
8845
+ if (invalid2) return invalid2;
8846
+ const network = encodeURIComponent(String(args?.network ?? "").trim());
8847
+ const address = encodeURIComponent(String(args?.address ?? "").trim());
8848
+ const query = {
8849
+ from: args?.from,
8850
+ to: args?.to,
8851
+ cursor: args?.cursor,
8852
+ per_page: args?.per_page ?? 100
8853
+ };
8854
+ return asTextContentResult(
8855
+ await client2.get(`/onchain/networks/${network}/wallets/${address}/trades`, {
8856
+ query
8857
+ })
8858
+ );
8859
+ };
8860
+ var get_wallet_trades_default = { metadata: metadata91, tool: tool91, handler: handler91 };
8861
+
8862
+ // src/tools/onchain/networks/wallets/get-wallet-transfers.ts
8863
+ var metadata92 = {
8864
+ resource: "onchain.networks.wallets.transfers",
8865
+ operation: "read",
8866
+ tags: ["coingecko", "onchain", "wallets", "transfers", "geckoterminal"],
8867
+ httpMethod: "get",
8868
+ httpPath: "/onchain/networks/{network}/wallets/{address}/transfers",
8869
+ operationId: "wallet-transfers-address"
8870
+ };
8871
+ var tool92 = {
8872
+ name: "coingecko_get_onchain_wallet_transfers",
8873
+ description: `Get a wallet's inbound and outbound token transfers on one EVM network.
8874
+
8875
+ Args:
8876
+ - network (string, required): One of ${WALLET_BALANCE_NETWORKS.join(", ")}.
8877
+ - address (string, required): EVM wallet address (0x\u2026).
8878
+ - direction (string, optional): "in" or "out". Default both.
8879
+ - token (string, optional): Only transfers of this token contract address.
8880
+ - from, to (string, optional): YYYY-MM-DD window, sent together, at most 30 days. Default: last 7 days.
8881
+ - cursor (string, optional): meta.next_cursor from the previous page.
8882
+ - per_page (integer, optional): 1-300. Default 100.
8883
+
8884
+ Returns:
8885
+ data rows with block_number, tx_hash, direction, token_address, symbol, decimals, amount (decimal string), from_address, to_address, block_timestamp; meta.next_cursor (null on the last page).
8886
+
8887
+ Examples:
8888
+ - Recent inbound on Ethereum: {"network":"eth","address":"0x\u2026","direction":"in"}
8889
+
8890
+ Use when:
8891
+ - You need who sent a wallet what, or where its tokens went.
8892
+
8893
+ Don't use when:
8894
+ - The wallet is on Solana (use helius_get_wallet_transfers).
8895
+ - You only need DEX buys and sells (use get_wallet_trades).`,
8896
+ inputSchema: {
8897
+ type: "object",
8898
+ properties: {
8899
+ network: {
8900
+ type: "string",
8901
+ minLength: 1,
8902
+ maxLength: 60,
8903
+ description: 'Network id, e.g. "eth". Required.'
8904
+ },
8905
+ address: {
8906
+ type: "string",
8907
+ minLength: 1,
8908
+ maxLength: 100,
8909
+ description: "EVM wallet address. Required."
8910
+ },
8911
+ direction: {
8912
+ type: "string",
8913
+ enum: ["in", "out"],
8914
+ description: "Transfer direction. Default both."
8915
+ },
8916
+ token: {
8917
+ type: "string",
8918
+ maxLength: 100,
8919
+ description: "Token contract address filter."
8920
+ },
8921
+ ...WALLET_WINDOW_PROPERTIES
8922
+ },
8923
+ required: ["network", "address"],
8924
+ additionalProperties: false
8925
+ },
8926
+ annotations: VOLATILE_READ_ANNOTATIONS
8927
+ };
8928
+ var handler92 = async (client2, args) => {
8929
+ const invalid2 = walletWindowError(args);
8930
+ if (invalid2) return invalid2;
8931
+ const network = encodeURIComponent(String(args?.network ?? "").trim());
8932
+ const address = encodeURIComponent(String(args?.address ?? "").trim());
8933
+ const query = {
8934
+ direction: args?.direction,
8935
+ token: args?.token,
8936
+ from: args?.from,
8937
+ to: args?.to,
8938
+ cursor: args?.cursor,
8939
+ per_page: args?.per_page ?? 100
8940
+ };
8941
+ return asTextContentResult(
8942
+ await client2.get(
8943
+ `/onchain/networks/${network}/wallets/${address}/transfers`,
8944
+ { query }
8945
+ )
8946
+ );
8947
+ };
8948
+ var get_wallet_transfers_default = { metadata: metadata92, tool: tool92, handler: handler92 };
8949
+
8563
8950
  // src/tools/rwas/query.ts
8564
8951
  function pickQuery(args, keys) {
8565
8952
  const query = {};
@@ -8596,7 +8983,7 @@ var PRECISION_VALUES = [
8596
8983
  ];
8597
8984
 
8598
8985
  // src/tools/rwas/get-rwas-list.ts
8599
- var metadata89 = {
8986
+ var metadata93 = {
8600
8987
  resource: "rwas",
8601
8988
  operation: "read",
8602
8989
  tags: ["coingecko", "rwa", "tokenized", "stocks", "commodities", "etf", "list"],
@@ -8604,7 +8991,7 @@ var metadata89 = {
8604
8991
  httpPath: "/rwas/list",
8605
8992
  operationId: "rwas-list"
8606
8993
  };
8607
- var tool89 = {
8994
+ var tool93 = {
8608
8995
  name: "coingecko_get_rwa_list",
8609
8996
  description: `List every tokenized real-world asset (RWA) that CoinGecko tracks: tokenized stocks, commodities, and ETFs with spot market data. Use it to resolve the RWA asset IDs the other coingecko_get_rwa_* tools take.
8610
8997
 
@@ -8651,15 +9038,15 @@ Plan and freshness:
8651
9038
  },
8652
9039
  annotations: READ_ONLY_ANNOTATIONS
8653
9040
  };
8654
- var handler89 = async (client2, args) => {
9041
+ var handler93 = async (client2, args) => {
8655
9042
  return asTextContentResult(
8656
9043
  await client2.get("/rwas/list", { query: pickQuery(args, ["asset_type"]) })
8657
9044
  );
8658
9045
  };
8659
- var get_rwas_list_default = { metadata: metadata89, tool: tool89, handler: handler89 };
9046
+ var get_rwas_list_default = { metadata: metadata93, tool: tool93, handler: handler93 };
8660
9047
 
8661
9048
  // src/tools/rwas/get-rwas-markets.ts
8662
- var metadata90 = {
9049
+ var metadata94 = {
8663
9050
  resource: "rwas.markets",
8664
9051
  operation: "read",
8665
9052
  tags: ["coingecko", "rwa", "tokenized", "stocks", "commodities", "etf", "markets", "price"],
@@ -8680,7 +9067,7 @@ var QUERY_KEYS = [
8680
9067
  "price_change_percentage",
8681
9068
  "sparkline"
8682
9069
  ];
8683
- var tool90 = {
9070
+ var tool94 = {
8684
9071
  name: "coingecko_get_rwa_markets",
8685
9072
  description: `Get CoinGecko spot market data for tokenized real-world assets (RWAs): tokenized stocks, commodities, and ETFs, with USD price, market cap, and 24h volume aggregated across every token that wraps each asset. This is spot data for the tokenized versions, not the traditional exchange quote and not perpetual futures.
8686
9073
 
@@ -8814,15 +9201,15 @@ Plan and freshness:
8814
9201
  },
8815
9202
  annotations: VOLATILE_READ_ANNOTATIONS
8816
9203
  };
8817
- var handler90 = async (client2, args) => {
9204
+ var handler94 = async (client2, args) => {
8818
9205
  return asTextContentResult(
8819
9206
  await client2.get("/rwas/markets", { query: pickQuery(args, QUERY_KEYS) })
8820
9207
  );
8821
9208
  };
8822
- var get_rwas_markets_default = { metadata: metadata90, tool: tool90, handler: handler90 };
9209
+ var get_rwas_markets_default = { metadata: metadata94, tool: tool94, handler: handler94 };
8823
9210
 
8824
9211
  // src/tools/rwas/get-rwas-asset.ts
8825
- var metadata91 = {
9212
+ var metadata95 = {
8826
9213
  resource: "rwas",
8827
9214
  operation: "read",
8828
9215
  tags: ["coingecko", "rwa", "tokenized", "stocks", "commodities", "etf", "details", "tokens"],
@@ -8831,7 +9218,7 @@ var metadata91 = {
8831
9218
  operationId: "rwas-id"
8832
9219
  };
8833
9220
  var QUERY_KEYS2 = ["sparkline", "tokenized_market_data", "tokens"];
8834
- var tool91 = {
9221
+ var tool95 = {
8835
9222
  name: "coingecko_get_rwa_asset",
8836
9223
  description: `Get one tokenized real-world asset (RWA) from CoinGecko by ID: a tokenized stock, commodity, or ETF, with its metadata, aggregated spot market data, and the list of tokens that wrap it, each with contract addresses per chain and its issuer.
8837
9224
 
@@ -8908,17 +9295,17 @@ Plan and freshness:
8908
9295
  },
8909
9296
  annotations: VOLATILE_READ_ANNOTATIONS
8910
9297
  };
8911
- var handler91 = async (client2, args) => {
9298
+ var handler95 = async (client2, args) => {
8912
9299
  return asTextContentResult(
8913
9300
  await client2.get(`/rwas/${pathId(args)}`, {
8914
9301
  query: pickQuery(args, QUERY_KEYS2)
8915
9302
  })
8916
9303
  );
8917
9304
  };
8918
- var get_rwas_asset_default = { metadata: metadata91, tool: tool91, handler: handler91 };
9305
+ var get_rwas_asset_default = { metadata: metadata95, tool: tool95, handler: handler95 };
8919
9306
 
8920
9307
  // src/tools/rwas/get-rwas-tickers.ts
8921
- var metadata92 = {
9308
+ var metadata96 = {
8922
9309
  resource: "rwas.tickers",
8923
9310
  operation: "read",
8924
9311
  tags: ["coingecko", "rwa", "tokenized", "stocks", "commodities", "etf", "tickers", "exchanges", "liquidity"],
@@ -8934,7 +9321,7 @@ var QUERY_KEYS3 = [
8934
9321
  "order",
8935
9322
  "page"
8936
9323
  ];
8937
- var tool92 = {
9324
+ var tool96 = {
8938
9325
  name: "coingecko_get_rwa_tickers",
8939
9326
  description: `Get exchange tickers for one tokenized real-world asset (RWA) on CoinGecko: every spot pair, across centralized and decentralized exchanges, for the tokens that wrap a given stock, commodity, or ETF. Requires a CoinGecko Basic plan or above.
8940
9327
 
@@ -9024,17 +9411,17 @@ Plan and freshness:
9024
9411
  },
9025
9412
  annotations: VOLATILE_READ_ANNOTATIONS
9026
9413
  };
9027
- var handler92 = async (client2, args) => {
9414
+ var handler96 = async (client2, args) => {
9028
9415
  return asTextContentResult(
9029
9416
  await client2.get(`/rwas/${pathId(args)}/tickers`, {
9030
9417
  query: pickQuery(args, QUERY_KEYS3)
9031
9418
  })
9032
9419
  );
9033
9420
  };
9034
- var get_rwas_tickers_default = { metadata: metadata92, tool: tool92, handler: handler92 };
9421
+ var get_rwas_tickers_default = { metadata: metadata96, tool: tool96, handler: handler96 };
9035
9422
 
9036
9423
  // src/tools/rwas/get-rwas-market-chart.ts
9037
- var metadata93 = {
9424
+ var metadata97 = {
9038
9425
  resource: "rwas.market_chart",
9039
9426
  operation: "read",
9040
9427
  tags: ["coingecko", "rwa", "tokenized", "stocks", "commodities", "etf", "chart", "historical"],
@@ -9043,7 +9430,7 @@ var metadata93 = {
9043
9430
  operationId: "rwas-id-market-chart"
9044
9431
  };
9045
9432
  var QUERY_KEYS4 = ["days", "interval", "precision"];
9046
- var tool93 = {
9433
+ var tool97 = {
9047
9434
  name: "coingecko_get_rwa_market_chart",
9048
9435
  description: `Get historical spot price, market cap, and volume series for one tokenized real-world asset (RWA) on CoinGecko: a tokenized stock, commodity, or ETF, aggregated across the tokens that wrap it. Requires a CoinGecko Basic plan or above.
9049
9436
 
@@ -9111,17 +9498,17 @@ Plan and freshness:
9111
9498
  },
9112
9499
  annotations: HISTORICAL_ANNOTATIONS
9113
9500
  };
9114
- var handler93 = async (client2, args) => {
9501
+ var handler97 = async (client2, args) => {
9115
9502
  const query = pickQuery(args, QUERY_KEYS4);
9116
9503
  if (query.days === void 0) query.days = "1";
9117
9504
  return asTextContentResult(
9118
9505
  await client2.get(`/rwas/${pathId(args)}/market_chart`, { query })
9119
9506
  );
9120
9507
  };
9121
- var get_rwas_market_chart_default = { metadata: metadata93, tool: tool93, handler: handler93 };
9508
+ var get_rwas_market_chart_default = { metadata: metadata97, tool: tool97, handler: handler97 };
9122
9509
 
9123
9510
  // src/tools/rwas/get-rwas-issuers.ts
9124
- var metadata94 = {
9511
+ var metadata98 = {
9125
9512
  resource: "rwas.issuers",
9126
9513
  operation: "read",
9127
9514
  tags: ["coingecko", "rwa", "tokenized", "issuers", "list"],
@@ -9129,7 +9516,7 @@ var metadata94 = {
9129
9516
  httpPath: "/rwas/issuers/list",
9130
9517
  operationId: "rwas-issuers-list"
9131
9518
  };
9132
- var tool94 = {
9519
+ var tool98 = {
9133
9520
  name: "coingecko_get_rwa_issuers",
9134
9521
  description: `List every issuer of tokenized real-world assets (RWAs) that CoinGecko tracks with spot market data: the companies and protocols that mint tokenized stocks, commodities, and ETFs, such as Ondo, Backed, Paxos, Dinari, and Robinhood. Use it to resolve issuer IDs for coingecko_get_rwa_issuer and for the issuer filters on coingecko_get_rwa_markets and coingecko_get_rwa_tickers.
9135
9522
 
@@ -9167,13 +9554,13 @@ Plan and freshness:
9167
9554
  },
9168
9555
  annotations: READ_ONLY_ANNOTATIONS
9169
9556
  };
9170
- var handler94 = async (client2, _args) => {
9557
+ var handler98 = async (client2, _args) => {
9171
9558
  return asTextContentResult(await client2.get("/rwas/issuers/list"));
9172
9559
  };
9173
- var get_rwas_issuers_default = { metadata: metadata94, tool: tool94, handler: handler94 };
9560
+ var get_rwas_issuers_default = { metadata: metadata98, tool: tool98, handler: handler98 };
9174
9561
 
9175
9562
  // src/tools/rwas/get-rwas-issuer.ts
9176
- var metadata95 = {
9563
+ var metadata99 = {
9177
9564
  resource: "rwas.issuers",
9178
9565
  operation: "read",
9179
9566
  tags: ["coingecko", "rwa", "tokenized", "issuers", "details", "tokens"],
@@ -9181,7 +9568,7 @@ var metadata95 = {
9181
9568
  httpPath: "/rwas/issuers/{id}",
9182
9569
  operationId: "rwas-issuers-id"
9183
9570
  };
9184
- var tool95 = {
9571
+ var tool99 = {
9185
9572
  name: "coingecko_get_rwa_issuer",
9186
9573
  description: `Get one issuer of tokenized real-world assets (RWAs) from CoinGecko by ID, with its aggregated spot market cap and 24h volume across every tokenized stock, commodity, and ETF it has minted, plus the full token catalog with per-chain contract addresses.
9187
9574
 
@@ -9241,12 +9628,12 @@ Plan and freshness:
9241
9628
  },
9242
9629
  annotations: VOLATILE_READ_ANNOTATIONS
9243
9630
  };
9244
- var handler95 = async (client2, args) => {
9631
+ var handler99 = async (client2, args) => {
9245
9632
  return asTextContentResult(
9246
9633
  await client2.get(`/rwas/issuers/${pathId(args)}`)
9247
9634
  );
9248
9635
  };
9249
- var get_rwas_issuer_default = { metadata: metadata95, tool: tool95, handler: handler95 };
9636
+ var get_rwas_issuer_default = { metadata: metadata99, tool: tool99, handler: handler99 };
9250
9637
 
9251
9638
  // src/db/supabase.ts
9252
9639
  import { createClient } from "@supabase/supabase-js";
@@ -9415,24 +9802,24 @@ var secureLogger = {
9415
9802
  /**
9416
9803
  * Log authentication events without exposing tokens
9417
9804
  */
9418
- authEvent: (event, success, metadata100) => {
9805
+ authEvent: (event, success, metadata104) => {
9419
9806
  const logData = {
9420
9807
  event,
9421
9808
  success,
9422
9809
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
9423
- ...sanitizeObject(metadata100 || {})
9810
+ ...sanitizeObject(metadata104 || {})
9424
9811
  };
9425
9812
  console.error(formatLogMessage("AUTH", event, logData));
9426
9813
  },
9427
9814
  /**
9428
9815
  * Log MCP tool calls for analytics
9429
9816
  */
9430
- toolCall: (toolName, success, durationMs, metadata100) => {
9817
+ toolCall: (toolName, success, durationMs, metadata104) => {
9431
9818
  const logData = {
9432
9819
  tool: toolName,
9433
9820
  success,
9434
9821
  durationMs,
9435
- ...sanitizeObject(metadata100 || {})
9822
+ ...sanitizeObject(metadata104 || {})
9436
9823
  };
9437
9824
  console.error(
9438
9825
  formatLogMessage(
@@ -9445,12 +9832,12 @@ var secureLogger = {
9445
9832
  /**
9446
9833
  * Log request/response for debugging (sanitized)
9447
9834
  */
9448
- request: (method, path, statusCode, metadata100) => {
9835
+ request: (method, path, statusCode, metadata104) => {
9449
9836
  const logData = {
9450
9837
  method,
9451
9838
  path,
9452
9839
  statusCode,
9453
- ...sanitizeObject(metadata100 || {})
9840
+ ...sanitizeObject(metadata104 || {})
9454
9841
  };
9455
9842
  console.error(formatLogMessage("REQUEST", `${method} ${path}`, logData));
9456
9843
  }
@@ -10092,8 +10479,8 @@ function canonicalJson2(value) {
10092
10479
  }
10093
10480
  return JSON.stringify(value) ?? "null";
10094
10481
  }
10095
- function cleanMonitorMetadata(metadata100) {
10096
- const cleaned = { ...metadata100 ?? {} };
10482
+ function cleanMonitorMetadata(metadata104) {
10483
+ const cleaned = { ...metadata104 ?? {} };
10097
10484
  delete cleaned.idempotency_key;
10098
10485
  delete cleaned.idempotency_fingerprint;
10099
10486
  delete cleaned.legacy_duplicate_idempotency_key;
@@ -10129,15 +10516,15 @@ function monitorCreateFingerprint(input) {
10129
10516
  ).digest("hex");
10130
10517
  }
10131
10518
  function existingMonitorFingerprint(existing) {
10132
- const metadata100 = existing.metadata ?? {};
10133
- const stored = metadata100.idempotency_fingerprint;
10519
+ const metadata104 = existing.metadata ?? {};
10520
+ const stored = metadata104.idempotency_fingerprint;
10134
10521
  if (typeof stored === "string" && /^[a-f0-9]{64}$/.test(stored)) {
10135
10522
  return stored;
10136
10523
  }
10137
10524
  return monitorCreateFingerprint({
10138
10525
  cadence: existing.cadence,
10139
10526
  kind: existing.kind,
10140
- metadata: metadata100,
10527
+ metadata: metadata104,
10141
10528
  name: existing.name,
10142
10529
  nextRunAt: existing.next_run_at,
10143
10530
  rules: existing.rules,
@@ -10907,7 +11294,7 @@ var hiveCreateMonitor = {
10907
11294
  const target = parseMonitorTarget(args?.target);
10908
11295
  const rules = parseMonitorRules(args?.rules);
10909
11296
  const status = parseMonitorStatus(args?.status);
10910
- const metadata100 = parseMonitorMetadata(args?.metadata);
11297
+ const metadata104 = parseMonitorMetadata(args?.metadata);
10911
11298
  const name = stringArg(args, "name");
10912
11299
  if (!name) {
10913
11300
  return result(
@@ -10955,7 +11342,7 @@ var hiveCreateMonitor = {
10955
11342
  "monitor"
10956
11343
  );
10957
11344
  }
10958
- if (args?.metadata !== void 0 && !metadata100) {
11345
+ if (args?.metadata !== void 0 && !metadata104) {
10959
11346
  return result(
10960
11347
  {
10961
11348
  ok: false,
@@ -10987,7 +11374,7 @@ var hiveCreateMonitor = {
10987
11374
  cadence: stringArg(args, "cadence"),
10988
11375
  status,
10989
11376
  nextRunAt: stringArg(args, "next_run_at") ?? null,
10990
- metadata: metadata100,
11377
+ metadata: metadata104,
10991
11378
  idempotencyKey
10992
11379
  }),
10993
11380
  "monitor"
@@ -11174,7 +11561,7 @@ var hiveUpdateMonitor = {
11174
11561
  const status = parseMonitorStatus(args?.status);
11175
11562
  const target = args?.target === void 0 ? void 0 : parseMonitorTarget(args?.target);
11176
11563
  const rules = args?.rules === void 0 ? void 0 : parseMonitorRules(args?.rules);
11177
- const metadata100 = args?.metadata === void 0 ? void 0 : parseMonitorMetadata(args?.metadata);
11564
+ const metadata104 = args?.metadata === void 0 ? void 0 : parseMonitorMetadata(args?.metadata);
11178
11565
  if (args?.status !== void 0 && !status) {
11179
11566
  return result(
11180
11567
  {
@@ -11205,7 +11592,7 @@ var hiveUpdateMonitor = {
11205
11592
  "monitor"
11206
11593
  );
11207
11594
  }
11208
- if (args?.metadata !== void 0 && !metadata100) {
11595
+ if (args?.metadata !== void 0 && !metadata104) {
11209
11596
  return result(
11210
11597
  {
11211
11598
  ok: false,
@@ -11226,7 +11613,7 @@ var hiveUpdateMonitor = {
11226
11613
  rules,
11227
11614
  cadence: stringArg(args, "cadence"),
11228
11615
  nextRunAt: args?.next_run_at === void 0 ? void 0 : stringArg(args, "next_run_at") ?? null,
11229
- metadata: metadata100
11616
+ metadata: metadata104
11230
11617
  }),
11231
11618
  "monitor"
11232
11619
  );
@@ -12118,14 +12505,14 @@ function validateFeedbackInput(input) {
12118
12505
  `Invalid arguments: message is ${message.length} characters; the limit is ${FEEDBACK_MAX_MESSAGE_CHARS}.`
12119
12506
  );
12120
12507
  }
12121
- let tool96 = null;
12508
+ let tool100 = null;
12122
12509
  if (input.tool !== void 0 && input.tool !== null) {
12123
12510
  if (typeof input.tool !== "string" || !isToolNameShaped(input.tool)) {
12124
12511
  throw new FeedbackValidationError(
12125
12512
  "Invalid arguments: tool must be a Hive tool name (lowercase letters, digits and underscores, 3 to 128 characters) or omitted."
12126
12513
  );
12127
12514
  }
12128
- tool96 = input.tool;
12515
+ tool100 = input.tool;
12129
12516
  }
12130
12517
  let receiptId = null;
12131
12518
  if (input.receiptId !== void 0 && input.receiptId !== null) {
@@ -12136,7 +12523,7 @@ function validateFeedbackInput(input) {
12136
12523
  }
12137
12524
  receiptId = input.receiptId.toLowerCase();
12138
12525
  }
12139
- return { message: scrubFeedbackText(message), tool: tool96, receiptId };
12526
+ return { message: scrubFeedbackText(message), tool: tool100, receiptId };
12140
12527
  }
12141
12528
  function withTimeout(promise, ms) {
12142
12529
  return new Promise((resolve, reject) => {
@@ -12441,6 +12828,10 @@ function getAllEndpoints() {
12441
12828
  list.push(get_total_supply_chart_default);
12442
12829
  list.push(get_total_supply_chart_range_default);
12443
12830
  list.push(get_insights_default);
12831
+ list.push(get_wallet_balances_default);
12832
+ list.push(get_wallet_pnl_default);
12833
+ list.push(get_wallet_trades_default);
12834
+ list.push(get_wallet_transfers_default);
12444
12835
  list.push(get_rwas_list_default);
12445
12836
  list.push(get_rwas_markets_default);
12446
12837
  list.push(get_rwas_asset_default);
@@ -16647,6 +17038,30 @@ var wrapper = {
16647
17038
  oldToolName: "coingecko_get_coin_insights"
16648
17039
  }
16649
17040
  },
17041
+ {
17042
+ tool: {
17043
+ name: "get_wallet_balances",
17044
+ oldToolName: "coingecko_get_onchain_wallet_balances"
17045
+ }
17046
+ },
17047
+ {
17048
+ tool: {
17049
+ name: "get_wallet_pnl",
17050
+ oldToolName: "coingecko_get_onchain_wallet_pnl"
17051
+ }
17052
+ },
17053
+ {
17054
+ tool: {
17055
+ name: "get_wallet_trades",
17056
+ oldToolName: "coingecko_get_onchain_wallet_trades"
17057
+ }
17058
+ },
17059
+ {
17060
+ tool: {
17061
+ name: "get_wallet_transfers",
17062
+ oldToolName: "coingecko_get_onchain_wallet_transfers"
17063
+ }
17064
+ },
16650
17065
  {
16651
17066
  tool: {
16652
17067
  name: "get_token_lists",
@@ -18223,10 +18638,10 @@ function setupLogger() {
18223
18638
  const consoleFormat = winston.format.combine(
18224
18639
  winston.format.colorize(),
18225
18640
  winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
18226
- winston.format.printf(({ timestamp, level, message, ...metadata100 }) => {
18641
+ winston.format.printf(({ timestamp, level, message, ...metadata104 }) => {
18227
18642
  let msg = `${timestamp} [${level}]: ${message}`;
18228
- if (Object.keys(metadata100).length > 0) {
18229
- msg += ` ${JSON.stringify(metadata100)}`;
18643
+ if (Object.keys(metadata104).length > 0) {
18644
+ msg += ` ${JSON.stringify(metadata104)}`;
18230
18645
  }
18231
18646
  return msg;
18232
18647
  })
@@ -26769,10 +27184,10 @@ function setupTools(apiClient) {
26769
27184
  ...derivativesVolumesTools(apiClient),
26770
27185
  ...metadataTools(apiClient)
26771
27186
  ];
26772
- toolCategories.forEach((tool96) => {
26773
- const execute = tool96.execute.bind(tool96);
26774
- tools5[tool96.name] = {
26775
- ...tool96,
27187
+ toolCategories.forEach((tool100) => {
27188
+ const execute = tool100.execute.bind(tool100);
27189
+ tools5[tool100.name] = {
27190
+ ...tool100,
26776
27191
  execute: async (args) => normalizeMcpErrorResult(await execute(args))
26777
27192
  };
26778
27193
  });
@@ -30855,7 +31270,7 @@ var handlers2 = {
30855
31270
  "ccxt_fetch_open_interest_multi"
30856
31271
  )
30857
31272
  };
30858
- var metadata96 = {
31273
+ var metadata100 = {
30859
31274
  fetchMarkets: fetchMarketsMetadata,
30860
31275
  fetchCurrencies: fetchCurrenciesMetadata,
30861
31276
  fetchTicker: fetchTickerMetadata,
@@ -30971,8 +31386,8 @@ var CCXT_REQUIRED_BATCH_FILTERS = {
30971
31386
  ccxt_fetch_borrow_rate_histories: "codes",
30972
31387
  ccxt_fetch_all_greeks: "symbols"
30973
31388
  };
30974
- function withCcxtBounds(tool96) {
30975
- const schema = tool96.inputSchema;
31389
+ function withCcxtBounds(tool100) {
31390
+ const schema = tool100.inputSchema;
30976
31391
  const properties = Object.fromEntries(
30977
31392
  Object.entries(schema.properties || {}).map(
30978
31393
  ([name, rawProperty]) => {
@@ -30991,13 +31406,13 @@ function withCcxtBounds(tool96) {
30991
31406
  )
30992
31407
  );
30993
31408
  const required = new Set(schema.required || []);
30994
- const explicitFilter = CCXT_REQUIRED_BATCH_FILTERS[tool96.name];
31409
+ const explicitFilter = CCXT_REQUIRED_BATCH_FILTERS[tool100.name];
30995
31410
  if (explicitFilter) required.add(explicitFilter);
30996
31411
  return {
30997
- ...tool96,
30998
- description: explicitFilter ? `${tool96.description}
31412
+ ...tool100,
31413
+ description: explicitFilter ? `${tool100.description}
30999
31414
 
31000
- Hive safety bound: ${explicitFilter} is required and accepts at most 100 entries; unbounded all-market reads are rejected.` : tool96.description,
31415
+ Hive safety bound: ${explicitFilter} is required and accepts at most 100 entries; unbounded all-market reads are rejected.` : tool100.description,
31001
31416
  inputSchema: {
31002
31417
  ...schema,
31003
31418
  type: "object",
@@ -31008,10 +31423,10 @@ Hive safety bound: ${explicitFilter} is required and accepts at most 100 entries
31008
31423
  };
31009
31424
  }
31010
31425
  var tools = Object.fromEntries(
31011
- Object.entries(rawTools).map(([key, tool96]) => [key, withCcxtBounds(tool96)])
31426
+ Object.entries(rawTools).map(([key, tool100]) => [key, withCcxtBounds(tool100)])
31012
31427
  );
31013
31428
  var exportedHandlers = handlers2;
31014
- var ccxt_default = { metadata: metadata96, tools, handlers: exportedHandlers };
31429
+ var ccxt_default = { metadata: metadata100, tools, handlers: exportedHandlers };
31015
31430
 
31016
31431
  // src/tools/ccxt/index.ts
31017
31432
  function getAllCCXTEndpoints() {
@@ -31852,7 +32267,7 @@ Use when:
31852
32267
  - You need accurate gas estimation for a complex transaction
31853
32268
 
31854
32269
  Don't use when:
31855
- - You only need current token balances (use moralis_get_wallet_token_balances)
32270
+ - You only need current token balances (use get_wallet_balances)
31856
32271
  - You want historical transaction data (use moralis_get_wallet_history)
31857
32272
  - You need token security analysis without simulation (use goplus_ tools)`,
31858
32273
  inputSchema: {
@@ -31932,7 +32347,7 @@ function handleSimulateTransaction(clientParam, args) {
31932
32347
  "Set TENDERLY_API_KEY, TENDERLY_ACCOUNT_SLUG, and TENDERLY_PROJECT_SLUG environment variables.",
31933
32348
  [
31934
32349
  "goplus_check_token_security \u2014 for token risk analysis without simulation",
31935
- "moralis_get_wallet_token_balances \u2014 for current wallet balances"
32350
+ "get_wallet_balances \u2014 for current wallet balances"
31936
32351
  ],
31937
32352
  {
31938
32353
  network_id: "1",
@@ -31971,7 +32386,7 @@ function handleSimulateTransaction(clientParam, args) {
31971
32386
  "Check that network_id is valid, from/to are valid addresses, and input is properly hex-encoded.",
31972
32387
  [
31973
32388
  "goplus_check_token_security \u2014 for token risk analysis",
31974
- "moralis_get_wallet_token_balances \u2014 for current balances"
32389
+ "get_wallet_balances \u2014 for current balances"
31975
32390
  ],
31976
32391
  {
31977
32392
  network_id: "1",
@@ -32512,7 +32927,7 @@ function handleGetBlockNumber(clientParam, args) {
32512
32927
  );
32513
32928
  }
32514
32929
  function makeGatewayTool(key, name, method, description, properties, required, buildParams) {
32515
- const metadata100 = {
32930
+ const metadata104 = {
32516
32931
  resource: `tenderly.gateway.${method}`,
32517
32932
  operation: "read",
32518
32933
  tags: ["blockchain", "evm", "tenderly", "gateway", "read"],
@@ -32520,7 +32935,7 @@ function makeGatewayTool(key, name, method, description, properties, required, b
32520
32935
  httpPath: "/{network}.gateway.tenderly.co/{accessKey}",
32521
32936
  operationId: `tenderly-${method.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`
32522
32937
  };
32523
- const tool96 = {
32938
+ const tool100 = {
32524
32939
  name,
32525
32940
  title: name.replace(/^tenderly_/, "").replace(/_/g, " ").replace(/\b\w/g, (character) => character.toUpperCase()),
32526
32941
  description: `${description}
@@ -32547,7 +32962,7 @@ Requires TENDERLY_NODE_ACCESS_KEY (or TENDERLY_GATEWAY_ACCESS_KEY). This is a re
32547
32962
  openWorldHint: true
32548
32963
  }
32549
32964
  };
32550
- const handler96 = async (clientParam, args = {}) => {
32965
+ const handler100 = async (clientParam, args = {}) => {
32551
32966
  const client2 = resolveClient(clientParam);
32552
32967
  if (!client2) {
32553
32968
  return createErrorResponse3(
@@ -32577,7 +32992,7 @@ Requires TENDERLY_NODE_ACCESS_KEY (or TENDERLY_GATEWAY_ACCESS_KEY). This is a re
32577
32992
  );
32578
32993
  }
32579
32994
  };
32580
- return { key, tool: tool96, metadata: metadata100, handler: handler96 };
32995
+ return { key, tool: tool100, metadata: metadata104, handler: handler100 };
32581
32996
  }
32582
32997
  var accessListProp = {
32583
32998
  type: "array",
@@ -32984,7 +33399,7 @@ var gatewayDefinitions = [
32984
33399
  }
32985
33400
  )
32986
33401
  ];
32987
- var metadata97 = {
33402
+ var metadata101 = {
32988
33403
  simulateTransaction: simulateTransactionMetadata2,
32989
33404
  simulateBundle: simulateBundleMetadata,
32990
33405
  estimateGas: estimateGasMetadata,
@@ -33011,7 +33426,7 @@ var handlers3 = {
33011
33426
  getBlockNumber: handleGetBlockNumber,
33012
33427
  ...Object.fromEntries(gatewayDefinitions.map((definition) => [definition.key, definition.handler]))
33013
33428
  };
33014
- var tenderly_default = { metadata: metadata97, tools: tools2, handlers: handlers3 };
33429
+ var tenderly_default = { metadata: metadata101, tools: tools2, handlers: handlers3 };
33015
33430
 
33016
33431
  // src/tools/tenderly/index.ts
33017
33432
  function getAllTenderlyEndpoints() {
@@ -40404,7 +40819,7 @@ var newHandlers = {
40404
40819
  }
40405
40820
  }
40406
40821
  };
40407
- function currentMoralisDefinition(key, name, resource, httpMethod, httpPath, description, properties, required, handler96) {
40822
+ function currentMoralisDefinition(key, name, resource, httpMethod, httpPath, description, properties, required, handler100) {
40408
40823
  return {
40409
40824
  key,
40410
40825
  metadata: {
@@ -40432,7 +40847,7 @@ function currentMoralisDefinition(key, name, resource, httpMethod, httpPath, des
40432
40847
  openWorldHint: true
40433
40848
  }
40434
40849
  },
40435
- handler: handler96
40850
+ handler: handler100
40436
40851
  };
40437
40852
  }
40438
40853
  var currentMoralisDefinitions = [
@@ -40661,7 +41076,7 @@ var currentMoralisTools = Object.fromEntries(
40661
41076
  var currentMoralisHandlers = Object.fromEntries(
40662
41077
  currentMoralisDefinitions.map((definition) => [definition.key, definition.handler])
40663
41078
  );
40664
- var metadata98 = {
41079
+ var metadata102 = {
40665
41080
  ...currentMoralisMetadata,
40666
41081
  getTokenScoreTimeseries: getTokenScoreTimeseriesMeta,
40667
41082
  getTokenAnalyticsTimeseries: getTokenAnalyticsTimeseriesMeta,
@@ -40931,8 +41346,8 @@ var MORALIS_ARRAY_LIMITS = {
40931
41346
  getNativeBalancesBatch: { wallet_addresses: 25 },
40932
41347
  getNftCollectionMetadataBatch: { addresses: 25 }
40933
41348
  };
40934
- function withMoralisBounds(key, tool96) {
40935
- const schema = tool96.inputSchema;
41349
+ function withMoralisBounds(key, tool100) {
41350
+ const schema = tool100.inputSchema;
40936
41351
  const properties = Object.fromEntries(
40937
41352
  Object.entries(schema.properties || {}).map(
40938
41353
  ([name, rawProperty]) => {
@@ -40951,7 +41366,7 @@ function withMoralisBounds(key, tool96) {
40951
41366
  )
40952
41367
  );
40953
41368
  return {
40954
- ...tool96,
41369
+ ...tool100,
40955
41370
  inputSchema: {
40956
41371
  ...schema,
40957
41372
  type: "object",
@@ -40961,7 +41376,7 @@ function withMoralisBounds(key, tool96) {
40961
41376
  };
40962
41377
  }
40963
41378
  var activeMetadata = Object.fromEntries(
40964
- activeMoralisKeys.map((key) => [key, metadata98[key]])
41379
+ activeMoralisKeys.map((key) => [key, metadata102[key]])
40965
41380
  );
40966
41381
  var activeTools = Object.fromEntries(
40967
41382
  activeMoralisKeys.map((key) => [key, withMoralisBounds(String(key), tools3[key])])
@@ -41772,7 +42187,7 @@ Use when:
41772
42187
 
41773
42188
  Don't use when:
41774
42189
  - You need raw token account data only (use helius_get_token_balances \u2014 faster)
41775
- - You need EVM wallet data (use moralis_get_wallet_token_balances or moralis_get_wallet_net_worth)`,
42190
+ - You need EVM wallet data (use get_wallet_balances or get_wallet_portfolio)`,
41776
42191
  inputSchema: {
41777
42192
  type: "object",
41778
42193
  properties: {
@@ -44268,7 +44683,7 @@ function meta(resource, path, method) {
44268
44683
  };
44269
44684
  }
44270
44685
  function dataPost(key, name, description, path, properties, bodyBuilder, required = [], schemaExtensions = {}) {
44271
- const tool96 = makeTool(
44686
+ const tool100 = makeTool(
44272
44687
  name,
44273
44688
  description,
44274
44689
  properties,
@@ -44278,7 +44693,7 @@ function dataPost(key, name, description, path, properties, bodyBuilder, require
44278
44693
  );
44279
44694
  return {
44280
44695
  key,
44281
- tool: tool96,
44696
+ tool: tool100,
44282
44697
  metadata: meta(key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`), path, "post"),
44283
44698
  handler: async (clientParam, args = {}) => {
44284
44699
  const client2 = resolveClient4(clientParam);
@@ -44293,7 +44708,7 @@ function dataPost(key, name, description, path, properties, bodyBuilder, require
44293
44708
  };
44294
44709
  }
44295
44710
  function dataGet(key, name, description, path, properties, queryBuilder, required = [], schemaExtensions = {}) {
44296
- const tool96 = makeTool(
44711
+ const tool100 = makeTool(
44297
44712
  name,
44298
44713
  description,
44299
44714
  properties,
@@ -44303,7 +44718,7 @@ function dataGet(key, name, description, path, properties, queryBuilder, require
44303
44718
  );
44304
44719
  return {
44305
44720
  key,
44306
- tool: tool96,
44721
+ tool: tool100,
44307
44722
  metadata: meta(key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`), path, "get"),
44308
44723
  handler: async (clientParam, args = {}) => {
44309
44724
  const client2 = resolveClient4(clientParam);
@@ -44318,7 +44733,7 @@ function dataGet(key, name, description, path, properties, queryBuilder, require
44318
44733
  };
44319
44734
  }
44320
44735
  function nftGet(key, name, description, path, properties, queryBuilder, required = [], annotations = volatileAnnotations3, schemaExtensions = {}) {
44321
- const tool96 = makeTool(
44736
+ const tool100 = makeTool(
44322
44737
  name,
44323
44738
  description,
44324
44739
  properties,
@@ -44328,7 +44743,7 @@ function nftGet(key, name, description, path, properties, queryBuilder, required
44328
44743
  );
44329
44744
  return {
44330
44745
  key,
44331
- tool: tool96,
44746
+ tool: tool100,
44332
44747
  metadata: meta(`nft.${key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)}`, path, "get"),
44333
44748
  handler: async (clientParam, args = {}) => {
44334
44749
  const client2 = resolveClient4(clientParam);
@@ -44348,7 +44763,7 @@ function nftGet(key, name, description, path, properties, queryBuilder, required
44348
44763
  };
44349
44764
  }
44350
44765
  function nftPost(key, name, description, path, properties, bodyBuilder, required = [], annotations = volatileAnnotations3, schemaExtensions = {}) {
44351
- const tool96 = makeTool(
44766
+ const tool100 = makeTool(
44352
44767
  name,
44353
44768
  description,
44354
44769
  properties,
@@ -44358,7 +44773,7 @@ function nftPost(key, name, description, path, properties, bodyBuilder, required
44358
44773
  );
44359
44774
  return {
44360
44775
  key,
44361
- tool: tool96,
44776
+ tool: tool100,
44362
44777
  metadata: meta(`nft.${key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)}`, path, "post"),
44363
44778
  handler: async (clientParam, args = {}) => {
44364
44779
  const client2 = resolveClient4(clientParam);
@@ -44378,7 +44793,7 @@ function nftPost(key, name, description, path, properties, bodyBuilder, required
44378
44793
  };
44379
44794
  }
44380
44795
  function rpcTool(key, name, description, method, properties, paramsBuilder, required = [], schemaExtensions = {}, defaultNetwork = "eth-mainnet") {
44381
- const tool96 = makeTool(
44796
+ const tool100 = makeTool(
44382
44797
  name,
44383
44798
  description,
44384
44799
  properties,
@@ -44388,7 +44803,7 @@ function rpcTool(key, name, description, method, properties, paramsBuilder, requ
44388
44803
  );
44389
44804
  return {
44390
44805
  key,
44391
- tool: tool96,
44806
+ tool: tool100,
44392
44807
  metadata: meta(`rpc.${key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)}`, "/v2/{apiKey}", "post"),
44393
44808
  handler: async (clientParam, args = {}) => {
44394
44809
  const client2 = resolveClient4(clientParam);
@@ -46162,8 +46577,8 @@ var ALCHEMY_ARRAY_LIMITS = {
46162
46577
  networks: 20,
46163
46578
  category: 10
46164
46579
  };
46165
- function withAlchemyBounds(tool96) {
46166
- const schema = tool96.inputSchema;
46580
+ function withAlchemyBounds(tool100) {
46581
+ const schema = tool100.inputSchema;
46167
46582
  const properties = Object.fromEntries(
46168
46583
  Object.entries(schema.properties || {}).map(
46169
46584
  ([name, rawProperty]) => {
@@ -46185,20 +46600,20 @@ function withAlchemyBounds(tool96) {
46185
46600
  }
46186
46601
  )
46187
46602
  );
46188
- return { ...tool96, inputSchema: { ...schema, properties } };
46603
+ return { ...tool100, inputSchema: { ...schema, properties } };
46189
46604
  }
46190
46605
  var activeDefinitions = definitions.map((definition) => ({
46191
46606
  ...definition,
46192
46607
  tool: withAlchemyBounds(definition.tool)
46193
46608
  }));
46194
- var metadata99 = Object.fromEntries(
46609
+ var metadata103 = Object.fromEntries(
46195
46610
  activeDefinitions.map((d) => [d.key, d.metadata])
46196
46611
  );
46197
46612
  var tools4 = Object.fromEntries(activeDefinitions.map((d) => [d.key, d.tool]));
46198
46613
  var handlers5 = Object.fromEntries(
46199
46614
  activeDefinitions.map((d) => [d.key, d.handler])
46200
46615
  );
46201
- var alchemy_default = { metadata: metadata99, tools: tools4, handlers: handlers5 };
46616
+ var alchemy_default = { metadata: metadata103, tools: tools4, handlers: handlers5 };
46202
46617
 
46203
46618
  // src/tools/alchemy/index.ts
46204
46619
  function getAllAlchemyEndpoints() {
@@ -46574,17 +46989,17 @@ var HEADROOM_TOOL_PATTERNS = [
46574
46989
  function toolNeedsResponseHeadroom(toolName) {
46575
46990
  return HEADROOM_TOOL_PATTERNS.some((pattern) => pattern.test(toolName));
46576
46991
  }
46577
- function getAnnotatedMaxResultSizeChars(tool96) {
46578
- const meta2 = tool96?._meta;
46992
+ function getAnnotatedMaxResultSizeChars(tool100) {
46993
+ const meta2 = tool100?._meta;
46579
46994
  const value = meta2?.[MAX_RESULT_SIZE_META_KEY];
46580
46995
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : null;
46581
46996
  }
46582
- function withResponseHeadroomMeta(tool96) {
46583
- if (!toolNeedsResponseHeadroom(tool96.name)) return tool96;
46584
- const existing = tool96._meta;
46585
- if (existing && existing[MAX_RESULT_SIZE_META_KEY] !== void 0) return tool96;
46997
+ function withResponseHeadroomMeta(tool100) {
46998
+ if (!toolNeedsResponseHeadroom(tool100.name)) return tool100;
46999
+ const existing = tool100._meta;
47000
+ if (existing && existing[MAX_RESULT_SIZE_META_KEY] !== void 0) return tool100;
46586
47001
  return {
46587
- ...tool96,
47002
+ ...tool100,
46588
47003
  _meta: {
46589
47004
  ...existing ?? {},
46590
47005
  [MAX_RESULT_SIZE_META_KEY]: ANNOTATED_MAX_RESULT_SIZE_CHARS
@@ -49515,13 +49930,13 @@ function historyInputSchema(baseCoinDescription) {
49515
49930
  required: ["base_coin"]
49516
49931
  };
49517
49932
  }
49518
- function errorResult2(tool96, error) {
49933
+ function errorResult2(tool100, error) {
49519
49934
  if (error instanceof ArchiveInputError) {
49520
49935
  return asTextContentResult(
49521
49936
  {
49522
49937
  error: error.message,
49523
49938
  runtime_status: "invalid_input",
49524
- tool: tool96
49939
+ tool: tool100
49525
49940
  },
49526
49941
  true
49527
49942
  );
@@ -49531,17 +49946,17 @@ function errorResult2(tool96, error) {
49531
49946
  {
49532
49947
  error: message,
49533
49948
  runtime_status: classifyRuntimeStatusFromError(message),
49534
- tool: tool96
49949
+ tool: tool100
49535
49950
  },
49536
49951
  true
49537
49952
  );
49538
49953
  }
49539
- function missingCredentialsResult(tool96) {
49954
+ function missingCredentialsResult(tool100) {
49540
49955
  return asTextContentResult(
49541
49956
  {
49542
49957
  error: ARCHIVE_MISSING_CREDENTIALS_MESSAGE,
49543
49958
  runtime_status: "missing_key",
49544
- tool: tool96
49959
+ tool: tool100
49545
49960
  },
49546
49961
  true
49547
49962
  );
@@ -50608,13 +51023,13 @@ function okResult(sourceUrl, body) {
50608
51023
  may_have_more
50609
51024
  });
50610
51025
  }
50611
- function errorResult3(tool96, error) {
51026
+ function errorResult3(tool100, error) {
50612
51027
  if (error instanceof PolymarketInputError) {
50613
51028
  return asTextContentResult(
50614
51029
  {
50615
51030
  error: error.message,
50616
51031
  runtime_status: "invalid_input",
50617
- tool: tool96
51032
+ tool: tool100
50618
51033
  },
50619
51034
  true
50620
51035
  );
@@ -50624,7 +51039,7 @@ function errorResult3(tool96, error) {
50624
51039
  {
50625
51040
  error: message,
50626
51041
  runtime_status: classifyRuntimeStatusFromError(message),
50627
- tool: tool96
51042
+ tool: tool100
50628
51043
  },
50629
51044
  true
50630
51045
  );
@@ -52123,10 +52538,10 @@ async function fetchHackRows() {
52123
52538
  }
52124
52539
 
52125
52540
  // src/tools/signals/tools.ts
52126
- function errorResult4(tool96, error, extra = {}) {
52541
+ function errorResult4(tool100, error, extra = {}) {
52127
52542
  if (error instanceof SignalsInputError) {
52128
52543
  return asTextContentResult(
52129
- { error: error.message, runtime_status: "invalid_input", tool: tool96, ...extra },
52544
+ { error: error.message, runtime_status: "invalid_input", tool: tool100, ...extra },
52130
52545
  true
52131
52546
  );
52132
52547
  }
@@ -52135,7 +52550,7 @@ function errorResult4(tool96, error, extra = {}) {
52135
52550
  {
52136
52551
  error: message,
52137
52552
  runtime_status: classifyRuntimeStatusFromError(message),
52138
- tool: tool96,
52553
+ tool: tool100,
52139
52554
  ...extra
52140
52555
  },
52141
52556
  true
@@ -54079,7 +54494,7 @@ var SCHEMA_PATTERNS = [
54079
54494
  TOKEN_DILIGENCE_OUTPUT_SCHEMA
54080
54495
  ],
54081
54496
  [
54082
- /^(alchemy_get_tokens_by_wallet|alchemy_get_token_balances_by_wallet|alchemy_get_native_balance|alchemy_get_asset_transfers|moralis_get_wallet_history|moralis_get_wallet_profitability|moralis_get_wallet_profitability_summary|moralis_get_wallet_pnl|moralis_get_wallet_pnl_summary|moralis_get_wallet_defi_positions|moralis_get_wallet_defi_summary|moralis_get_wallet_insight|helius_get_wallet_balances|helius_get_wallet_history|helius_get_wallet_transfers|get_wallet_balances|get_wallet_stats|get_wallet_chart)$/,
54497
+ /^(get_wallet_balances|get_wallet_pnl|get_wallet_trades|get_wallet_transfers|alchemy_get_tokens_by_wallet|alchemy_get_token_balances_by_wallet|alchemy_get_native_balance|alchemy_get_asset_transfers|moralis_get_wallet_history|moralis_get_wallet_profitability|moralis_get_wallet_profitability_summary|moralis_get_wallet_pnl|moralis_get_wallet_pnl_summary|moralis_get_wallet_defi_positions|moralis_get_wallet_defi_summary|moralis_get_wallet_insight|helius_get_wallet_balances|helius_get_wallet_history|helius_get_wallet_transfers|get_wallet_balances|get_wallet_stats|get_wallet_chart)$/,
54083
54498
  WALLET_INVESTIGATION_OUTPUT_SCHEMA
54084
54499
  ],
54085
54500
  [
@@ -54601,11 +55016,11 @@ var TENDERLY_REST_TOOLS = /* @__PURE__ */ new Set([
54601
55016
  "tenderly_estimate_gas",
54602
55017
  "tenderly_decode_calldata"
54603
55018
  ]);
54604
- function matchesProvider(provider, toolName, metadata100) {
55019
+ function matchesProvider(provider, toolName, metadata104) {
54605
55020
  const normalizedProvider = provider.toLowerCase();
54606
55021
  const normalizedToolName = toolName.toLowerCase();
54607
- const resource = metadata100.resource.toLowerCase();
54608
- const tags = metadata100.tags.map((tag) => tag.toLowerCase());
55022
+ const resource = metadata104.resource.toLowerCase();
55023
+ const tags = metadata104.tags.map((tag) => tag.toLowerCase());
54609
55024
  return normalizedToolName.startsWith(`${normalizedProvider}_`) || normalizedToolName.includes(`_${normalizedProvider}_`) || resource.startsWith(normalizedProvider) || resource.includes(`${normalizedProvider}.`) || tags.includes(normalizedProvider);
54610
55025
  }
54611
55026
  var PROVIDER_CATALOG = [
@@ -54616,7 +55031,7 @@ var PROVIDER_CATALOG = [
54616
55031
  type: "MCP discovery and compatibility tools",
54617
55032
  clientStrategy: "hive",
54618
55033
  alwaysAvailable: true,
54619
- matches: (toolName, metadata100) => toolName.startsWith("hive_") || metadata100.resource === "dynamic_tools" || metadata100.tags.includes("hive")
55034
+ matches: (toolName, metadata104) => toolName.startsWith("hive_") || metadata104.resource === "dynamic_tools" || metadata104.tags.includes("hive")
54620
55035
  },
54621
55036
  {
54622
55037
  id: "coingecko",
@@ -54625,7 +55040,7 @@ var PROVIDER_CATALOG = [
54625
55040
  type: "Market data, prices, and metadata",
54626
55041
  clientStrategy: "shared-coingecko",
54627
55042
  alwaysAvailable: true,
54628
- matches: (toolName, metadata100) => matchesProvider("coingecko", toolName, metadata100)
55043
+ matches: (toolName, metadata104) => matchesProvider("coingecko", toolName, metadata104)
54629
55044
  },
54630
55045
  {
54631
55046
  id: "goplus",
@@ -54637,7 +55052,7 @@ var PROVIDER_CATALOG = [
54637
55052
  label: "GOPLUS_APP_KEY or GOPLUS_API_KEY, plus GOPLUS_APP_SECRET",
54638
55053
  isConfigured: () => hasAnyEnvVar("GOPLUS_APP_KEY", "GOPLUS_API_KEY") && hasEnvVar("GOPLUS_APP_SECRET")
54639
55054
  },
54640
- matches: (toolName, metadata100) => matchesProvider("goplus", toolName, metadata100)
55055
+ matches: (toolName, metadata104) => matchesProvider("goplus", toolName, metadata104)
54641
55056
  },
54642
55057
  {
54643
55058
  id: "ccxt",
@@ -54646,7 +55061,7 @@ var PROVIDER_CATALOG = [
54646
55061
  type: "Centralized exchange market data and trading metadata",
54647
55062
  clientStrategy: "shared-ccxt",
54648
55063
  alwaysAvailable: true,
54649
- matches: (toolName, metadata100) => matchesProvider("ccxt", toolName, metadata100)
55064
+ matches: (toolName, metadata104) => matchesProvider("ccxt", toolName, metadata104)
54650
55065
  },
54651
55066
  {
54652
55067
  id: "defillama",
@@ -54655,7 +55070,7 @@ var PROVIDER_CATALOG = [
54655
55070
  type: "TVL, protocol analytics, yields, and bridge data",
54656
55071
  clientStrategy: "internal",
54657
55072
  alwaysAvailable: true,
54658
- matches: (toolName, metadata100) => matchesProvider("defillama", toolName, metadata100)
55073
+ matches: (toolName, metadata104) => matchesProvider("defillama", toolName, metadata104)
54659
55074
  },
54660
55075
  {
54661
55076
  // Listed BEFORE hyperliquid: rwa_get_hyperliquid_dex_perps contains the
@@ -54667,7 +55082,7 @@ var PROVIDER_CATALOG = [
54667
55082
  type: "Tokenized real-world-asset perps: cross-venue funding, markets, and open interest across Hyperliquid HIP-3 builder dexes, Ostium, Avantis, Lighter, and Extended (keyless official APIs)",
54668
55083
  clientStrategy: "internal",
54669
55084
  alwaysAvailable: true,
54670
- matches: (toolName, metadata100) => matchesProvider("rwa", toolName, metadata100)
55085
+ matches: (toolName, metadata104) => matchesProvider("rwa", toolName, metadata104)
54671
55086
  },
54672
55087
  {
54673
55088
  id: "hyperliquid",
@@ -54676,7 +55091,7 @@ var PROVIDER_CATALOG = [
54676
55091
  type: "Hyperliquid perpetual DEX: per-pair volume, funding, open interest, and builder DEXs (tokenized-stock perps)",
54677
55092
  clientStrategy: "internal",
54678
55093
  alwaysAvailable: true,
54679
- matches: (toolName, metadata100) => matchesProvider("hyperliquid", toolName, metadata100)
55094
+ matches: (toolName, metadata104) => matchesProvider("hyperliquid", toolName, metadata104)
54680
55095
  },
54681
55096
  {
54682
55097
  // The Hive-native hive_archive_monitor tool contains the "_archive_"
@@ -54694,7 +55109,7 @@ var PROVIDER_CATALOG = [
54694
55109
  "SHARPE_ARCHIVE_SUPABASE_SERVICE_ROLE_KEY"
54695
55110
  )
54696
55111
  },
54697
- matches: (toolName, metadata100) => matchesProvider("archive", toolName, metadata100)
55112
+ matches: (toolName, metadata104) => matchesProvider("archive", toolName, metadata104)
54698
55113
  },
54699
55114
  {
54700
55115
  id: "polymarket",
@@ -54703,7 +55118,7 @@ var PROVIDER_CATALOG = [
54703
55118
  type: "Polymarket prediction markets: market and event search, market-implied odds, CLOB order books and price history, per-wallet positions and activity (keyless public Gamma, CLOB and Data APIs)",
54704
55119
  clientStrategy: "internal",
54705
55120
  alwaysAvailable: true,
54706
- matches: (toolName, metadata100) => matchesProvider("polymarket", toolName, metadata100)
55121
+ matches: (toolName, metadata104) => matchesProvider("polymarket", toolName, metadata104)
54707
55122
  },
54708
55123
  {
54709
55124
  id: "alternative",
@@ -54712,7 +55127,7 @@ var PROVIDER_CATALOG = [
54712
55127
  type: "Crypto Fear & Greed Index: daily market-wide sentiment composite since 2018 (keyless)",
54713
55128
  clientStrategy: "internal",
54714
55129
  alwaysAvailable: true,
54715
- matches: (_toolName, metadata100) => metadata100.tags.includes("alternative-me")
55130
+ matches: (_toolName, metadata104) => metadata104.tags.includes("alternative-me")
54716
55131
  },
54717
55132
  {
54718
55133
  id: "blockchain",
@@ -54721,7 +55136,7 @@ var PROVIDER_CATALOG = [
54721
55136
  type: "Bitcoin on-chain charts: hash rate, active addresses, transaction count, market price, difficulty, fees, miner revenue (keyless)",
54722
55137
  clientStrategy: "internal",
54723
55138
  alwaysAvailable: true,
54724
- matches: (_toolName, metadata100) => metadata100.tags.includes("blockchain-com")
55139
+ matches: (_toolName, metadata104) => metadata104.tags.includes("blockchain-com")
54725
55140
  },
54726
55141
  {
54727
55142
  id: "blockscout",
@@ -54730,7 +55145,7 @@ var PROVIDER_CATALOG = [
54730
55145
  type: "EVM token holder lists and counts from Blockscout explorers (keyless public API; BLOCKSCOUT_API_KEY switches to the PRO API)",
54731
55146
  clientStrategy: "internal",
54732
55147
  alwaysAvailable: true,
54733
- matches: (_toolName, metadata100) => metadata100.tags.includes("blockscout")
55148
+ matches: (_toolName, metadata104) => metadata104.tags.includes("blockscout")
54734
55149
  },
54735
55150
  {
54736
55151
  id: "fetch",
@@ -54739,7 +55154,7 @@ var PROVIDER_CATALOG = [
54739
55154
  type: "Allowlisted fetch of long-tail public crypto APIs (the escape hatch when no typed tool covers a source)",
54740
55155
  clientStrategy: "internal",
54741
55156
  alwaysAvailable: true,
54742
- matches: (toolName, metadata100) => matchesProvider("fetch", toolName, metadata100)
55157
+ matches: (toolName, metadata104) => matchesProvider("fetch", toolName, metadata104)
54743
55158
  },
54744
55159
  {
54745
55160
  id: "tenderly",
@@ -54751,7 +55166,7 @@ var PROVIDER_CATALOG = [
54751
55166
  label: "Tenderly REST credentials or TENDERLY_NODE_ACCESS_KEY/TENDERLY_GATEWAY_ACCESS_KEY",
54752
55167
  isConfigured: () => hasTenderlyRestCredentials() || hasTenderlyNodeCredentials()
54753
55168
  },
54754
- matches: (toolName, metadata100) => matchesProvider("tenderly", toolName, metadata100)
55169
+ matches: (toolName, metadata104) => matchesProvider("tenderly", toolName, metadata104)
54755
55170
  },
54756
55171
  {
54757
55172
  id: "moralis",
@@ -54763,7 +55178,7 @@ var PROVIDER_CATALOG = [
54763
55178
  label: "MORALIS_API_KEY",
54764
55179
  isConfigured: () => hasEnvVar("MORALIS_API_KEY")
54765
55180
  },
54766
- matches: (toolName, metadata100) => matchesProvider("moralis", toolName, metadata100)
55181
+ matches: (toolName, metadata104) => matchesProvider("moralis", toolName, metadata104)
54767
55182
  },
54768
55183
  {
54769
55184
  id: "helius",
@@ -54775,7 +55190,7 @@ var PROVIDER_CATALOG = [
54775
55190
  label: "HELIUS_API_KEY",
54776
55191
  isConfigured: () => hasEnvVar("HELIUS_API_KEY")
54777
55192
  },
54778
- matches: (toolName, metadata100) => matchesProvider("helius", toolName, metadata100)
55193
+ matches: (toolName, metadata104) => matchesProvider("helius", toolName, metadata104)
54779
55194
  },
54780
55195
  {
54781
55196
  id: "alchemy",
@@ -54787,11 +55202,11 @@ var PROVIDER_CATALOG = [
54787
55202
  label: "ALCHEMY_API_KEY",
54788
55203
  isConfigured: () => hasEnvVar("ALCHEMY_API_KEY")
54789
55204
  },
54790
- matches: (toolName, metadata100) => matchesProvider("alchemy", toolName, metadata100)
55205
+ matches: (toolName, metadata104) => matchesProvider("alchemy", toolName, metadata104)
54791
55206
  }
54792
55207
  ];
54793
- function getProviderDescriptorForTool(toolName, metadata100) {
54794
- return PROVIDER_CATALOG.find((provider) => provider.matches(toolName, metadata100)) ?? UNKNOWN_PROVIDER_DESCRIPTOR;
55208
+ function getProviderDescriptorForTool(toolName, metadata104) {
55209
+ return PROVIDER_CATALOG.find((provider) => provider.matches(toolName, metadata104)) ?? UNKNOWN_PROVIDER_DESCRIPTOR;
54795
55210
  }
54796
55211
  function getProviderDescriptorForEndpoint(endpoint) {
54797
55212
  return getProviderDescriptorForTool(endpoint.tool.name, endpoint.metadata);
@@ -54820,7 +55235,7 @@ function getProviderStatusCatalog() {
54820
55235
  })
54821
55236
  );
54822
55237
  }
54823
- function getCredentialRequirementForTool(toolName, metadata100) {
55238
+ function getCredentialRequirementForTool(toolName, metadata104) {
54824
55239
  if (toolName === "tenderly_get_supported_networks" || toolName === "tenderly_get_block_number") {
54825
55240
  return null;
54826
55241
  }
@@ -54833,7 +55248,7 @@ function getCredentialRequirementForTool(toolName, metadata100) {
54833
55248
  isConfigured: hasTenderlyNodeCredentials
54834
55249
  };
54835
55250
  }
54836
- return getProviderDescriptorForTool(toolName, metadata100).credentialRequirement ?? null;
55251
+ return getProviderDescriptorForTool(toolName, metadata104).credentialRequirement ?? null;
54837
55252
  }
54838
55253
 
54839
55254
  // src/mcpInvokers.ts
@@ -54864,14 +55279,14 @@ var RESPONSE_FORMAT_SCHEMA = {
54864
55279
  enum: ["json", "markdown"],
54865
55280
  description: "Output format: 'json' for structured data (default) or 'markdown' for human-readable text."
54866
55281
  };
54867
- function normalizeToolSchema(tool96) {
55282
+ function normalizeToolSchema(tool100) {
54868
55283
  const normalized = {
54869
- ...tool96,
54870
- inputSchema: tool96.inputSchema ? JSON.parse(JSON.stringify(tool96.inputSchema)) : tool96.inputSchema,
54871
- title: tool96.title ?? getToolTitle(tool96.name),
55284
+ ...tool100,
55285
+ inputSchema: tool100.inputSchema ? JSON.parse(JSON.stringify(tool100.inputSchema)) : tool100.inputSchema,
55286
+ title: tool100.title ?? getToolTitle(tool100.name),
54872
55287
  annotations: {
54873
- ...getAnnotationsForTool(tool96.name),
54874
- ...tool96.annotations ?? {}
55288
+ ...getAnnotationsForTool(tool100.name),
55289
+ ...tool100.annotations ?? {}
54875
55290
  }
54876
55291
  };
54877
55292
  if (normalized.inputSchema && typeof normalized.inputSchema === "object" && normalized.inputSchema.type === "object") {
@@ -54898,20 +55313,19 @@ function normalizeEndpointSchema(endpoint) {
54898
55313
  var RETIRED_TOOLS_DATE = "2026-09-06";
54899
55314
  var RETIRED_TOOL_REPLACEMENTS = {
54900
55315
  // wallet
54901
- codex_filter_wallets_by_network: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54902
- codex_get_wallet_aggregate_backfill_state: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54903
- codex_get_wallet_label_types: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54904
- filter_network_wallets: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54905
- filter_token_wallets: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54906
- filter_wallets: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54907
- get_wallet_balances: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54908
- get_wallet_chart: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54909
- get_wallet_stats: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
54910
- get_wallet_token_events: "Use alchemy_get_token_balances_by_wallet, alchemy_get_asset_transfers, or moralis_get_wallet_profitability_summary for wallet balances, transfers, and PnL.",
55316
+ codex_filter_wallets_by_network: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
55317
+ codex_get_wallet_aggregate_backfill_state: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
55318
+ codex_get_wallet_label_types: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
55319
+ filter_network_wallets: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
55320
+ filter_token_wallets: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
55321
+ filter_wallets: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
55322
+ get_wallet_chart: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
55323
+ get_wallet_stats: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
55324
+ get_wallet_token_events: "Use get_wallet_balances, get_wallet_transfers, get_wallet_trades, or get_wallet_pnl for wallet balances, transfers, DEX trades, and PnL.",
54911
55325
  // holders
54912
- get_token_holders: "Use get_token_top_holders for holders on any network, coingecko_get_onchain_token_top_traders for traders where CoinGecko serves them (base and similar; not Ethereum on the current plan), or moralis_get_token_holder_metrics for holder metrics.",
54913
- get_token_top_traders: "Use get_token_top_holders for holders on any network, coingecko_get_onchain_token_top_traders for traders where CoinGecko serves them (base and similar; not Ethereum on the current plan), or moralis_get_token_holder_metrics for holder metrics.",
54914
- get_top_holders_percentage: "Use get_token_top_holders for holders on any network, coingecko_get_onchain_token_top_traders for traders where CoinGecko serves them (base and similar; not Ethereum on the current plan), or moralis_get_token_holder_metrics for holder metrics.",
55326
+ get_token_holders: "Use get_token_top_holders for holders on any network, or coingecko_get_onchain_token_top_traders for traders (tokens created after 2023-09-01; not wrapped native tokens or stablecoins).",
55327
+ get_token_top_traders: "Use get_token_top_holders for holders on any network, or coingecko_get_onchain_token_top_traders for traders (tokens created after 2023-09-01; not wrapped native tokens or stablecoins).",
55328
+ get_top_holders_percentage: "Use get_token_top_holders for holders on any network, or coingecko_get_onchain_token_top_traders for traders (tokens created after 2023-09-01; not wrapped native tokens or stablecoins).",
54915
55329
  // pairs
54916
55330
  codex_get_detailed_token_stats: "Use get_token_pools, get_pool_info, get_pools_by_address, moralis_get_pair_stats, or get_new_pools for pool and pair data.",
54917
55331
  codex_get_windowed_pair_stats: "Use get_token_pools, get_pool_info, get_pools_by_address, moralis_get_pair_stats, or get_new_pools for pool and pair data.",
@@ -54972,6 +55386,9 @@ var ALCHEMY_PAYG = "because Alchemy offers it only on Pay As You Go and Enterpri
54972
55386
  var ALCHEMY_BUNDLE_REPLACEMENT = "Use tenderly_simulate_bundle or tenderly_node_simulate_bundle for multi-transaction simulation.";
54973
55387
  var ALCHEMY_SIMULATION_SUNSET = 'because Alchemy shut down its Transaction Simulation API on 2026-09-30 and now answers "Unsupported method" on every plan';
54974
55388
  var ALCHEMY_SIMULATION_REPLACEMENT = "Use tenderly_simulate_transaction or tenderly_node_simulate_transaction; both return the execution trace, logs, and asset and balance changes without broadcasting.";
55389
+ var MORALIS_PAUSED = "because Hive's Moralis account is paused and will not be renewed";
55390
+ var MORALIS_BALANCES_REPLACEMENT = "Use get_wallet_balances for priced EVM balances across chains.";
55391
+ var MORALIS_PNL_REPLACEMENT = "Use get_wallet_pnl for realized and unrealized PnL per wallet and per token.";
54975
55392
  var CCXT_PRIVATE = "because every exchange that serves it requires an authenticated exchange account";
54976
55393
  var CCXT_BORROW_REPLACEMENT = "Use ccxt_fetch_borrow_rate_history or ccxt_fetch_borrow_rate_histories (public) and read the latest point.";
54977
55394
  var UNSERVABLE_TOOLS = {
@@ -54991,10 +55408,6 @@ var UNSERVABLE_TOOLS = {
54991
55408
  reason: COINGECKO_ENTERPRISE,
54992
55409
  replacement: COINGECKO_SUPPLY_REPLACEMENT
54993
55410
  },
54994
- get_coin_insights: {
54995
- reason: COINGECKO_ENTERPRISE,
54996
- replacement: "No direct replacement; use get_coins_market_data and get_coin_tickers for the market facts behind an insight."
54997
- },
54998
55411
  helius_get_wallet_identity: {
54999
55412
  reason: HELIUS_WALLET_PLAN,
55000
55413
  replacement: "No other wallet-identity source is live on Hive's plans; use helius_get_wallet_history or helius_get_transfers_by_address for the wallet's activity."
@@ -55073,6 +55486,56 @@ var UNSERVABLE_TOOLS = {
55073
55486
  goplus_simulate_solana_transaction: {
55074
55487
  reason: 'because GoPlus answers "system error" to every Solana pre-execution request, including a fresh valid transfer',
55075
55488
  replacement: "Use get_solana_token_security for the tokens the transaction touches; Hive has no other Solana pre-signing simulation."
55489
+ },
55490
+ moralis_get_wallet_token_balances: {
55491
+ reason: MORALIS_PAUSED,
55492
+ replacement: MORALIS_BALANCES_REPLACEMENT,
55493
+ date: "2026-10-14"
55494
+ },
55495
+ moralis_get_wallet_token_balances_price: {
55496
+ reason: MORALIS_PAUSED,
55497
+ replacement: MORALIS_BALANCES_REPLACEMENT,
55498
+ date: "2026-10-14"
55499
+ },
55500
+ moralis_get_wallet_net_worth: {
55501
+ reason: MORALIS_PAUSED,
55502
+ replacement: MORALIS_BALANCES_REPLACEMENT,
55503
+ date: "2026-10-14"
55504
+ },
55505
+ moralis_get_wallet_profitability: {
55506
+ reason: MORALIS_PAUSED,
55507
+ replacement: MORALIS_PNL_REPLACEMENT,
55508
+ date: "2026-10-14"
55509
+ },
55510
+ moralis_get_wallet_profitability_summary: {
55511
+ reason: MORALIS_PAUSED,
55512
+ replacement: MORALIS_PNL_REPLACEMENT,
55513
+ date: "2026-10-14"
55514
+ },
55515
+ moralis_get_wallet_pnl: {
55516
+ reason: MORALIS_PAUSED,
55517
+ replacement: MORALIS_PNL_REPLACEMENT,
55518
+ date: "2026-10-14"
55519
+ },
55520
+ moralis_get_wallet_pnl_summary: {
55521
+ reason: MORALIS_PAUSED,
55522
+ replacement: MORALIS_PNL_REPLACEMENT,
55523
+ date: "2026-10-14"
55524
+ },
55525
+ moralis_get_wallet_swaps: {
55526
+ reason: MORALIS_PAUSED,
55527
+ replacement: "Use get_wallet_trades for a wallet's DEX buys and sells.",
55528
+ date: "2026-10-14"
55529
+ },
55530
+ moralis_get_wallet_token_transfers: {
55531
+ reason: MORALIS_PAUSED,
55532
+ replacement: "Use get_wallet_transfers for EVM token transfers, or helius_get_wallet_transfers on Solana.",
55533
+ date: "2026-10-14"
55534
+ },
55535
+ moralis_get_token_top_traders: {
55536
+ reason: MORALIS_PAUSED,
55537
+ replacement: "Use coingecko_get_onchain_token_top_traders for a token's most profitable traders.",
55538
+ date: "2026-10-14"
55076
55539
  }
55077
55540
  };
55078
55541
  function isUnservableTool(toolName) {
@@ -55428,9 +55891,9 @@ function withExecMarker(result2, marker) {
55428
55891
  function humanizePropertyName(propName) {
55429
55892
  return propName.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").trim().toLowerCase();
55430
55893
  }
55431
- function fillMissingInputDescriptions(tool96) {
55432
- const schema = tool96.inputSchema;
55433
- if (!schema?.properties) return tool96;
55894
+ function fillMissingInputDescriptions(tool100) {
55895
+ const schema = tool100.inputSchema;
55896
+ if (!schema?.properties) return tool100;
55434
55897
  let changed = false;
55435
55898
  const properties = {};
55436
55899
  for (const [propName, propSchema] of Object.entries(schema.properties)) {
@@ -55441,14 +55904,14 @@ function fillMissingInputDescriptions(tool96) {
55441
55904
  changed = true;
55442
55905
  properties[propName] = {
55443
55906
  ...propSchema,
55444
- description: `${humanizePropertyName(propName)} parameter for ${tool96.name}. See the tool Args section for accepted values and examples.`
55907
+ description: `${humanizePropertyName(propName)} parameter for ${tool100.name}. See the tool Args section for accepted values and examples.`
55445
55908
  };
55446
55909
  }
55447
- if (!changed) return tool96;
55910
+ if (!changed) return tool100;
55448
55911
  return {
55449
- ...tool96,
55912
+ ...tool100,
55450
55913
  inputSchema: {
55451
- ...tool96.inputSchema,
55914
+ ...tool100.inputSchema,
55452
55915
  properties
55453
55916
  }
55454
55917
  };
@@ -55481,18 +55944,18 @@ function getFallbackCoinGeckoClient() {
55481
55944
  function isKeylessCoinGeckoClient(client2) {
55482
55945
  return client2 instanceof Coingecko3 && !client2.proAPIKey && !client2.demoAPIKey;
55483
55946
  }
55484
- function createSafeHandler(handler96, metadata100, toolName, inputSchema) {
55947
+ function createSafeHandler(handler100, metadata104, toolName, inputSchema) {
55485
55948
  const schemaParams = inputSchemaParamNames(inputSchema);
55486
55949
  const credentialRequirement = getCredentialRequirementForTool(
55487
55950
  toolName,
55488
- metadata100
55951
+ metadata104
55489
55952
  );
55490
55953
  return async (client2, args) => {
55491
55954
  const t0 = Date.now();
55492
55955
  try {
55493
- let usedFallback = metadata100.tags.includes("coingecko") && isKeylessCoinGeckoClient(client2);
55956
+ let usedFallback = metadata104.tags.includes("coingecko") && isKeylessCoinGeckoClient(client2);
55494
55957
  let effectiveClient = client2;
55495
- if (effectiveClient == null && metadata100.tags.includes("coingecko")) {
55958
+ if (effectiveClient == null && metadata104.tags.includes("coingecko")) {
55496
55959
  effectiveClient = getFallbackCoinGeckoClient();
55497
55960
  usedFallback = isKeylessCoinGeckoClient(effectiveClient);
55498
55961
  }
@@ -55523,7 +55986,7 @@ function createSafeHandler(handler96, metadata100, toolName, inputSchema) {
55523
55986
  );
55524
55987
  }
55525
55988
  }
55526
- let result2 = await handler96(effectiveClient, safeArgs);
55989
+ let result2 = await handler100(effectiveClient, safeArgs);
55527
55990
  const observedAt = (/* @__PURE__ */ new Date()).toISOString();
55528
55991
  if (result2._hiveExec?.source === "fallback") usedFallback = true;
55529
55992
  if (!result2.isError && credentialRequirement && !credentialRequirement.isConfigured() && result2?.content?.[0]?.type === "text" && result2.content[0].text) {
@@ -55755,9 +56218,9 @@ function getAllWrappedEndpoints() {
55755
56218
  const allEndpointsJSON = wrapper;
55756
56219
  const updatedTools = [];
55757
56220
  for (const endpoint of allTool) {
55758
- let { tool: tool96 } = endpoint;
56221
+ let { tool: tool100 } = endpoint;
55759
56222
  let matchedItem = null;
55760
- const originalName = tool96.name;
56223
+ const originalName = tool100.name;
55761
56224
  const strippedName = stripProviderPrefix(originalName);
55762
56225
  for (const endpoints of Object.values(allEndpointsJSON)) {
55763
56226
  for (const item of endpoints) {
@@ -55783,10 +56246,10 @@ function getAllWrappedEndpoints() {
55783
56246
  }
55784
56247
  if (matchedItem) {
55785
56248
  let toolInstanse = {
55786
- ...tool96,
56249
+ ...tool100,
55787
56250
  name: matchedItem.tool.name,
55788
- title: tool96.title ?? getToolTitle(matchedItem.tool.name),
55789
- description: matchedItem.tool.description ?? tool96.description
56251
+ title: tool100.title ?? getToolTitle(matchedItem.tool.name),
56252
+ description: matchedItem.tool.description ?? tool100.description
55790
56253
  };
55791
56254
  if (!toolInstanse.annotations) {
55792
56255
  toolInstanse.annotations = getAnnotationsForTool(toolInstanse.name);
@@ -55829,10 +56292,10 @@ function getAllWrappedEndpoints() {
55829
56292
  "signals_",
55830
56293
  "fetch_"
55831
56294
  ];
55832
- if (selfDescribedPrefixes.some((p) => tool96.name.startsWith(p)) || isFreeWriteEndpoint(tool96.name)) {
56295
+ if (selfDescribedPrefixes.some((p) => tool100.name.startsWith(p)) || isFreeWriteEndpoint(tool100.name)) {
55833
56296
  let toolInstanse = {
55834
- ...tool96,
55835
- title: tool96.title ?? getToolTitle(tool96.name)
56297
+ ...tool100,
56298
+ title: tool100.title ?? getToolTitle(tool100.name)
55836
56299
  };
55837
56300
  if (!toolInstanse.annotations) {
55838
56301
  toolInstanse.annotations = getAnnotationsForTool(toolInstanse.name);
@@ -55858,7 +56321,7 @@ function getAllWrappedEndpoints() {
55858
56321
  });
55859
56322
  } else {
55860
56323
  secureLogger.debug(
55861
- `No match found in allEndpoints for tool: ${tool96.name}`
56324
+ `No match found in allEndpoints for tool: ${tool100.name}`
55862
56325
  );
55863
56326
  }
55864
56327
  }
@@ -55874,9 +56337,9 @@ function getToolByCategory(category) {
55874
56337
  const allWrappedTools = getAllWrappedEndpoints();
55875
56338
  const tools5 = [];
55876
56339
  for (const toolName of toolNameList) {
55877
- const tool96 = allWrappedTools.find((tool97) => tool97.tool.name === toolName);
55878
- if (tool96) {
55879
- tools5.push(tool96);
56340
+ const tool100 = allWrappedTools.find((tool101) => tool101.tool.name === toolName);
56341
+ if (tool100) {
56342
+ tools5.push(tool100);
55880
56343
  }
55881
56344
  }
55882
56345
  return tools5;
@@ -56099,8 +56562,13 @@ var ToolRegistry = [
56099
56562
  {
56100
56563
  category: "Portfolio & Wallet",
56101
56564
  name: "get_portfolio_wallet_endpoints",
56102
- description: "Endpoints for tracking user wallet balances, transaction history, portfolio positions across protocols and chains, net asset calculations, token holdings analysis, comprehensive wallet activity monitoring, real-time balance tracking, balance update history over time, multi-token portfolio analysis, balance changes with transaction context, financial auditing capabilities for individual users and addresses, wallet filtering and discovery, NFT holdings tracking, wallet PnL, DeFi positions, swap history, and wallet insight metrics. Provider guide: Use alchemy_ tools for default EVM portfolio, balances, transfers, and NFT holdings. Use moralis_ tools only for unique wallet intelligence (PnL, DeFi positions, decoded wallet insight/history). Use helius_ tools for Solana-native wallet depth (native SOL balance, SPL token accounts, Digital Asset Standard assets owned by a wallet).",
56565
+ description: "Endpoints for tracking user wallet balances, transaction history, portfolio positions across protocols and chains, net asset calculations, token holdings analysis, comprehensive wallet activity monitoring, real-time balance tracking, balance update history over time, multi-token portfolio analysis, balance changes with transaction context, financial auditing capabilities for individual users and addresses, wallet filtering and discovery, NFT holdings tracking, wallet PnL, DeFi positions, swap history, and wallet insight metrics. Provider guide: Use get_wallet_balances, get_wallet_pnl, get_wallet_trades, and get_wallet_transfers (CoinGecko) for EVM balances, PnL, DEX trades, and transfers. Use alchemy_ tools for NFT holdings, raw transfers, and EVM chains CoinGecko does not cover. Use moralis_ tools only for DeFi positions and decoded wallet insight/history. Use helius_ tools for Solana-native wallet depth (native SOL balance, SPL token accounts, Digital Asset Standard assets owned by a wallet).",
56103
56566
  tools: [
56567
+ // CoinGecko wallet data (default for EVM balances, PnL, DEX trades, transfers)
56568
+ "get_wallet_balances",
56569
+ "get_wallet_pnl",
56570
+ "get_wallet_trades",
56571
+ "get_wallet_transfers",
56104
56572
  "alchemy_get_tokens_by_wallet",
56105
56573
  "alchemy_get_token_balances_by_wallet",
56106
56574
  "alchemy_get_nfts_by_wallet",
@@ -56131,24 +56599,15 @@ var ToolRegistry = [
56131
56599
  "alchemy_solana_get_transaction_with_compression_info",
56132
56600
  // Moralis wallet intelligence tools
56133
56601
  "moralis_get_wallet_history",
56134
- "moralis_get_wallet_profitability",
56135
- "moralis_get_wallet_profitability_summary",
56136
- "moralis_get_wallet_pnl",
56137
- "moralis_get_wallet_pnl_summary",
56138
56602
  "moralis_get_wallet_defi_positions",
56139
56603
  "moralis_get_wallet_defi_summary",
56140
- "moralis_get_wallet_swaps",
56141
56604
  "moralis_get_wallet_chain_activity",
56142
56605
  "moralis_get_wallet_stats",
56143
56606
  "moralis_get_wallet_insight",
56144
- "moralis_get_wallet_token_balances",
56145
- "moralis_get_wallet_token_balances_price",
56146
- "moralis_get_wallet_net_worth",
56147
56607
  "moralis_get_wallet_approvals",
56148
56608
  "moralis_get_wallet_active_chains",
56149
56609
  "moralis_get_native_balance",
56150
56610
  "moralis_get_native_balances_batch",
56151
- "moralis_get_wallet_token_transfers",
56152
56611
  "moralis_get_sol_balance",
56153
56612
  "moralis_get_sol_token_balances",
56154
56613
  "moralis_get_sol_portfolio",
@@ -56233,7 +56692,6 @@ var ToolRegistry = [
56233
56692
  "moralis_get_token_metadata_batch",
56234
56693
  "moralis_get_token_holders",
56235
56694
  "moralis_get_token_transfers",
56236
- "moralis_get_token_top_traders",
56237
56695
  "moralis_get_token_details",
56238
56696
  "moralis_get_sol_token_price",
56239
56697
  "moralis_get_sol_token_metadata",
@@ -56470,6 +56928,7 @@ var ToolRegistry = [
56470
56928
  "get_exchanges_list",
56471
56929
  "get_derivatives_exchanges_list",
56472
56930
  "get_news",
56931
+ "get_coin_insights",
56473
56932
  "moralis_search_entities",
56474
56933
  "moralis_get_entity",
56475
56934
  "moralis_get_entities_by_category",
@@ -57047,8 +57506,8 @@ function normalizeToolResponse(result2, toolName, args) {
57047
57506
  }
57048
57507
 
57049
57508
  // src/utils/clientRouter.ts
57050
- function getClientForTool(metadata100, clients) {
57051
- const provider = getProviderDescriptorForTool("", metadata100);
57509
+ function getClientForTool(metadata104, clients) {
57510
+ const provider = getProviderDescriptorForTool("", metadata104);
57052
57511
  if (provider.clientStrategy === "shared-goplus") {
57053
57512
  return clients.goplusClient ?? void 0;
57054
57513
  }
@@ -57687,7 +58146,7 @@ function describeErrorCode(code) {
57687
58146
  // src/utils/agentErrorCopy.ts
57688
58147
  function agentErrorCopy(status, context = {}) {
57689
58148
  const provider = context.provider || "the provider";
57690
- const tool96 = context.tool || "this tool";
58149
+ const tool100 = context.tool || "this tool";
57691
58150
  switch (status) {
57692
58151
  case "ok":
57693
58152
  return {
@@ -57697,12 +58156,12 @@ function agentErrorCopy(status, context = {}) {
57697
58156
  case "invalid_input":
57698
58157
  return {
57699
58158
  cause: "The arguments failed validation or named an unsupported venue/method; the provider was not the problem.",
57700
- next_action: `Fix the arguments: call get_api_endpoint_schema for '${tool96}', use supported values, then retry. Do not retry unchanged.`
58159
+ next_action: `Fix the arguments: call get_api_endpoint_schema for '${tool100}', use supported values, then retry. Do not retry unchanged.`
57701
58160
  };
57702
58161
  case "missing_key":
57703
58162
  return {
57704
- cause: `${provider} is not configured on this deployment (no API credential), so '${tool96}' cannot return data here.`,
57705
- next_action: `Do not retry '${tool96}'. Use search_tools to pick a sibling provider tool for the same data, or ask the operator to configure ${provider} credentials.`
58163
+ cause: `${provider} is not configured on this deployment (no API credential), so '${tool100}' cannot return data here.`,
58164
+ next_action: `Do not retry '${tool100}'. Use search_tools to pick a sibling provider tool for the same data, or ask the operator to configure ${provider} credentials.`
57706
58165
  };
57707
58166
  case "plan_required":
57708
58167
  return {
@@ -57721,7 +58180,7 @@ function agentErrorCopy(status, context = {}) {
57721
58180
  };
57722
58181
  case "failing":
57723
58182
  return {
57724
- cause: `${provider} returned an unexpected error for '${tool96}'.`,
58183
+ cause: `${provider} returned an unexpected error for '${tool100}'.`,
57725
58184
  next_action: "Do not retry in a loop. Try the route fallback tool or a sibling provider via search_tools, and report the runtime_status to the user."
57726
58185
  };
57727
58186
  }
@@ -59665,22 +60124,23 @@ function heroTools(endpoints, options = {}) {
59665
60124
  const tokens = firstArray(payload, ["tokens", "items", "balances"]);
59666
60125
  const summarized = tokens.map((token) => {
59667
60126
  if (!isRecord3(token)) return token;
59668
- const metadata100 = isRecord3(token.tokenMetadata) ? token.tokenMetadata : isRecord3(token.token) ? token.token : void 0;
60127
+ const metadata104 = isRecord3(token.tokenMetadata) ? token.tokenMetadata : isRecord3(token.token) ? token.token : void 0;
59669
60128
  const fallbackAddress = typeof token.address === "string" && token.address.trim().toLowerCase() === walletLower ? null : token.address ?? null;
59670
60129
  const tokenAddress = token.tokenAddress ?? token.mint ?? fallbackAddress;
59671
60130
  const isNative = tokenAddress == null;
59672
- const rawDecimals = token.decimals ?? metadata100?.decimals;
60131
+ const rawDecimals = token.decimals ?? metadata104?.decimals;
59673
60132
  const decimals = typeof rawDecimals === "number" ? rawDecimals : isNative ? 18 : void 0;
59674
60133
  const balance = decodeBalance(
59675
60134
  token.balance ?? token.amount ?? token.tokenBalance ?? token.uiAmount ?? null,
59676
60135
  decimals
59677
60136
  );
59678
60137
  return {
59679
- symbol: token.symbol ?? metadata100?.symbol ?? token.tokenSymbol ?? (isNative ? NATIVE_SYMBOLS[chainLabel] ?? null : null),
59680
- name: token.name ?? metadata100?.name ?? null,
60138
+ symbol: token.symbol ?? metadata104?.symbol ?? token.tokenSymbol ?? (isNative ? NATIVE_SYMBOLS[chainLabel] ?? null : null),
60139
+ name: token.name ?? metadata104?.name ?? null,
59681
60140
  address: tokenAddress,
59682
60141
  balance,
59683
- usd_value: token.totalValueUsd ?? token.valueUsd ?? token.usd_value ?? (typeof token.totalValueUsdCents === "number" ? token.totalValueUsdCents / 100 : usdFromPrices(token, balance))
60142
+ usd_value: token.totalValueUsd ?? token.valueUsd ?? token.usd_value ?? (typeof token.totalValueUsdCents === "number" ? token.totalValueUsdCents / 100 : usdFromPrices(token, balance)),
60143
+ ...token.h24_change_pct != null ? { h24_change_pct: token.h24_change_pct } : {}
59684
60144
  };
59685
60145
  });
59686
60146
  const nonZero = summarized.filter(
@@ -59708,6 +60168,23 @@ function heroTools(endpoints, options = {}) {
59708
60168
  } : {}
59709
60169
  };
59710
60170
  };
60171
+ const coingeckoBalances = (payload) => {
60172
+ const attributes = isRecord3(payload.data) && isRecord3(payload.data.attributes) ? payload.data.attributes : {};
60173
+ const rows = Array.isArray(attributes.balances) ? attributes.balances : [];
60174
+ const toNumber = (value) => value == null || !Number.isFinite(Number(value)) ? null : Number(value);
60175
+ return {
60176
+ total_value_usd: toNumber(attributes.total_value_usd),
60177
+ balances: rows.filter(isRecord3).map((row) => ({
60178
+ symbol: row.symbol ?? null,
60179
+ name: row.name ?? null,
60180
+ tokenAddress: row.token_type === "native" ? null : row.address ?? null,
60181
+ balance: row.balance ?? null,
60182
+ decimals: 0,
60183
+ usd_value: toNumber(row.value_usd),
60184
+ h24_change_pct: toNumber(row.h24_price_change_percentage)
60185
+ }))
60186
+ };
60187
+ };
59711
60188
  const getWalletPortfolio = {
59712
60189
  metadata: {
59713
60190
  resource: "dynamic_tools",
@@ -59717,7 +60194,7 @@ function heroTools(endpoints, options = {}) {
59717
60194
  tool: {
59718
60195
  name: "get_wallet_portfolio",
59719
60196
  title: "Get Wallet Portfolio",
59720
- description: "Token holdings for a wallet with balances and USD values where available. Likely spam airdrops are hidden and counted (include_spam=true shows them). EVM chains route through Alchemy; Solana wallets are detected automatically and route through Helius.",
60197
+ description: `Token holdings for a wallet with balances, USD values, and 24h price change where available. Likely spam airdrops are hidden and counted (include_spam=true shows them). EVM chains route through CoinGecko (${WALLET_BALANCE_NETWORKS.join(", ")}) with Alchemy as the fallback; Solana wallets are detected automatically and route through Helius.`,
59721
60198
  inputSchema: zodToInputSchema(walletPortfolioSchema),
59722
60199
  outputSchema: heroOutputSchema("get_wallet_portfolio"),
59723
60200
  annotations: VOLATILE_READ_ANNOTATIONS
@@ -59748,9 +60225,28 @@ function heroTools(endpoints, options = {}) {
59748
60225
  }
59749
60226
  const normalized = normalizeChain(chain);
59750
60227
  const network = ALCHEMY_NETWORKS[normalized];
60228
+ const geckoNetwork = GECKO_NETWORKS[normalized] ?? normalized;
60229
+ let fallbackNote;
60230
+ if (WALLET_BALANCE_NETWORKS.includes(geckoNetwork)) {
60231
+ const result3 = await executeUnderlying("get_wallet_balances", {
60232
+ address,
60233
+ networks: geckoNetwork,
60234
+ per_page: 100
60235
+ }, "get_wallet_portfolio");
60236
+ if (!network || "hive" in result3 && result3.ok) {
60237
+ return respond(result3, format, (payload) => {
60238
+ const balances = coingeckoBalances(payload);
60239
+ return {
60240
+ ...trimWalletPortfolio(address, normalized, includeSpam, true)(balances),
60241
+ total_value_usd: balances.total_value_usd
60242
+ };
60243
+ });
60244
+ }
60245
+ fallbackNote = "CoinGecko wallet balances failed for this call; served from Alchemy.";
60246
+ }
59751
60247
  if (!network) {
59752
60248
  return errorResult5(
59753
- `Invalid arguments: Unknown chain '${chain}'. Pass an EVM chain name (${Object.keys(ALCHEMY_NETWORKS).slice(0, 6).join(", ")}, \u2026) or "solana".`
60249
+ `Invalid arguments: Unknown chain '${chain}'. Pass an EVM chain name (${Object.keys(ALCHEMY_NETWORKS).slice(0, 6).join(", ")}, \u2026), a CoinGecko network id (${WALLET_BALANCE_NETWORKS.join(", ")}), or "solana".`
59754
60250
  );
59755
60251
  }
59756
60252
  const result2 = await executeUnderlying("alchemy_get_tokens_by_wallet", {
@@ -59759,11 +60255,10 @@ function heroTools(endpoints, options = {}) {
59759
60255
  withMetadata: true,
59760
60256
  withPrices: true
59761
60257
  }, "get_wallet_portfolio");
59762
- return respond(
59763
- result2,
59764
- format,
59765
- trimWalletPortfolio(address, normalized, includeSpam, true)
59766
- );
60258
+ return respond(result2, format, (payload) => ({
60259
+ ...trimWalletPortfolio(address, normalized, includeSpam, true)(payload),
60260
+ ...fallbackNote ? { fallback_note: fallbackNote } : {}
60261
+ }));
59767
60262
  }
59768
60263
  };
59769
60264
  return [getTokenPrice, checkTokenSafety, getWalletPortfolio];
@@ -60027,7 +60522,7 @@ var TASK_TOOLSET_ROUTES = {
60027
60522
  step(
60028
60523
  "balances",
60029
60524
  "Read current wallet value and balances.",
60030
- "moralis_get_wallet_net_worth",
60525
+ "get_wallet_balances",
60031
60526
  "alchemy_get_token_balances_by_wallet",
60032
60527
  PROVIDER_FALLBACK
60033
60528
  ),
@@ -60066,7 +60561,7 @@ var TASK_TOOLSET_ROUTES = {
60066
60561
  step(
60067
60562
  "balances",
60068
60563
  "Anchor activity to the current wallet state.",
60069
- "moralis_get_wallet_net_worth",
60564
+ "get_wallet_balances",
60070
60565
  "alchemy_get_native_balance",
60071
60566
  PROVIDER_FALLBACK
60072
60567
  ),
@@ -61044,18 +61539,18 @@ var TASK_TOOLSET_CATALOG = [
61044
61539
  requiredIdentifiers: ["wallet address", "chain"],
61045
61540
  optionalIdentifiers: ["token contract", "transaction hash", "time range"],
61046
61541
  recommendedTools: [
61542
+ "get_wallet_balances",
61543
+ "get_wallet_pnl",
61544
+ "get_wallet_trades",
61545
+ "get_wallet_transfers",
61047
61546
  "alchemy_get_tokens_by_wallet",
61048
61547
  "alchemy_get_token_balances_by_wallet",
61049
61548
  "alchemy_get_nfts_by_wallet",
61050
61549
  "alchemy_get_asset_transfers",
61051
61550
  "alchemy_get_native_balance",
61052
61551
  "moralis_get_wallet_history",
61053
- "moralis_get_wallet_token_balances",
61054
- "moralis_get_wallet_net_worth",
61055
- "moralis_get_wallet_profitability_summary",
61056
61552
  "moralis_get_wallet_defi_positions",
61057
61553
  "moralis_get_wallet_defi_summary",
61058
- "moralis_get_wallet_swaps",
61059
61554
  "moralis_get_wallet_chain_activity",
61060
61555
  "moralis_get_wallet_insight",
61061
61556
  "helius_get_wallet_balances",
@@ -63835,7 +64330,7 @@ async function runMcpProtocolHealth(options = {}) {
63835
64330
  checks.push(
63836
64331
  await timedCheck("tools_list_root_surface", async () => {
63837
64332
  const listed = await client2.listTools();
63838
- const names = listed.tools.map((tool96) => tool96.name);
64333
+ const names = listed.tools.map((tool100) => tool100.name);
63839
64334
  const expectedCount = getRootVisibleToolCount();
63840
64335
  const expectedTools = [...ROOT_VISIBLE_TOOL_NAMES];
63841
64336
  if (listed.tools.length !== expectedCount) {
@@ -67103,6 +67598,10 @@ var TOOL_PROBE_ARGS = {
67103
67598
  },
67104
67599
  get_multi_tokens: { network: "eth", addresses: ETH_USDC },
67105
67600
  get_token_lists: { asset_platform_id: "ethereum" },
67601
+ get_wallet_balances: { address: ETH_WALLET, networks: "eth", per_page: 5 },
67602
+ get_wallet_pnl: { address: ETH_WALLET, networks: "eth", per_page: 5 },
67603
+ get_wallet_trades: { network: "eth", address: ETH_WALLET, per_page: 5 },
67604
+ get_wallet_transfers: { network: "eth", address: ETH_WALLET, per_page: 5 },
67106
67605
  coingecko_get_onchain_token_top_traders: {
67107
67606
  network: COINGECKO_TOP_TRADERS_NETWORK,
67108
67607
  address: COINGECKO_TOP_TRADERS_TOKEN,
@@ -69226,8 +69725,8 @@ var WORKFLOW_REGRESSION_CASES = [
69226
69725
  expectedTopToolset: "wallet_investigation",
69227
69726
  expectedToolsets: ["wallet_investigation"],
69228
69727
  expectedCategoryTool: "get_portfolio_wallet_endpoints",
69229
- expectedSchemaTool: "moralis_get_wallet_profitability_summary",
69230
- expectedProvider: "Moralis"
69728
+ expectedSchemaTool: "get_wallet_pnl",
69729
+ expectedProvider: "CoinGecko"
69231
69730
  },
69232
69731
  {
69233
69732
  id: "wallet-defi-pnl",
@@ -69246,8 +69745,8 @@ var WORKFLOW_REGRESSION_CASES = [
69246
69745
  expectedTopToolset: "wallet_investigation",
69247
69746
  expectedToolsets: ["wallet_investigation"],
69248
69747
  expectedCategoryTool: "get_portfolio_wallet_endpoints",
69249
- expectedSchemaTool: "moralis_get_wallet_swaps",
69250
- expectedProvider: "Moralis"
69748
+ expectedSchemaTool: "get_wallet_trades",
69749
+ expectedProvider: "CoinGecko"
69251
69750
  },
69252
69751
  {
69253
69752
  id: "malicious-address",
@@ -72204,7 +72703,7 @@ function getRootToolSet() {
72204
72703
  tools: Array.from(toolsByName.values()),
72205
72704
  visibleTools: ROOT_VISIBLE_TOOL_ORDER.map(
72206
72705
  (name) => compatibilityByName.get(name)
72207
- ).filter((tool96) => Boolean(tool96))
72706
+ ).filter((tool100) => Boolean(tool100))
72208
72707
  };
72209
72708
  secureLogger.info("Root MCP tool catalog cached", {
72210
72709
  actualToolCount: actualToolEndpoints.length,
@@ -72476,21 +72975,21 @@ var HiveMCPServer = class {
72476
72975
  }
72477
72976
  registerAllTools() {
72478
72977
  const registeredTools = this.scope.kind === "root" ? this.compatibilityToolEndpoints.map((endpoint) => endpoint.tool) : this.visibleTools;
72479
- for (const tool96 of registeredTools) {
72480
- const inputSchema = tool96.inputSchema;
72978
+ for (const tool100 of registeredTools) {
72979
+ const inputSchema = tool100.inputSchema;
72481
72980
  const inputZodSchema = memoizedJsonSchemaToZodInputSchema(inputSchema);
72482
- const outputSchema = tool96.outputSchema;
72981
+ const outputSchema = tool100.outputSchema;
72483
72982
  const outputZodShape = outputSchema?.type === "object" ? memoizedJsonSchemaToZodOutputSchema(outputSchema) : void 0;
72484
- const toolName = tool96.name;
72485
- const toolMeta = tool96._meta;
72983
+ const toolName = tool100.name;
72984
+ const toolMeta = tool100._meta;
72486
72985
  this.server.registerTool(
72487
72986
  toolName,
72488
72987
  {
72489
- title: tool96.title,
72490
- description: tool96.description,
72988
+ title: tool100.title,
72989
+ description: tool100.description,
72491
72990
  inputSchema: inputZodSchema,
72492
72991
  ...outputZodShape && { outputSchema: outputZodShape },
72493
- annotations: tool96.annotations,
72992
+ annotations: tool100.annotations,
72494
72993
  // Surfaces response-size headroom annotations (plan 1.15) in
72495
72994
  // SDK-generated tools/list responses.
72496
72995
  ...toolMeta && { _meta: toolMeta }