hvip-mcp-server 0.2.17 → 0.2.19

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 +432 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21195,7 +21195,13 @@ var publicApi = {
21195
21195
  getTakerFlow: (ccy, instType, begin, end) => request("GET", "/api/v5/rubik/stat/taker-flow", { params: { ccy, instType, begin, end } }),
21196
21196
  getTopTradersContractLSRatio: (ccy, begin, end) => request("GET", "/api/v5/rubik/stat/top-traders-contract-ls-ratio", { params: { ccy, begin, end } }),
21197
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 } })
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")
21199
21205
  };
21200
21206
  var privateApi = {
21201
21207
  getBalance: (auth, ccy) => request("GET", "/api/v5/account/balance", { params: { ccy }, auth }),
@@ -21235,6 +21241,11 @@ var privateApi = {
21235
21241
  getEthStakingBalance: (auth) => request("GET", "/api/v5/finance/staking-defi/eth/balance", { auth }),
21236
21242
  getEthStakingHistory: (auth, limit) => request("GET", "/api/v5/finance/staking-defi/eth/purchase-redeem-history", { params: { limit }, auth }),
21237
21243
  getSolStakingBalance: (auth) => request("GET", "/api/v5/finance/staking-defi/sol/balance", { auth }),
21244
+ // ── 质押操作(第七批新增) ─────────────────────────────────────────────────
21245
+ getStakingOrders: (auth, productId, state, limit) => request("GET", "/api/v5/finance/staking-defi/orders", { params: { productId, state, limit }, auth }),
21246
+ purchaseEthStaking: (auth, body) => request("POST", "/api/v5/finance/staking-defi/eth/purchase", { body, auth }),
21247
+ redeemEthStaking: (auth, body) => request("POST", "/api/v5/finance/staking-defi/eth/redeem", { body, auth }),
21248
+ getSolStakingHistory: (auth, limit) => request("GET", "/api/v5/finance/staking-defi/sol/history", { params: { limit }, auth }),
21238
21249
  // ── 跟单(私有) ─────────────────────────────────────────────────────────────
21239
21250
  getMyLeadPositions: (auth, instType) => request("GET", "/api/v5/copytrading/current-subpositions", { params: { instType }, auth }),
21240
21251
  getMyLeadHistory: (auth, instType, limit) => request("GET", "/api/v5/copytrading/subpositions-history", { params: { instType, limit }, auth }),
@@ -21275,7 +21286,22 @@ var privateApi = {
21275
21286
  orderPrecheck: (auth, body) => request("POST", "/api/v5/trade/order-precheck", { body, auth }),
21276
21287
  getAccountRateLimit: (auth) => request("GET", "/api/v5/trade/account-rate-limit", { auth }),
21277
21288
  easyConvert: (auth, body) => request("POST", "/api/v5/trade/easy-convert", { body, auth }),
21278
- getEasyConvertHistory: (auth, after, before, limit) => request("GET", "/api/v5/trade/easy-convert-history", { params: { after, before, limit }, auth })
21289
+ getEasyConvertHistory: (auth, after, before, limit) => request("GET", "/api/v5/trade/easy-convert-history", { params: { after, before, limit }, auth }),
21290
+ // ── 公开数据(从public移入,实需鉴权) ─────────────────────────────────
21291
+ getEconomicCalendar: (auth, begin, end, limit) => request("GET", "/api/v5/public/economic-calendar", { params: { begin, end, limit }, auth }),
21292
+ // ── 子账户(第六批新增) ──────────────────────────────────────────────────
21293
+ getSubAccountApiKey: (auth, subAcct) => request("GET", "/api/v5/users/subaccount/apikey", { params: { subAcct }, auth }),
21294
+ createSubAccountApiKey: (auth, body) => request("POST", "/api/v5/users/subaccount/apikey", { body, auth }),
21295
+ modifySubAccountApiKey: (auth, body) => request("POST", "/api/v5/users/subaccount/modify-apikey", { body, auth }),
21296
+ deleteSubAccountApiKey: (auth, body) => request("POST", "/api/v5/users/subaccount/delete-apikey", { body, auth }),
21297
+ getSubAccountBills: (auth, subAcct, after, before, limit) => request("GET", "/api/v5/asset/subaccount/bills", { params: { subAcct, after, before, limit }, auth }),
21298
+ // ── 账户+资金(第四批新增) ──────────────────────────────────────────────────
21299
+ setPositionMode: (auth, body) => request("POST", "/api/v5/account/set-position-mode", { body, auth }),
21300
+ getAssetValuation: (auth, ccy) => request("GET", "/api/v5/asset/asset-valuation", { params: { ccy }, auth }),
21301
+ getConvertCurrencies: (auth) => request("GET", "/api/v5/asset/convert/currencies", { auth }),
21302
+ convertTrade: (auth, body) => request("POST", "/api/v5/asset/convert/trade", { body, auth }),
21303
+ getSubAccountFundingBalance: (auth, subAcct) => request("GET", "/api/v5/asset/subaccount/balances", { params: { subAcct }, auth }),
21304
+ setSubAccountTransferOut: (auth, body) => request("POST", "/api/v5/users/subaccount/set-transfer-out", { body, auth })
21279
21305
  };
21280
21306
 
21281
21307
  // src/adapters/hrails.ts
@@ -21678,7 +21704,7 @@ function registerMarketTools(server) {
21678
21704
  }
21679
21705
 
21680
21706
  // src/tools/public.ts
21681
- function registerPublicTools(server) {
21707
+ function registerPublicTools(server, auth) {
21682
21708
  server.tool(
21683
21709
  "okx_get_instruments",
21684
21710
  "## \u529F\u80FD\uFF1A\u83B7\u53D6OKX\u53EF\u4EA4\u6613\u4EA7\u54C1\u5217\u8868\uFF0C\u542B\u4EA7\u54C1\u89C4\u683C\u3001\u6700\u5C0F\u4E0B\u5355\u91CF\u3001\u624B\u7EED\u8D39\u7B49\u7EA7\u7B49\u4FE1\u606F\n## \u573A\u666F\uFF1A\u7528\u4E8E\u786E\u8BA4\u67D0\u4EA7\u54C1\u662F\u5426\u53EF\u4EA4\u6613\u3001\u83B7\u53D6\u7CBE\u5EA6\u53C2\u6570\u3001\u4E0B\u5355\u524D\u9A8C\u8BC1\u4EA7\u54C1\u89C4\u683C\n## \u5173\u952E\u8BCD\uFF1A\u4EA7\u54C1\u5217\u8868, instruments, \u53EF\u4EA4\u6613\u54C1\u79CD, \u89C4\u683C\u53C2\u6570, \u6700\u5C0F\u4E0B\u5355, \u7CBE\u5EA6\n## \u53C2\u6570\uFF1A\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743\n## - instId: \u6307\u5B9A\u4EA7\u54C1ID\uFF0C\u4E0D\u586B\u5219\u8FD4\u56DE\u5168\u91CF\u3002\u4E0D\u4F20instType\u5C06\u8FD4\u56DE\u5168\u91CF\u6570\u636E(~200KB)\uFF0C\u5DF2\u81EA\u52A8\u622A\u65ADtop20\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\u7C7B\u578B ~50KB\uFF0C\u5168\u91CF ~200KB\uFF08\u5DF2\u81EA\u52A8\u622A\u65AD top 20\uFF09\n## \u5173\u8054\uFF1A\u51E0\u4E4E\u6240\u6709\u5DE5\u5177\u7684\u524D\u7F6E\u5DE5\u5177 \u2192 \u83B7\u53D6 instId/instFamily \u540E\u7528\u4E8E okx_get_ticker\u3001okx_place_order \u7B49",
@@ -21973,6 +21999,112 @@ function registerPublicTools(server) {
21973
21999
  }
21974
22000
  }
21975
22001
  );
22002
+ server.tool(
22003
+ "okx_get_platform_24_volume",
22004
+ "## \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",
22005
+ {},
22006
+ async () => {
22007
+ try {
22008
+ const data = await publicApi.getPlatform24Volume();
22009
+ const enriched = data.map((item) => ({
22010
+ ...item,
22011
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
22012
+ }));
22013
+ return toResult(enriched);
22014
+ } catch (e) {
22015
+ return toError(e);
22016
+ }
22017
+ }
22018
+ );
22019
+ server.tool(
22020
+ "okx_get_call_auction_details",
22021
+ "## \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",
22022
+ {
22023
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u5FC5\u586B")
22024
+ },
22025
+ async ({ instId }) => {
22026
+ try {
22027
+ const data = await publicApi.getCallAuctionDetails(instId);
22028
+ const enriched = data.map((item) => ({
22029
+ ...item,
22030
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0,
22031
+ auctionEndTimeIso: item.auctionEndTime ? new Date(parseInt(item.auctionEndTime)).toISOString() : void 0
22032
+ }));
22033
+ return toResult(enriched);
22034
+ } catch (e) {
22035
+ return toError(e);
22036
+ }
22037
+ }
22038
+ );
22039
+ server.tool(
22040
+ "okx_get_option_instrument_family_trades",
22041
+ `## \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
22042
+ ## \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
22043
+ ## \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
22044
+ ## \u53C2\u6570\uFF1A
22045
+ ## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B
22046
+ ## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4\u4E0D\u586B\u5219\u8FD4\u56DE\u5168\u90E8
22047
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
22048
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22049
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB
22050
+ ## \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`,
22051
+ {
22052
+ instFamily: external_exports.string().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B"),
22053
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570")
22054
+ },
22055
+ async ({ instFamily, limit }) => {
22056
+ try {
22057
+ const data = await publicApi.getOptionInstrumentFamilyTrades(instFamily, limit);
22058
+ return toResult(data);
22059
+ } catch (e) {
22060
+ return toError(e);
22061
+ }
22062
+ }
22063
+ );
22064
+ server.tool(
22065
+ "okx_get_option_trades",
22066
+ `## \u529F\u80FD\uFF1A\u83B7\u53D6\u671F\u6743\u9010\u7B14\u6210\u4EA4\u8BB0\u5F55
22067
+ ## \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
22068
+ ## \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
22069
+ ## \u53C2\u6570\uFF1A
22070
+ ## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u4E0EinstId\u4E8C\u9009\u4E00
22071
+ ## - instId: \u671F\u6743\u4EA7\u54C1ID\uFF0C\u5982 BTC-USD-260612-64000-C\u3002\u4E0EinstFamily\u4E8C\u9009\u4E00
22072
+ ## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\uFF0C\u6700\u5927100
22073
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
22074
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22075
+ ## \u8FD4\u56DE\u91CF\uFF1A100\u6761 ~5KB \u2014 \u4E2D\u7B49
22076
+ ## \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`,
22077
+ {
22078
+ instFamily: external_exports.string().optional().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u4E0EinstId\u4E8C\u9009\u4E00"),
22079
+ instId: external_exports.string().optional().describe("\u671F\u6743\u4EA7\u54C1ID\uFF0C\u5982 BTC-USD-260612-64000-C\u3002\u4E0EinstFamily\u4E8C\u9009\u4E00"),
22080
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22081
+ },
22082
+ async ({ instFamily, instId, limit }) => {
22083
+ try {
22084
+ const data = await publicApi.getOptionTrades(instFamily, instId, limit);
22085
+ const enriched = data.map((item) => ({
22086
+ ...item,
22087
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
22088
+ }));
22089
+ return toResult(enriched);
22090
+ } catch (e) {
22091
+ return toError(e);
22092
+ }
22093
+ }
22094
+ );
22095
+ server.tool(
22096
+ "okx_get_exchange_rate",
22097
+ "## \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",
22098
+ {},
22099
+ async () => {
22100
+ try {
22101
+ const data = await publicApi.getExchangeRate();
22102
+ return toResult(data);
22103
+ } catch (e) {
22104
+ return toError(e);
22105
+ }
22106
+ }
22107
+ );
21976
22108
  server.tool(
21977
22109
  "okx_search_instruments",
21978
22110
  "## \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",
@@ -21999,6 +22131,28 @@ function registerPublicTools(server) {
21999
22131
  }
22000
22132
  }
22001
22133
  );
22134
+ server.tool(
22135
+ "okx_get_economic_calendar",
22136
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u7ECF\u6D4E\u65E5\u5386\u6570\u636E\uFF08\u91CD\u8981\u7ECF\u6D4E\u4E8B\u4EF6\u3001\u6570\u636E\u516C\u5E03\u65F6\u95F4\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8FFD\u8E2A\u5B8F\u89C2\u7ECF\u6D4E\u4E8B\u4EF6\u3001\u8BC4\u4F30\u5E02\u573A\u6CE2\u52A8\u89E6\u53D1\u56E0\u7D20\u3001\u63D0\u524D\u51C6\u5907\u5E94\u5BF9\u91CD\u8981\u6570\u636E\u516C\u5E03\n## \u5173\u952E\u8BCD\uFF1A\u7ECF\u6D4E\u65E5\u5386, economic calendar, \u7ECF\u6D4E\u6570\u636E, \u5B8F\u89C2\u7ECF\u6D4E, \u975E\u519C, CPI, \u5229\u7387\u51B3\u8BAE\n## \u53C2\u6570\uFF1A\n## - begin: \u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\u3002\u53EF\u9009\n## - end: \u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\u3002\u53EF\u9009\n## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\u3002\u53EF\u9009\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 ~10KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u83B7\u53D6\u7ECF\u6D4E\u4E8B\u4EF6 \u2192 \u9884\u5224\u5E02\u573A\u6CE2\u52A8 \u2192 \u7ED3\u5408 okx_get_ticker \u76D1\u63A7\u884C\u60C5\u53D8\u5316",
22137
+ {
22138
+ begin: external_exports.string().optional().describe("\u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09"),
22139
+ end: external_exports.string().optional().describe("\u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09"),
22140
+ limit: external_exports.string().optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22141
+ },
22142
+ async ({ begin, end, limit }) => {
22143
+ if (!auth) return toError(AUTH_REQUIRED);
22144
+ try {
22145
+ const data = await privateApi.getEconomicCalendar(auth, begin, end, limit);
22146
+ const enriched = data.map((item) => ({
22147
+ ...item,
22148
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
22149
+ }));
22150
+ return toResult(enriched);
22151
+ } catch (e) {
22152
+ return toError(e);
22153
+ }
22154
+ }
22155
+ );
22002
22156
  }
22003
22157
 
22004
22158
  // src/tools/account.ts
@@ -22224,6 +22378,80 @@ function registerAccountTools(server, auth) {
22224
22378
  }
22225
22379
  }
22226
22380
  );
22381
+ server.tool(
22382
+ "okx_set_position_mode",
22383
+ "## \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",
22384
+ {
22385
+ 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")
22386
+ },
22387
+ async ({ posMode }) => {
22388
+ if (!auth) return toError(AUTH_REQUIRED);
22389
+ try {
22390
+ const data = await privateApi.setPositionMode(auth, { posMode });
22391
+ return toResult(data);
22392
+ } catch (e) {
22393
+ return toError(e);
22394
+ }
22395
+ }
22396
+ );
22397
+ server.tool(
22398
+ "okx_get_asset_valuation",
22399
+ "## \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",
22400
+ {
22401
+ ccy: external_exports.string().optional().describe("\u8BA1\u4EF7\u5E01\u79CD\uFF0C\u5982 USD\u3001CNY\u3002\u4E0D\u586B\u9ED8\u8BA4\u6309\u6240\u6709\u5E01\u79CD")
22402
+ },
22403
+ async ({ ccy }) => {
22404
+ if (!auth) return toError(AUTH_REQUIRED);
22405
+ try {
22406
+ const data = await privateApi.getAssetValuation(auth, ccy);
22407
+ return toResult(data);
22408
+ } catch (e) {
22409
+ return toError(e);
22410
+ }
22411
+ }
22412
+ );
22413
+ server.tool(
22414
+ "okx_get_convert_currencies",
22415
+ "## \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",
22416
+ {},
22417
+ async () => {
22418
+ if (!auth) return toError(AUTH_REQUIRED);
22419
+ try {
22420
+ const data = await privateApi.getConvertCurrencies(auth);
22421
+ return toResult(data);
22422
+ } catch (e) {
22423
+ return toError(e);
22424
+ }
22425
+ }
22426
+ );
22427
+ server.tool(
22428
+ "okx_convert_trade",
22429
+ `## \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
22430
+ ## \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
22431
+ ## \u5173\u952E\u8BCD\uFF1A\u5151\u6362, convert trade, \u8D44\u4EA7\u5151\u6362, \u6362\u5E01, \u4E00\u952E\u5151\u6362, \u95EA\u5151
22432
+ ## \u53C2\u6570\uFF1A
22433
+ ## - fromCcy: \u5356\u51FA\u5E01\u79CD\uFF0C\u5982 USDT\u3002\u5FC5\u586B
22434
+ ## - toCcy: \u4E70\u5165\u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B
22435
+ ## - sz: \u5356\u51FA\u6570\u91CF\u3002\u5FC5\u586B
22436
+ ## \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
22437
+ ## \u98CE\u9669\uFF1AFUND_TRANSFER \u2014 \u4EA7\u751F\u771F\u5B9E\u5151\u6362\u4EA4\u6613\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4
22438
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B
22439
+ ## \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`,
22440
+ {
22441
+ fromCcy: external_exports.string().describe("\u5356\u51FA\u5E01\u79CD\uFF0C\u5982 USDT\u3002\u5FC5\u586B"),
22442
+ toCcy: external_exports.string().describe("\u4E70\u5165\u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B"),
22443
+ sz: external_exports.string().describe("\u5356\u51FA\u6570\u91CF\u3002\u5FC5\u586B")
22444
+ },
22445
+ async ({ fromCcy, toCcy, sz }) => {
22446
+ if (!auth) return toError(AUTH_REQUIRED);
22447
+ try {
22448
+ const data = await privateApi.convertTrade(auth, { fromCcy, toCcy, sz });
22449
+ return toResult(data);
22450
+ } catch (e) {
22451
+ return toError(e);
22452
+ }
22453
+ }
22454
+ );
22227
22455
  server.tool(
22228
22456
  "okx_get_margin_balance",
22229
22457
  "## \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",
@@ -23121,6 +23349,137 @@ function registerSubAccountTools(server, auth) {
23121
23349
  }
23122
23350
  }
23123
23351
  );
23352
+ server.tool(
23353
+ "okx_subaccount_set_transfer_out",
23354
+ "## \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",
23355
+ {
23356
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23357
+ canTransferOut: external_exports.boolean().describe("\u662F\u5426\u5141\u8BB8\u8F6C\u51FA\u3002true=\u5141\u8BB8, false=\u7981\u6B62")
23358
+ },
23359
+ async ({ subAcct, canTransferOut }) => {
23360
+ if (!auth) return toError(AUTH_REQUIRED);
23361
+ try {
23362
+ const data = await privateApi.setSubAccountTransferOut(auth, { subAcct, canTransOut: canTransferOut });
23363
+ return toResult(data);
23364
+ } catch (e) {
23365
+ return toError(e);
23366
+ }
23367
+ }
23368
+ );
23369
+ server.tool(
23370
+ "okx_get_subaccount_api_key",
23371
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5B50\u8D26\u6237\u7684API Key\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u7BA1\u7406\u5B50\u8D26\u6237\u7684API\u6743\u9650\u3001\u67E5\u770B\u5404\u5B50\u8D26\u6237\u5DF2\u521B\u5EFA\u7684API Key\n## \u5173\u952E\u8BCD\uFF1A\u5B50\u8D26\u6237API, subaccount apikey, \u5B50\u8D26\u6237\u79D8\u94A5, API\u7BA1\u7406\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 ~1KB\n## \u5173\u8054\uFF1Aokx_list_subaccounts \u83B7\u53D6\u5B50\u8D26\u6237 \u2192 \u672C\u5DE5\u5177\u67E5API Key \u2192 okx_create_subaccount_api_key \u521B\u5EFA",
23372
+ {
23373
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B")
23374
+ },
23375
+ async ({ subAcct }) => {
23376
+ if (!auth) return toError(AUTH_REQUIRED);
23377
+ try {
23378
+ const data = await privateApi.getSubAccountApiKey(auth, subAcct);
23379
+ return toResult(data);
23380
+ } catch (e) {
23381
+ return toError(e);
23382
+ }
23383
+ }
23384
+ );
23385
+ server.tool(
23386
+ "okx_create_subaccount_api_key",
23387
+ "## \u529F\u80FD\uFF1A\u4E3A\u5B50\u8D26\u6237\u521B\u5EFA\u65B0\u7684API Key\n## \u573A\u666F\uFF1A\u7528\u4E8E\u4E3A\u5B50\u8D26\u6237\u5F00\u901AAPI\u6743\u9650\u3001\u5206\u914D\u4EA4\u6613\u989D\u5EA6\n## \u5173\u952E\u8BCD\uFF1A\u521B\u5EFAAPI, create apikey, \u5B50\u8D26\u6237\u521B\u5EFA\u79D8\u94A5, API\u521B\u5EFA\n## \u53C2\u6570\uFF1A\n## - subAcct: \u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B\n## - label: API Key\u5907\u6CE8\u540D\u79F0\u3002\u5FC5\u586B\n## - passphrase: API Key\u4EA4\u6613\u5BC6\u7801\u3002\u5FC5\u586B\n## - perm: \u6743\u9650\u5B57\u7B26\u4E32\uFF0C\u5982 read_only\u3001trade\u3002\u5FC5\u586B\n## - ip: IP\u767D\u540D\u5355\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\u3002\u53EF\u9009\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 \u521B\u5EFAAPI Key\u5F71\u54CD\u5B50\u8D26\u6237\u8BBF\u95EE\u6743\u9650\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u7531\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_subaccount_api_key \u67E5\u770B\u73B0\u6709 \u2192 \u672C\u5DE5\u5177\u521B\u5EFA \u2192 okx_reset_subaccount_api_key \u91CD\u7F6E",
23388
+ {
23389
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23390
+ label: external_exports.string().describe("API Key\u5907\u6CE8\u540D\u79F0\u3002\u5FC5\u586B"),
23391
+ passphrase: external_exports.string().describe("API Key\u4EA4\u6613\u5BC6\u7801\u3002\u5FC5\u586B"),
23392
+ perm: external_exports.string().describe("\u6743\u9650\u5B57\u7B26\u4E32\uFF0C\u5982 read_only\u3001trade"),
23393
+ ip: external_exports.string().optional().describe("IP\u767D\u540D\u5355\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694")
23394
+ },
23395
+ async ({ subAcct, label, passphrase, perm, ip }) => {
23396
+ if (!auth) return toError(AUTH_REQUIRED);
23397
+ try {
23398
+ const body = { subAcct, label, passphrase, perm };
23399
+ if (ip) body.ip = ip;
23400
+ const data = await privateApi.createSubAccountApiKey(auth, body);
23401
+ return toResult(data);
23402
+ } catch (e) {
23403
+ return toError(e);
23404
+ }
23405
+ }
23406
+ );
23407
+ server.tool(
23408
+ "okx_reset_subaccount_api_key",
23409
+ "## \u529F\u80FD\uFF1A\u4FEE\u6539\u5B50\u8D26\u6237\u7684API Key\uFF08\u91CD\u7F6E\u6743\u9650\u3001IP\u767D\u540D\u5355\u6216\u5907\u6CE8\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u66F4\u65B0\u5B50\u8D26\u6237API Key\u7684\u6743\u9650\u8303\u56F4\u3001\u4FEE\u6539IP\u767D\u540D\u5355\n## \u5173\u952E\u8BCD\uFF1A\u4FEE\u6539API, reset apikey, \u91CD\u7F6E\u79D8\u94A5, \u66F4\u65B0API\u6743\u9650\n## \u53C2\u6570\uFF1A\n## - subAcct: \u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B\n## - apiKey: \u9700\u8981\u4FEE\u6539\u7684API Key\u3002\u5FC5\u586B\n## - label: API Key\u65B0\u5907\u6CE8\u3002\u53EF\u9009\n## - perm: \u65B0\u6743\u9650\u5B57\u7B26\u4E32\u3002\u53EF\u9009\n## - ip: \u65B0IP\u767D\u540D\u5355\u3002\u53EF\u9009\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\u6539API Key\u5F71\u54CD\u5B50\u8D26\u6237\u8BBF\u95EE\u6743\u9650\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u7531\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_create_subaccount_api_key \u521B\u5EFA \u2192 \u672C\u5DE5\u5177\u4FEE\u6539 \u2192 okx_delete_subaccount_api_key \u5220\u9664",
23410
+ {
23411
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23412
+ apiKey: external_exports.string().describe("\u9700\u8981\u4FEE\u6539\u7684API Key\u3002\u5FC5\u586B"),
23413
+ label: external_exports.string().optional().describe("API Key\u65B0\u5907\u6CE8"),
23414
+ perm: external_exports.string().optional().describe("\u65B0\u6743\u9650\u5B57\u7B26\u4E32"),
23415
+ ip: external_exports.string().optional().describe("\u65B0IP\u767D\u540D\u5355\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694")
23416
+ },
23417
+ async ({ subAcct, apiKey, label, perm, ip }) => {
23418
+ if (!auth) return toError(AUTH_REQUIRED);
23419
+ try {
23420
+ const body = { subAcct, apiKey };
23421
+ if (label) body.label = label;
23422
+ if (perm) body.perm = perm;
23423
+ if (ip) body.ip = ip;
23424
+ const data = await privateApi.modifySubAccountApiKey(auth, body);
23425
+ return toResult(data);
23426
+ } catch (e) {
23427
+ return toError(e);
23428
+ }
23429
+ }
23430
+ );
23431
+ server.tool(
23432
+ "okx_delete_subaccount_api_key",
23433
+ "## \u529F\u80FD\uFF1A\u5220\u9664\u5B50\u8D26\u6237\u7684API Key\n## \u573A\u666F\uFF1A\u7528\u4E8E\u64A4\u9500\u5B50\u8D26\u6237\u7684API\u8BBF\u95EE\u6743\u9650\u3001\u5B50\u8D26\u6237\u4E0D\u518D\u9700\u8981\u4EA4\u6613\u65F6\u6E05\u7406API Key\n## \u5173\u952E\u8BCD\uFF1A\u5220\u9664API, delete apikey, \u79FB\u9664\u79D8\u94A5, \u64A4\u9500API\u6743\u9650\n## \u53C2\u6570\uFF1A\n## - subAcct: \u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B\n## - apiKey: \u9700\u8981\u5220\u9664\u7684API Key\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 \u5220\u9664API Key\u540E\u5B50\u8D26\u6237\u5C06\u65E0\u6CD5\u901A\u8FC7API\u8BBF\u95EE\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u7531\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1Aokx_get_subaccount_api_key \u67E5\u770B\u73B0\u6709 \u2192 \u672C\u5DE5\u5177\u5220\u9664 \u2192 okx_list_subaccounts \u9A8C\u8BC1",
23434
+ {
23435
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23436
+ apiKey: external_exports.string().describe("\u9700\u8981\u5220\u9664\u7684API Key\u3002\u5FC5\u586B")
23437
+ },
23438
+ async ({ subAcct, apiKey }) => {
23439
+ if (!auth) return toError(AUTH_REQUIRED);
23440
+ try {
23441
+ const data = await privateApi.deleteSubAccountApiKey(auth, { subAcct, apiKey });
23442
+ return toResult(data);
23443
+ } catch (e) {
23444
+ return toError(e);
23445
+ }
23446
+ }
23447
+ );
23448
+ server.tool(
23449
+ "okx_get_subaccount_bills",
23450
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5B50\u8D26\u6237\u7684\u8D44\u91D1\u6D41\u6C34\uFF08\u8D26\u5355\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5BA1\u8BA1\u5B50\u8D26\u6237\u7684\u8D44\u91D1\u53D8\u52A8\u3001\u8FFD\u8E2A\u5B50\u8D26\u6237\u7684\u5212\u8F6C\u548C\u4EA4\u6613\u8BB0\u5F55\n## \u5173\u952E\u8BCD\uFF1A\u5B50\u8D26\u6237\u8D26\u5355, subaccount bills, \u5B50\u8D26\u6237\u6D41\u6C34, \u8D44\u91D1\u53D8\u52A8, \u5B50\u8D26\u6237\u5BF9\u8D26\n## \u53C2\u6570\uFF1A\n## - subAcct: \u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B\n## - after: \u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u540E\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09\u3002\u53EF\u9009\n## - before: \u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u524D\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09\u3002\u53EF\u9009\n## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\u3002\u53EF\u9009\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\u4E2D\u7B49 ~10KB\n## \u5173\u8054\uFF1Aokx_get_subaccount_balance \u67E5\u4F59\u989D \u2192 \u672C\u5DE5\u5177\u67E5\u6D41\u6C34 \u2192 okx_transfer_subaccount \u5212\u8F6C",
23451
+ {
23452
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23453
+ after: external_exports.string().optional().describe("\u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u540E\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09"),
23454
+ before: external_exports.string().optional().describe("\u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u524D\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09"),
23455
+ limit: external_exports.string().optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
23456
+ },
23457
+ async ({ subAcct, after, before, limit }) => {
23458
+ if (!auth) return toError(AUTH_REQUIRED);
23459
+ try {
23460
+ const data = await privateApi.getSubAccountBills(auth, subAcct, after, before, limit);
23461
+ return toResult(data);
23462
+ } catch (e) {
23463
+ return toError(e);
23464
+ }
23465
+ }
23466
+ );
23467
+ server.tool(
23468
+ "okx_get_subaccount_assets",
23469
+ "## \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",
23470
+ {
23471
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B")
23472
+ },
23473
+ async ({ subAcct }) => {
23474
+ if (!auth) return toError(AUTH_REQUIRED);
23475
+ try {
23476
+ const data = await privateApi.getSubAccountFundingBalance(auth, subAcct);
23477
+ return toResult(data);
23478
+ } catch (e) {
23479
+ return toError(e);
23480
+ }
23481
+ }
23482
+ );
23124
23483
  }
23125
23484
 
23126
23485
  // src/tools/finance.ts
@@ -23217,6 +23576,75 @@ function registerFinanceTools(server, auth) {
23217
23576
  }
23218
23577
  }
23219
23578
  );
23579
+ server.tool(
23580
+ "okx_get_staking_orders",
23581
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u94FE\u4E0A\u8D28\u62BC\u7684\u8BA2\u5355/\u5386\u53F2\u8BB0\u5F55\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770BETH/SOL\u8D28\u62BC\u7684\u7533\u8D2D\u548C\u8D4E\u56DE\u8BB0\u5F55\u3001\u8FFD\u8E2A\u8D28\u62BC\u64CD\u4F5C\u72B6\u6001\n## \u5173\u952E\u8BCD\uFF1A\u8D28\u62BC\u8BA2\u5355, staking orders, \u8D28\u62BC\u8BB0\u5F55, \u8D28\u62BC\u5386\u53F2, \u7533\u8D2D\u8D4E\u56DE\n## \u53C2\u6570\uFF1A\n## - productId: \u4EA7\u54C1ID\uFF0C\u5982 ETH\u3002\u53EF\u9009\n## - state: \u8BA2\u5355\u72B6\u6001\u30021=\u7B49\u5F85\u7533\u8D2D, 2=\u7533\u8D2D\u4E2D, 3=\u7533\u8D2D\u6210\u529F, 4=\u8D4E\u56DE\u4E2D, 5=\u8D4E\u56DE\u6210\u529F, 6=\u5DF2\u53D6\u6D88\u3002\u53EF\u9009\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\uFF1A\u672C\u5DE5\u5177\u67E5\u8BB0\u5F55 \u2192 okx_stake_eth/okx_unstake_eth \u64CD\u4F5C \u2192 okx_get_eth_staking_balance \u786E\u8BA4",
23582
+ {
23583
+ productId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u5982 ETH\u3002\u53EF\u9009"),
23584
+ state: external_exports.string().optional().describe("\u8BA2\u5355\u72B6\u6001\u30021=\u7B49\u5F85\u7533\u8D2D, 2=\u7533\u8D2D\u4E2D, 3=\u7533\u8D2D\u6210\u529F, 4=\u8D4E\u56DE\u4E2D, 5=\u8D4E\u56DE\u6210\u529F, 6=\u5DF2\u53D6\u6D88"),
23585
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
23586
+ },
23587
+ async ({ productId, state, limit }) => {
23588
+ if (!auth) return toError(AUTH_REQUIRED);
23589
+ try {
23590
+ const data = await privateApi.getStakingOrders(auth, productId, state, limit);
23591
+ return toResult(data);
23592
+ } catch (e) {
23593
+ return toError(e);
23594
+ }
23595
+ }
23596
+ );
23597
+ server.tool(
23598
+ "okx_stake_eth",
23599
+ "## \u529F\u80FD\uFF1A\u7533\u8D2DETH\u94FE\u4E0A\u8D28\u62BC\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5C06ETH\u5B58\u5165\u8D28\u62BC\u4EE5\u8D5A\u53D6\u5E74\u5316\u6536\u76CA\u3001\u957F\u671F\u6301\u6709ETH\u7684\u88AB\u52A8\u6536\u76CA\n## \u5173\u952E\u8BCD\uFF1AETH\u8D28\u62BC, stake eth, \u7533\u8D2D\u8D28\u62BC, ETH\u5B58\u5165, \u8D28\u62BC\u7533\u8D2D\n## \u53C2\u6570\uFF1A\n## - amt: \u8D28\u62BC\u6570\u91CF\uFF08ETH\uFF09\u3002\u5FC5\u586B\n## - rate: \u6536\u76CA\u7387\u7C7B\u578B\u30020.5=\u6D3B\u671F, 0.01=\u5B9A\u671F\u3002\u53EF\u9009\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4\u7533\u8D2D\u6570\u91CF\n## \u98CE\u9669\uFF1AFUND_TRANSFER \u2014 \u8D28\u62BCETH\u5C06\u9501\u4ED3\uFF0C\u63D0\u73B0\u5230\u8D26\u6709\u5EF6\u8FDF\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_eth_staking_balance \u770B\u6301\u4ED3 \u2192 \u672C\u5DE5\u5177\u7533\u8D2D \u2192 okx_get_staking_orders \u786E\u8BA4",
23600
+ {
23601
+ amt: external_exports.string().describe("\u8D28\u62BC\u6570\u91CF\uFF08ETH\uFF09\u3002\u5FC5\u586B"),
23602
+ rate: external_exports.string().optional().describe("\u6536\u76CA\u7387\u7C7B\u578B\u30020.5=\u6D3B\u671F, 0.01=\u5B9A\u671F\u3002\u4E0D\u586B\u9ED8\u8BA4\u6D3B\u671F")
23603
+ },
23604
+ async ({ amt, rate }) => {
23605
+ if (!auth) return toError(AUTH_REQUIRED);
23606
+ try {
23607
+ const body = { amt };
23608
+ if (rate) body.rate = rate;
23609
+ const data = await privateApi.purchaseEthStaking(auth, body);
23610
+ return toResult(data);
23611
+ } catch (e) {
23612
+ return toError(e);
23613
+ }
23614
+ }
23615
+ );
23616
+ server.tool(
23617
+ "okx_unstake_eth",
23618
+ "## \u529F\u80FD\uFF1A\u8D4E\u56DEETH\u94FE\u4E0A\u8D28\u62BC\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5C06\u8D28\u62BC\u7684ETH\u8D4E\u56DE\u3001\u63D0\u53D6\u8D28\u62BC\u6536\u76CA\u3001\u5E94\u5BF9\u63D0\u73B0\u9700\u6C42\n## \u5173\u952E\u8BCD\uFF1A\u8D4E\u56DEETH, unstake eth, \u89E3\u9664\u8D28\u62BC, ETH\u8D4E\u56DE, \u63D0\u53D6\u8D28\u62BC\n## \u53C2\u6570\uFF1A\n## - amt: \u8D4E\u56DE\u6570\u91CF\uFF08ETH\uFF09\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\u8D4E\u56DE\u6570\u91CF\n## \u98CE\u9669\uFF1AFUND_TRANSFER \u2014 \u8D4E\u56DEETH\u9700\u8981\u7B49\u5F85\u94FE\u4E0A\u786E\u8BA4\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_eth_staking_balance \u770B\u6301\u4ED3 \u2192 \u672C\u5DE5\u5177\u8D4E\u56DE \u2192 okx_get_eth_staking_history \u786E\u8BA4",
23619
+ {
23620
+ amt: external_exports.string().describe("\u8D4E\u56DE\u6570\u91CF\uFF08ETH\uFF09\u3002\u5FC5\u586B")
23621
+ },
23622
+ async ({ amt }) => {
23623
+ if (!auth) return toError(AUTH_REQUIRED);
23624
+ try {
23625
+ const data = await privateApi.redeemEthStaking(auth, { amt });
23626
+ return toResult(data);
23627
+ } catch (e) {
23628
+ return toError(e);
23629
+ }
23630
+ }
23631
+ );
23632
+ server.tool(
23633
+ "okx_get_sol_staking_history",
23634
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2SOL\u8D28\u62BC\u7684\u7533\u8D2D/\u8D4E\u56DE\u5386\u53F2\u8BB0\u5F55\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8FFD\u8E2ASOL\u8D28\u62BC\u64CD\u4F5C\u3001\u6838\u5BF9\u8D28\u62BC\u548C\u8D4E\u56DE\u8BB0\u5F55\n## \u5173\u952E\u8BCD\uFF1ASOL\u8D28\u62BC\u5386\u53F2, sol staking history, \u8D28\u62BC\u8BB0\u5F55, SOL\u8D4E\u56DE\u8BB0\u5F55\n## \u53C2\u6570\uFF1A\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_get_sol_staking_balance \u770B\u6301\u4ED3 \u2192 \u672C\u5DE5\u5177\u770B\u64CD\u4F5C\u5386\u53F2 \u2192 \u8BA1\u7B97\u6536\u76CA",
23635
+ {
23636
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
23637
+ },
23638
+ async ({ limit }) => {
23639
+ if (!auth) return toError(AUTH_REQUIRED);
23640
+ try {
23641
+ const data = await privateApi.getSolStakingHistory(auth, limit);
23642
+ return toResult(data);
23643
+ } catch (e) {
23644
+ return toError(e);
23645
+ }
23646
+ }
23647
+ );
23220
23648
  }
23221
23649
 
23222
23650
  // src/tools/outcomes.ts
@@ -23833,7 +24261,7 @@ async function main() {
23833
24261
  const server = new McpServer({ name: "hvip", version: "0.2.1" });
23834
24262
  const auth = getAuth();
23835
24263
  registerMarketTools(server);
23836
- registerPublicTools(server);
24264
+ registerPublicTools(server, auth);
23837
24265
  registerStatsTools(server);
23838
24266
  registerSpreadTools(server);
23839
24267
  registerOutcomesTools(server);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hvip-mcp-server",
3
- "version": "0.2.17",
3
+ "version": "0.2.19",
4
4
  "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",