hvip-mcp-server 0.2.33 → 0.2.35

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 (3) hide show
  1. package/README.md +3 -3
  2. package/dist/index.js +264 -18
  3. package/package.json +41 -41
package/README.md CHANGED
@@ -1,3 +1,3 @@
1
- # OKX MCP Server
2
-
3
- OKX API 全景图 —— 让任何 AI Agent 都能使用 OKX 的全部能力。
1
+ # OKX MCP Server
2
+
3
+ OKX API 全景图 —— 让任何 AI Agent 都能使用 OKX 的全部能力。
package/dist/index.js CHANGED
@@ -21394,6 +21394,7 @@ var privateApi = {
21394
21394
  getFundingRateHistory: (instId, before, after, limit) => request("GET", "/api/v5/public/funding-rate-history", { params: { instId, before, after, limit } }),
21395
21395
  getInterestRateLoanQuota: () => request("GET", "/api/v5/public/interest-rate-loan-quota"),
21396
21396
  getPremiumHistory: (instId, period) => request("GET", "/api/v5/public/premium-history", { params: { instId, period } }),
21397
+ getInstrumentTickBands: (instType) => request("GET", "/api/v5/public/instrument-tick-bands", { params: { instType } }),
21397
21398
  getSettlementHistory: (instType, instFamily, uly) => request("GET", "/api/v5/public/settlement-history", { params: { instType, instFamily, uly } }),
21398
21399
  getEventSeries: () => request("GET", "/api/v5/public/event-contract/series"),
21399
21400
  getEventMarkets: (seriesId) => request("GET", "/api/v5/public/event-contract/markets", { params: { seriesId } }),
@@ -22053,7 +22054,7 @@ function registerPublicTools(server, auth) {
22053
22054
  );
22054
22055
  server.tool(
22055
22056
  "okx_get_mark_price",
22056
- "\u83B7\u53D6\u6807\u8BB0\u4EF7\u683C\u3002\u6807\u8BB0\u4EF7\u683C\u7528\u4E8E\u8BA1\u7B97\u6D6E\u52A8\u76C8\u4E8F\u548C\u5F3A\u5E73\u4EF7\u683C\uFF0C\u4E0E\u6307\u6570\u4EF7\u683C\u504F\u5DEE\u8FC7\u5927\u65F6\u5B58\u5728\u5957\u5229\u7A7A\u95F4\u3002\u4E0D\u4F20instId\u8FD4\u56DE\u5168\u91CF(~30KB)\uFF0C\u5DF2\u81EA\u52A8\u622A\u65ADtop20\u3002",
22057
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5408\u7EA6\u6807\u8BB0\u4EF7\u683C\uFF0C\u7528\u4E8E\u8BA1\u7B97\u6D6E\u52A8\u76C8\u4E8F\u548C\u5F3A\u5E73\u4EF7\u683C\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5408\u7EA6\u5F53\u524D\u6807\u8BB0\u4EF7\u3001\u5224\u65AD\u4E0E\u6307\u6570\u4EF7\u683C\u504F\u5DEE\u3001\u53D1\u73B0\u5957\u5229\u7A7A\u95F4\u3001\u6279\u91CF\u76D1\u63A7\u6807\u8BB0\u4EF7\u683C\n## \u5173\u952E\u8BCD\uFF1A\u6807\u8BB0\u4EF7\u683C, mark price, \u6807\u8BB0\u4EF7, \u5F3A\u5E73\u4EF7\u683C, \u6D6E\u52A8\u76C8\u4E8F, \u5957\u5229\u7A7A\u95F4\n## \u53C2\u6570\uFF1A\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743\n## - instId: \u4EA7\u54C1ID\uFF0C\u4E0D\u586B\u5219\u8FD4\u56DE\u8BE5\u7C7B\u578B\u5168\u91CF\uFF08~30KB\uFF0C\u5DF2\u81EA\u52A8\u622A\u65ADtop20\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\u5355\u4EA7\u54C1 ~500B\uFF0C\u5168\u91CF ~30KB\uFF08\u5DF2\u81EA\u52A8\u622A\u65AD top 20\uFF09\n## \u5173\u8054\uFF1Aokx_get_index_price \u770B\u6307\u6570\u4EF7 \u2192 \u672C\u5DE5\u5177\u770B\u6807\u8BB0\u4EF7 \u2192 \u5BF9\u6BD4\u57FA\u5DEE \u2192 okx_get_ticker \u770B\u6700\u65B0\u4EF7",
22057
22058
  {
22058
22059
  instType: external_exports.enum(INST_TYPE_PUBLIC).describe("\u4EA7\u54C1\u7C7B\u578B\u3002MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743"),
22059
22060
  instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u4E0D\u586B\u5219\u8FD4\u56DE\u8BE5\u7C7B\u578B\u5168\u91CF")
@@ -22074,7 +22075,7 @@ function registerPublicTools(server, auth) {
22074
22075
  );
22075
22076
  server.tool(
22076
22077
  "okx_get_index_price",
22077
- "\u83B7\u53D6\u6307\u6570\u4EF7\u683C\uFF08\u591A\u4EA4\u6613\u6240\u52A0\u6743\u5747\u4EF7\uFF09\u3002\u7528\u4E8E\u5224\u65AD\u73B0\u8D27\u5E02\u573A\u6574\u4F53\u4EF7\u683C\u57FA\u51C6\uFF0C\u4E0E\u6807\u8BB0\u4EF7\u683C\u5BF9\u6BD4\u53EF\u53D1\u73B0\u504F\u5DEE\u3002",
22078
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u6307\u6570\u4EF7\u683C\uFF08\u591A\u4EA4\u6613\u6240\u52A0\u6743\u5747\u4EF7\uFF09\uFF0C\u53CD\u6620\u73B0\u8D27\u5E02\u573A\u6574\u4F53\u4EF7\u683C\u57FA\u51C6\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u73B0\u8D27\u5E02\u573A\u6574\u4F53\u4EF7\u683C\u3001\u4E0E\u6807\u8BB0\u4EF7\u683C\u5BF9\u6BD4\u53D1\u73B0\u504F\u5DEE\u3001\u8BC4\u4F30\u5408\u7EA6\u6EA2\u4EF7/\u6298\u4EF7\n## \u5173\u952E\u8BCD\uFF1A\u6307\u6570\u4EF7\u683C, index price, \u52A0\u6743\u5747\u4EF7, \u73B0\u8D27\u57FA\u51C6, \u6307\u6570\u4EF7, \u591A\u4EA4\u6613\u6240\u5747\u4EF7\n## \u53C2\u6570\uFF1A\n## - instId: \u6307\u6570\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\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 ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u6307\u6570\u4EF7 \u2192 okx_get_mark_price \u770B\u6807\u8BB0\u4EF7 \u2192 \u5BF9\u6BD4\u504F\u5DEE \u2192 \u5224\u65AD\u5957\u5229\u7A7A\u95F4",
22078
22079
  { instId: external_exports.string().describe("\u6307\u6570\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT") },
22079
22080
  async ({ instId }) => {
22080
22081
  try {
@@ -22091,7 +22092,7 @@ function registerPublicTools(server, auth) {
22091
22092
  );
22092
22093
  server.tool(
22093
22094
  "okx_get_open_interest",
22094
- "\u83B7\u53D6\u5408\u7EA6\u6301\u4ED3\u91CF\u3002\u6301\u4ED3\u91CF\u5FEB\u901F\u589E\u52A0\u901A\u5E38\u610F\u5473\u7740\u65B0\u8D44\u91D1\u5165\u573A\uFF0C\u7ED3\u5408\u4EF7\u683C\u65B9\u5411\u53EF\u5224\u65AD\u8D8B\u52BF\u5F3A\u5EA6\u3002\u4E0D\u4F20instId\u8FD4\u56DE\u5168\u91CF(~77KB)\uFF0C\u5DF2\u81EA\u52A8\u622A\u65ADtop20\u3002",
22095
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5408\u7EA6\u6301\u4ED3\u91CF\u6570\u636E\uFF0C\u53CD\u6620\u5E02\u573A\u53C2\u4E0E\u5EA6\u548C\u8D44\u91D1\u6D41\u5411\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u65B0\u8D44\u91D1\u5165\u573A\uFF08\u6301\u4ED3\u91CF\u5FEB\u901F\u589E\u52A0\uFF09\u3001\u5206\u6790\u8D8B\u52BF\u5F3A\u5EA6\u3001\u6279\u91CF\u76D1\u63A7\u5408\u7EA6\u6301\u4ED3\n## \u5173\u952E\u8BCD\uFF1A\u6301\u4ED3\u91CF, open interest, OI, \u672A\u5E73\u4ED3\u91CF, \u8D44\u91D1\u6D41\u5165, \u5E02\u573A\u53C2\u4E0E\u5EA6, \u5408\u7EA6\u6301\u4ED3\n## \u53C2\u6570\uFF1A\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743\n## - instId: \u4EA7\u54C1ID\uFF0C\u4E0D\u586B\u5219\u8FD4\u56DE\u5168\u91CF\uFF08~77KB\uFF0C\u5DF2\u81EA\u52A8\u622A\u65ADtop20\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\u5355\u4EA7\u54C1 ~500B\uFF0C\u5168\u91CF ~77KB\uFF08\u5DF2\u81EA\u52A8\u622A\u65AD top 20\uFF09\n## \u5173\u8054\uFF1Aokx_get_ticker \u770B\u4EF7\u683C\u65B9\u5411 \u2192 \u672C\u5DE5\u5177\u770B\u6301\u4ED3\u91CF\u53D8\u5316 \u2192 \u91CF\u4EF7\u7ED3\u5408\u5224\u65AD\u8D8B\u52BF",
22095
22096
  {
22096
22097
  instType: external_exports.enum(INST_TYPE_CONTRACTS).describe("\u4EA7\u54C1\u7C7B\u578B\u3002SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743"),
22097
22098
  instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u4E0D\u586B\u5219\u8FD4\u56DE\u5168\u91CF")
@@ -22112,7 +22113,7 @@ function registerPublicTools(server, auth) {
22112
22113
  );
22113
22114
  server.tool(
22114
22115
  "okx_get_system_time",
22115
- "\u83B7\u53D6OKX\u670D\u52A1\u5668\u5F53\u524D\u65F6\u95F4\u6233\u3002\u7528\u4E8E\u6821\u51C6\u672C\u5730\u65F6\u95F4\u504F\u5DEE\uFF0C\u786E\u4FDD\u7B7E\u540D\u8BF7\u6C42\u7684\u65F6\u95F4\u6233\u5728\u6709\u6548\u8303\u56F4\u5185\uFF08\xB130\u79D2\uFF09\u3002",
22116
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6OKX\u670D\u52A1\u5668\u5F53\u524D\u65F6\u95F4\u6233\n## \u573A\u666F\uFF1A\u7528\u4E8E\u6821\u51C6\u672C\u5730\u65F6\u95F4\u504F\u5DEE\u3001\u786E\u4FDD\u7B7E\u540D\u8BF7\u6C42\u7684\u65F6\u95F4\u6233\u5728\u6709\u6548\u8303\u56F4\u5185\uFF08\xB130\u79D2\uFF09\u3001\u6392\u67E5\u9274\u6743\u5931\u8D25\n## \u5173\u952E\u8BCD\uFF1A\u670D\u52A1\u5668\u65F6\u95F4, system time, \u65F6\u95F4\u6233, \u65F6\u95F4\u6821\u51C6, \u7B7E\u540D\u65F6\u95F4, \u9274\u6743\u65F6\u95F4\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 ~200B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u6821\u51C6\u65F6\u95F4 \u2192 \u6240\u6709\u9274\u6743\u63A5\u53E3\u4F9D\u8D56\u6B63\u786E\u65F6\u95F4\u6233 \u2192 okx_place_order \u7B49\u4E0B\u5355",
22116
22117
  {},
22117
22118
  async () => {
22118
22119
  try {
@@ -22125,7 +22126,7 @@ function registerPublicTools(server, auth) {
22125
22126
  );
22126
22127
  server.tool(
22127
22128
  "okx_get_opt_summary",
22128
- "\u83B7\u53D6\u671F\u6743\u5E02\u573A\u6458\u8981\u6570\u636E\uFF0C\u542B\u5404\u5230\u671F\u65E5\u7684\u9690\u542B\u6CE2\u52A8\u7387\uFF08IV\uFF09\u3001\u672A\u5E73\u4ED3\u91CF\u548C\u6210\u4EA4\u91CF\u5206\u5E03\u3002\u7528\u4E8E\u671F\u6743\u4EA4\u6613\u524D\u7684\u6574\u4F53\u5E02\u573A\u626B\u63CF\u3002",
22129
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u671F\u6743\u5E02\u573A\u6458\u8981\u6570\u636E\uFF0C\u542B\u5404\u5230\u671F\u65E5\u7684\u9690\u542B\u6CE2\u52A8\u7387\uFF08IV\uFF09\u3001\u672A\u5E73\u4ED3\u91CF\u548C\u6210\u4EA4\u91CF\u5206\u5E03\n## \u573A\u666F\uFF1A\u7528\u4E8E\u671F\u6743\u4EA4\u6613\u524D\u5E02\u573A\u626B\u63CF\u3001\u5206\u6790\u6CE2\u52A8\u7387\u671F\u9650\u7ED3\u6784\u3001\u53D1\u73B0\u5F02\u5E38IV\u3001\u6309\u5230\u671F\u65E5\u7B5B\u9009\n## \u5173\u952E\u8BCD\uFF1A\u671F\u6743\u6458\u8981, opt summary, \u9690\u542B\u6CE2\u52A8\u7387, IV, \u671F\u6743\u672A\u5E73\u4ED3, \u6CE2\u52A8\u7387\u66F2\u7EBF, \u671F\u6743\u5E02\u573A\n## \u53C2\u6570\uFF1A\n## - uly: \u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USD\u3001ETH-USD\n## - expTime: \u5230\u671F\u65E5\u7B5B\u9009\uFF0C\u683C\u5F0F YYYYMMDD\uFF0C\u5982 20250101\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\u626B\u63CF\u671F\u6743\u5E02\u573A \u2192 okx_get_instruments(instType=OPTION) \u83B7\u53D6\u5177\u4F53\u5408\u7EA6 \u2192 okx_get_ticker \u67E5\u671F\u6743\u884C\u60C5",
22129
22130
  {
22130
22131
  uly: external_exports.string().describe("\u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USD\u3001ETH-USD"),
22131
22132
  expTime: external_exports.string().optional().describe("\u5230\u671F\u65E5\u7B5B\u9009\uFF0C\u683C\u5F0F YYYYMMDD\uFF0C\u5982 20250101")
@@ -22145,7 +22146,7 @@ function registerPublicTools(server, auth) {
22145
22146
  );
22146
22147
  server.tool(
22147
22148
  "okx_get_insurance_fund",
22148
- "\u83B7\u53D6OKX\u4FDD\u9669\u57FA\u91D1\u4F59\u989D\u53D8\u52A8\u5386\u53F2\u3002\u4FDD\u9669\u57FA\u91D1\u89C4\u6A21\u53CD\u6620\u4EA4\u6613\u6240\u62B5\u5FA1\u6781\u7AEF\u884C\u60C5\u7684\u80FD\u529B\uFF0C\u4E5F\u662F\u8861\u91CF\u5E73\u53F0\u98CE\u9669\u7684\u6307\u6807\u3002",
22149
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6OKX\u4FDD\u9669\u57FA\u91D1\u4F59\u989D\u53D8\u52A8\u5386\u53F2\uFF0C\u53CD\u6620\u4EA4\u6613\u6240\u62B5\u5FA1\u6781\u7AEF\u884C\u60C5\u7684\u80FD\u529B\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8BC4\u4F30\u5E73\u53F0\u98CE\u9669\u3001\u76D1\u63A7\u4FDD\u9669\u57FA\u91D1\u89C4\u6A21\u53D8\u5316\u3001\u6781\u7AEF\u884C\u60C5\u524D\u540E\u5BF9\u6BD4\u57FA\u91D1\u6D88\u8017\n## \u5173\u952E\u8BCD\uFF1A\u4FDD\u9669\u57FA\u91D1, insurance fund, \u5E73\u53F0\u98CE\u9669, \u6781\u7AEF\u884C\u60C5, \u4EA4\u6613\u6240\u4FDD\u969C, \u98CE\u9669\u6307\u6807\n## \u53C2\u6570\uFF1A\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743\n## - uly: \u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USD\uFF08SWAP/FUTURES/OPTION\u5FC5\u586B\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_instruments \u83B7\u53D6\u4EA7\u54C1 \u2192 \u672C\u5DE5\u5177\u770B\u4FDD\u9669\u57FA\u91D1 \u2192 \u8BC4\u4F30\u5E73\u53F0\u5065\u5EB7\u5EA6",
22149
22150
  {
22150
22151
  instType: external_exports.enum(INST_TYPE_MARGIN_PUB).describe("\u4EA7\u54C1\u7C7B\u578B\u3002MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743"),
22151
22152
  uly: external_exports.string().optional().describe("\u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USD\uFF08SWAP/FUTURES/OPTION\u5FC5\u586B\uFF09")
@@ -22165,7 +22166,7 @@ function registerPublicTools(server, auth) {
22165
22166
  );
22166
22167
  server.tool(
22167
22168
  "okx_convert_contract_coin",
22168
- "\u5408\u7EA6\u5F20\u6570\u4E0E\u5E01\u6570\u4E92\u6362\u8BA1\u7B97\u3002\u4E0B\u5408\u7EA6\u5355\u65F6\u5148\u7528\u6B64\u63A5\u53E3\u6362\u7B97\u5F20\u6570\uFF0C\u907F\u514D\u6570\u91CF\u586B\u9519\u3002",
22169
+ "## \u529F\u80FD\uFF1A\u5408\u7EA6\u5F20\u6570\u4E0E\u5E01\u6570\u4E92\u6362\u8BA1\u7B97\uFF0C\u4E0B\u5408\u7EA6\u5355\u524D\u6362\u7B97\u6570\u91CF\n## \u573A\u666F\uFF1A\u7528\u4E8E\u4E0B\u5355\u524D\u5C06\u5E01\u6570\u6362\u7B97\u4E3A\u5408\u7EA6\u5F20\u6570\u3001\u5F20\u6570\u6362\u5E01\u6570\u3001\u907F\u514D\u6570\u91CF\u586B\u9519\u5BFC\u81F4\u8BA2\u5355\u5931\u8D25\n## \u5173\u952E\u8BCD\uFF1A\u5F20\u6570\u6362\u7B97, \u5E01\u6570\u6362\u7B97, convert contract, \u5408\u7EA6\u6362\u7B97, \u5F20\u6570\u8BA1\u7B97, \u4E0B\u5355\u51C6\u5907\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\n## - sz: \u6570\u91CF\uFF08\u5F20\u6570\u6216\u5E01\u6570\uFF0C\u53D6\u51B3\u4E8Eunit\u53C2\u6570\u7684\u8BBE\u7F6E\uFF09\n## - unit: sz\u7684\u5355\u4F4D\u3002coin=\u5E01\uFF0Ccontracts=\u5F20\n## - opType: \u5F00\u4ED3\u6216\u5E73\u4ED3\u3002open=\u5F00\u4ED3, close=\u5E73\u4ED3\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\u4E0B\u5355\u524D\u5FC5\u8C03 \u2192 \u672C\u5DE5\u5177\u6362\u7B97\u6570\u91CF \u2192 okx_place_order \u4E0B\u5355",
22169
22170
  {
22170
22171
  instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP"),
22171
22172
  sz: external_exports.string().describe("\u6570\u91CF\uFF08\u5F20\u6570\u6216\u5E01\u6570\uFF0C\u53D6\u51B3\u4E8Eunit\uFF09"),
@@ -22183,7 +22184,7 @@ function registerPublicTools(server, auth) {
22183
22184
  );
22184
22185
  server.tool(
22185
22186
  "okx_get_announcements",
22186
- "\u83B7\u53D6OKX\u5B98\u65B9\u516C\u544A\u5217\u8868\uFF08\u7EF4\u62A4\u901A\u77E5\u3001\u65B0\u5E01\u4E0A\u7EBF\u3001\u6D3B\u52A8\u7B49\uFF09\u3002\u5B9A\u671F\u67E5\u8BE2\u53EF\u53CA\u65F6\u4E86\u89E3\u5E73\u53F0\u53D8\u5316\uFF0C\u63D0\u524D\u505A\u597D\u98CE\u9669\u51C6\u5907\u3002",
22187
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6OKX\u5B98\u65B9\u516C\u544A\u5217\u8868\uFF08\u7EF4\u62A4\u901A\u77E5\u3001\u65B0\u5E01\u4E0A\u7EBF\u3001\u6D3B\u52A8\u7B49\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u53CA\u65F6\u4E86\u89E3\u5E73\u53F0\u7EF4\u62A4\u8BA1\u5212\u3001\u8DDF\u8E2A\u65B0\u5E01\u4E0A\u7EBF\u4FE1\u606F\u3001\u63D0\u524D\u505A\u597D\u98CE\u9669\u51C6\u5907\n## \u5173\u952E\u8BCD\uFF1A\u516C\u544A, announcements, \u7EF4\u62A4\u901A\u77E5, \u65B0\u5E01\u4E0A\u7EBF, \u5E73\u53F0\u516C\u544A, \u6D3B\u52A8\u901A\u77E5\n## \u53C2\u6570\uFF1A\n## - annType: \u516C\u544A\u7C7B\u578BID\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\u3002\u53EF\u5148\u8C03\u7528 okx_get_announcement_types \u67E5\u8BE2\u53EF\u7528\u7C7B\u578B\n## - lang: \u8BED\u8A00\u3002zh-Hans=\u4E2D\u6587, en-US=\u82F1\u6587\u3002\u9ED8\u8BA4\u4E2D\u6587\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_announcement_types \u83B7\u53D6\u7C7B\u578B\u5217\u8868 \u2192 \u672C\u5DE5\u5177\u6309\u7C7B\u578B\u7B5B\u9009\u516C\u544A \u2192 \u8BC4\u4F30\u5BF9\u4EA4\u6613\u7684\u5F71\u54CD",
22187
22188
  {
22188
22189
  annType: external_exports.string().optional().describe("\u516C\u544A\u7C7B\u578BID\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\u3002\u53EF\u5148\u8C03\u7528 okx_get_announcement_types \u67E5\u8BE2\u53EF\u7528\u7C7B\u578B"),
22189
22190
  lang: external_exports.enum(["zh-Hans", "en-US"]).optional().describe("\u8BED\u8A00\uFF0C\u9ED8\u8BA4\u4E2D\u6587")
@@ -22640,6 +22641,21 @@ function registerPublicTools(server, auth) {
22640
22641
  }
22641
22642
  }
22642
22643
  );
22644
+ server.tool(
22645
+ "okx_get_instrument_tick_bands",
22646
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u4EA7\u54C1\u6700\u5C0F\u4EF7\u683C\u7CBE\u5EA6\u6863\u4F4D\n## \u573A\u666F\uFF1A\u7528\u4E8E\u4E86\u89E3\u671F\u6743\u4EA7\u54C1\u7684\u4EF7\u683C\u6700\u5C0F\u53D8\u52A8\u5355\u4F4D\uFF08tick size\uFF09\n## \u5173\u952E\u8BCD\uFF1ATick\u6863\u4F4D, tick bands, \u6700\u5C0F\u4EF7\u683C\u53D8\u52A8, \u4EF7\u683C\u7CBE\u5EA6\n## \u53C2\u6570\uFF1A\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002\u4EC5 OPTION \u652F\u6301\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\u4E2D\u7B49 ~10KB\n## \u5173\u8054\uFF1A\u6B64\u5DE5\u5177\u67E5\u7CBE\u5EA6 \u2192 okx_get_instruments \u67E5\u4EA7\u54C1\u89C4\u683C \u2192 \u4E0B\u5355\u65F6\u4F7F\u7528\u6B63\u786E\u4EF7\u683C",
22647
+ {
22648
+ instType: external_exports.enum(["OPTION"]).describe("\u4EA7\u54C1\u7C7B\u578B\u3002\u4EC5 OPTION \u652F\u6301\u6B64\u67E5\u8BE2")
22649
+ },
22650
+ async ({ instType }) => {
22651
+ try {
22652
+ const data = await publicApi.getInstrumentTickBands(instType);
22653
+ return toResult(data);
22654
+ } catch (e) {
22655
+ return toError(e);
22656
+ }
22657
+ }
22658
+ );
22643
22659
  }
22644
22660
 
22645
22661
  // src/tools/account.ts
@@ -23366,7 +23382,7 @@ function registerAccountTools(server, auth) {
23366
23382
  function registerTradingTools(server, auth) {
23367
23383
  server.tool(
23368
23384
  "okx_place_order",
23369
- "\u5728OKX\u4E0B\u5355\u3002\u26A0\uFE0F \u6B64\u64CD\u4F5C\u4F1A\u4EA7\u751F\u771F\u5B9E\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u660E\u786E\u786E\u8BA4\u4EA7\u54C1\u3001\u65B9\u5411\u3001\u6570\u91CF\u548C\u4EF7\u683C\u3002\u9700\u8981API Key\u9274\u6743\u3002",
23385
+ "## \u529F\u80FD\uFF1A\u5728OKX\u4E0B\u5355\uFF08\u5E02\u4EF7/\u9650\u4EF7/\u53EA\u6302/\u5168\u90E8\u6210\u4EA4\u6216\u53D6\u6D88/\u7ACB\u5373\u6210\u4EA4\u5E76\u53D6\u6D88\u5269\u4F59\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5F00\u4ED3\u505A\u591A/\u505A\u7A7A\u3001\u9650\u4EF7\u6302\u5355\u3001\u5E02\u4EF7\u5FEB\u901F\u6210\u4EA4\u3001\u53EA\u6302\u5355\u4E0D\u6210\u4EA4\uFF08post_only\uFF09\n## \u5173\u952E\u8BCD\uFF1A\u4E0B\u5355, place order, \u5E02\u4EF7\u5355, \u9650\u4EF7\u5355, \u5F00\u4ED3, \u5E73\u4ED3, \u4E70\u5165, \u5356\u51FA\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\n## - tdMode: \u4EA4\u6613\u6A21\u5F0F\u3002cash=\u73B0\u8D27, isolated=\u9010\u4ED3, cross=\u5168\u4ED3\n## - side: \u4E70\u5356\u65B9\u5411\u3002buy=\u4E70\u5165, sell=\u5356\u51FA\n## - ordType: \u8BA2\u5355\u7C7B\u578B\u3002market=\u5E02\u4EF7, limit=\u9650\u4EF7, post_only=\u53EA\u6302, fok=\u5168\u6210\u6216\u53D6\u6D88, ioc=\u7ACB\u5373\u6210\u4EA4\u5E76\u53D6\u6D88\n## - sz: \u59D4\u6258\u6570\u91CF\uFF08\u6839\u636E\u4EA7\u54C1\u4E0D\u540C\u53EF\u4E3A\u5F20\u6570\u6216\u5E01\u6570\uFF0C\u4E0B\u5355\u524D\u5EFA\u8BAE\u5148\u7528 okx_convert_contract_coin \u6362\u7B97\uFF09\n## - px: \u59D4\u6258\u4EF7\u683C\uFF08\u9650\u4EF7\u5355\u5FC5\u586B\uFF09\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u4F1A\u4EA7\u751F\u771F\u5B9E\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u660E\u786E\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u521B\u5EFA\u771F\u5B9E\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\u4EA7\u54C1\u3001\u65B9\u5411\u3001\u6570\u91CF\u548C\u4EF7\u683C\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_ticker \u770B\u4EF7\u683C \u2192 okx_get_balance \u786E\u8BA4\u4F59\u989D \u2192 \u672C\u5DE5\u5177\u4E0B\u5355 \u2192 okx_get_order \u786E\u8BA4\u6210\u4EA4",
23370
23386
  {
23371
23387
  instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT"),
23372
23388
  tdMode: external_exports.enum(["cash", "isolated", "cross"]).describe("\u4EA4\u6613\u6A21\u5F0F\uFF1Acash=\u73B0\u8D27\uFF0Cisolated=\u9010\u4ED3\uFF0Ccross=\u5168\u4ED3"),
@@ -23389,7 +23405,7 @@ function registerTradingTools(server, auth) {
23389
23405
  );
23390
23406
  server.tool(
23391
23407
  "okx_cancel_order",
23392
- "\u64A4\u9500\u6307\u5B9A\u8BA2\u5355\u3002\u26A0\uFE0F \u9700\u8981API Key\u9274\u6743\u3002",
23408
+ "## \u529F\u80FD\uFF1A\u64A4\u9500\u6307\u5B9A\u8BA2\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u53D6\u6D88\u672A\u6210\u4EA4\u7684\u9650\u4EF7\u5355\u3001\u7EA0\u6B63\u8BEF\u4E0B\u5355\u3001\u6E05\u7A7A\u67D0\u4EA7\u54C1\u6302\u5355\n## \u5173\u952E\u8BCD\uFF1A\u64A4\u5355, cancel order, \u64A4\u9500\u8BA2\u5355, \u53D6\u6D88\u6302\u5355, \u53D6\u6D88\u59D4\u6258\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\n## - ordId: \u8BA2\u5355ID\uFF0C\u7531 okx_place_order \u8FD4\u56DE\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 \u64A4\u9500\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1Aokx_place_order \u4E0B\u5355 \u2192 okx_get_orders_pending \u67E5\u770B\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u64A4\u5355 \u2192 okx_get_order \u786E\u8BA4\u64A4\u9500",
23393
23409
  {
23394
23410
  instId: external_exports.string().describe("\u4EA7\u54C1ID"),
23395
23411
  ordId: external_exports.string().describe("\u8BA2\u5355ID")
@@ -23406,7 +23422,7 @@ function registerTradingTools(server, auth) {
23406
23422
  );
23407
23423
  server.tool(
23408
23424
  "okx_amend_order",
23409
- "\u4FEE\u6539\u672A\u6210\u4EA4\u8BA2\u5355\u7684\u4EF7\u683C\u6216\u6570\u91CF\u3002\u26A0\uFE0F \u9700\u8981API Key\u9274\u6743\u3002",
23425
+ "## \u529F\u80FD\uFF1A\u4FEE\u6539\u672A\u6210\u4EA4\u8BA2\u5355\u7684\u4EF7\u683C\u6216\u6570\u91CF\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8C03\u6574\u9650\u4EF7\u5355\u4EF7\u683C\u8DDF\u8FDB\u5E02\u573A\u3001\u51CF\u5C11\u59D4\u6258\u6570\u91CF\u3001\u4FEE\u6539\u6302\u5355\u53C2\u6570\n## \u5173\u952E\u8BCD\uFF1A\u6539\u5355, amend order, \u4FEE\u6539\u8BA2\u5355, \u6539\u4EF7, \u6539\u91CF, \u8C03\u6574\u59D4\u6258\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\n## - ordId: \u8BA2\u5355ID\n## - newSz: \u65B0\u59D4\u6258\u6570\u91CF\uFF08\u53EF\u9009\uFF09\n## - newPx: \u65B0\u59D4\u6258\u4EF7\u683C\uFF08\u53EF\u9009\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\u8BA2\u5355\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 \u67E5\u770B\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u6539\u5355 \u2192 okx_get_order \u786E\u8BA4\u4FEE\u6539",
23410
23426
  {
23411
23427
  instId: external_exports.string().describe("\u4EA7\u54C1ID"),
23412
23428
  ordId: external_exports.string().describe("\u8BA2\u5355ID"),
@@ -23428,7 +23444,7 @@ function registerTradingTools(server, auth) {
23428
23444
  );
23429
23445
  server.tool(
23430
23446
  "okx_get_orders_pending",
23431
- "\u67E5\u8BE2\u5F53\u524D\u6240\u6709\u672A\u6210\u4EA4\u6302\u5355\u5217\u8868\u3002\u7528\u4E8E\u76D1\u63A7\u672A\u6210\u4EA4\u8BA2\u5355\u3001\u68C0\u67E5\u9650\u4EF7\u5355\u662F\u5426\u4ECD\u5728\u961F\u5217\u4E2D\u3002\u26A0\uFE0F \u9700\u8981API Key\u9274\u6743\u3002",
23447
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5F53\u524D\u6240\u6709\u672A\u6210\u4EA4\u6302\u5355\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u76D1\u63A7\u672A\u6210\u4EA4\u8BA2\u5355\u3001\u68C0\u67E5\u9650\u4EF7\u5355\u662F\u5426\u4ECD\u5728\u961F\u5217\u4E2D\u3001\u6279\u91CF\u67E5\u770B\u6302\u5355\u72B6\u6001\n## \u5173\u952E\u8BCD\uFF1A\u6302\u5355\u67E5\u8BE2, orders pending, \u672A\u6210\u4EA4\u8BA2\u5355, \u9650\u4EF7\u5355\u72B6\u6001, \u59D4\u6258\u5217\u8868, \u5F53\u524D\u6302\u5355\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\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\n## - instId: \u4EA7\u54C1ID\uFF0C\u7CBE\u786E\u7B5B\u9009\n## - ordType: \u8BA2\u5355\u7C7B\u578B\u7B5B\u9009\u3002market/limit/post_only/fok/ioc\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\uFF1Aokx_place_order \u4E0B\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u770B\u6302\u5355 \u2192 okx_cancel_order \u64A4\u5355 / okx_amend_order \u6539\u5355",
23432
23448
  {
23433
23449
  instType: external_exports.enum(INST_TYPE_TRADE).optional().describe("\u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
23434
23450
  instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u7CBE\u786E\u7B5B\u9009"),
@@ -23446,7 +23462,7 @@ function registerTradingTools(server, auth) {
23446
23462
  );
23447
23463
  server.tool(
23448
23464
  "okx_get_fills",
23449
- "\u67E5\u8BE2\u6700\u8FD1\u7684\u6210\u4EA4\u660E\u7EC6\uFF08\u9010\u7B14\u6210\u4EA4\uFF09\uFF0C\u542B\u6210\u4EA4\u4EF7\u3001\u6210\u4EA4\u91CF\u548C\u624B\u7EED\u8D39\u3002\u6BD4\u8BA2\u5355\u5386\u53F2\u66F4\u7EC6\u7C92\u5EA6\uFF0C\u53EF\u7528\u4E8E\u7CBE\u786E\u8BA1\u7B97\u5747\u4EF7\u3002\u26A0\uFE0F \u9700\u8981API Key\u9274\u6743\u3002",
23465
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u6700\u8FD1\u7684\u6210\u4EA4\u660E\u7EC6\uFF08\u9010\u7B14\u6210\u4EA4\uFF09\uFF0C\u542B\u6210\u4EA4\u4EF7\u3001\u6210\u4EA4\u91CF\u548C\u624B\u7EED\u8D39\n## \u573A\u666F\uFF1A\u7528\u4E8E\u7CBE\u786E\u8BA1\u7B97\u6210\u4EA4\u5747\u4EF7\u3001\u6838\u5BF9\u6BCF\u7B14\u6210\u4EA4\u624B\u7EED\u8D39\u3001\u6BD4\u8BA2\u5355\u5386\u53F2\u66F4\u7EC6\u7C92\u5EA6\u5730\u590D\u76D8\n## \u5173\u952E\u8BCD\uFF1A\u6210\u4EA4\u660E\u7EC6, fills, \u9010\u7B14\u6210\u4EA4, \u6210\u4EA4\u8BB0\u5F55, \u624B\u7EED\u8D39\u660E\u7EC6, \u5747\u4EF7\u8BA1\u7B97\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: \u4EA7\u54C1ID\n## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\uFF0C\u6700\u5927100\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\uFF1A100\u6761 ~10KB \u2014 \u4E2D\u7B49\n## \u5173\u8054\uFF1Aokx_place_order \u4E0B\u5355 \u2192 \u672C\u5DE5\u5177\u770B\u6210\u4EA4\u660E\u7EC6 \u2192 okx_get_fills_history \u67E5\u5386\u53F2\u6210\u4EA4",
23450
23466
  {
23451
23467
  instType: external_exports.enum(INST_TYPE_TRADE).optional().describe("\u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743"),
23452
23468
  instId: external_exports.string().optional().describe("\u4EA7\u54C1ID"),
@@ -23464,7 +23480,7 @@ function registerTradingTools(server, auth) {
23464
23480
  );
23465
23481
  server.tool(
23466
23482
  "okx_get_orders_history_archive",
23467
- "\u67E5\u8BE23\u4E2A\u6708\u4EE5\u524D\u7684\u5B8C\u6574\u5386\u53F2\u8BA2\u5355\uFF08\u5F52\u6863\u6570\u636E\uFF09\u3002\u7528\u4E8E\u957F\u671F\u4EA4\u6613\u8BB0\u5F55\u5206\u6790\u3002\u26A0\uFE0F \u9700\u8981API Key\u9274\u6743\u3002",
23483
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE23\u4E2A\u6708\u4EE5\u524D\u7684\u5B8C\u6574\u5386\u53F2\u8BA2\u5355\uFF08\u5F52\u6863\u6570\u636E\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u957F\u671F\u4EA4\u6613\u8BB0\u5F55\u5206\u6790\u3001\u5E74\u5EA6\u4EA4\u6613\u590D\u76D8\u3001\u5BA1\u8BA1\u5F52\u6863\u6570\u636E\n## \u5173\u952E\u8BCD\uFF1A\u5F52\u6863\u8BA2\u5355, orders history archive, \u5386\u53F2\u5F52\u6863, \u957F\u671F\u8BB0\u5F55, \u8BA2\u5355\u5B58\u6863\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## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA450\uFF0C\u6700\u5927100\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\uFF1Aokx_get_orders_history \u67E5\u8FD1\u671F\u8BA2\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u5F52\u6863 \u2192 \u5B8C\u6574\u4EA4\u6613\u590D\u76D8",
23468
23484
  {
23469
23485
  instType: external_exports.enum(INST_TYPE_TRADE).describe("\u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743"),
23470
23486
  limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA450")
@@ -23897,7 +23913,7 @@ function registerTradingTools(server, auth) {
23897
23913
  function registerAlgoTools(server, auth) {
23898
23914
  server.tool(
23899
23915
  "okx_get_algo_orders",
23900
- "\u67E5\u8BE2\u5F53\u524D\u6302\u5355\u4E2D\u7684\u7B56\u7565\u59D4\u6258\u5355\uFF08\u6B62\u76C8\u6B62\u635F\u3001\u51B0\u5C71\u3001\u65F6\u95F4\u52A0\u6743\u7B49\uFF09\u3002\u26A0\uFE0F \u9700\u8981API Key\u9274\u6743\u3002",
23916
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5F53\u524D\u6302\u5355\u4E2D\u7684\u7B56\u7565\u59D4\u6258\u5355\uFF08\u6B62\u76C8\u6B62\u635F\u3001\u51B0\u5C71\u3001\u65F6\u95F4\u52A0\u6743\u7B49\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5F53\u524D\u751F\u6548\u7684\u7B56\u7565\u5355\u3001\u76D1\u63A7\u6B62\u76C8\u6B62\u635F\u6302\u5355\u3001\u68C0\u67E5\u51B0\u5C71/TWAP\u6267\u884C\u72B6\u6001\n## \u5173\u952E\u8BCD\uFF1A\u7B56\u7565\u59D4\u6258, algo orders, \u6B62\u76C8\u6B62\u635F, \u6761\u4EF6\u5355, \u51B0\u5C71\u59D4\u6258, TWAP, \u7B56\u7565\u5355\u67E5\u8BE2\n## \u53C2\u6570\uFF1A\n## - ordType: \u7B56\u7565\u7C7B\u578B\u3002conditional=\u6761\u4EF6\u5355, oco=OCO\u8BA2\u5355, trigger=\u89E6\u53D1\u5355, move_order_stop=\u79FB\u52A8\u6B62\u635F, iceberg=\u51B0\u5C71, twap=\u65F6\u95F4\u52A0\u6743\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743\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_place_algo_order \u4E0B\u7B56\u7565\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u770B\u6302\u5355 \u2192 okx_cancel_algo_order \u64A4\u9500",
23901
23917
  {
23902
23918
  ordType: external_exports.enum(["conditional", "oco", "trigger", "move_order_stop", "iceberg", "twap"]).describe("\u7B56\u7565\u7C7B\u578B"),
23903
23919
  instType: external_exports.enum(INST_TYPE_TRADE).optional().describe("\u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743")
@@ -23914,7 +23930,7 @@ function registerAlgoTools(server, auth) {
23914
23930
  );
23915
23931
  server.tool(
23916
23932
  "okx_get_algo_orders_history",
23917
- "\u67E5\u8BE2\u5386\u53F2\u7B56\u7565\u59D4\u6258\u5355\u8BB0\u5F55\u3002\u26A0\uFE0F \u9700\u8981API Key\u9274\u6743\u3002",
23933
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5386\u53F2\u7B56\u7565\u59D4\u6258\u5355\u8BB0\u5F55\uFF08\u5DF2\u89E6\u53D1/\u5DF2\u64A4\u9500/\u5931\u8D25\u7684\u7B56\u7565\u5355\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u590D\u76D8\u7B56\u7565\u5355\u6267\u884C\u60C5\u51B5\u3001\u5206\u6790\u6B62\u76C8\u6B62\u635F\u89E6\u53D1\u5386\u53F2\u3001\u6392\u67E5\u7B56\u7565\u5931\u8D25\u539F\u56E0\n## \u5173\u952E\u8BCD\uFF1A\u7B56\u7565\u5386\u53F2, algo orders history, \u7B56\u7565\u8BB0\u5F55, \u5386\u53F2\u6761\u4EF6\u5355, \u6B62\u76C8\u6B62\u635F\u5386\u53F2, \u7B56\u7565\u590D\u76D8\n## \u53C2\u6570\uFF1A\n## - ordType: \u7B56\u7565\u7C7B\u578B\u3002conditional=\u6761\u4EF6\u5355, oco=OCO, trigger=\u89E6\u53D1\u5355, move_order_stop=\u79FB\u52A8\u6B62\u635F, iceberg=\u51B0\u5C71, twap=\u65F6\u95F4\u52A0\u6743\n## - state: \u8BA2\u5355\u72B6\u6001\u3002effective=\u5DF2\u751F\u6548, canceled=\u5DF2\u64A4\u9500, order_failed=\u5931\u8D25\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743\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\uFF1Aokx_get_algo_orders \u67E5\u770B\u5F53\u524D\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u5386\u53F2 \u2192 \u5206\u6790\u7B56\u7565\u6548\u679C",
23918
23934
  {
23919
23935
  ordType: external_exports.enum(["conditional", "oco", "trigger", "move_order_stop", "iceberg", "twap"]).describe("\u7B56\u7565\u7C7B\u578B"),
23920
23936
  state: external_exports.enum(["effective", "canceled", "order_failed"]).describe("\u8BA2\u5355\u72B6\u6001"),
@@ -23932,7 +23948,7 @@ function registerAlgoTools(server, auth) {
23932
23948
  );
23933
23949
  server.tool(
23934
23950
  "okx_place_algo_order",
23935
- "\u4E0B\u7B56\u7565\u59D4\u6258\u5355\uFF08\u6B62\u76C8\u6B62\u635F\u3001\u6761\u4EF6\u5355\u7B49\uFF09\u3002\u26A0\uFE0F \u6B64\u64CD\u4F5C\u4F1A\u4EA7\u751F\u771F\u5B9E\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\u3002\u9700\u8981API Key\u9274\u6743\u3002",
23951
+ "## \u529F\u80FD\uFF1A\u4E0B\u7B56\u7565\u59D4\u6258\u5355\uFF08\u6B62\u76C8\u6B62\u635F\u3001\u6761\u4EF6\u5355\u3001OCO\u7B49\uFF09\uFF0C\u5728\u6EE1\u8DB3\u6761\u4EF6\u65F6\u81EA\u52A8\u89E6\u53D1\u4E0B\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8BBE\u7F6E\u6B62\u76C8\u6B62\u635F\u81EA\u52A8\u5E73\u4ED3\u3001\u5728\u4EF7\u683C\u7A81\u7834\u65F6\u81EA\u52A8\u5F00\u4ED3\u3001\u8BBE\u7F6EOCO\u4E8C\u9009\u4E00\u8BA2\u5355\n## \u5173\u952E\u8BCD\uFF1A\u4E0B\u7B56\u7565\u5355, place algo, \u6B62\u76C8\u6B62\u635F\u4E0B\u5355, \u6761\u4EF6\u5355, OCO\u4E0B\u5355, \u81EA\u52A8\u89E6\u53D1\n## \u53C2\u6570\uFF1A\n## - params: \u8BA2\u5355\u53C2\u6570\uFF08JSON\u5BF9\u8C61\uFF09\uFF0C\u53C2\u8003OKX\u6587\u6863\u3002\u542B instId/tdMode/side/ordType/sz/px \u53CA\u7B56\u7565\u53C2\u6570\u5982 slTriggerPx/tpTriggerPx\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u4F1A\u4EA7\u751F\u771F\u5B9E\u7B56\u7565\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u521B\u5EFA\u7B56\u7565\u8BA2\u5355\uFF0C\u53EF\u80FD\u81EA\u52A8\u89E6\u53D1\u771F\u5B9E\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_algo_orders \u67E5\u770B\u5F53\u524D\u7B56\u7565 \u2192 \u672C\u5DE5\u5177\u4E0B\u7B56\u7565\u5355 \u2192 okx_get_algo_orders \u786E\u8BA4",
23936
23952
  { params: external_exports.record(external_exports.unknown()).describe("\u8BA2\u5355\u53C2\u6570\uFF0C\u53C2\u8003OKX\u6587\u6863") },
23937
23953
  async ({ params }) => {
23938
23954
  if (!auth) return toError(AUTH_REQUIRED);
@@ -23946,7 +23962,7 @@ function registerAlgoTools(server, auth) {
23946
23962
  );
23947
23963
  server.tool(
23948
23964
  "okx_cancel_algo_order",
23949
- "\u64A4\u9500\u7B56\u7565\u59D4\u6258\u5355\u3002\u26A0\uFE0F \u9700\u8981API Key\u9274\u6743\u3002",
23965
+ "## \u529F\u80FD\uFF1A\u64A4\u9500\u6307\u5B9A\u7684\u7B56\u7565\u59D4\u6258\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u53D6\u6D88\u4E0D\u518D\u9700\u8981\u7684\u6B62\u76C8\u6B62\u635F\u3001\u5173\u95ED\u6761\u4EF6\u5355\u3001\u8C03\u6574\u7B56\u7565\u524D\u5148\u64A4\u65E7\u5355\n## \u5173\u952E\u8BCD\uFF1A\u64A4\u9500\u7B56\u7565, cancel algo, \u53D6\u6D88\u6B62\u76C8\u6B62\u635F, \u64A4\u7B56\u7565\u5355, \u53D6\u6D88\u6761\u4EF6\u5355\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\n## - algoId: \u7B56\u7565\u8BA2\u5355ID\uFF0C\u7531 okx_place_algo_order \u8FD4\u56DE\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 \u64A4\u9500\u7B56\u7565\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1Aokx_get_algo_orders \u67E5\u770B\u7B56\u7565\u5217\u8868 \u2192 \u672C\u5DE5\u5177\u64A4\u9500 \u2192 okx_get_algo_orders_history \u786E\u8BA4\u64A4\u9500",
23950
23966
  {
23951
23967
  instId: external_exports.string().describe("\u4EA7\u54C1ID"),
23952
23968
  algoId: external_exports.string().describe("\u7B56\u7565\u8BA2\u5355ID")
@@ -27129,6 +27145,235 @@ function registerFiatTools(server, auth) {
27129
27145
  );
27130
27146
  }
27131
27147
 
27148
+ // src/tools/agent-utils.ts
27149
+ function registerAgentUtils(server, auth) {
27150
+ server.tool(
27151
+ "okx_account_overview",
27152
+ '## \u529F\u80FD\uFF1A\u4E00\u952E\u83B7\u53D6\u8D26\u6237\u5168\u666F\uFF1A\u4F59\u989D\u3001\u6301\u4ED3\u3001\u914D\u7F6E\u3001\u603B\u4F30\u503C\uFF0C\u66FF\u4EE3\u4E32\u884C\u8C03\u7528 4 \u4E2A\u5DE5\u5177\n## \u573A\u666F\uFF1A\u7528\u4E8EAgent\u9996\u6B21\u4E86\u89E3\u7528\u6237\u8D26\u6237\u5168\u8C8C\u3001\u56DE\u7B54"\u6211\u8D26\u6237\u73B0\u5728\u4EC0\u4E48\u60C5\u51B5"\u3001\u6BCF\u65E5\u8D44\u4EA7\u6982\u89C8\n## \u5173\u952E\u8BCD\uFF1A\u8D26\u6237\u5168\u666F, \u8D26\u6237\u6982\u89C8, account overview, \u8D44\u4EA7\u5FEB\u7167, \u6301\u4ED3\u6C47\u603B, \u4E00\u952E\u67E5\u8D26\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 ~3KB \u2014 \u7ED3\u6784\u5316\u6458\u8981\uFF0C\u975E\u539F\u59CBJSON\u5806\u780C\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u5168\u666F \u2192 okx_get_positions \u6DF1\u5165\u5355\u4ED3\u4F4D \u2192 okx_get_balance \u770B\u5404\u5E01\u79CD \u2192 okx_place_order \u4EA4\u6613',
27153
+ {},
27154
+ async () => {
27155
+ if (!auth) return toError(AUTH_REQUIRED);
27156
+ try {
27157
+ const [balance, positions, config2, valuation] = await Promise.allSettled([
27158
+ privateApi.getBalance(auth),
27159
+ privateApi.getPositions(auth),
27160
+ privateApi.getAccountConfig(auth),
27161
+ privateApi.getAssetValuation(auth)
27162
+ ]);
27163
+ const balanceData = balance.status === "fulfilled" ? balance.value : [];
27164
+ const totalEq = balanceData.length > 0 ? balanceData[0]?.totalEq : "N/A";
27165
+ const details = balanceData.length > 0 ? balanceData[0]?.details ?? [] : [];
27166
+ const nonZero = details.filter((d) => parseFloat(d.availBal || d.cashBal || "0") > 0);
27167
+ const balanceSummary = nonZero.map((d) => ({
27168
+ ccy: d.ccy,
27169
+ equity: d.eq ?? d.cashBal,
27170
+ avail: d.availBal ?? d.cashBal,
27171
+ frozen: d.frozenBal ?? "0",
27172
+ upl: d.upl
27173
+ }));
27174
+ const posData = positions.status === "fulfilled" ? positions.value : [];
27175
+ const activePositions = posData.filter(
27176
+ (p) => parseFloat(p.avgPx || "0") > 0 || parseFloat(p.pos || "0") !== 0
27177
+ );
27178
+ const posSummary = activePositions.map((p) => ({
27179
+ instId: p.instId,
27180
+ posSide: p.posSide,
27181
+ pos: p.pos,
27182
+ avgPx: p.avgPx,
27183
+ markPx: p.markPx,
27184
+ upl: p.upl,
27185
+ uplRatio: p.uplRatio,
27186
+ lever: p.lever,
27187
+ margin: p.margin,
27188
+ liqPx: p.liqPx
27189
+ }));
27190
+ const cfg = config2.status === "fulfilled" ? config2.value?.[0] ?? {} : {};
27191
+ const val = valuation.status === "fulfilled" ? valuation.value?.[0] ?? {} : {};
27192
+ const overview = {
27193
+ totalEquity: totalEq,
27194
+ totalValue: val.totalBal ?? "N/A",
27195
+ valuationCurrency: val.ccy ?? "USD",
27196
+ balance: {
27197
+ currencyCount: balanceSummary.length,
27198
+ currencies: balanceSummary.slice(0, 10)
27199
+ // top 10 非零币种
27200
+ },
27201
+ positions: {
27202
+ activeCount: posSummary.length,
27203
+ list: posSummary.slice(0, 20)
27204
+ // top 20
27205
+ },
27206
+ config: {
27207
+ acctLv: cfg.acctLv,
27208
+ posMode: cfg.posMode,
27209
+ autoLoan: cfg.autoLoan
27210
+ },
27211
+ errors: [
27212
+ balance.status === "rejected" ? `\u4F59\u989D\u67E5\u8BE2\u5931\u8D25: ${balance.reason?.message}` : null,
27213
+ positions.status === "rejected" ? `\u6301\u4ED3\u67E5\u8BE2\u5931\u8D25: ${positions.reason?.message}` : null,
27214
+ config2.status === "rejected" ? `\u914D\u7F6E\u67E5\u8BE2\u5931\u8D25: ${config2.reason?.message}` : null,
27215
+ valuation.status === "rejected" ? `\u4F30\u503C\u67E5\u8BE2\u5931\u8D25: ${valuation.reason?.message}` : null
27216
+ ].filter(Boolean)
27217
+ };
27218
+ return toResult(overview);
27219
+ } catch (e) {
27220
+ return toError(e);
27221
+ }
27222
+ }
27223
+ );
27224
+ server.tool(
27225
+ "okx_quick_market",
27226
+ '## \u529F\u80FD\uFF1A\u5355\u6B21\u8C03\u7528\u8FD4\u56DE\u6307\u5B9A\u4EA7\u54C1\u7684\u884C\u60C5+5\u6863\u6DF1\u5EA6+\u8D44\u91D1\u8D39\u7387+\u4EA7\u54C1\u89C4\u683C\u7684\u7ED3\u6784\u5316\u6458\u8981\n## \u573A\u666F\uFF1A\u7528\u4E8EAgent\u56DE\u7B54"\u73B0\u5728BTC\u4EC0\u4E48\u60C5\u51B5"\u65F6\u4E00\u6B21\u62FF\u5230\u5168\u90E8\u4FE1\u606F\u3001\u5FEB\u901F\u5224\u65AD\u4EA4\u6613\u65F6\u673A\n## \u5173\u952E\u8BCD\uFF1A\u5E02\u573A\u901F\u89C8, quick market, \u884C\u60C5+\u6DF1\u5EA6, \u4E00\u952E\u770B\u76D8, \u7EFC\u5408\u884C\u60C5, \u5E02\u573A\u6982\u51B5\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3001ETH-USDT-SWAP\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 \u7CBE\u7B805\u6863\u6DF1\u5EA6\uFF0C\u975E\u5168\u91CF\u8BA2\u5355\u7C3F\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u901F\u89C8 \u2192 okx_get_candles \u6DF1\u5165K\u7EBF\u5206\u6790 \u2192 okx_get_orderbook \u770B\u5168\u6DF1\u5EA6 \u2192 okx_place_order \u4E0B\u5355',
27227
+ {
27228
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3001ETH-USDT-SWAP")
27229
+ },
27230
+ async ({ instId }) => {
27231
+ try {
27232
+ const isSwap = instId.toUpperCase().includes("-SWAP");
27233
+ const isMargin = instId.toUpperCase().includes("MARGIN");
27234
+ const fetchers = [
27235
+ ["ticker", publicApi.getTicker(instId)],
27236
+ ["orderbook", publicApi.getOrderbook(instId, 5)]
27237
+ ];
27238
+ if (isSwap) {
27239
+ fetchers.push(["fundingRate", publicApi.getFundingRate(instId)]);
27240
+ }
27241
+ const keys = fetchers.map((f) => f[0]);
27242
+ const results = await Promise.allSettled(fetchers.map((f) => f[1]));
27243
+ const tickerIdx = keys.indexOf("ticker");
27244
+ const tickerRaw = results[tickerIdx]?.status === "fulfilled" ? results[tickerIdx].value : [];
27245
+ const tk = tickerRaw.length > 0 ? tickerRaw[0] : {};
27246
+ const obIdx = keys.indexOf("orderbook");
27247
+ const obRaw = results[obIdx]?.status === "fulfilled" ? results[obIdx].value : null;
27248
+ const obData = obRaw?.data?.[0] ?? obRaw;
27249
+ const asks = (obData?.asks ?? []).slice(0, 5);
27250
+ const bids = (obData?.bids ?? []).slice(0, 5);
27251
+ const spread = asks.length > 0 && bids.length > 0 ? (parseFloat(asks[0]?.[0] ?? "0") - parseFloat(bids[0]?.[0] ?? "0")).toFixed(2) : "N/A";
27252
+ let fundingRate = null;
27253
+ if (isSwap) {
27254
+ const frIdx = keys.indexOf("fundingRate");
27255
+ const frRaw = results[frIdx]?.status === "fulfilled" ? results[frIdx].value : [];
27256
+ const fr = frRaw.length > 0 ? frRaw[0] : {};
27257
+ fundingRate = {
27258
+ fundingRate: fr.fundingRate,
27259
+ nextFundingTime: fr.nextFundingTime ? new Date(parseInt(fr.nextFundingTime)).toISOString() : void 0
27260
+ };
27261
+ }
27262
+ const summary = {
27263
+ instId,
27264
+ productType: isSwap ? "\u6C38\u7EED\u5408\u7EA6" : isMargin ? "\u6760\u6746" : "\u73B0\u8D27/\u5176\u4ED6",
27265
+ ticker: {
27266
+ last: tk.last,
27267
+ bid: tk.bidPx,
27268
+ ask: tk.askPx,
27269
+ high24h: tk.high24h,
27270
+ low24h: tk.low24h,
27271
+ vol24h: tk.vol24h,
27272
+ change24h: tk.sodUtc8 ? `${tk.sodUtc8} (${tk.sodUtc0 ?? "-"}%)` : void 0
27273
+ },
27274
+ depth: {
27275
+ spread,
27276
+ top5Asks: asks.map((a) => ({ px: a[0], sz: a[1], orders: a[3] })),
27277
+ top5Bids: bids.map((b) => ({ px: b[0], sz: b[1], orders: b[3] }))
27278
+ },
27279
+ fundingRate,
27280
+ errors: results.map((r, i) => r.status === "rejected" ? `${keys[i]}\u5931\u8D25: ${r.reason?.message}` : null).filter(Boolean)
27281
+ };
27282
+ return toResult(summary);
27283
+ } catch (e) {
27284
+ return toError(e);
27285
+ }
27286
+ }
27287
+ );
27288
+ server.tool(
27289
+ "okx_preflight_check",
27290
+ "## \u529F\u80FD\uFF1A\u4E0B\u5355\u524D\u4E00\u6B21\u6027\u68C0\u67E5\uFF1A\u6700\u5927\u53EF\u5F00\u6570\u91CF\u3001\u9650\u4EF7\u8303\u56F4\u3001\u5408\u7EA6\u5F20\u6570\u6362\u7B97\u3001\u5F53\u524D\u4EF7\u683C\uFF0C\u907F\u514D\u4E0B\u5355\u540E\u62A5\u9519\n## \u573A\u666F\uFF1A\u7528\u4E8EAgent\u4E0B\u5355\u524D\u5FC5\u8C03\u3001\u9A8C\u8BC1\u7528\u6237\u8F93\u5165\u7684\u6570\u91CF\u548C\u4EF7\u683C\u662F\u5426\u5408\u6CD5\u3001\u907F\u514D\u56E0\u53C2\u6570\u9519\u8BEF\u88AB\u62D2\n## \u5173\u952E\u8BCD\uFF1A\u4E0B\u5355\u9884\u68C0, preflight, \u4E0B\u5355\u524D\u68C0\u67E5, \u6570\u91CF\u6362\u7B97, \u9650\u4EF7\u68C0\u67E5, \u53EF\u5F00\u68C0\u67E5\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B\n## - tdMode: \u4EA4\u6613\u6A21\u5F0F\u3002cash=\u73B0\u8D27, cross=\u5168\u4ED3, isolated=\u9010\u4ED3\u3002\u5FC5\u586B\n## - sz: \u7528\u6237\u60F3\u4E0B\u5355\u7684\u6570\u91CF\u3002\u5FC5\u586B\uFF08\u5E01\u6570\uFF0C\u4F1A\u81EA\u52A8\u6362\u7B97\u4E3A\u5F20\u6570\uFF09\n## - px: \u7528\u6237\u60F3\u4E0B\u5355\u7684\u4EF7\u683C\uFF08\u9009\u586B\uFF0C\u586B\u4E86\u4F1A\u68C0\u67E5\u662F\u5426\u5728\u9650\u4EF7\u8303\u56F4\u5185\uFF09\n## - side: \u4E70\u5356\u65B9\u5411\u3002buy=\u4E70\u5165, sell=\u5356\u51FA\u3002\u586B\u4E86\u4F1A\u67E5\u5BF9\u5E94\u65B9\u5411\u7684\u6700\u5927\u53EF\u5F00\n## - ordType: \u8BA2\u5355\u7C7B\u578B\u3002\u586B\u4E86\u4F1A\u68C0\u67E5\u662F\u5426\u5728\u9650\u4EF7\u8303\u56F4\u5185\uFF08\u9650\u4EF7\u5355\u624D\u9700\u8981\uFF09\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09- \u53EA\u67E5\u8BE2\u4E0D\u4EA7\u751F\u8BA2\u5355\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\u9884\u68C0\u901A\u8FC7 \u2192 okx_place_order \u4E0B\u5355 \u2192 okx_get_order \u786E\u8BA4\u6210\u4EA4",
27291
+ {
27292
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B"),
27293
+ tdMode: external_exports.enum(["cash", "cross", "isolated"]).describe("\u4EA4\u6613\u6A21\u5F0F\u3002cash=\u73B0\u8D27, cross=\u5168\u4ED3, isolated=\u9010\u4ED3"),
27294
+ sz: external_exports.string().describe("\u7528\u6237\u60F3\u4E0B\u5355\u7684\u6570\u91CF\uFF08\u5E01\u6570\uFF0C\u4F1A\u81EA\u52A8\u6362\u7B97\uFF09"),
27295
+ px: external_exports.string().optional().describe("\u7528\u6237\u60F3\u4E0B\u5355\u7684\u4EF7\u683C\uFF08\u9009\u586B\uFF09"),
27296
+ side: external_exports.enum(["buy", "sell"]).optional().describe("\u4E70\u5356\u65B9\u5411"),
27297
+ ordType: external_exports.enum(["market", "limit", "post_only", "fok", "ioc"]).optional().describe("\u8BA2\u5355\u7C7B\u578B")
27298
+ },
27299
+ async ({ instId, tdMode, sz, px, side, ordType }) => {
27300
+ if (!auth) return toError(AUTH_REQUIRED);
27301
+ try {
27302
+ const calls = [
27303
+ ["maxSize", privateApi.getMaxSize(auth, instId, tdMode)],
27304
+ ["priceLimit", publicApi.getPriceLimitBatch("", void 0, instId)],
27305
+ ["convertCoin", publicApi.convertContractCoin(instId, sz, "coin", "open")],
27306
+ ["ticker", publicApi.getTicker(instId)]
27307
+ ];
27308
+ const keys = calls.map((c) => c[0]);
27309
+ const results = await Promise.allSettled(calls.map((c) => c[1]));
27310
+ const get = (name) => {
27311
+ const idx = keys.indexOf(name);
27312
+ if (idx < 0) return null;
27313
+ return results[idx].status === "fulfilled" ? results[idx].value : null;
27314
+ };
27315
+ const maxSizeData = get("maxSize");
27316
+ const maxSz = maxSizeData?.[0];
27317
+ const limitData = get("priceLimit");
27318
+ const limit = limitData?.[0];
27319
+ const convertData = get("convertCoin");
27320
+ const converted = convertData?.[0];
27321
+ const tickerData = get("ticker");
27322
+ const tk = tickerData?.[0] ?? {};
27323
+ const checks = {
27324
+ instId,
27325
+ tdMode,
27326
+ userInput: { sz, px, side, ordType },
27327
+ currentPrice: {
27328
+ last: tk.last,
27329
+ bid: tk.bidPx,
27330
+ ask: tk.askPx
27331
+ },
27332
+ maxSize: maxSz ? {
27333
+ maxBuy: maxSz.maxBuy,
27334
+ maxSell: maxSz.maxSell,
27335
+ ccy: maxSz.ccy
27336
+ } : null,
27337
+ priceLimit: limit ? {
27338
+ highest: limit.highest,
27339
+ lowest: limit.lowest,
27340
+ pxWithinLimit: px ? parseFloat(px) >= parseFloat(limit.lowest ?? "0") && parseFloat(px) <= parseFloat(limit.highest ?? "Infinity") : null
27341
+ } : null,
27342
+ contractConversion: converted ? {
27343
+ fromCoin: sz,
27344
+ toContracts: converted.sz,
27345
+ unit: "contracts"
27346
+ } : null,
27347
+ warnings: [],
27348
+ errors: results.map((r, i) => r.status === "rejected" ? `${keys[i]}\u67E5\u8BE2\u5931\u8D25: ${r.reason?.message}` : null).filter(Boolean)
27349
+ };
27350
+ if (limit && px) {
27351
+ const lowest = parseFloat(limit.lowest ?? "0");
27352
+ const highest = parseFloat(limit.highest ?? "Infinity");
27353
+ const price = parseFloat(px);
27354
+ if (price < lowest) checks.warnings.push(`\u4EF7\u683C ${px} \u4F4E\u4E8E\u4E0B\u9650 ${limit.lowest}`);
27355
+ if (price > highest) checks.warnings.push(`\u4EF7\u683C ${px} \u9AD8\u4E8E\u4E0A\u9650 ${limit.highest}`);
27356
+ }
27357
+ if (maxSz && side) {
27358
+ const maxBuy = parseFloat(maxSz.maxBuy ?? "0");
27359
+ const maxSell = parseFloat(maxSz.maxSell ?? "0");
27360
+ const qty = parseFloat(sz);
27361
+ if (side === "buy" && qty > maxBuy) checks.warnings.push(`\u6570\u91CF ${sz} \u8D85\u8FC7\u6700\u5927\u53EF\u4E70 ${maxSz.maxBuy}`);
27362
+ if (side === "sell" && qty > maxSell) checks.warnings.push(`\u6570\u91CF ${sz} \u8D85\u8FC7\u6700\u5927\u53EF\u5356 ${maxSz.maxSell}`);
27363
+ }
27364
+ if (converted) {
27365
+ const contractSz = converted.sz;
27366
+ if (parseFloat(contractSz ?? "0") < 1) checks.warnings.push(`\u6362\u7B97\u540E\u5F20\u6570 ${contractSz} < 1\uFF0C\u53EF\u80FD\u65E0\u6CD5\u4E0B\u5355`);
27367
+ }
27368
+ checks.passed = checks.warnings.length === 0 && checks.errors.length === 0;
27369
+ return toResult(checks);
27370
+ } catch (e) {
27371
+ return toError(e);
27372
+ }
27373
+ }
27374
+ );
27375
+ }
27376
+
27132
27377
  // src/index.ts
27133
27378
  async function main() {
27134
27379
  const server = new McpServer({ name: "hvip", version: "0.2.1" });
@@ -27150,6 +27395,7 @@ async function main() {
27150
27395
  registerAffiliateTools(server, auth);
27151
27396
  registerFiatTools(server, auth);
27152
27397
  registerRfqTools(server, auth);
27398
+ registerAgentUtils(server, auth);
27153
27399
  const transport = new StdioServerTransport();
27154
27400
  await server.connect(transport);
27155
27401
  }
package/package.json CHANGED
@@ -1,41 +1,41 @@
1
- {
2
- "name": "hvip-mcp-server",
3
- "version": "0.2.33",
4
- "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
- "homepage": "https://hvip.one",
6
- "license": "MIT",
7
- "bin": {
8
- "hvip-mcp": "dist/index.js"
9
- },
10
- "files": [
11
- "dist/index.js"
12
- ],
13
- "scripts": {
14
- "build": "node build.mjs",
15
- "dev": "tsx watch src/index.ts",
16
- "start": "node dist/index.js",
17
- "verify": "tsx tests/verify.mts",
18
- "test": "vitest run",
19
- "test:watch": "vitest",
20
- "lint": "eslint src",
21
- "typecheck": "tsc --noEmit"
22
- },
23
- "dependencies": {
24
- "@modelcontextprotocol/sdk": "^1.12.0",
25
- "dotenv": "^16.4.0",
26
- "zod": "^3.23.0"
27
- },
28
- "devDependencies": {
29
- "@types/node": "^22.0.0",
30
- "@typescript-eslint/eslint-plugin": "^8.0.0",
31
- "@typescript-eslint/parser": "^8.0.0",
32
- "esbuild": "^0.28.0",
33
- "eslint": "^9.0.0",
34
- "tsx": "^4.16.0",
35
- "typescript": "^5.5.0",
36
- "vitest": "^2.0.0"
37
- },
38
- "engines": {
39
- "node": ">=20"
40
- }
41
- }
1
+ {
2
+ "name": "hvip-mcp-server",
3
+ "version": "0.2.35",
4
+ "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
+ "homepage": "https://hvip.one",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "hvip-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/index.js"
12
+ ],
13
+ "scripts": {
14
+ "build": "node build.mjs",
15
+ "dev": "tsx watch src/index.ts",
16
+ "start": "node dist/index.js",
17
+ "verify": "tsx tests/verify.mts",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "lint": "eslint src",
21
+ "typecheck": "tsc --noEmit"
22
+ },
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.12.0",
25
+ "dotenv": "^16.4.0",
26
+ "zod": "^3.23.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^22.0.0",
30
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
31
+ "@typescript-eslint/parser": "^8.0.0",
32
+ "esbuild": "^0.28.0",
33
+ "eslint": "^9.0.0",
34
+ "tsx": "^4.16.0",
35
+ "typescript": "^5.5.0",
36
+ "vitest": "^2.0.0"
37
+ },
38
+ "engines": {
39
+ "node": ">=20"
40
+ }
41
+ }