hvip-mcp-server 0.2.18 → 0.2.20

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 +300 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21241,6 +21241,11 @@ var privateApi = {
21241
21241
  getEthStakingBalance: (auth) => request("GET", "/api/v5/finance/staking-defi/eth/balance", { auth }),
21242
21242
  getEthStakingHistory: (auth, limit) => request("GET", "/api/v5/finance/staking-defi/eth/purchase-redeem-history", { params: { limit }, auth }),
21243
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 }),
21244
21249
  // ── 跟单(私有) ─────────────────────────────────────────────────────────────
21245
21250
  getMyLeadPositions: (auth, instType) => request("GET", "/api/v5/copytrading/current-subpositions", { params: { instType }, auth }),
21246
21251
  getMyLeadHistory: (auth, instType, limit) => request("GET", "/api/v5/copytrading/subpositions-history", { params: { instType, limit }, auth }),
@@ -21282,6 +21287,14 @@ var privateApi = {
21282
21287
  getAccountRateLimit: (auth) => request("GET", "/api/v5/trade/account-rate-limit", { auth }),
21283
21288
  easyConvert: (auth, body) => request("POST", "/api/v5/trade/easy-convert", { body, auth }),
21284
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 }),
21285
21298
  // ── 账户+资金(第四批新增) ──────────────────────────────────────────────────
21286
21299
  setPositionMode: (auth, body) => request("POST", "/api/v5/account/set-position-mode", { body, auth }),
21287
21300
  getAssetValuation: (auth, ccy) => request("GET", "/api/v5/asset/asset-valuation", { params: { ccy }, auth }),
@@ -21691,7 +21704,7 @@ function registerMarketTools(server) {
21691
21704
  }
21692
21705
 
21693
21706
  // src/tools/public.ts
21694
- function registerPublicTools(server) {
21707
+ function registerPublicTools(server, auth) {
21695
21708
  server.tool(
21696
21709
  "okx_get_instruments",
21697
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",
@@ -22118,6 +22131,28 @@ function registerPublicTools(server) {
22118
22131
  }
22119
22132
  }
22120
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
+ );
22121
22156
  }
22122
22157
 
22123
22158
  // src/tools/account.ts
@@ -23254,10 +23289,106 @@ function registerStatsTools(server) {
23254
23289
  }
23255
23290
  }
23256
23291
  );
23292
+ server.tool(
23293
+ "okx_get_long_short_ratio_all",
23294
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5168\u90E8\u5408\u7EA6\u7684\u591A\u7A7A\u6301\u4ED3\u6BD4\u4F8B\u6C47\u603B\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u6574\u4F53\u5408\u7EA6\u5E02\u573A\u7684\u591A\u7A7A\u60C5\u7EEA\u3001\u53D1\u73B0\u6781\u7AEF\u6BD4\u4F8B\u65F6\u7684\u53CD\u8F6C\u4FE1\u53F7\n## \u5173\u952E\u8BCD\uFF1A\u5168\u90E8\u5408\u7EA6\u591A\u7A7A\u6BD4, long short ratio all, \u5168\u5E02\u573A\u591A\u7A7A, \u591A\u7A7A\u60C5\u7EEA\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\uFF1A\u672C\u5DE5\u5177\u770B\u5168\u5E02\u573A\u591A\u7A7A\u6BD4 \u2192 okx_get_long_short_ratio \u770B\u5206\u5408\u7EA6 \u2192 \u5BF9\u6BD4\u5206\u6790",
23295
+ {
23296
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
23297
+ begin: external_exports.string().optional().describe("\u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09"),
23298
+ end: external_exports.string().optional().describe("\u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09")
23299
+ },
23300
+ async ({ ccy, begin, end }) => {
23301
+ try {
23302
+ const data = await publicApi.getContractsLongShortRatio(ccy, begin, end);
23303
+ const enriched = data.map((item) => ({
23304
+ ...item,
23305
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
23306
+ }));
23307
+ return toResult(enriched);
23308
+ } catch (e) {
23309
+ return toError(e);
23310
+ }
23311
+ }
23312
+ );
23313
+ server.tool(
23314
+ "okx_get_taker_flow_contract",
23315
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5408\u7EA6\u4E3B\u52A8\u4E70\u5356\u6D41\u5411\uFF08Taker\u6D41\u91CF\uFF09\uFF0C\u7EDF\u8BA1\u4E70\u5165\u548C\u5356\u51FATaker\u6210\u4EA4\u91CF\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u5408\u7EA6\u5E02\u573A\u7684\u4E3B\u52A8\u4E70\u5356\u529B\u91CF\u5BF9\u6BD4\u3001\u8FFD\u8E2A\u806A\u660E\u94B1\u6D41\u5411\n## \u5173\u952E\u8BCD\uFF1A\u4E3B\u52A8\u6D41\u5411, taker flow contract, \u5408\u7EA6\u4E3B\u52A8\u4E70\u5356, Taker\u6D41\u91CF\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SWAP/FUTURES\u3002\u53EF\u9009\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## \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\u6210\u4EA4\u91CF \u2192 \u672C\u5DE5\u5177\u770B\u4E70\u5356\u65B9\u5411 \u2192 \u5224\u65AD\u591A\u7A7A\u529B\u5EA6",
23316
+ {
23317
+ ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B"),
23318
+ instType: external_exports.enum(INST_TYPE_SWAP_FUT).optional().describe("\u4EA7\u54C1\u7C7B\u578B\u3002SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272"),
23319
+ begin: external_exports.string().optional().describe("\u5F00\u59CB\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09"),
23320
+ end: external_exports.string().optional().describe("\u7ED3\u675F\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09")
23321
+ },
23322
+ async ({ ccy, instType, begin, end }) => {
23323
+ try {
23324
+ const data = await publicApi.getTakerFlow(ccy, instType, begin, end);
23325
+ const enriched = data.map((item) => ({
23326
+ ...item,
23327
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
23328
+ }));
23329
+ return toResult(enriched);
23330
+ } catch (e) {
23331
+ return toError(e);
23332
+ }
23333
+ }
23334
+ );
23335
+ server.tool(
23336
+ "okx_get_open_interest_history_rubik",
23337
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5408\u7EA6\u6301\u4ED3\u91CF\u5386\u53F2\u8D70\u52BF\uFF08\u4EA4\u6613\u5927\u6570\u636E\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u6301\u4ED3\u91CF\u8D8B\u52BF\u3001\u5224\u65AD\u8D44\u91D1\u6D41\u5165\u6D41\u51FA\u3001\u91CF\u4EF7\u914D\u5408\u5206\u6790\n## \u5173\u952E\u8BCD\uFF1A\u6301\u4ED3\u91CF\u5386\u53F2, OI\u5386\u53F2, open interest history, rubik, \u6301\u4ED3\u8D70\u52BF\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B\n## - period: \u65F6\u95F4\u7C92\u5EA6\u30025m/15m/30m/1H/2H/4H/6H/12H/1D/1W\u3002\u9ED8\u8BA45m\n## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\uFF0C\u6700\u592714400\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 ~5KB \u2014 \u5FAE\u5C0F\n## \u5173\u8054\uFF1A\u5148\u8C03 okx_get_instruments \u83B7\u53D6\u5408\u7EA6\u4EA7\u54C1 \u2192 \u672C\u5DE5\u5177\u67E5\u6301\u4ED3\u8D8B\u52BF \u2192 \u7ED3\u5408 okx_get_ticker \u5224\u65AD\u91CF\u4EF7\u5173\u7CFB",
23338
+ {
23339
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B"),
23340
+ period: external_exports.enum(["5m", "15m", "30m", "1H", "2H", "4H", "6H", "12H", "1D", "1W"]).optional().describe("\u65F6\u95F4\u7C92\u5EA6\uFF0C\u9ED8\u8BA45m"),
23341
+ limit: external_exports.string().optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\uFF0C\u6700\u592714400")
23342
+ },
23343
+ async ({ instId, period, limit }) => {
23344
+ try {
23345
+ const data = await publicApi.getOpenInterestHistory(instId, period, limit);
23346
+ const enriched = data.map((row) => ({
23347
+ ts: row[0],
23348
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
23349
+ oi: row[1],
23350
+ oiCcy: row[2],
23351
+ vol: row[3]
23352
+ }));
23353
+ return toResult(enriched);
23354
+ } catch (e) {
23355
+ return toError(e);
23356
+ }
23357
+ }
23358
+ );
23359
+ server.tool(
23360
+ "okx_get_savings_lending_rate",
23361
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u6D3B\u671F\u501F\u5E01\u5F53\u524D\u5E02\u573A\u5229\u7387\u6C47\u603B\uFF08\u516C\u5F00\u6570\u636E\uFF0C\u65E0\u9700API Key\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u501F\u8D37\u6210\u672C\u3001\u5BFB\u627E\u95F2\u7F6E\u8D44\u91D1\u6700\u4F18\u51FA\u501F\u5229\u7387\u3001\u6BD4\u8F83\u5404\u5E01\u79CD\u501F\u8D37\u5229\u7387\n## \u5173\u952E\u8BCD\uFF1A\u501F\u5E01\u5229\u7387, lending rate, \u501F\u8D37\u6210\u672C, \u51FA\u501F\u5229\u7387, \u5E02\u573A\u5229\u7387\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3001USDT\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\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\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u5E02\u573A\u5229\u7387 \u2192 \u5224\u65AD\u6760\u6746\u6210\u672C \u2192 okx_get_margin_lending_ratio \u770B\u501F\u5E01\u91CF\u8D8B\u52BF",
23362
+ { ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001USDT\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8") },
23363
+ async ({ ccy }) => {
23364
+ try {
23365
+ const data = await publicApi.getLendingRateSummary(ccy);
23366
+ return toResult(data);
23367
+ } catch (e) {
23368
+ return toError(e);
23369
+ }
23370
+ }
23371
+ );
23257
23372
  }
23258
23373
 
23259
23374
  // src/tools/subaccount.ts
23260
23375
  function registerSubAccountTools(server, auth) {
23376
+ server.tool(
23377
+ "okx_get_subaccount_list",
23378
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u6240\u6709\u5B50\u8D26\u6237\u5217\u8868\u53CA\u5176\u72B6\u6001\n## \u573A\u666F\uFF1A\u7528\u4E8E\u591A\u7B56\u7565\u8D26\u6237\u7BA1\u7406\u3001\u67E5\u770B\u5404\u5B50\u8D26\u6237\u7684\u542F\u7528\u72B6\u6001\n## \u5173\u952E\u8BCD\uFF1A\u5B50\u8D26\u6237\u5217\u8868, subaccount list, \u5B50\u8D26\u53F7\u5217\u8868, \u5B50\u8D26\u6237\u72B6\u6001\n## \u53C2\u6570\uFF1A\n## - enable: \u7B5B\u9009\u542F\u7528\u72B6\u6001\uFF0C\u4E0D\u586B\u5219\u8FD4\u56DE\u5168\u90E8\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\uFF1A\u672C\u5DE5\u5177\u83B7\u53D6\u5B50\u8D26\u6237\u5217\u8868 \u2192 okx_get_subaccount_balance \u67E5\u4F59\u989D \u2192 okx_transfer_subaccount \u5212\u8F6C",
23379
+ {
23380
+ enable: external_exports.boolean().optional().describe("\u7B5B\u9009\u542F\u7528\u72B6\u6001\uFF0C\u4E0D\u586B\u5219\u8FD4\u56DE\u5168\u90E8")
23381
+ },
23382
+ async ({ enable }) => {
23383
+ if (!auth) return toError(AUTH_REQUIRED);
23384
+ try {
23385
+ const data = await privateApi.listSubAccounts(auth, enable);
23386
+ return toResult(data);
23387
+ } catch (e) {
23388
+ return toError(e);
23389
+ }
23390
+ }
23391
+ );
23261
23392
  server.tool(
23262
23393
  "okx_list_subaccounts",
23263
23394
  "## \u529F\u80FD\uFF1A\u83B7\u53D6\u6240\u6709\u5B50\u8D26\u6237\u5217\u8868\u53CA\u5176\u72B6\u6001\n## \u573A\u666F\uFF1A\u7528\u4E8E\u591A\u7B56\u7565\u8D26\u6237\u7BA1\u7406\u3001\u67E5\u770B\u5404\u5B50\u8D26\u6237\u7684\u542F\u7528\u72B6\u6001\n## \u5173\u952E\u8BCD\uFF1A\u5B50\u8D26\u6237, subaccounts, \u591A\u8D26\u6237, \u5B50\u8D26\u53F7, \u8D26\u6237\u7BA1\u7406\n## \u53C2\u6570\uFF1A\n## - enable: \u7B5B\u9009\u542F\u7528\u72B6\u6001\uFF0C\u4E0D\u586B\u5219\u8FD4\u56DE\u5168\u90E8\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\uFF1A\u672C\u5DE5\u5177\u83B7\u53D6\u5B50\u8D26\u6237\u5217\u8868 \u2192 okx_get_subaccount_balance \u67E5\u4F59\u989D \u2192 okx_transfer_subaccount \u5212\u8F6C",
@@ -23331,6 +23462,104 @@ function registerSubAccountTools(server, auth) {
23331
23462
  }
23332
23463
  }
23333
23464
  );
23465
+ server.tool(
23466
+ "okx_get_subaccount_api_key",
23467
+ "## \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",
23468
+ {
23469
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B")
23470
+ },
23471
+ async ({ subAcct }) => {
23472
+ if (!auth) return toError(AUTH_REQUIRED);
23473
+ try {
23474
+ const data = await privateApi.getSubAccountApiKey(auth, subAcct);
23475
+ return toResult(data);
23476
+ } catch (e) {
23477
+ return toError(e);
23478
+ }
23479
+ }
23480
+ );
23481
+ server.tool(
23482
+ "okx_create_subaccount_api_key",
23483
+ "## \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",
23484
+ {
23485
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23486
+ label: external_exports.string().describe("API Key\u5907\u6CE8\u540D\u79F0\u3002\u5FC5\u586B"),
23487
+ passphrase: external_exports.string().describe("API Key\u4EA4\u6613\u5BC6\u7801\u3002\u5FC5\u586B"),
23488
+ perm: external_exports.string().describe("\u6743\u9650\u5B57\u7B26\u4E32\uFF0C\u5982 read_only\u3001trade"),
23489
+ ip: external_exports.string().optional().describe("IP\u767D\u540D\u5355\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694")
23490
+ },
23491
+ async ({ subAcct, label, passphrase, perm, ip }) => {
23492
+ if (!auth) return toError(AUTH_REQUIRED);
23493
+ try {
23494
+ const body = { subAcct, label, passphrase, perm };
23495
+ if (ip) body.ip = ip;
23496
+ const data = await privateApi.createSubAccountApiKey(auth, body);
23497
+ return toResult(data);
23498
+ } catch (e) {
23499
+ return toError(e);
23500
+ }
23501
+ }
23502
+ );
23503
+ server.tool(
23504
+ "okx_reset_subaccount_api_key",
23505
+ "## \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",
23506
+ {
23507
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23508
+ apiKey: external_exports.string().describe("\u9700\u8981\u4FEE\u6539\u7684API Key\u3002\u5FC5\u586B"),
23509
+ label: external_exports.string().optional().describe("API Key\u65B0\u5907\u6CE8"),
23510
+ perm: external_exports.string().optional().describe("\u65B0\u6743\u9650\u5B57\u7B26\u4E32"),
23511
+ ip: external_exports.string().optional().describe("\u65B0IP\u767D\u540D\u5355\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694")
23512
+ },
23513
+ async ({ subAcct, apiKey, label, perm, ip }) => {
23514
+ if (!auth) return toError(AUTH_REQUIRED);
23515
+ try {
23516
+ const body = { subAcct, apiKey };
23517
+ if (label) body.label = label;
23518
+ if (perm) body.perm = perm;
23519
+ if (ip) body.ip = ip;
23520
+ const data = await privateApi.modifySubAccountApiKey(auth, body);
23521
+ return toResult(data);
23522
+ } catch (e) {
23523
+ return toError(e);
23524
+ }
23525
+ }
23526
+ );
23527
+ server.tool(
23528
+ "okx_delete_subaccount_api_key",
23529
+ "## \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",
23530
+ {
23531
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23532
+ apiKey: external_exports.string().describe("\u9700\u8981\u5220\u9664\u7684API Key\u3002\u5FC5\u586B")
23533
+ },
23534
+ async ({ subAcct, apiKey }) => {
23535
+ if (!auth) return toError(AUTH_REQUIRED);
23536
+ try {
23537
+ const data = await privateApi.deleteSubAccountApiKey(auth, { subAcct, apiKey });
23538
+ return toResult(data);
23539
+ } catch (e) {
23540
+ return toError(e);
23541
+ }
23542
+ }
23543
+ );
23544
+ server.tool(
23545
+ "okx_get_subaccount_bills",
23546
+ "## \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",
23547
+ {
23548
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
23549
+ after: external_exports.string().optional().describe("\u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u540E\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09"),
23550
+ before: external_exports.string().optional().describe("\u67E5\u8BE2\u6B64\u65F6\u95F4\u6233\u4E4B\u524D\u7684\u8BB0\u5F55\uFF08\u6BEB\u79D2Unix\u65F6\u95F4\u6233\uFF09"),
23551
+ limit: external_exports.string().optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
23552
+ },
23553
+ async ({ subAcct, after, before, limit }) => {
23554
+ if (!auth) return toError(AUTH_REQUIRED);
23555
+ try {
23556
+ const data = await privateApi.getSubAccountBills(auth, subAcct, after, before, limit);
23557
+ return toResult(data);
23558
+ } catch (e) {
23559
+ return toError(e);
23560
+ }
23561
+ }
23562
+ );
23334
23563
  server.tool(
23335
23564
  "okx_get_subaccount_assets",
23336
23565
  "## \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",
@@ -23443,6 +23672,75 @@ function registerFinanceTools(server, auth) {
23443
23672
  }
23444
23673
  }
23445
23674
  );
23675
+ server.tool(
23676
+ "okx_get_staking_orders",
23677
+ "## \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",
23678
+ {
23679
+ productId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u5982 ETH\u3002\u53EF\u9009"),
23680
+ 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"),
23681
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
23682
+ },
23683
+ async ({ productId, state, limit }) => {
23684
+ if (!auth) return toError(AUTH_REQUIRED);
23685
+ try {
23686
+ const data = await privateApi.getStakingOrders(auth, productId, state, limit);
23687
+ return toResult(data);
23688
+ } catch (e) {
23689
+ return toError(e);
23690
+ }
23691
+ }
23692
+ );
23693
+ server.tool(
23694
+ "okx_stake_eth",
23695
+ "## \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",
23696
+ {
23697
+ amt: external_exports.string().describe("\u8D28\u62BC\u6570\u91CF\uFF08ETH\uFF09\u3002\u5FC5\u586B"),
23698
+ 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")
23699
+ },
23700
+ async ({ amt, rate }) => {
23701
+ if (!auth) return toError(AUTH_REQUIRED);
23702
+ try {
23703
+ const body = { amt };
23704
+ if (rate) body.rate = rate;
23705
+ const data = await privateApi.purchaseEthStaking(auth, body);
23706
+ return toResult(data);
23707
+ } catch (e) {
23708
+ return toError(e);
23709
+ }
23710
+ }
23711
+ );
23712
+ server.tool(
23713
+ "okx_unstake_eth",
23714
+ "## \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",
23715
+ {
23716
+ amt: external_exports.string().describe("\u8D4E\u56DE\u6570\u91CF\uFF08ETH\uFF09\u3002\u5FC5\u586B")
23717
+ },
23718
+ async ({ amt }) => {
23719
+ if (!auth) return toError(AUTH_REQUIRED);
23720
+ try {
23721
+ const data = await privateApi.redeemEthStaking(auth, { amt });
23722
+ return toResult(data);
23723
+ } catch (e) {
23724
+ return toError(e);
23725
+ }
23726
+ }
23727
+ );
23728
+ server.tool(
23729
+ "okx_get_sol_staking_history",
23730
+ "## \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",
23731
+ {
23732
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
23733
+ },
23734
+ async ({ limit }) => {
23735
+ if (!auth) return toError(AUTH_REQUIRED);
23736
+ try {
23737
+ const data = await privateApi.getSolStakingHistory(auth, limit);
23738
+ return toResult(data);
23739
+ } catch (e) {
23740
+ return toError(e);
23741
+ }
23742
+ }
23743
+ );
23446
23744
  }
23447
23745
 
23448
23746
  // src/tools/outcomes.ts
@@ -24059,7 +24357,7 @@ async function main() {
24059
24357
  const server = new McpServer({ name: "hvip", version: "0.2.1" });
24060
24358
  const auth = getAuth();
24061
24359
  registerMarketTools(server);
24062
- registerPublicTools(server);
24360
+ registerPublicTools(server, auth);
24063
24361
  registerStatsTools(server);
24064
24362
  registerSpreadTools(server);
24065
24363
  registerOutcomesTools(server);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hvip-mcp-server",
3
- "version": "0.2.18",
3
+ "version": "0.2.20",
4
4
  "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",