hvip-mcp-server 0.2.22 → 0.2.23

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 +316 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21320,7 +21320,29 @@ var privateApi = {
21320
21320
  createRfq: (auth, body) => request("POST", "/api/v5/rfq/create-rfq", { body, auth }),
21321
21321
  executeRfqQuote: (auth, body) => request("POST", "/api/v5/rfq/execute-quote", { body, auth }),
21322
21322
  getRfqs: (auth, state) => request("GET", "/api/v5/rfq/rfqs", { params: { state }, auth }),
21323
- getRfqQuotes: (auth, rfqId) => request("GET", "/api/v5/rfq/quotes", { params: { rfqId }, auth })
21323
+ getRfqQuotes: (auth, rfqId) => request("GET", "/api/v5/rfq/quotes", { params: { rfqId }, auth }),
21324
+ // ── 交易收尾(第十三批新增) ──────────────────────────────────────────
21325
+ getMmpConfig: (auth) => request("GET", "/api/v5/account/mmp-config", { auth }),
21326
+ setMmpConfig: (auth, body) => request("POST", "/api/v5/account/mmp-config", { body, auth }),
21327
+ getOrderAlgo: (auth, algoId) => request("GET", "/api/v5/trade/order-algo", { params: { algoId }, auth }),
21328
+ // ── 网格操作(第十四批新增) ──────────────────────────────────────────
21329
+ createGridAlgo: (auth, body) => request("POST", "/api/v5/tradingBot/grid/order-algo", { body, auth }),
21330
+ stopGridAlgo: (auth, body) => request("POST", "/api/v5/tradingBot/grid/stop-order-algo", { body, auth }),
21331
+ closeGridPosition: (auth, body) => request("POST", "/api/v5/tradingBot/grid/close-position", { body, auth }),
21332
+ getGridPositions: (auth, algoId) => request("GET", "/api/v5/tradingBot/grid/positions", { params: { algoId }, auth }),
21333
+ // ── 信号操作(第十五批新增 — 路径经 curl 修正) ─────────────────────────────────
21334
+ createSignal: (auth, body) => request("POST", "/api/v5/tradingBot/signal/create-signal", { body, auth }),
21335
+ stopSignal: (auth, body) => request("POST", "/api/v5/tradingBot/signal/stop-order-algo", { body, auth }),
21336
+ getSignalOrdersDetail: (auth, algoId) => request("GET", "/api/v5/tradingBot/signal/orders-algo-details", { params: { algoId, algoOrdType: "contract" }, auth }),
21337
+ getSignalSubscriptions: (auth) => request("GET", "/api/v5/tradingBot/signal/signals", { auth }),
21338
+ // ── 价差操作(第十六批新增) ──────────────────────────────────────────
21339
+ placeSpreadOrder: (auth, body) => request("POST", "/api/v5/sprd/order", { body, auth }),
21340
+ cancelSpreadOrder: (auth, body) => request("POST", "/api/v5/sprd/cancel-order", { body, auth }),
21341
+ getSpreadOrdersPending: (auth, sprdId) => request("GET", "/api/v5/sprd/orders-pending", { params: { sprdId }, auth }),
21342
+ // ── 资金收尾(第十七批新增) ──────────────────────────────────────────
21343
+ getDepositLightning: (auth, ccy) => request("GET", "/api/v5/asset/deposit-lightning", { params: { ccy }, auth }),
21344
+ withdrawalLightning: (auth, body) => request("POST", "/api/v5/asset/withdrawal-lightning", { body, auth }),
21345
+ getTransferState: (auth, transferId) => request("GET", "/api/v5/asset/transfer-state", { params: { transferId }, auth })
21324
21346
  };
21325
21347
 
21326
21348
  // src/adapters/hrails.ts
@@ -22950,6 +22972,55 @@ function registerTradingTools(server, auth) {
22950
22972
  }
22951
22973
  }
22952
22974
  );
22975
+ server.tool(
22976
+ "okx_get_mmp_config",
22977
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2MMP\uFF08\u505A\u5E02\u5546\u4FDD\u62A4\uFF09\u914D\u7F6E\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5F53\u524D\u505A\u5E02\u5546\u4FDD\u62A4\u53C2\u6570\u3001\u786E\u8BA4\u98CE\u63A7\u8BBE\u7F6E\n## \u5173\u952E\u8BCD\uFF1A\u505A\u5E02\u5546\u4FDD\u62A4, MMP, mmp config, \u505A\u5E02\u5546\u98CE\u63A7, \u5E02\u573A\u4FDD\u62A4\n## \u53C2\u6570\uFF1A\u65E0\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u914D\u7F6E \u2192 okx_set_mmp_config \u4FEE\u6539",
22978
+ {},
22979
+ async () => {
22980
+ if (!auth) return toError(AUTH_REQUIRED);
22981
+ try {
22982
+ const data = await privateApi.getMmpConfig(auth);
22983
+ return toResult(data);
22984
+ } catch (e) {
22985
+ return toError(e);
22986
+ }
22987
+ }
22988
+ );
22989
+ server.tool(
22990
+ "okx_set_mmp_config",
22991
+ "## \u529F\u80FD\uFF1A\u8BBE\u7F6EMMP\uFF08\u505A\u5E02\u5546\u4FDD\u62A4\uFF09\u53C2\u6570\n## \u573A\u666F\uFF1A\u7528\u4E8E\u914D\u7F6E\u505A\u5E02\u5546\u98CE\u63A7\u53C2\u6570\u3001\u4FDD\u62A4\u505A\u5E02\u7B56\u7565\n## \u53C2\u6570\uFF1A\n## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B\n## - timeInterval: \u65F6\u95F4\u7A97\u53E3\uFF08\u6BEB\u79D2\uFF09\u3002\u5FC5\u586B\n## - frozenInterval: \u51BB\u7ED3\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\u3002\u5FC5\u586B\n## - limit: \u9650\u5236\u91CF\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u4FEE\u6539MMP\u53C2\u6570\u5F71\u54CD\u505A\u5E02\u7B56\u7565\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u98CE\u9669\uFF1AADMIN \u2014 \u4FEE\u6539\u98CE\u63A7\u914D\u7F6E\u53EF\u80FD\u5F71\u54CD\u4EA4\u6613\u6267\u884C\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_mmp_config \u67E5\u770B\u5F53\u524D \u2192 \u672C\u5DE5\u5177\u4FEE\u6539 \u2192 \u751F\u6548",
22992
+ {
22993
+ instFamily: external_exports.string().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B"),
22994
+ timeInterval: external_exports.string().describe("\u65F6\u95F4\u7A97\u53E3\uFF08\u6BEB\u79D2\uFF09\u3002\u5FC5\u586B"),
22995
+ frozenInterval: external_exports.string().describe("\u51BB\u7ED3\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\u3002\u5FC5\u586B"),
22996
+ limit: external_exports.string().describe("\u9650\u5236\u91CF\u3002\u5FC5\u586B")
22997
+ },
22998
+ async ({ instFamily, timeInterval, frozenInterval, limit }) => {
22999
+ if (!auth) return toError(AUTH_REQUIRED);
23000
+ try {
23001
+ const data = await privateApi.setMmpConfig(auth, { instFamily, timeInterval, frozenInterval, limit });
23002
+ return toResult(data);
23003
+ } catch (e) {
23004
+ return toError(e);
23005
+ }
23006
+ }
23007
+ );
23008
+ server.tool(
23009
+ "okx_get_order_algo",
23010
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u6307\u5B9A\u7B56\u7565\u59D4\u6258\u7684\u8BE6\u60C5\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8FFD\u8E2A\u7B56\u7565\u59D4\u6258\u72B6\u6001\u3001\u67E5\u770B\u89E6\u53D1\u6761\u4EF6\u548C\u6267\u884C\u7ED3\u679C\n## \u5173\u952E\u8BCD\uFF1A\u7B56\u7565\u59D4\u6258\u8BE6\u60C5, order algo, \u7B56\u7565\u5355\u67E5\u8BE2, \u6761\u4EF6\u5355\u8BE6\u60C5\n## \u53C2\u6570\uFF1A\n## - algoId: \u7B56\u7565\u59D4\u6258ID\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\u5FAE\u5C0F ~2KB\n## \u5173\u8054\uFF1Aokx_get_orders_algo_pending \u67E5\u770B\u7B56\u7565\u5217\u8868 \u2192 \u672C\u5DE5\u5177\u67E5\u8BE6\u60C5",
23011
+ {
23012
+ algoId: external_exports.string().optional().describe("\u7B56\u7565\u59D4\u6258ID")
23013
+ },
23014
+ async ({ algoId }) => {
23015
+ if (!auth) return toError(AUTH_REQUIRED);
23016
+ try {
23017
+ const data = await privateApi.getOrderAlgo(auth, algoId);
23018
+ return toResult(data);
23019
+ } catch (e) {
23020
+ return toError(e);
23021
+ }
23022
+ }
23023
+ );
22953
23024
  }
22954
23025
 
22955
23026
  // src/tools/algo.ts
@@ -23181,6 +23252,56 @@ function registerFundingTools(server, auth) {
23181
23252
  }
23182
23253
  }
23183
23254
  );
23255
+ server.tool(
23256
+ "okx_get_deposit_lightning",
23257
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u95EA\u7535\u5145\u503C\u5730\u5740\uFF08\u83B7\u53D6\u4E34\u65F6\u5145\u503C\u5730\u5740\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5FEB\u901F\u751F\u6210\u5145\u503C\u5730\u5740\u63A5\u6536\u8D44\u91D1\u3001\u83B7\u53D6\u672C\u5730\u8D27\u5E01\u652F\u4ED8\u65B9\u5F0F\u7684\u5145\u503C\u4FE1\u606F\n## \u5173\u952E\u8BCD\uFF1A\u95EA\u7535\u5145\u503C, lightning deposit, \u5FEB\u901F\u5145\u503C, \u5145\u503C\u5730\u5740, \u95EA\u7535\u5165\u91D1\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 USDT\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\uFF08\u5730\u5740\u6709\u6548\u671F\u5185\u53EF\u91CD\u590D\u4F7F\u7528\uFF09\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u83B7\u53D6\u95EA\u7535\u5730\u5740 \u2192 \u7528\u6237\u5145\u503C \u2192 okx_get_deposit_history \u8FFD\u8E2A\u5230\u8D26",
23258
+ {
23259
+ ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 USDT\u3002\u5FC5\u586B")
23260
+ },
23261
+ async ({ ccy }) => {
23262
+ if (!auth) return toError(AUTH_REQUIRED);
23263
+ try {
23264
+ const data = await privateApi.getDepositLightning(auth, ccy);
23265
+ return toResult(data);
23266
+ } catch (e) {
23267
+ return toError(e);
23268
+ }
23269
+ }
23270
+ );
23271
+ server.tool(
23272
+ "okx_withdrawal_lightning",
23273
+ "## \u529F\u80FD\uFF1A\u95EA\u7535\u63D0\u73B0\uFF08\u5FEB\u901F\u63D0\u73B0\u5230\u672C\u5730\u652F\u4ED8\u65B9\u5F0F\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5FEB\u901F\u63D0\u73B0\u5230\u7B2C\u4E09\u65B9\u652F\u4ED8\u6E20\u9053\u3001\u5C0F\u989D\u5FEB\u901F\u51FA\u91D1\n## \u5173\u952E\u8BCD\uFF1A\u95EA\u7535\u63D0\u73B0, lightning withdrawal, \u5FEB\u901F\u63D0\u73B0, \u95EA\u7535\u51FA\u91D1\n## \u53C2\u6570\uFF1A\n## - ccy: \u63D0\u73B0\u5E01\u79CD\u3002\u5FC5\u586B\n## - amt: \u63D0\u73B0\u6570\u91CF\u3002\u5FC5\u586B\n## - to: \u63D0\u73B0\u53BB\u5411\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u63D0\u73B0\uFF09- \u5C06\u63D0\u73B0\u8D44\u91D1\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u4E8C\u6B21\u786E\u8BA4\n## \u98CE\u9669\uFF1AFUND_TRANSFER \u2014 \u63D0\u73B0\u64CD\u4F5C\u76F4\u63A5\u8F6C\u51FA\u8D44\u91D1\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u4E8C\u6B21\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u95EA\u7535\u63D0\u73B0 \u2192 okx_get_withdrawal_history \u8FFD\u8E2A\u63D0\u73B0\u72B6\u6001",
23274
+ {
23275
+ ccy: external_exports.string().describe("\u63D0\u73B0\u5E01\u79CD\u3002\u5FC5\u586B"),
23276
+ amt: external_exports.string().describe("\u63D0\u73B0\u6570\u91CF\u3002\u5FC5\u586B"),
23277
+ to: external_exports.string().describe("\u63D0\u73B0\u53BB\u5411\u3002\u5FC5\u586B")
23278
+ },
23279
+ async ({ ccy, amt, to }) => {
23280
+ if (!auth) return toError(AUTH_REQUIRED);
23281
+ try {
23282
+ const data = await privateApi.withdrawalLightning(auth, { ccy, amt, to });
23283
+ return toResult(data);
23284
+ } catch (e) {
23285
+ return toError(e);
23286
+ }
23287
+ }
23288
+ );
23289
+ server.tool(
23290
+ "okx_get_transfer_state",
23291
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u8D44\u91D1\u5212\u8F6C\u72B6\u6001\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8FFD\u8E2A\u8DE8\u8D26\u6237\u5212\u8F6C\u662F\u5426\u5230\u8D26\u3001\u786E\u8BA4\u5212\u8F6C\u6210\u529F\n## \u5173\u952E\u8BCD\uFF1A\u5212\u8F6C\u72B6\u6001, transfer state, \u8D44\u91D1\u5212\u8F6C, \u8F6C\u8D26\u72B6\u6001, \u5212\u8F6C\u67E5\u8BE2\n## \u53C2\u6570\uFF1A\n## - transferId: \u5212\u8F6CID\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_transfer \u5212\u8F6C \u2192 \u672C\u5DE5\u5177\u8FFD\u8E2A\u72B6\u6001 \u2192 \u786E\u8BA4\u5230\u8D26",
23292
+ {
23293
+ transferId: external_exports.string().describe("\u5212\u8F6CID\uFF08\u4ECE okx_transfer \u8FD4\u56DE\u83B7\u53D6\uFF09\u3002\u5FC5\u586B")
23294
+ },
23295
+ async ({ transferId }) => {
23296
+ if (!auth) return toError(AUTH_REQUIRED);
23297
+ try {
23298
+ const data = await privateApi.getTransferState(auth, transferId);
23299
+ return toResult(data);
23300
+ } catch (e) {
23301
+ return toError(e);
23302
+ }
23303
+ }
23304
+ );
23184
23305
  }
23185
23306
 
23186
23307
  // src/tools/stats.ts
@@ -24157,10 +24278,84 @@ function registerBotTools(server, auth) {
24157
24278
  }
24158
24279
  }
24159
24280
  );
24281
+ server.tool(
24282
+ "okx_create_grid_order",
24283
+ "## \u529F\u80FD\uFF1A\u521B\u5EFA\u7F51\u683C\u4EA4\u6613\u8BA2\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8BBE\u7F6E\u73B0\u8D27\u7F51\u683C/\u5408\u7EA6\u7F51\u683C/\u5929\u5730\u7F51\u683C\u7B56\u7565\n## \u5173\u952E\u8BCD\uFF1A\u521B\u5EFA\u7F51\u683C, create grid, \u7F51\u683C\u4EA4\u6613, \u73B0\u8D27\u7F51\u683C, \u5408\u7EA6\u7F51\u683C, \u5929\u5730\u7F51\u683C\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\u3002\u5FC5\u586B\n## - algoOrdType: \u7F51\u683C\u7C7B\u578B\u3002grid=\u73B0\u8D27\u7F51\u683C, contract_grid=\u5408\u7EA6\u7F51\u683C, moon_grid=\u5929\u5730\u7F51\u683C\u3002\u5FC5\u586B\n## - maxPx: \u4EF7\u683C\u4E0A\u9650\u3002\u5FC5\u586B\n## - minPx: \u4EF7\u683C\u4E0B\u9650\u3002\u5FC5\u586B\n## - gridNum: \u7F51\u683C\u6570\u91CF\u3002\u5FC5\u586B\n## - direction: \u5408\u7EA6\u7F51\u683C\u65B9\u5411\u3002long=\u505A\u591A, short=\u505A\u7A7A, neutral=\u4E2D\u6027\u3002\u53EF\u9009\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u521B\u5EFA\u7F51\u683C\u7B56\u7565\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u7F51\u683C\u4EA4\u6613\u4F1A\u81EA\u52A8\u4E0B\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u521B\u5EFA \u2192 okx_get_grid_orders_pending \u67E5\u770B \u2192 okx_stop_grid_order \u505C\u6B62",
24284
+ {
24285
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
24286
+ algoOrdType: external_exports.enum(["grid", "contract_grid", "moon_grid"]).describe("\u7F51\u683C\u7C7B\u578B\u3002grid=\u73B0\u8D27\u7F51\u683C, contract_grid=\u5408\u7EA6\u7F51\u683C, moon_grid=\u5929\u5730\u7F51\u683C"),
24287
+ maxPx: external_exports.string().describe("\u4EF7\u683C\u4E0A\u9650\u3002\u5FC5\u586B"),
24288
+ minPx: external_exports.string().describe("\u4EF7\u683C\u4E0B\u9650\u3002\u5FC5\u586B"),
24289
+ gridNum: external_exports.string().describe("\u7F51\u683C\u6570\u91CF\u3002\u5FC5\u586B"),
24290
+ direction: external_exports.enum(["long", "short", "neutral"]).optional().describe("\u5408\u7EA6\u7F51\u683C\u65B9\u5411\u3002long=\u505A\u591A, short=\u505A\u7A7A, neutral=\u4E2D\u6027")
24291
+ },
24292
+ async ({ instId, algoOrdType, maxPx, minPx, gridNum, direction }) => {
24293
+ if (!auth) return toError(AUTH_REQUIRED);
24294
+ try {
24295
+ const body = { instId, algoOrdType, maxPx, minPx, gridNum };
24296
+ if (direction) body.direction = direction;
24297
+ const data = await privateApi.createGridAlgo(auth, body);
24298
+ return toResult(data);
24299
+ } catch (e) {
24300
+ return toError(e);
24301
+ }
24302
+ }
24303
+ );
24304
+ server.tool(
24305
+ "okx_stop_grid_order",
24306
+ "## \u529F\u80FD\uFF1A\u505C\u6B62\u7F51\u683C\u4EA4\u6613\u8BA2\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u7EC8\u6B62\u8FD0\u884C\u4E2D\u7684\u7F51\u683C\u7B56\u7565\u3001\u6E05\u7A7A\u7F51\u683C\u4ED3\u4F4D\n## \u5173\u952E\u8BCD\uFF1A\u505C\u6B62\u7F51\u683C, stop grid, \u7F51\u683C\u505C\u6B62, \u7EC8\u6B62\u7F51\u683C\n## \u53C2\u6570\uFF1A\n## - algoId: \u7F51\u683C\u7B56\u7565ID\u3002\u5FC5\u586B\n## - instId: \u4EA7\u54C1ID\u3002\u5FC5\u586B\n## - algoOrdType: \u7F51\u683C\u7C7B\u578B\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u505C\u6B62\u7F51\u683C\u7B56\u7565\u5E73\u4ED3\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u505C\u6B62\u7F51\u683C\u5C06\u6E05\u7A7A\u6240\u6709\u7F51\u683C\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_grid_orders_pending \u67E5\u770B\u8FD0\u884C\u4E2D \u2192 \u672C\u5DE5\u5177\u505C\u6B62 \u2192 \u786E\u8BA4\u5DF2\u505C\u6B62",
24307
+ {
24308
+ algoId: external_exports.string().describe("\u7F51\u683C\u7B56\u7565ID\u3002\u5FC5\u586B"),
24309
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
24310
+ algoOrdType: external_exports.enum(["grid", "contract_grid", "moon_grid"]).describe("\u7F51\u683C\u7C7B\u578B\u3002grid=\u73B0\u8D27\u7F51\u683C, contract_grid=\u5408\u7EA6\u7F51\u683C, moon_grid=\u5929\u5730\u7F51\u683C")
24311
+ },
24312
+ async ({ algoId, instId, algoOrdType }) => {
24313
+ if (!auth) return toError(AUTH_REQUIRED);
24314
+ try {
24315
+ const data = await privateApi.stopGridAlgo(auth, { algoId, instId, algoOrdType });
24316
+ return toResult(data);
24317
+ } catch (e) {
24318
+ return toError(e);
24319
+ }
24320
+ }
24321
+ );
24322
+ server.tool(
24323
+ "okx_close_grid_position",
24324
+ "## \u529F\u80FD\uFF1A\u5E73\u4ED3\u7F51\u683C\u7B56\u7565\u7684\u6301\u4ED3\n## \u573A\u666F\uFF1A\u7528\u4E8E\u624B\u52A8\u5E73\u6389\u7F51\u683C\u7B56\u7565\u7684\u5F53\u524D\u6301\u4ED3\u3001\u90E8\u5206\u6216\u5168\u90E8\u5E73\u4ED3\n## \u5173\u952E\u8BCD\uFF1A\u7F51\u683C\u5E73\u4ED3, close grid position, \u7F51\u683C\u6301\u4ED3\u5E73\u4ED3\n## \u53C2\u6570\uFF1A\n## - algoId: \u7F51\u683C\u7B56\u7565ID\u3002\u5FC5\u586B\n## - algoOrdType: \u7F51\u683C\u7C7B\u578B\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u5E73\u6389\u7F51\u683C\u6301\u4ED3\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u5E73\u4ED3\u64CD\u4F5C\u5F71\u54CD\u6301\u4ED3\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_grid_positions \u67E5\u770B\u7F51\u683C\u6301\u4ED3 \u2192 \u672C\u5DE5\u5177\u5E73\u4ED3",
24325
+ {
24326
+ algoId: external_exports.string().describe("\u7F51\u683C\u7B56\u7565ID\u3002\u5FC5\u586B"),
24327
+ algoOrdType: external_exports.enum(["grid", "contract_grid", "moon_grid"]).describe("\u7F51\u683C\u7C7B\u578B")
24328
+ },
24329
+ async ({ algoId, algoOrdType }) => {
24330
+ if (!auth) return toError(AUTH_REQUIRED);
24331
+ try {
24332
+ const data = await privateApi.closeGridPosition(auth, { algoId, algoOrdType });
24333
+ return toResult(data);
24334
+ } catch (e) {
24335
+ return toError(e);
24336
+ }
24337
+ }
24338
+ );
24339
+ server.tool(
24340
+ "okx_get_grid_positions",
24341
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u7F51\u683C\u7B56\u7565\u7684\u6301\u4ED3\u8BE6\u60C5\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u7F51\u683C\u6301\u4ED3\u65B9\u5411\u3001\u6570\u91CF\u548C\u76C8\u4E8F\n## \u5173\u952E\u8BCD\uFF1A\u7F51\u683C\u6301\u4ED3, grid positions, \u7F51\u683C\u4ED3\u4F4D, \u7F51\u683C\u76C8\u4E8F\n## \u53C2\u6570\uFF1A\n## - algoId: \u7F51\u683C\u7B56\u7565ID\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB\n## \u5173\u8054\uFF1Aokx_get_grid_orders_pending \u67E5\u770B\u7B56\u7565 \u2192 \u672C\u5DE5\u5177\u770B\u6301\u4ED3 \u2192 \u51B3\u5B9A\u662F\u5426\u5E73\u4ED3",
24342
+ {
24343
+ algoId: external_exports.string().describe("\u7F51\u683C\u7B56\u7565ID\u3002\u5FC5\u586B")
24344
+ },
24345
+ async ({ algoId }) => {
24346
+ if (!auth) return toError(AUTH_REQUIRED);
24347
+ try {
24348
+ const data = await privateApi.getGridPositions(auth, algoId);
24349
+ return toResult(data);
24350
+ } catch (e) {
24351
+ return toError(e);
24352
+ }
24353
+ }
24354
+ );
24160
24355
  }
24161
24356
 
24162
24357
  // src/tools/spread.ts
24163
- function registerSpreadTools(server) {
24358
+ function registerSpreadTools(server, auth) {
24164
24359
  server.tool(
24165
24360
  "okx_get_spreads",
24166
24361
  "## \u529F\u80FD\uFF1A\u83B7\u53D6\u4EF7\u5DEE\u5408\u7EA6\u4EA7\u54C1\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8DE8\u671F\u5957\u5229\u7B56\u7565\u8BBE\u8BA1\u3001\u53D1\u73B0\u53EF\u4EA4\u6613\u4EF7\u5DEE\u5408\u7EA6\u3001\u7B5B\u9009\u7279\u5B9A\u671F\u9650\u7684\u4EF7\u5DEE\u54C1\u79CD\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u5408\u7EA6, spreads, \u8DE8\u671F\u5957\u5229, \u4EF7\u5DEE\u5217\u8868, \u671F\u9650\u5957\u5229\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\uFF0C\u5982 BTC-USDT_BTC-USDT-SWAP\n## - baseCcy: \u6807\u7684\u5E01\u79CD\uFF0C\u5982 BTC\n## - instId: \u817F\u5408\u7EA6\u4EA7\u54C1ID\uFF0C\u7CBE\u786E\u7B5B\u9009\n## - state: \u5408\u7EA6\u72B6\u6001\u3002live=\u6D3B\u8DC3, expired=\u5DF2\u5230\u671F, suspend=\u6682\u505C\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 ~3KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u83B7\u53D6\u4EF7\u5DEE\u5408\u7EA6\u5217\u8868 \u2192 okx_get_spread_ticker \u67E5\u884C\u60C5 \u2192 okx_get_spread_candles \u5206\u6790\u8D70\u52BF",
@@ -24268,6 +24463,61 @@ function registerSpreadTools(server) {
24268
24463
  }
24269
24464
  }
24270
24465
  );
24466
+ server.tool(
24467
+ "okx_place_spread_order",
24468
+ "## \u529F\u80FD\uFF1A\u4E0B\u4EF7\u5DEE\u5408\u7EA6\u8BA2\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u6267\u884C\u4EF7\u5DEE\u5957\u5229\u4EA4\u6613\u3001\u4E0B\u8DE8\u671F\u5957\u5229\u5355\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u4E0B\u5355, spread order, \u4EF7\u5DEE\u4EA4\u6613, \u8DE8\u671F\u5957\u5229, \u4EF7\u5DEE\u5957\u5229\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B\n## - side: \u4E70\u5356\u65B9\u5411\u3002buy=\u4E70\u5165, sell=\u5356\u51FA\u3002\u5FC5\u586B\n## - ordType: \u8BA2\u5355\u7C7B\u578B\u3002market=\u5E02\u4EF7, limit=\u9650\u4EF7\u3002\u5FC5\u586B\n## - sz: \u6570\u91CF\u3002\u5FC5\u586B\n## - px: \u4EF7\u683C\uFF08\u9650\u4EF7\u5355\u5FC5\u586B\uFF09\u3002\u53EF\u9009\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u63D0\u4EA4\u4EF7\u5DEE\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u4E0B\u5355\u64CD\u4F5C\u76F4\u63A5\u5F71\u54CD\u4EF7\u5DEE\u6301\u4ED3\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_spread_ticker \u770B\u884C\u60C5 \u2192 \u672C\u5DE5\u5177\u4E0B\u5355 \u2192 okx_get_spread_orders \u67E5\u8BA2\u5355",
24469
+ {
24470
+ sprdId: external_exports.string().describe("\u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B"),
24471
+ side: external_exports.enum(["buy", "sell"]).describe("\u4E70\u5356\u65B9\u5411\u3002buy=\u4E70\u5165, sell=\u5356\u51FA"),
24472
+ ordType: external_exports.enum(["market", "limit", "post_only", "fok", "ioc"]).describe("\u8BA2\u5355\u7C7B\u578B\u3002market=\u5E02\u4EF7, limit=\u9650\u4EF7"),
24473
+ sz: external_exports.string().describe("\u6570\u91CF\u3002\u5FC5\u586B"),
24474
+ px: external_exports.string().optional().describe("\u4EF7\u683C\uFF08\u9650\u4EF7\u5355\u5FC5\u586B\uFF09")
24475
+ },
24476
+ async ({ sprdId, side, ordType, sz, px }) => {
24477
+ if (!auth) return toError(AUTH_REQUIRED);
24478
+ try {
24479
+ const body = { sprdId, side, ordType, sz };
24480
+ if (px) body.px = px;
24481
+ const data = await privateApi.placeSpreadOrder(auth, body);
24482
+ return toResult(data);
24483
+ } catch (e) {
24484
+ return toError(e);
24485
+ }
24486
+ }
24487
+ );
24488
+ server.tool(
24489
+ "okx_cancel_spread_order",
24490
+ "## \u529F\u80FD\uFF1A\u64A4\u9500\u4EF7\u5DEE\u5408\u7EA6\u8BA2\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u53D6\u6D88\u672A\u6210\u4EA4\u7684\u4EF7\u5DEE\u6302\u5355\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u64A4\u5355, cancel spread, \u53D6\u6D88\u4EF7\u5DEE, \u64A4\u5355\u4EF7\u5DEE\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B\n## - ordId: \u8BA2\u5355ID\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u64A4\u9500\u4EF7\u5DEE\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u64A4\u5355\u64CD\u4F5C\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1Aokx_get_spread_orders \u67E5\u770B\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u64A4\u9500 \u2192 \u786E\u8BA4\u64A4\u9500\u6210\u529F",
24491
+ {
24492
+ sprdId: external_exports.string().describe("\u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B"),
24493
+ ordId: external_exports.string().describe("\u8BA2\u5355ID\u3002\u5FC5\u586B")
24494
+ },
24495
+ async ({ sprdId, ordId }) => {
24496
+ if (!auth) return toError(AUTH_REQUIRED);
24497
+ try {
24498
+ const data = await privateApi.cancelSpreadOrder(auth, { sprdId, ordId });
24499
+ return toResult(data);
24500
+ } catch (e) {
24501
+ return toError(e);
24502
+ }
24503
+ }
24504
+ );
24505
+ server.tool(
24506
+ "okx_get_spread_orders",
24507
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u4EF7\u5DEE\u5408\u7EA6\u5F53\u524D\u6302\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u4EF7\u5DEE\u5408\u7EA6\u7684\u672A\u6210\u4EA4\u8BA2\u5355\u5217\u8868\u3001\u76D1\u63A7\u6302\u5355\u72B6\u6001\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u6302\u5355, spread orders, \u4EF7\u5DEE\u59D4\u6258, \u4EF7\u5DEE\u672A\u6210\u4EA4\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\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\u5FAE\u5C0F ~2KB\n## \u5173\u8054\uFF1Aokx_place_spread_order \u4E0B\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u770B \u2192 okx_cancel_spread_order \u64A4\u9500",
24508
+ {
24509
+ sprdId: external_exports.string().optional().describe("\u4EF7\u5DEE\u5408\u7EA6ID")
24510
+ },
24511
+ async ({ sprdId }) => {
24512
+ if (!auth) return toError(AUTH_REQUIRED);
24513
+ try {
24514
+ const data = await privateApi.getSpreadOrdersPending(auth, sprdId);
24515
+ return toResult(data);
24516
+ } catch (e) {
24517
+ return toError(e);
24518
+ }
24519
+ }
24520
+ );
24271
24521
  }
24272
24522
 
24273
24523
  // src/tools/copy.ts
@@ -24587,6 +24837,69 @@ function registerSignalTools(server, auth) {
24587
24837
  }
24588
24838
  }
24589
24839
  );
24840
+ server.tool(
24841
+ "okx_create_signal_bot",
24842
+ "## \u529F\u80FD\uFF1A\u521B\u5EFA\u4FE1\u53F7\u4EA4\u6613\u673A\u5668\u4EBA\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8BA2\u9605\u5916\u90E8\u4FE1\u53F7\u6E90\u3001\u81EA\u52A8\u8DDF\u968F\u4FE1\u53F7\u5F00\u5E73\u4ED3\n## \u5173\u952E\u8BCD\uFF1A\u521B\u5EFA\u4FE1\u53F7, create signal, \u4FE1\u53F7\u673A\u5668\u4EBA, \u4FE1\u53F7\u4EA4\u6613\n## \u53C2\u6570\uFF1A\n## - channel: \u4FE1\u53F7\u6E20\u9053\u3002\u5FC5\u586B\n## - signalName: \u4FE1\u53F7\u540D\u79F0\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u521B\u5EFA\u4FE1\u53F7\u673A\u5668\u4EBA\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u4FE1\u53F7\u673A\u5668\u4EBA\u4F1A\u81EA\u52A8\u6267\u884C\u4EA4\u6613\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u521B\u5EFA \u2192 okx_get_signal_bots_pending \u67E5\u770B\u72B6\u6001 \u2192 okx_stop_signal_bot \u505C\u6B62",
24843
+ {
24844
+ channel: external_exports.string().describe("\u4FE1\u53F7\u6E20\u9053\u3002\u5FC5\u586B"),
24845
+ signalName: external_exports.string().describe("\u4FE1\u53F7\u540D\u79F0\u3002\u5FC5\u586B")
24846
+ },
24847
+ async ({ channel, signalName }) => {
24848
+ if (!auth) return toError(AUTH_REQUIRED);
24849
+ try {
24850
+ const data = await privateApi.createSignal(auth, { channel, signalName });
24851
+ return toResult(data);
24852
+ } catch (e) {
24853
+ return toError(e);
24854
+ }
24855
+ }
24856
+ );
24857
+ server.tool(
24858
+ "okx_stop_signal_bot",
24859
+ "## \u529F\u80FD\uFF1A\u505C\u6B62\u4FE1\u53F7\u4EA4\u6613\u673A\u5668\u4EBA\n## \u573A\u666F\uFF1A\u7528\u4E8E\u7EC8\u6B62\u8FD0\u884C\u4E2D\u7684\u4FE1\u53F7\u7B56\u7565\u3001\u5E73\u6389\u6240\u6709\u4FE1\u53F7\u6301\u4ED3\n## \u5173\u952E\u8BCD\uFF1A\u505C\u6B62\u4FE1\u53F7, stop signal, \u4FE1\u53F7\u505C\u6B62, \u5173\u95ED\u4FE1\u53F7\u673A\u5668\u4EBA\n## \u53C2\u6570\uFF1A\n## - algoId: \u4FE1\u53F7\u673A\u5668\u4EBAID\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u505C\u6B62\u4FE1\u53F7\u5E76\u5E73\u4ED3\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u505C\u6B62\u4FE1\u53F7\u4F1A\u5E73\u6389\u6240\u6709\u6301\u4ED3\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_signal_bots_pending \u67E5\u770B\u8FD0\u884C\u4E2D \u2192 \u672C\u5DE5\u5177\u505C\u6B62",
24860
+ {
24861
+ algoId: external_exports.string().describe("\u4FE1\u53F7\u673A\u5668\u4EBAID\u3002\u5FC5\u586B")
24862
+ },
24863
+ async ({ algoId }) => {
24864
+ if (!auth) return toError(AUTH_REQUIRED);
24865
+ try {
24866
+ const data = await privateApi.stopSignal(auth, { algoId, algoOrdType: "contract" });
24867
+ return toResult(data);
24868
+ } catch (e) {
24869
+ return toError(e);
24870
+ }
24871
+ }
24872
+ );
24873
+ server.tool(
24874
+ "okx_get_signal_orders",
24875
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u4FE1\u53F7\u673A\u5668\u4EBA\u8BA2\u5355\u8BE6\u60C5\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u4FE1\u53F7\u7B56\u7565\u7684\u89E6\u53D1\u8BA2\u5355\u5217\u8868\u548C\u6210\u4EA4\u8BB0\u5F55\n## \u5173\u952E\u8BCD\uFF1A\u4FE1\u53F7\u8BA2\u5355, signal orders, \u4FE1\u53F7\u59D4\u6258, \u4FE1\u53F7\u6210\u4EA4\n## \u53C2\u6570\uFF1A\n## - algoId: \u4FE1\u53F7\u673A\u5668\u4EBAID\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1Aokx_get_signal_bots_pending \u67E5\u770B\u673A\u5668\u4EBA \u2192 \u672C\u5DE5\u5177\u67E5\u8BA2\u5355 \u2192 \u5206\u6790\u8868\u73B0",
24876
+ {
24877
+ algoId: external_exports.string().describe("\u4FE1\u53F7\u673A\u5668\u4EBAID\u3002\u5FC5\u586B")
24878
+ },
24879
+ async ({ algoId }) => {
24880
+ if (!auth) return toError(AUTH_REQUIRED);
24881
+ try {
24882
+ const data = await privateApi.getSignalOrdersDetail(auth, algoId);
24883
+ return toResult(data);
24884
+ } catch (e) {
24885
+ return toError(e);
24886
+ }
24887
+ }
24888
+ );
24889
+ server.tool(
24890
+ "okx_get_signal_subscriptions",
24891
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5DF2\u8BA2\u9605\u7684\u4FE1\u53F7\u6E90\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5F53\u524D\u8BA2\u9605\u4E86\u54EA\u4E9B\u4FE1\u53F7\u3001\u4FE1\u53F7\u6E90\u4FE1\u606F\u548C\u72B6\u6001\n## \u5173\u952E\u8BCD\uFF1A\u4FE1\u53F7\u8BA2\u9605, signal subscriptions, \u4FE1\u53F7\u6E90, \u8BA2\u9605\u5217\u8868\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 ~2KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u5DF2\u8BA2\u9605\u4FE1\u53F7 \u2192 okx_create_signal_bot \u521B\u5EFA\u65B0\u7684\u4FE1\u53F7\u673A\u5668\u4EBA",
24892
+ {},
24893
+ async () => {
24894
+ if (!auth) return toError(AUTH_REQUIRED);
24895
+ try {
24896
+ const data = await privateApi.getSignalSubscriptions(auth);
24897
+ return toResult(data);
24898
+ } catch (e) {
24899
+ return toError(e);
24900
+ }
24901
+ }
24902
+ );
24590
24903
  }
24591
24904
 
24592
24905
  // src/tools/rfq.ts
@@ -24710,7 +25023,7 @@ async function main() {
24710
25023
  registerMarketTools(server);
24711
25024
  registerPublicTools(server, auth);
24712
25025
  registerStatsTools(server);
24713
- registerSpreadTools(server);
25026
+ registerSpreadTools(server, auth);
24714
25027
  registerOutcomesTools(server);
24715
25028
  registerAccountTools(server, auth);
24716
25029
  registerTradingTools(server, auth);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hvip-mcp-server",
3
- "version": "0.2.22",
3
+ "version": "0.2.23",
4
4
  "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",