hvip-mcp-server 0.2.16 → 0.2.18

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.
Files changed (2) hide show
  1. package/dist/index.js +512 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21151,6 +21151,9 @@ var publicApi = {
21151
21151
  getFundingRate: (instId) => request("GET", "/api/v5/public/funding-rate", { params: { instId } }),
21152
21152
  getMarkPrice: (instType, instId) => request("GET", "/api/v5/public/mark-price", { params: { instType, instId } }),
21153
21153
  getIndexPrice: (instId) => request("GET", "/api/v5/market/index-tickers", { params: { instId } }),
21154
+ getBooksFull: (instId, sz) => request("GET", "/api/v5/market/books-full", { params: { instId, sz } }),
21155
+ getIndexTickers: (quoteCcy, instId) => request("GET", "/api/v5/market/index-tickers", { params: { quoteCcy, instId } }),
21156
+ getIndexCandles: (instId, bar, after, before, limit) => request("GET", "/api/v5/market/index-candles", { params: { instId, bar, after, before, limit } }),
21154
21157
  getOpenInterest: (instType, instId) => request("GET", "/api/v5/public/open-interest", { params: { instType, instId } }),
21155
21158
  getSystemTime: () => request("GET", "/api/v5/public/time"),
21156
21159
  // ── 交易大数据(公共,无需鉴权) ─────────────────────────────────────────────
@@ -21189,7 +21192,16 @@ var publicApi = {
21189
21192
  getAnnouncements: (annType, lang) => request("GET", "/api/v5/support/announcements", { params: { annType, lang } }),
21190
21193
  getAnnouncementTypes: () => request("GET", "/api/v5/support/announcement-types"),
21191
21194
  getUnderlying: (instType) => request("GET", "/api/v5/public/underlying", { params: { instType } }),
21192
- getTakerFlow: (ccy, instType, begin, end) => request("GET", "/api/v5/rubik/stat/taker-flow", { params: { ccy, instType, begin, end } })
21195
+ getTakerFlow: (ccy, instType, begin, end) => request("GET", "/api/v5/rubik/stat/taker-flow", { params: { ccy, instType, begin, end } }),
21196
+ getTopTradersContractLSRatio: (ccy, begin, end) => request("GET", "/api/v5/rubik/stat/top-traders-contract-ls-ratio", { params: { ccy, begin, end } }),
21197
+ getContractsTakerVolume: (ccy, begin, end) => request("GET", "/api/v5/rubik/stat/contracts-taker-volume", { params: { ccy, begin, end } }),
21198
+ getContractsLongShortRatio: (ccy, begin, end) => request("GET", "/api/v5/rubik/stat/long-short-ratio", { params: { ccy, begin, end } }),
21199
+ // ── 公共数据(第三批新增) ──────────────────────────────────────────────────
21200
+ getPlatform24Volume: () => request("GET", "/api/v5/market/platform-24-volume"),
21201
+ getCallAuctionDetails: (instId) => request("GET", "/api/v5/market/call-auction-details", { params: { instId } }),
21202
+ getOptionInstrumentFamilyTrades: (instFamily, limit) => request("GET", "/api/v5/market/option/instrument-family-trades", { params: { instFamily, limit } }),
21203
+ getOptionTrades: (instFamily, instId, limit) => request("GET", "/api/v5/public/option-trades", { params: { instFamily, instId, limit } }),
21204
+ getExchangeRate: () => request("GET", "/api/v5/market/exchange-rate")
21193
21205
  };
21194
21206
  var privateApi = {
21195
21207
  getBalance: (auth, ccy) => request("GET", "/api/v5/account/balance", { params: { ccy }, auth }),
@@ -21246,6 +21258,8 @@ var privateApi = {
21246
21258
  getAlgoOrdersHistory: (auth, ordType, state, instType) => request("GET", "/api/v5/trade/orders-algo-history", { params: { ordType, state, instType }, auth }),
21247
21259
  placeAlgoOrder: (auth, body) => request("POST", "/api/v5/trade/order-algo", { body, auth }),
21248
21260
  cancelAlgoOrder: (auth, body) => request("POST", "/api/v5/trade/cancel-algos", { body, auth }),
21261
+ amendAlgoOrder: (auth, body) => request("POST", "/api/v5/trade/amend-algos", { body, auth }),
21262
+ getOrdersAlgoPending: (auth, algoId, instType, instId, ordType, limit) => request("GET", "/api/v5/trade/orders-algo-pending", { params: { algoId, instType, instId, ordType, limit }, auth }),
21249
21263
  // ── 子账户 ──────────────────────────────────────────────────────────────────
21250
21264
  listSubAccounts: (auth, enable) => request("GET", "/api/v5/users/subaccount/list", { params: { enable }, auth }),
21251
21265
  getSubAccountBalance: (auth, subAcct) => request("GET", "/api/v5/account/subaccount/balances", { params: { subAcct }, auth }),
@@ -21261,7 +21275,20 @@ var privateApi = {
21261
21275
  getSignalPositions: (auth, algoId) => request("GET", "/api/v5/tradingBot/signal/positions", { params: { algoId }, auth }),
21262
21276
  getSignalPositionsHistory: (auth, algoId, limit) => request("GET", "/api/v5/tradingBot/signal/positions-history", { params: { algoOrdType: "contract", algoId, limit }, auth }),
21263
21277
  getSignalSubOrders: (auth, algoId, limit) => request("GET", "/api/v5/tradingBot/signal/sub-orders", { params: { algoOrdType: "contract", algoId, limit }, auth }),
21264
- getSignalEventHistory: (auth, algoId, limit) => request("GET", "/api/v5/tradingBot/signal/event-histories", { params: { algoId, limit }, auth })
21278
+ getSignalEventHistory: (auth, algoId, limit) => request("GET", "/api/v5/tradingBot/signal/event-histories", { params: { algoId, limit }, auth }),
21279
+ // ── 交易扩展 ──────────────────────────────────────────────────────────────────
21280
+ cancelAllAfter: (auth, body) => request("POST", "/api/v5/trade/cancel-all-after", { body, auth }),
21281
+ orderPrecheck: (auth, body) => request("POST", "/api/v5/trade/order-precheck", { body, auth }),
21282
+ getAccountRateLimit: (auth) => request("GET", "/api/v5/trade/account-rate-limit", { auth }),
21283
+ easyConvert: (auth, body) => request("POST", "/api/v5/trade/easy-convert", { body, auth }),
21284
+ getEasyConvertHistory: (auth, after, before, limit) => request("GET", "/api/v5/trade/easy-convert-history", { params: { after, before, limit }, auth }),
21285
+ // ── 账户+资金(第四批新增) ──────────────────────────────────────────────────
21286
+ setPositionMode: (auth, body) => request("POST", "/api/v5/account/set-position-mode", { body, auth }),
21287
+ getAssetValuation: (auth, ccy) => request("GET", "/api/v5/asset/asset-valuation", { params: { ccy }, auth }),
21288
+ getConvertCurrencies: (auth) => request("GET", "/api/v5/asset/convert/currencies", { auth }),
21289
+ convertTrade: (auth, body) => request("POST", "/api/v5/asset/convert/trade", { body, auth }),
21290
+ getSubAccountFundingBalance: (auth, subAcct) => request("GET", "/api/v5/asset/subaccount/balances", { params: { subAcct }, auth }),
21291
+ setSubAccountTransferOut: (auth, body) => request("POST", "/api/v5/users/subaccount/set-transfer-out", { body, auth })
21265
21292
  };
21266
21293
 
21267
21294
  // src/adapters/hrails.ts
@@ -21582,6 +21609,85 @@ function registerMarketTools(server) {
21582
21609
  }
21583
21610
  }
21584
21611
  );
21612
+ server.tool(
21613
+ "okx_get_books_full",
21614
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u4EA7\u54C1\u5168\u6DF1\u5EA6\u8BA2\u5355\u7C3F\uFF08\u6240\u6709\u6863\u4F4D\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u7CBE\u786E\u5206\u6790\u5E02\u573A\u6D41\u52A8\u6027\u5168\u8C8C\u3001\u53D1\u73B0\u9690\u85CF\u7684\u5927\u989D\u6302\u5355\u3001\u8BA1\u7B97\u6DF1\u5EA6\u52A0\u6743\u4EF7\u683C\n## \u5173\u952E\u8BCD\uFF1A\u5168\u6DF1\u5EA6, \u5B8C\u6574\u8BA2\u5355\u7C3F, books full, \u6240\u6709\u6863\u4F4D, \u6DF1\u5EA6\u5206\u6790, \u6D41\u52A8\u6027\u5168\u666F\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u5FC5\u586B\n## - depth: \u6DF1\u5EA6\u6863\u4F4D\uFF0C\u9ED8\u8BA4\u5168\u90E8\uFF0C\u53EF\u9009\u6307\u5B9A\u6863\u4F4D\u6570\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\u3002\u26A0\uFE0F \u6570\u636E\u91CF\u5927\uFF08\u53EF\u8FBE\u6570\u767EKB\uFF09\uFF0C\u614E\u91CD\u5168\u91CF\u8FD4\u56DE\n## \u8FD4\u56DE\u91CF\uFF1A\u5927\u578B ~200KB+\uFF08\u5305\u542B\u6240\u6709\u6863\u4F4D\u6570\u636E\uFF09\n## \u5173\u8054\uFF1Aokx_get_orderbook \u770B\u6709\u9650\u6DF1\u5EA6 \u2192 \u672C\u5DE5\u5177\u770B\u5168\u6DF1\u5EA6 \u2192 \u8BA1\u7B97\u7CBE\u786E\u5E02\u573A\u51B2\u51FB\u6210\u672C",
21615
+ {
21616
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT"),
21617
+ depth: external_exports.number().int().min(1).max(400).optional().describe("\u6DF1\u5EA6\u6863\u4F4D\uFF0C\u9ED8\u8BA4\u5168\u91CF\uFF0C\u53EF\u9009\u9650\u5236")
21618
+ },
21619
+ async ({ instId, depth }) => {
21620
+ try {
21621
+ const data = await publicApi.getBooksFull(instId, depth);
21622
+ const enriched = data.data || data;
21623
+ if (Array.isArray(enriched)) {
21624
+ const withTsIso = enriched.map((item) => ({
21625
+ ...item,
21626
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21627
+ }));
21628
+ return toResult(withTsIso);
21629
+ }
21630
+ if (enriched && typeof enriched === "object") {
21631
+ return toResult({
21632
+ ...enriched,
21633
+ tsIso: enriched.ts ? new Date(parseInt(enriched.ts)).toISOString() : void 0
21634
+ });
21635
+ }
21636
+ return toResult(data);
21637
+ } catch (e) {
21638
+ return toError(e);
21639
+ }
21640
+ }
21641
+ );
21642
+ server.tool(
21643
+ "okx_get_index_tickers",
21644
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u6307\u6570\u884C\u60C5\u5217\u8868\uFF08\u591A\u4EA4\u6613\u6240\u52A0\u6743\u5747\u4EF7\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u6307\u6570\u73B0\u8D27\u4EF7\u683C\u57FA\u51C6\u3001\u6279\u91CF\u83B7\u53D6\u5404\u5E01\u79CD\u6307\u6570\u4EF7\u683C\u3001\u5224\u65AD\u5408\u7EA6\u6807\u8BB0\u4EF7\u504F\u5DEE\n## \u5173\u952E\u8BCD\uFF1A\u6307\u6570\u884C\u60C5, index tickers, \u6307\u6570\u4EF7\u683C, \u52A0\u6743\u5747\u4EF7, \u73B0\u8D27\u57FA\u51C6\n## \u53C2\u6570\uFF1A\n## - quoteCcy: \u8BA1\u4EF7\u5E01\u79CD\uFF0C\u5982 USDT\u3001USD\u3001BTC\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\n## - instId: \u6307\u5B9A\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u53EF\u9009\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~10KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u6307\u6570\u4EF7\u683C \u2192 okx_get_mark_price \u770B\u6807\u8BB0\u4EF7 \u2192 \u5BF9\u6BD4\u504F\u5DEE\u5224\u65AD\u5957\u5229\u7A7A\u95F4",
21645
+ {
21646
+ quoteCcy: external_exports.string().optional().describe("\u8BA1\u4EF7\u5E01\u79CD\uFF0C\u5982 USDT\u3001USD\u3001BTC"),
21647
+ instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT")
21648
+ },
21649
+ async ({ quoteCcy, instId }) => {
21650
+ try {
21651
+ const data = await publicApi.getIndexTickers(quoteCcy, instId);
21652
+ const enriched = data.map((item) => ({
21653
+ ...item,
21654
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21655
+ }));
21656
+ return toResult(enriched);
21657
+ } catch (e) {
21658
+ return toError(e);
21659
+ }
21660
+ }
21661
+ );
21662
+ server.tool(
21663
+ "okx_get_index_candles",
21664
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u6307\u6570K\u7EBF\u6570\u636E\uFF08\u591A\u4EA4\u6613\u6240\u52A0\u6743\u5747\u4EF7\u7684OHLCV\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u73B0\u8D27\u5E02\u573A\u6574\u4F53\u4EF7\u683C\u8D70\u52BF\u3001\u6392\u9664\u5355\u4EA4\u6613\u6240\u5F02\u5E38\u6CE2\u52A8\u3001\u5224\u65AD\u771F\u5B9E\u5E02\u573A\u8D8B\u52BF\n## \u5173\u952E\u8BCD\uFF1A\u6307\u6570K\u7EBF, index candles, \u6307\u6570OHLCV, \u52A0\u6743K\u7EBF, \u73B0\u8D27\u8D8B\u52BF\n## \u53C2\u6570\uFF1A\n## - instId: \u6307\u6570\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u5FC5\u586B\n## - bar: K\u7EBF\u5468\u671F\u30021m/3m/5m/15m/30m=\u5206\u949F, 1H=1\u5C0F\u65F6, 4H=4\u5C0F\u65F6, 1D=\u65E5\u7EBF, 1W=\u5468\u7EBF\u3002\u9ED8\u8BA41H\n## - after: \u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u524D\u7684\u6570\u636E\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09\n## - before: \u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u540E\u7684\u6570\u636E\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09\n## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\uFF0C\u6700\u5927300\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A100\u6761 ~5KB \u2014 \u5FAE\u5C0F\n## \u5173\u8054\uFF1Aokx_get_candles \u770B\u5355\u4EA4\u6613\u6240K\u7EBF \u2192 \u672C\u5DE5\u5177\u770B\u6307\u6570K\u7EBF \u2192 \u5BF9\u6BD4\u5224\u65AD\u4EA4\u6613\u6240\u504F\u5DEE",
21665
+ {
21666
+ instId: external_exports.string().describe("\u6307\u6570\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT"),
21667
+ bar: external_exports.enum(["1m", "3m", "5m", "15m", "30m", "1H", "4H", "1D", "1W"]).optional().describe("K\u7EBF\u5468\u671F\uFF0C\u9ED8\u8BA41H"),
21668
+ after: external_exports.string().optional().describe("\u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u524D\u7684\u6570\u636E\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09"),
21669
+ before: external_exports.string().optional().describe("\u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u540E\u7684\u6570\u636E\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09"),
21670
+ limit: external_exports.number().int().min(1).max(300).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
21671
+ },
21672
+ async ({ instId, bar, after, before, limit }) => {
21673
+ try {
21674
+ const data = await publicApi.getIndexCandles(instId, bar, after, before, limit);
21675
+ const enriched = data.map((row) => ({
21676
+ ts: row[0],
21677
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
21678
+ open: row[1],
21679
+ high: row[2],
21680
+ low: row[3],
21681
+ close: row[4],
21682
+ vol: row[5],
21683
+ volCcy: row[6]
21684
+ }));
21685
+ return toResult(enriched);
21686
+ } catch (e) {
21687
+ return toError(e);
21688
+ }
21689
+ }
21690
+ );
21585
21691
  }
21586
21692
 
21587
21693
  // src/tools/public.ts
@@ -21880,6 +21986,112 @@ function registerPublicTools(server) {
21880
21986
  }
21881
21987
  }
21882
21988
  );
21989
+ server.tool(
21990
+ "okx_get_platform_24_volume",
21991
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6OKX\u5E73\u53F024\u5C0F\u65F6\u603B\u4EA4\u6613\u91CF\uFF08\u73B0\u8D27+\u5408\u7EA6+\u671F\u6743\u5408\u8BA1\uFF09\uFF0C\u4E0D\u542B\u7279\u5B9A\u5E01\u79CD\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8BC4\u4F30\u4EA4\u6613\u6240\u6574\u4F53\u6D3B\u8DC3\u5EA6\u3001\u5224\u65AD\u5E02\u573A\u70ED\u5EA6\u9AD8\u4F4E\u3001\u76D1\u63A7\u5E73\u53F0\u4EA4\u6613\u91CF\u53D8\u5316\u8D8B\u52BF\n## \u5173\u952E\u8BCD\uFF1A\u5E73\u53F0\u4EA4\u6613\u91CF, 24\u5C0F\u65F6\u4EA4\u6613\u91CF, platform volume, \u603B\u6210\u4EA4\u91CF, \u5E02\u573A\u70ED\u5EA6, \u5168\u5E73\u53F0\n## \u53C2\u6570\uFF1A\u65E0\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u5168\u5E73\u53F0\u70ED\u5EA6 \u2192 okx_get_ticker \u770B\u5177\u4F53\u4EA7\u54C1 \u2192 okx_get_tickers \u626B\u63CF\u5E02\u573A",
21992
+ {},
21993
+ async () => {
21994
+ try {
21995
+ const data = await publicApi.getPlatform24Volume();
21996
+ const enriched = data.map((item) => ({
21997
+ ...item,
21998
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21999
+ }));
22000
+ return toResult(enriched);
22001
+ } catch (e) {
22002
+ return toError(e);
22003
+ }
22004
+ }
22005
+ );
22006
+ server.tool(
22007
+ "okx_get_call_auction_details",
22008
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u4EA7\u54C1\u96C6\u5408\u7ADE\u4EF7\u8BE6\u60C5\uFF0C\u542B\u5F53\u524D\u7ADE\u4EF7\u7684\u672A\u5339\u914D\u91CF\u548C\u53C2\u8003\u4EF7\u683C\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5F00\u76D8\u524D/\u76D8\u524D\u4EA4\u6613\u65F6\u6BB5\u67E5\u770B\u96C6\u5408\u7ADE\u4EF7\u4F9B\u9700\u3001\u5224\u65AD\u5F00\u76D8\u4EF7\u683C\u533A\u95F4\u3001\u53D1\u73B0\u5F02\u5E38\u7ADE\u4EF7\n## \u5173\u952E\u8BCD\uFF1A\u96C6\u5408\u7ADE\u4EF7, call auction, \u7ADE\u4EF7\u8BE6\u60C5, \u5F00\u76D8\u7ADE\u4EF7, \u76D8\u524D\u7ADE\u4EF7, \u672A\u5339\u914D\u91CF\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5355\u4EA7\u54C1 ~500B \u2014 \u5FAE\u5C0F\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u7ADE\u4EF7 \u2192 okx_get_ticker \u770B\u5F00\u76D8\u4EF7 \u2192 \u5F00\u76D8\u540E okx_get_candles \u8DDF\u8E2A\u8D70\u52BF",
22009
+ {
22010
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u5FC5\u586B")
22011
+ },
22012
+ async ({ instId }) => {
22013
+ try {
22014
+ const data = await publicApi.getCallAuctionDetails(instId);
22015
+ const enriched = data.map((item) => ({
22016
+ ...item,
22017
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0,
22018
+ auctionEndTimeIso: item.auctionEndTime ? new Date(parseInt(item.auctionEndTime)).toISOString() : void 0
22019
+ }));
22020
+ return toResult(enriched);
22021
+ } catch (e) {
22022
+ return toError(e);
22023
+ }
22024
+ }
22025
+ );
22026
+ server.tool(
22027
+ "okx_get_option_instrument_family_trades",
22028
+ `## \u529F\u80FD\uFF1A\u6309\u4EA7\u54C1\u65CF\u83B7\u53D6\u671F\u6743\u94FE\u6700\u65B0\u6210\u4EA4\uFF08\u6309\u671F\u6743\u7C7B\u578B\u5F52\u7EC4\uFF09
22029
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u5FEB\u901F\u6D4F\u89C8\u67D0BTC/ETH\u671F\u6743\u94FE\u6574\u4F53\u6210\u4EA4\u6982\u51B5\u3001\u5BF9\u6BD4\u770B\u6DA8/\u770B\u8DCC\u6210\u4EA4\u5206\u5E03\u3001\u53D1\u73B0\u5927\u989D\u671F\u6743\u5F02\u52A8
22030
+ ## \u5173\u952E\u8BCD\uFF1A\u671F\u6743\u65CF\u6210\u4EA4, option family trades, \u671F\u6743\u94FE\u6210\u4EA4, \u671F\u6743\u6210\u4EA4\u6982\u51B5, \u671F\u6743\u6210\u4EA4\u6C47\u603B
22031
+ ## \u53C2\u6570\uFF1A
22032
+ ## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B
22033
+ ## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4\u4E0D\u586B\u5219\u8FD4\u56DE\u5168\u90E8
22034
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
22035
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22036
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB
22037
+ ## \u5173\u8054\uFF1A\u5148\u8C03 okx_get_instruments(instType=OPTION) \u83B7\u53D6\u671F\u6743\u4EA7\u54C1 \u2192 \u672C\u5DE5\u5177\u770B\u65CF\u6210\u4EA4 \u2192 okx_get_option_trades \u770B\u5355\u7B14`,
22038
+ {
22039
+ instFamily: external_exports.string().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B"),
22040
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570")
22041
+ },
22042
+ async ({ instFamily, limit }) => {
22043
+ try {
22044
+ const data = await publicApi.getOptionInstrumentFamilyTrades(instFamily, limit);
22045
+ return toResult(data);
22046
+ } catch (e) {
22047
+ return toError(e);
22048
+ }
22049
+ }
22050
+ );
22051
+ server.tool(
22052
+ "okx_get_option_trades",
22053
+ `## \u529F\u80FD\uFF1A\u83B7\u53D6\u671F\u6743\u9010\u7B14\u6210\u4EA4\u8BB0\u5F55
22054
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u5177\u4F53\u671F\u6743\u5408\u7EA6\u7684\u6210\u4EA4\u4EF7\u91CF\u5206\u5E03\u3001\u5224\u65AD\u4E3B\u52A8\u4E70\u5356\u65B9\u5411\u3001\u8DDF\u8E2A\u671F\u6743\u5927\u5355
22055
+ ## \u5173\u952E\u8BCD\uFF1A\u671F\u6743\u6210\u4EA4, option trades, \u9010\u7B14\u671F\u6743\u6210\u4EA4, \u671F\u6743\u660E\u7EC6, \u671F\u6743\u5927\u5355, option fill
22056
+ ## \u53C2\u6570\uFF1A
22057
+ ## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u4E0EinstId\u4E8C\u9009\u4E00
22058
+ ## - instId: \u671F\u6743\u4EA7\u54C1ID\uFF0C\u5982 BTC-USD-260612-64000-C\u3002\u4E0EinstFamily\u4E8C\u9009\u4E00
22059
+ ## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\uFF0C\u6700\u5927100
22060
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
22061
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22062
+ ## \u8FD4\u56DE\u91CF\uFF1A100\u6761 ~5KB \u2014 \u4E2D\u7B49
22063
+ ## \u5173\u8054\uFF1Aokx_get_option_instrument_family_trades \u770B\u65CF\u6982\u51B5 \u2192 \u672C\u5DE5\u5177\u770B\u9010\u7B14 \u2192 okx_get_opt_summary \u770B\u6CE2\u52A8\u7387`,
22064
+ {
22065
+ instFamily: external_exports.string().optional().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u4E0EinstId\u4E8C\u9009\u4E00"),
22066
+ instId: external_exports.string().optional().describe("\u671F\u6743\u4EA7\u54C1ID\uFF0C\u5982 BTC-USD-260612-64000-C\u3002\u4E0EinstFamily\u4E8C\u9009\u4E00"),
22067
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22068
+ },
22069
+ async ({ instFamily, instId, limit }) => {
22070
+ try {
22071
+ const data = await publicApi.getOptionTrades(instFamily, instId, limit);
22072
+ const enriched = data.map((item) => ({
22073
+ ...item,
22074
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
22075
+ }));
22076
+ return toResult(enriched);
22077
+ } catch (e) {
22078
+ return toError(e);
22079
+ }
22080
+ }
22081
+ );
22082
+ server.tool(
22083
+ "okx_get_exchange_rate",
22084
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6OKX\u5E73\u53F0\u652F\u6301\u7684\u6CD5\u5B9A\u8D27\u5E01\u6C47\u7387\uFF08\u5982USD/CNY\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5C06\u7F8E\u5143\u8BA1\u4EF7\u76C8\u4E8F\u6362\u7B97\u4E3A\u672C\u5730\u6CD5\u5E01\u3001\u8BA1\u7B97\u6CD5\u5E01\u51FA\u5165\u91D1\u91D1\u989D\n## \u5173\u952E\u8BCD\uFF1A\u6C47\u7387, exchange rate, \u6CD5\u5E01\u6C47\u7387, USD/CNY, \u7F8E\u5143\u6C47\u7387, \u4EBA\u6C11\u5E01\u6C47\u7387\n## \u53C2\u6570\uFF1A\u65E0\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~100B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u6C47\u7387 \u2192 \u8F85\u52A9\u8BA1\u7B97\u76C8\u4E8F \u2192 \u7528\u6237\u4E86\u89E3\u672C\u5730\u6CD5\u5E01\u4EF7\u503C",
22085
+ {},
22086
+ async () => {
22087
+ try {
22088
+ const data = await publicApi.getExchangeRate();
22089
+ return toResult(data);
22090
+ } catch (e) {
22091
+ return toError(e);
22092
+ }
22093
+ }
22094
+ );
21883
22095
  server.tool(
21884
22096
  "okx_search_instruments",
21885
22097
  "## \u529F\u80FD\uFF1A\u6309\u5173\u952E\u8BCD\u641C\u7D22\u53EF\u4EA4\u6613\u4EA7\u54C1\uFF08\u73B0\u8D27/\u5408\u7EA6/\u671F\u6743\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u7528\u6237\u8F93\u5165\u4EA7\u54C1\u540D\u79F0\u6A21\u7CCA\u67E5\u627E instId\u3001\u53D1\u73B0\u65B0\u4EA7\u54C1\u3001\u786E\u8BA4\u67D0\u5E01\u79CD\u6709\u54EA\u4E9B\u53EF\u4EA4\u6613\u4EA7\u54C1\n## \u5173\u952E\u8BCD\uFF1A\u641C\u7D22, \u67E5\u627E\u4EA7\u54C1, search instruments, \u4EA7\u54C1\u641C\u7D22, \u6A21\u7CCA\u67E5\u8BE2, \u5E01\u79CD\u641C\u7D22, find instrument\n## \u53C2\u6570\uFF1A\n## - keyword: \u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u5982 BTC\u3001ETH\u3001SOL\u3002\u5FC5\u586B\uFF0C\u6700\u5C112\u5B57\u7B26\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u7B5B\u9009\u3002\u4E0D\u586B\u5219\u641C\u7D22\u5168\u90E8\u7C7B\u578B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB \u2014 \u6700\u591A\u8FD4\u56DE top 20 \u5339\u914D\u7ED3\u679C\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u641C\u7D22\u4EA7\u54C1 \u2192 okx_get_ticker \u67E5\u884C\u60C5 \u2192 okx_place_order \u4E0B\u5355",
@@ -22131,6 +22343,80 @@ function registerAccountTools(server, auth) {
22131
22343
  }
22132
22344
  }
22133
22345
  );
22346
+ server.tool(
22347
+ "okx_set_position_mode",
22348
+ "## \u529F\u80FD\uFF1A\u8BBE\u7F6E\u6301\u4ED3\u6A21\u5F0F\uFF08\u5355\u5411\u6301\u4ED3/\u53CC\u5411\u6301\u4ED3\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5207\u6362\u6301\u4ED3\u6A21\u5F0F\uFF08\u5982\u4ECE\u5355\u5411\u5207\u5230\u53CC\u5411\u652F\u6301\u540C\u65F6\u505A\u591A\u7A7A\uFF09\u3001\u5F00\u5355\u524D\u786E\u8BA4\u6301\u4ED3\u6A21\u5F0F\u6B63\u786E\n## \u5173\u952E\u8BCD\uFF1A\u6301\u4ED3\u6A21\u5F0F, \u6301\u4ED3\u65B9\u5411, position mode, \u53CC\u5411\u6301\u4ED3, \u5355\u5411\u6301\u4ED3, \u9501\u4ED3\n## \u53C2\u6570\uFF1A\n## - posMode: \u6301\u4ED3\u6A21\u5F0F\u3002long_short_mode=\u53CC\u5411\u6301\u4ED3, net_mode=\u5355\u5411\u6301\u4ED3\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AADMIN \u2014 \u4FEE\u6539\u8D26\u6237\u914D\u7F6E\uFF0C\u5F71\u54CD\u6240\u6709\u5408\u7EA6/\u6760\u6746\u4EA4\u6613\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u7531\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u5148\u8C03 okx_get_account_config \u770B\u5F53\u524D\u6A21\u5F0F \u2192 \u672C\u5DE5\u5177\u5207\u6362 \u2192 \u8C03 okx_set_leverage \u8BBE\u6760\u6746",
22349
+ {
22350
+ posMode: external_exports.enum(["long_short_mode", "net_mode"]).describe("\u6301\u4ED3\u6A21\u5F0F\u3002long_short_mode=\u53CC\u5411\u6301\u4ED3, net_mode=\u5355\u5411\u6301\u4ED3")
22351
+ },
22352
+ async ({ posMode }) => {
22353
+ if (!auth) return toError(AUTH_REQUIRED);
22354
+ try {
22355
+ const data = await privateApi.setPositionMode(auth, { posMode });
22356
+ return toResult(data);
22357
+ } catch (e) {
22358
+ return toError(e);
22359
+ }
22360
+ }
22361
+ );
22362
+ server.tool(
22363
+ "okx_get_asset_valuation",
22364
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6OKX\u8D26\u6237\u603B\u8D44\u4EA7\u4F30\u503C\uFF08\u542B\u4EA4\u6613\u8D26\u6237\u548C\u8D44\u91D1\u8D26\u6237\u603B\u6743\u76CA\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u603B\u8D44\u4EA7\u6982\u51B5\u3001\u6309\u5E01\u79CD\u7EDF\u8BA1\u6301\u4ED3\u4EF7\u503C\u3001\u6838\u5BF9\u8D26\u6237\u603B\u6743\u76CA\u53D8\u5316\n## \u5173\u952E\u8BCD\uFF1A\u8D44\u4EA7\u4F30\u503C, \u603B\u8D44\u4EA7, asset valuation, \u8D26\u6237\u603B\u6743\u76CA, \u8D44\u4EA7\u6982\u51B5\n## \u53C2\u6570\uFF1A\n## - ccy: \u8BA1\u4EF7\u5E01\u79CD\uFF0C\u5982 USD\u3001CNY\u3002\u4E0D\u586B\u9ED8\u8BA4\u6309\u6240\u6709\u5E01\u79CD\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u603B\u8D44\u4EA7 \u2192 okx_get_balance \u770B\u4EA4\u6613\u8D26\u6237 \u2192 okx_get_funding_balance \u770B\u8D44\u91D1\u8D26\u6237",
22365
+ {
22366
+ ccy: external_exports.string().optional().describe("\u8BA1\u4EF7\u5E01\u79CD\uFF0C\u5982 USD\u3001CNY\u3002\u4E0D\u586B\u9ED8\u8BA4\u6309\u6240\u6709\u5E01\u79CD")
22367
+ },
22368
+ async ({ ccy }) => {
22369
+ if (!auth) return toError(AUTH_REQUIRED);
22370
+ try {
22371
+ const data = await privateApi.getAssetValuation(auth, ccy);
22372
+ return toResult(data);
22373
+ } catch (e) {
22374
+ return toError(e);
22375
+ }
22376
+ }
22377
+ );
22378
+ server.tool(
22379
+ "okx_get_convert_currencies",
22380
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6OKX\u652F\u6301\u7684\u4E00\u952E\u5151\u6362\u5E01\u79CD\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5728\u95EA\u5151\u524D\u67E5\u770B\u652F\u6301\u54EA\u4E9B\u5151\u6362\u5BF9\u3001\u786E\u8BA4\u76EE\u6807\u5E01\u79CD\u662F\u5426\u53EF\u5151\u6362\n## \u5173\u952E\u8BCD\uFF1A\u5151\u6362\u5E01\u79CD, convert currencies, \u95EA\u5151\u5217\u8868, \u5151\u6362\u652F\u6301, \u53EF\u5151\u6362\u5E01\u79CD\n## \u53C2\u6570\uFF1A\u65E0\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u53EF\u5151\u6362\u5E01\u79CD \u2192 okx_convert_trade \u6267\u884C\u5151\u6362 \u2192 okx_get_easy_convert_history \u67E5\u8BB0\u5F55",
22381
+ {},
22382
+ async () => {
22383
+ if (!auth) return toError(AUTH_REQUIRED);
22384
+ try {
22385
+ const data = await privateApi.getConvertCurrencies(auth);
22386
+ return toResult(data);
22387
+ } catch (e) {
22388
+ return toError(e);
22389
+ }
22390
+ }
22391
+ );
22392
+ server.tool(
22393
+ "okx_convert_trade",
22394
+ `## \u529F\u80FD\uFF1A\u6267\u884C\u8D44\u4EA7\u5151\u6362\uFF08\u5C06\u4E00\u79CD\u8D44\u4EA7\u76F4\u63A5\u6362\u6210\u53E6\u4E00\u79CD\uFF0C\u5982 USDT\u2192BTC\uFF09
22395
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u5FEB\u901F\u6362\u5E01\u3001\u5C0F\u989D\u8D44\u4EA7\u5151\u6362\u3001\u65E0\u9700\u6302\u5355\u7684\u5373\u65F6\u5151\u6362
22396
+ ## \u5173\u952E\u8BCD\uFF1A\u5151\u6362, convert trade, \u8D44\u4EA7\u5151\u6362, \u6362\u5E01, \u4E00\u952E\u5151\u6362, \u95EA\u5151
22397
+ ## \u53C2\u6570\uFF1A
22398
+ ## - fromCcy: \u5356\u51FA\u5E01\u79CD\uFF0C\u5982 USDT\u3002\u5FC5\u586B
22399
+ ## - toCcy: \u4E70\u5165\u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B
22400
+ ## - sz: \u5356\u51FA\u6570\u91CF\u3002\u5FC5\u586B
22401
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4\u5151\u6362\u65B9\u5411\u548C\u6570\u91CF
22402
+ ## \u98CE\u9669\uFF1AFUND_TRANSFER \u2014 \u4EA7\u751F\u771F\u5B9E\u5151\u6362\u4EA4\u6613\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4
22403
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B
22404
+ ## \u5173\u8054\uFF1Aokx_get_convert_currencies \u67E5\u652F\u6301\u5E01\u79CD \u2192 \u672C\u5DE5\u5177\u5151\u6362 \u2192 okx_get_balance \u786E\u8BA4\u5230\u8D26`,
22405
+ {
22406
+ fromCcy: external_exports.string().describe("\u5356\u51FA\u5E01\u79CD\uFF0C\u5982 USDT\u3002\u5FC5\u586B"),
22407
+ toCcy: external_exports.string().describe("\u4E70\u5165\u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B"),
22408
+ sz: external_exports.string().describe("\u5356\u51FA\u6570\u91CF\u3002\u5FC5\u586B")
22409
+ },
22410
+ async ({ fromCcy, toCcy, sz }) => {
22411
+ if (!auth) return toError(AUTH_REQUIRED);
22412
+ try {
22413
+ const data = await privateApi.convertTrade(auth, { fromCcy, toCcy, sz });
22414
+ return toResult(data);
22415
+ } catch (e) {
22416
+ return toError(e);
22417
+ }
22418
+ }
22419
+ );
22134
22420
  server.tool(
22135
22421
  "okx_get_margin_balance",
22136
22422
  "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u67D0\u4EA7\u54C1\u7684\u4FDD\u8BC1\u91D1\u4F59\u989D\u8BE6\u60C5\n## \u573A\u666F\uFF1A\u7528\u4E8E\u6760\u6746/\u5408\u7EA6\u4EA4\u6613\u524D\u67E5\u770B\u53EF\u7528\u4FDD\u8BC1\u91D1\u3001\u5360\u7528\u4FDD\u8BC1\u91D1\u3001\u4FDD\u8BC1\u91D1\u7387\n## \u5173\u952E\u8BCD\uFF1A\u4FDD\u8BC1\u91D1\u4F59\u989D, \u4FDD\u8BC1\u91D1\u7387, margin balance, \u53EF\u7528\u4FDD\u8BC1\u91D1, \u5360\u7528\u4FDD\u8BC1\u91D1\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u5FC5\u586B\n## - mgnMode: \u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_balance \u67E5\u603B\u4F59\u989D \u2192 \u672C\u5DE5\u5177\u67E5\u4FDD\u8BC1\u91D1 \u2192 okx_get_positions \u67E5\u6301\u4ED3",
@@ -22430,6 +22716,97 @@ function registerTradingTools(server, auth) {
22430
22716
  }
22431
22717
  }
22432
22718
  );
22719
+ server.tool(
22720
+ "okx_cancel_all_after",
22721
+ "## \u529F\u80FD\uFF1A\u8BBE\u7F6E\u5B9A\u65F6\u5168\u64A4\uFF08N\u79D2\u540E\u81EA\u52A8\u64A4\u9500\u6240\u6709\u6302\u5355\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u6781\u7AEF\u884C\u60C5\u4E0B\u542F\u52A8\u7D27\u6025\u64A4\u5355\u5012\u8BA1\u65F6\u3001\u7A0B\u5E8F\u5316\u98CE\u9669\u63A7\u5236\u3001\u8D85\u65F6\u81EA\u52A8\u6E05\u7A7A\u6302\u5355\n## \u5173\u952E\u8BCD\uFF1A\u5B9A\u65F6\u5168\u64A4, cancel all after, \u5012\u8BA1\u65F6\u64A4\u5355, \u7D27\u6025\u98CE\u63A7, \u81EA\u52A8\u64A4\u5355\n## \u53C2\u6570\uFF1A\n## - timeOut: \u5012\u8BA1\u65F6\u79D2\u6570\u30020=\u53D6\u6D88\u5B9A\u65F6\u5168\u64A4, \u6B63\u6570=\u8BBEN\u79D2\u540E\u5168\u64A4\u3002\u6700\u5927120\u79D2\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u98CE\u63A7\u6838\u5FC3\u5DE5\u5177\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u98CE\u9669\uFF1AFUND_TRANSFER \u2014 \u5B9A\u65F6\u64A4\u9500\u6240\u6709\u6302\u5355\uFF0C\u5F71\u54CD\u8303\u56F4\u6781\u5927\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1Aokx_get_orders_pending \u786E\u8BA4\u5F53\u524D\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u8BBE\u5012\u8BA1\u65F6 \u2192 \u5230\u65F6\u95F4\u81EA\u52A8\u64A4\u9500",
22722
+ {
22723
+ timeOut: external_exports.string().describe("\u5012\u8BA1\u65F6\u79D2\u6570\uFF0C0=\u53D6\u6D88\u5B9A\u65F6\u5168\u64A4\uFF0C\u6B63\u6570=\u8BBEN\u79D2\u540E\u5168\u64A4\uFF0C\u6700\u5927120\u79D2")
22724
+ },
22725
+ async ({ timeOut }) => {
22726
+ if (!auth) return toError(AUTH_REQUIRED);
22727
+ try {
22728
+ const data = await privateApi.cancelAllAfter(auth, { timeOut });
22729
+ return toResult(data);
22730
+ } catch (e) {
22731
+ return toError(e);
22732
+ }
22733
+ }
22734
+ );
22735
+ server.tool(
22736
+ "okx_order_precheck",
22737
+ `## \u529F\u80FD\uFF1A\u4E0B\u5355\u9884\u68C0\uFF08\u9A8C\u8BC1\u8BA2\u5355\u53C2\u6570\u662F\u5426\u5408\u6CD5\uFF0C\u4E0D\u5B9E\u9645\u4E0B\u5355\uFF09
22738
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u4E0B\u5355\u524D\u9A8C\u8BC1\u53C2\u6570\u6B63\u786E\u6027\u3001\u68C0\u67E5\u4F59\u989D\u548C\u98CE\u63A7\u9650\u5236\u3001\u907F\u514D\u56E0\u53C2\u6570\u9519\u8BEF\u5BFC\u81F4\u7684\u8BA2\u5355\u5931\u8D25
22739
+ ## \u5173\u952E\u8BCD\uFF1A\u4E0B\u5355\u9884\u68C0, \u9884\u68C0\u67E5, order precheck, \u8BA2\u5355\u9A8C\u8BC1, \u53C2\u6570\u68C0\u67E5
22740
+ ## \u53C2\u6570\uFF1A
22741
+ ## - params: \u8BA2\u5355\u53C2\u6570JSON\u5BF9\u8C61\uFF0C\u4E0E okx_place_order \u53C2\u6570\u76F8\u540C\u3002\u5FC5\u586B
22742
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
22743
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u9884\u68C0\uFF0C\u4E0D\u4EA7\u751F\u5B9E\u9645\u8BA2\u5355\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22744
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B
22745
+ ## \u5173\u8054\uFF1Aokx_place_order \u4E0B\u5355\u524D \u2192 \u672C\u5DE5\u5177\u9884\u68C0\u53C2\u6570 \u2192 \u901A\u8FC7\u540E\u6B63\u5F0F\u4E0B\u5355`,
22746
+ {
22747
+ params: external_exports.string().describe(`\u8BA2\u5355\u53C2\u6570JSON\u5B57\u7B26\u4E32\uFF0C\u5982 '{"instId":"BTC-USDT","tdMode":"cash","side":"buy","ordType":"limit","sz":"0.001","px":"60000"}'`)
22748
+ },
22749
+ async ({ params }) => {
22750
+ if (!auth) return toError(AUTH_REQUIRED);
22751
+ try {
22752
+ const parsed = JSON.parse(params);
22753
+ const data = await privateApi.orderPrecheck(auth, parsed);
22754
+ return toResult(data);
22755
+ } catch (e) {
22756
+ return toError(e);
22757
+ }
22758
+ }
22759
+ );
22760
+ server.tool(
22761
+ "okx_get_account_rate_limit",
22762
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5F53\u524D\u8D26\u6237\u7684API\u9891\u7387\u9650\u5236\u4F7F\u7528\u60C5\u51B5\n## \u573A\u666F\uFF1A\u7528\u4E8E\u9AD8\u9891\u4EA4\u6613\u524D\u68C0\u67E5\u5269\u4F59\u914D\u989D\u3001\u907F\u514D\u89E6\u53D1\u9650\u9891\u3001\u8C03\u6574\u8BF7\u6C42\u8282\u594F\n## \u5173\u952E\u8BCD\uFF1A\u9891\u7387\u9650\u5236, rate limit, API\u914D\u989D, \u9650\u9891\u67E5\u8BE2, \u5269\u4F59\u6B21\u6570\n## \u53C2\u6570\uFF1A\u65E0\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u5269\u4F59\u914D\u989D \u2192 \u9AD8\u9891\u4E0B\u5355\u524D\u786E\u8BA4 \u2192 \u907F\u514D HTTP 429 \u9519\u8BEF",
22763
+ {},
22764
+ async () => {
22765
+ if (!auth) return toError(AUTH_REQUIRED);
22766
+ try {
22767
+ const data = await privateApi.getAccountRateLimit(auth);
22768
+ return toResult(data);
22769
+ } catch (e) {
22770
+ return toError(e);
22771
+ }
22772
+ }
22773
+ );
22774
+ server.tool(
22775
+ "okx_easy_convert",
22776
+ "## \u529F\u80FD\uFF1A\u95EA\u5151\uFF08\u4E00\u952E\u5151\u6362\u4E0D\u540C\u5E01\u79CD\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5FEB\u901F\u5151\u6362USDT\u5230BTC/ETH\u7B49\u3001\u5C0F\u989D\u6362\u5E01\u9700\u6C42\u3001\u65E0\u9700\u6302\u5355\u5373\u65F6\u6210\u4EA4\n## \u5173\u952E\u8BCD\uFF1A\u95EA\u5151, easy convert, \u5E01\u79CD\u5151\u6362, \u4E00\u952E\u6362\u5E01, \u5FEB\u901F\u5151\u6362\n## \u53C2\u6570\uFF1A\n## - fromCcy: \u5356\u51FA\u5E01\u79CD\uFF0C\u5982 USDT\u3002\u5FC5\u586B\n## - toCcy: \u4E70\u5165\u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B\n## - sz: \u5356\u51FA\u6570\u91CF\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4\u5151\u6362\u5E01\u79CD\u548C\u6570\u91CF\n## \u98CE\u9669\uFF1AFUND_TRANSFER \u2014 \u4EA7\u751F\u771F\u5B9E\u5151\u6362\u4EA4\u6613\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_ticker \u770B\u5F53\u524D\u4EF7 \u2192 \u672C\u5DE5\u5177\u95EA\u5151 \u2192 okx_get_easy_convert_history \u67E5\u8BB0\u5F55",
22777
+ {
22778
+ fromCcy: external_exports.string().describe("\u5356\u51FA\u5E01\u79CD\uFF0C\u5982 USDT"),
22779
+ toCcy: external_exports.string().describe("\u4E70\u5165\u5E01\u79CD\uFF0C\u5982 BTC"),
22780
+ sz: external_exports.string().describe("\u5356\u51FA\u6570\u91CF")
22781
+ },
22782
+ async ({ fromCcy, toCcy, sz }) => {
22783
+ if (!auth) return toError(AUTH_REQUIRED);
22784
+ try {
22785
+ const data = await privateApi.easyConvert(auth, { fromCcy, toCcy, sz });
22786
+ return toResult(data);
22787
+ } catch (e) {
22788
+ return toError(e);
22789
+ }
22790
+ }
22791
+ );
22792
+ server.tool(
22793
+ "okx_get_easy_convert_history",
22794
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u95EA\u5151\u5386\u53F2\u8BB0\u5F55\n## \u573A\u666F\uFF1A\u7528\u4E8E\u590D\u76D8\u95EA\u5151\u4EA4\u6613\u3001\u6838\u5BF9\u5151\u6362\u6C47\u7387\u3001\u7EDF\u8BA1\u6362\u5E01\u6210\u672C\n## \u5173\u952E\u8BCD\uFF1A\u95EA\u5151\u5386\u53F2, easy convert history, \u5151\u6362\u8BB0\u5F55, \u6362\u5E01\u5386\u53F2\n## \u53C2\u6570\uFF1A\n## - after: \u67E5\u8BE2\u6B64\u65F6\u95F4\u4E4B\u540E\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09\n## - before: \u67E5\u8BE2\u6B64\u65F6\u95F4\u4E4B\u524D\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09\n## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1Aokx_easy_convert \u95EA\u5151 \u2192 \u672C\u5DE5\u5177\u67E5\u5386\u53F2 \u2192 okx_get_account_bills \u5BF9\u8D26",
22795
+ {
22796
+ after: external_exports.string().optional().describe("\u67E5\u8BE2\u6B64\u65F6\u95F4\u4E4B\u540E\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09"),
22797
+ before: external_exports.string().optional().describe("\u67E5\u8BE2\u6B64\u65F6\u95F4\u4E4B\u524D\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09"),
22798
+ limit: external_exports.string().optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22799
+ },
22800
+ async ({ after, before, limit }) => {
22801
+ if (!auth) return toError(AUTH_REQUIRED);
22802
+ try {
22803
+ const data = await privateApi.getEasyConvertHistory(auth, after, before, limit);
22804
+ return toResult(data);
22805
+ } catch (e) {
22806
+ return toError(e);
22807
+ }
22808
+ }
22809
+ );
22433
22810
  }
22434
22811
 
22435
22812
  // src/tools/algo.ts
@@ -22500,6 +22877,43 @@ function registerAlgoTools(server, auth) {
22500
22877
  }
22501
22878
  }
22502
22879
  );
22880
+ server.tool(
22881
+ "okx_get_orders_algo_pending",
22882
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5F85\u89E6\u53D1\u7684\u7B56\u7565\u59D4\u6258\u5355\uFF08\u66F4\u7075\u6D3B\u7684\u67E5\u8BE2\u65B9\u5F0F\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u6240\u6709\u5F85\u89E6\u53D1\u7B56\u7565\u3001\u6309\u4EA7\u54C1\u6216ID\u7CBE\u786E\u67E5\u627E\u7B56\u7565\u5355\u3001\u76D1\u63A7\u81EA\u52A8\u4EA4\u6613\u72B6\u6001\n## \u5173\u952E\u8BCD\uFF1A\u7B56\u7565\u6302\u5355, orders algo pending, \u5F85\u89E6\u53D1, \u6761\u4EF6\u5355\u67E5\u8BE2, \u6B62\u76C8\u6B62\u635F\u67E5\u8BE2\n## \u53C2\u6570\uFF1A\n## - algoId: \u7B56\u7565\u8BA2\u5355ID\uFF0C\u7CBE\u786E\u67E5\u8BE2\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SPOT/MARGIN/SWAP/FUTURES/OPTION\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\n## - ordType: \u7B56\u7565\u7C7B\u578B\u3002conditional/trigger/oco/move_order_stop/iceberg/twap\n## - limit: \u8FD4\u56DE\u6761\u6570\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u8BE2\u5F85\u89E6\u53D1\u7B56\u7565 \u2192 okx_place_algo_order \u4E0B\u7B56\u7565\u5355 \u2192 okx_cancel_algo_order \u64A4\u9500",
22883
+ {
22884
+ algoId: external_exports.string().optional().describe("\u7B56\u7565\u8BA2\u5355ID\uFF0C\u7CBE\u786E\u67E5\u8BE2"),
22885
+ instType: external_exports.enum(INST_TYPE_TRADE).optional().describe("\u4EA7\u54C1\u7C7B\u578B"),
22886
+ instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT"),
22887
+ ordType: external_exports.enum(["conditional", "oco", "trigger", "move_order_stop", "iceberg", "twap"]).optional().describe("\u7B56\u7565\u7C7B\u578B"),
22888
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570")
22889
+ },
22890
+ async ({ algoId, instType, instId, ordType, limit }) => {
22891
+ if (!auth) return toError(AUTH_REQUIRED);
22892
+ try {
22893
+ const data = await privateApi.getOrdersAlgoPending(auth, algoId, instType, instId, ordType, limit);
22894
+ return toResult(data);
22895
+ } catch (e) {
22896
+ return toError(e);
22897
+ }
22898
+ }
22899
+ );
22900
+ server.tool(
22901
+ "okx_amend_algo_order",
22902
+ "## \u529F\u80FD\uFF1A\u4FEE\u6539\u7B56\u7565\u59D4\u6258\u5355\uFF08\u6B62\u76C8\u6B62\u635F\u4EF7\u683C\u3001\u89E6\u53D1\u6761\u4EF6\u7B49\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8C03\u6574\u6B62\u76C8\u6B62\u635F\u4EF7\u683C\u3001\u4FEE\u6539\u89E6\u53D1\u6761\u4EF6\u3001\u66F4\u65B0\u7B56\u7565\u5355\u53C2\u6570\n## \u5173\u952E\u8BCD\uFF1A\u4FEE\u6539\u7B56\u7565, amend algo, \u8C03\u6574\u6B62\u76C8\u6B62\u635F, \u4FEE\u6539\u6761\u4EF6\u5355, \u66F4\u65B0\u7B56\u7565\n## \u53C2\u6570\uFF1A\n## - orders: \u4FEE\u6539\u7B56\u7565\u8BA2\u5355\u6570\u7EC4\uFF08JSON\u6570\u7EC4\u5B57\u7B26\u4E32\uFF09\uFF0C\u6BCF\u9879\u542B algoId/instId \u53CA\u9700\u4FEE\u6539\u7684\u5B57\u6BB5\uFF08\u5982 newSz/newPx/slTriggerPx/tpTriggerPx\uFF09\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u4FEE\u6539\u7B56\u7565\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_orders_algo_pending \u67E5\u8BE2\u7B56\u7565 \u2192 \u672C\u5DE5\u5177\u4FEE\u6539 \u2192 okx_get_algo_orders \u786E\u8BA4\u4FEE\u6539",
22903
+ {
22904
+ orders: external_exports.string().describe(`\u4FEE\u6539\u7B56\u7565\u8BA2\u5355\u6570\u7EC4JSON\u5B57\u7B26\u4E32\uFF0C\u5982 '[{"algoId":"123","instId":"BTC-USDT","newTpTriggerPx":"65000"}]'`)
22905
+ },
22906
+ async ({ orders }) => {
22907
+ if (!auth) return toError(AUTH_REQUIRED);
22908
+ try {
22909
+ const parsed = JSON.parse(orders);
22910
+ const data = await privateApi.amendAlgoOrder(auth, parsed);
22911
+ return toResult(data);
22912
+ } catch (e) {
22913
+ return toError(e);
22914
+ }
22915
+ }
22916
+ );
22503
22917
  }
22504
22918
 
22505
22919
  // src/tools/funding.ts
@@ -22777,6 +23191,69 @@ function registerStatsTools(server) {
22777
23191
  }
22778
23192
  }
22779
23193
  );
23194
+ server.tool(
23195
+ "okx_get_top_traders_contract_ls_ratio",
23196
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u7CBE\u82F1\u4EA4\u6613\u5458\u591A\u7A7A\u6301\u4ED3\u6BD4\u4F8B\uFF08\u5168\u90E8\u5408\u7EA6\u6C47\u603B\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u7CBE\u82F1\u7FA4\u4F53\u6574\u4F53\u6301\u4ED3\u65B9\u5411\u3001\u5206\u6790\u5927\u6237\u60C5\u7EEA\u53D8\u5316\u8D8B\u52BF\u3001\u53D1\u73B0\u6781\u7AEF\u6301\u4ED3\u7684\u8F6C\u6298\u4FE1\u53F7\n## \u5173\u952E\u8BCD\uFF1A\u7CBE\u82F1\u591A\u7A7A\u6BD4, \u5168\u90E8\u5408\u7EA6, top traders LS ratio, \u5927\u6237\u60C5\u7EEA, \u6301\u4ED3\u6C47\u603B\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u53EF\u9009\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\n## - begin: \u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n## - end: \u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1Aokx_get_top_trader_long_short_ratio \u770B\u5355\u4E00\u5408\u7EA6\u5927\u6237 \u2192 \u672C\u5DE5\u5177\u770B\u5168\u90E8\u5408\u7EA6\u6C47\u603B \u2192 \u5224\u65AD\u6574\u4F53\u5927\u6237\u65B9\u5411",
23197
+ {
23198
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
23199
+ begin: external_exports.string().optional().describe("\u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09"),
23200
+ end: external_exports.string().optional().describe("\u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09")
23201
+ },
23202
+ async ({ ccy, begin, end }) => {
23203
+ try {
23204
+ const data = await publicApi.getTopTradersContractLSRatio(ccy, begin, end);
23205
+ const enriched = data.map((item) => ({
23206
+ ...item,
23207
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
23208
+ }));
23209
+ return toResult(enriched);
23210
+ } catch (e) {
23211
+ return toError(e);
23212
+ }
23213
+ }
23214
+ );
23215
+ server.tool(
23216
+ "okx_get_contracts_taker_volume",
23217
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5408\u7EA6\u4E3B\u52A8\u4E70\u5356\u91CF\u7EDF\u8BA1\uFF08\u5168\u90E8\u5408\u7EA6\u6C47\u603B\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u6574\u4F53\u5408\u7EA6\u5E02\u573A\u7684\u4E70\u5356\u529B\u91CF\u5BF9\u6BD4\u3001\u5206\u6790\u5168\u5E02\u573A\u8D44\u91D1\u6D41\u5411\u8D8B\u52BF\n## \u5173\u952E\u8BCD\uFF1A\u5408\u7EA6\u4E70\u5356\u91CF, contracts taker volume, \u4E3B\u52A8\u4E70\u5356, \u5168\u90E8\u5408\u7EA6, \u4E70\u5356\u529B\u91CF\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u53EF\u9009\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\n## - begin: \u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n## - end: \u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1Aokx_get_taker_volume \u770B\u5206\u7C7B\u578B\u4E70\u5356\u91CF \u2192 \u672C\u5DE5\u5177\u770B\u5168\u90E8\u5408\u7EA6\u6C47\u603B \u2192 \u5224\u65AD\u6574\u4F53\u5E02\u573A\u65B9\u5411",
23218
+ {
23219
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
23220
+ begin: external_exports.string().optional().describe("\u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09"),
23221
+ end: external_exports.string().optional().describe("\u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09")
23222
+ },
23223
+ async ({ ccy, begin, end }) => {
23224
+ try {
23225
+ const data = await publicApi.getContractsTakerVolume(ccy, begin, end);
23226
+ const enriched = data.map((item) => ({
23227
+ ...item,
23228
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
23229
+ }));
23230
+ return toResult(enriched);
23231
+ } catch (e) {
23232
+ return toError(e);
23233
+ }
23234
+ }
23235
+ );
23236
+ server.tool(
23237
+ "okx_get_contracts_long_short_ratio",
23238
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5168\u90E8\u5408\u7EA6\u591A\u7A7A\u6301\u4ED3\u6BD4\u4F8B\uFF08\u591A\u7A7A\u6BD4\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u6574\u4F53\u5408\u7EA6\u5E02\u573A\u60C5\u7EEA\uFF08>1\u591A\u5934\u504F\u591A\uFF0C<1\u7A7A\u5934\u504F\u591A\uFF09\u3001\u53D1\u73B0\u6781\u7AEF\u60C5\u7EEA\u7684\u8F6C\u6298\u4FE1\u53F7\n## \u5173\u952E\u8BCD\uFF1A\u5408\u7EA6\u591A\u7A7A\u6BD4, contracts LS ratio, \u5168\u90E8\u5408\u7EA6\u6301\u4ED3, \u5E02\u573A\u60C5\u7EEA, \u591A\u7A7A\u8D26\u6237\u6BD4\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u53EF\u9009\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\n## - begin: \u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n## - end: \u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1Aokx_get_long_short_ratio \u770B\u5206\u5408\u7EA6\u591A\u7A7A\u6BD4 \u2192 \u672C\u5DE5\u5177\u770B\u5168\u90E8\u5408\u7EA6\u6C47\u603B \u2192 \u5BF9\u6BD4\u5224\u65AD\u60C5\u7EEA\u65B9\u5411",
23239
+ {
23240
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
23241
+ begin: external_exports.string().optional().describe("\u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09"),
23242
+ end: external_exports.string().optional().describe("\u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09")
23243
+ },
23244
+ async ({ ccy, begin, end }) => {
23245
+ try {
23246
+ const data = await publicApi.getContractsLongShortRatio(ccy, begin, end);
23247
+ const enriched = data.map((item) => ({
23248
+ ...item,
23249
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
23250
+ }));
23251
+ return toResult(enriched);
23252
+ } catch (e) {
23253
+ return toError(e);
23254
+ }
23255
+ }
23256
+ );
22780
23257
  }
22781
23258
 
22782
23259
  // src/tools/subaccount.ts
@@ -22837,6 +23314,39 @@ function registerSubAccountTools(server, auth) {
22837
23314
  }
22838
23315
  }
22839
23316
  );
23317
+ server.tool(
23318
+ "okx_subaccount_set_transfer_out",
23319
+ "## \u529F\u80FD\uFF1A\u8BBE\u7F6E\u5B50\u8D26\u6237\u7684\u8D44\u91D1\u8F6C\u51FA\u6743\u9650\n## \u573A\u666F\uFF1A\u7528\u4E8E\u63A7\u5236\u5B50\u8D26\u6237\u662F\u5426\u53EF\u4EE5\u5411\u5916\u90E8\u8F6C\u51FA\u8D44\u91D1\u3001\u7BA1\u7406\u591A\u7B56\u7565\u8D26\u6237\u7684\u8D44\u91D1\u6743\u9650\n## \u5173\u952E\u8BCD\uFF1A\u5B50\u8D26\u6237\u8F6C\u51FA, \u8F6C\u51FA\u6743\u9650, set transfer out, \u5B50\u8D26\u6237\u6743\u9650, \u98CE\u63A7, \u8D44\u91D1\u7BA1\u7406\n## \u53C2\u6570\uFF1A\n## - subAcct: \u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B\n## - canTransferOut: \u662F\u5426\u5141\u8BB8\u8F6C\u51FA\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981\u4E3B\u8D26\u6237 API Key\uFF08\u7BA1\u7406\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AADMIN \u2014 \u4FEE\u6539\u5B50\u8D26\u6237\u6743\u9650\uFF0C\u5F71\u54CD\u8D44\u91D1\u5B89\u5168\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u7531\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~200B\n## \u5173\u8054\uFF1Aokx_list_subaccounts \u83B7\u53D6\u5B50\u8D26\u6237\u5217\u8868 \u2192 \u672C\u5DE5\u5177\u7BA1\u7406\u6743\u9650 \u2192 okx_transfer_subaccount \u5212\u8F6C",
23320
+ {
23321
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23322
+ canTransferOut: external_exports.boolean().describe("\u662F\u5426\u5141\u8BB8\u8F6C\u51FA\u3002true=\u5141\u8BB8, false=\u7981\u6B62")
23323
+ },
23324
+ async ({ subAcct, canTransferOut }) => {
23325
+ if (!auth) return toError(AUTH_REQUIRED);
23326
+ try {
23327
+ const data = await privateApi.setSubAccountTransferOut(auth, { subAcct, canTransOut: canTransferOut });
23328
+ return toResult(data);
23329
+ } catch (e) {
23330
+ return toError(e);
23331
+ }
23332
+ }
23333
+ );
23334
+ server.tool(
23335
+ "okx_get_subaccount_assets",
23336
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5B50\u8D26\u6237\u7684\u8D44\u91D1\u8D26\u6237\u4F59\u989D\uFF08\u975E\u4EA4\u6613\u8D26\u6237\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5B50\u8D26\u6237\u7684\u5145\u503C\u8D44\u91D1\u3001\u786E\u8BA4\u5B50\u8D26\u6237\u8D44\u91D1\u8D26\u6237\u8D44\u4EA7\n## \u5173\u952E\u8BCD\uFF1A\u5B50\u8D26\u6237\u8D44\u4EA7, subaccount assets, \u5B50\u8D26\u6237\u8D44\u91D1, \u5B50\u8D26\u6237\u4F59\u989D, \u5B50\u8D26\u53F7\u8D44\u91D1\n## \u53C2\u6570\uFF1A\n## - subAcct: \u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981\u4E3B\u8D26\u6237 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB\n## \u5173\u8054\uFF1Aokx_get_subaccount_balance \u770B\u4EA4\u6613\u4F59\u989D \u2192 \u672C\u5DE5\u5177\u770B\u8D44\u91D1\u4F59\u989D \u2192 \u7EFC\u5408\u8BC4\u4F30\u5B50\u8D26\u6237\u8D44\u4EA7",
23337
+ {
23338
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B")
23339
+ },
23340
+ async ({ subAcct }) => {
23341
+ if (!auth) return toError(AUTH_REQUIRED);
23342
+ try {
23343
+ const data = await privateApi.getSubAccountFundingBalance(auth, subAcct);
23344
+ return toResult(data);
23345
+ } catch (e) {
23346
+ return toError(e);
23347
+ }
23348
+ }
23349
+ );
22840
23350
  }
22841
23351
 
22842
23352
  // src/tools/finance.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hvip-mcp-server",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",