hvip-mcp-server 0.2.21 → 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 +668 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21301,7 +21301,48 @@ var privateApi = {
21301
21301
  getConvertCurrencies: (auth) => request("GET", "/api/v5/asset/convert/currencies", { auth }),
21302
21302
  convertTrade: (auth, body) => request("POST", "/api/v5/asset/convert/trade", { body, auth }),
21303
21303
  getSubAccountFundingBalance: (auth, subAcct) => request("GET", "/api/v5/asset/subaccount/balances", { params: { subAcct }, auth }),
21304
- setSubAccountTransferOut: (auth, body) => request("POST", "/api/v5/users/subaccount/set-transfer-out", { body, auth })
21304
+ setSubAccountTransferOut: (auth, body) => request("POST", "/api/v5/users/subaccount/set-transfer-out", { body, auth }),
21305
+ // ── 资金账户补完(第九批新增) ──────────────────────────────────────────
21306
+ getInterestRate: (auth, ccy) => request("GET", "/api/v5/account/interest-rate", { params: { ccy }, auth }),
21307
+ getMaxWithdrawal: (auth, ccy) => request("GET", "/api/v5/account/max-withdrawal", { params: { ccy }, auth }),
21308
+ getAccountGreeks: (auth, instType, instFamily, uly, instId) => request("GET", "/api/v5/account/greeks", { params: { instType, instFamily, uly, instId }, auth }),
21309
+ setAccountLevel: (auth, body) => request("POST", "/api/v5/account/set-account-level", { body, auth }),
21310
+ // ── 跟单操作(第十批新增) ──────────────────────────────────────────────
21311
+ setCopySettings: (auth, body) => request("POST", "/api/v5/copytrading/copy-settings", { body, auth }),
21312
+ closeSubposition: (auth, body) => request("POST", "/api/v5/copytrading/close-subposition", { body, auth }),
21313
+ getCopySettings: (auth) => request("GET", "/api/v5/copytrading/copy-settings", { auth }),
21314
+ updateCopySettings: (auth, body) => request("POST", "/api/v5/copytrading/set-copy-settings", { body, auth }),
21315
+ // ── 定投操作(第十一批新增) ────────────────────────────────────────────
21316
+ createRecurringPlan: (auth, body) => request("POST", "/api/v5/tradingBot/recurring/order-algo", { body, auth }),
21317
+ stopRecurringPlan: (auth, body) => request("POST", "/api/v5/tradingBot/recurring/stop-order-algo", { body, auth }),
21318
+ getRecurringSubOrders: (auth, algoId, limit) => request("GET", "/api/v5/tradingBot/recurring/sub-orders", { params: { algoId, limit }, auth }),
21319
+ // ── 大宗交易(第十二批新增) ────────────────────────────────────────────
21320
+ createRfq: (auth, body) => request("POST", "/api/v5/rfq/create-rfq", { body, auth }),
21321
+ executeRfqQuote: (auth, body) => request("POST", "/api/v5/rfq/execute-quote", { body, auth }),
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 }),
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 })
21305
21346
  };
21306
21347
 
21307
21348
  // src/adapters/hrails.ts
@@ -22469,6 +22510,95 @@ function registerAccountTools(server, auth) {
22469
22510
  }
22470
22511
  }
22471
22512
  );
22513
+ server.tool(
22514
+ "okx_get_bills",
22515
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u8D26\u6237\u8D26\u5355\u6D41\u6C34\uFF08\u6240\u6709\u5E01\u79CD\u7684\u5168\u90E8\u4EA4\u6613\u6D41\u6C34\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5BA1\u8BA1\u4EA4\u6613\u8BB0\u5F55\u3001\u67E5\u770B\u8D44\u91D1\u6D41\u5411\u3001\u8C03\u8BD5\u4E0D\u660E\u6263\u6B3E\n## \u5173\u952E\u8BCD\uFF1A\u8D26\u5355, bills, \u8D44\u91D1\u6D41\u6C34, \u4EA4\u6613\u6D41\u6C34, \u8D26\u6237\u8D26\u5355\n## \u53C2\u6570\uFF1A\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SPOT/MARGIN/SWAP/FUTURES/OPTION\u3002\u53EF\u9009\n## - ccy: \u5E01\u79CD\uFF0C\u5982 USDT\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 ~10KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u6D41\u6C34 \u2192 okx_get_account_bills \u67E5\u8D26\u5355\u8BE6\u60C5 \u2192 \u5BF9\u8D26",
22516
+ {
22517
+ instType: external_exports.enum(INST_TYPE_TRADE).optional().describe("\u4EA7\u54C1\u7C7B\u578B\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
22518
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 USDT"),
22519
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22520
+ },
22521
+ async ({ instType, ccy, limit }) => {
22522
+ if (!auth) return toError(AUTH_REQUIRED);
22523
+ try {
22524
+ const data = await privateApi.getAccountBills(auth, instType, ccy, limit);
22525
+ return toResult(data);
22526
+ } catch (e) {
22527
+ return toError(e);
22528
+ }
22529
+ }
22530
+ );
22531
+ server.tool(
22532
+ "okx_get_interest_rates",
22533
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5404\u5E01\u79CD\u7684\u501F\u5E01\u5229\u7387\n## \u573A\u666F\uFF1A\u7528\u4E8E\u6BD4\u8F83\u4E0D\u540C\u5E01\u79CD\u7684\u501F\u8D37\u6210\u672C\u3001\u8BA1\u7B97\u6301\u4ED3\u5229\u606F\u3001\u9009\u62E9\u4F4E\u6210\u672C\u501F\u5E01\u5E01\u79CD\n## \u5173\u952E\u8BCD\uFF1A\u501F\u5E01\u5229\u7387, interest rate, \u5229\u7387\u67E5\u8BE2, \u501F\u8D37\u6210\u672C, \u5E01\u79CD\u5229\u7387\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 USDT\u3001BTC\u3002\u53EF\u9009\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\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\u5229\u7387 \u2192 okx_get_interest_accrued \u67E5\u5DF2\u8BA1\u5229\u606F \u2192 \u8BA1\u7B97\u603B\u6210\u672C",
22534
+ {
22535
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 USDT\u3001BTC\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8")
22536
+ },
22537
+ async ({ ccy }) => {
22538
+ if (!auth) return toError(AUTH_REQUIRED);
22539
+ try {
22540
+ const data = await privateApi.getInterestRate(auth, ccy);
22541
+ const enriched = data.map((item) => ({
22542
+ ...item,
22543
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
22544
+ }));
22545
+ return toResult(enriched);
22546
+ } catch (e) {
22547
+ return toError(e);
22548
+ }
22549
+ }
22550
+ );
22551
+ server.tool(
22552
+ "okx_get_max_withdrawal",
22553
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5404\u5E01\u79CD\u7684\u6700\u5927\u53EF\u63D0\u73B0\u6570\u91CF\n## \u573A\u666F\uFF1A\u7528\u4E8E\u63D0\u73B0\u524D\u786E\u8BA4\u53EF\u63D0\u989D\u5EA6\u3001\u5224\u65AD\u8D26\u6237\u662F\u5426\u6709\u8DB3\u591F\u8D44\u91D1\u8F6C\u51FA\n## \u5173\u952E\u8BCD\uFF1A\u6700\u5927\u63D0\u73B0, \u53EF\u63D0\u9650\u989D, max withdrawal, \u63D0\u73B0\u989D\u5EA6, \u51FA\u91D1\u4E0A\u9650\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 USDT\u3002\u53EF\u9009\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8\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\u53EF\u63D0\u989D\u5EA6 \u2192 okx_get_balance \u786E\u8BA4\u4F59\u989D \u2192 okx_withdrawal \u63D0\u73B0",
22554
+ {
22555
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 USDT\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8")
22556
+ },
22557
+ async ({ ccy }) => {
22558
+ if (!auth) return toError(AUTH_REQUIRED);
22559
+ try {
22560
+ const data = await privateApi.getMaxWithdrawal(auth, ccy);
22561
+ return toResult(data);
22562
+ } catch (e) {
22563
+ return toError(e);
22564
+ }
22565
+ }
22566
+ );
22567
+ server.tool(
22568
+ "okx_get_account_greeks",
22569
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u671F\u6743 Greeks \u98CE\u9669\u53C2\u6570\uFF08Delta/Gamma/Vega/Theta\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u671F\u6743\u6301\u4ED3\u98CE\u9669\u8BC4\u4F30\u3001\u8BA1\u7B97\u5BF9\u51B2\u6BD4\u4F8B\u3001\u7BA1\u7406\u671F\u6743\u655E\u53E3\n## \u5173\u952E\u8BCD\uFF1A\u671F\u6743\u98CE\u9669, greeks, \u671F\u6743\u53C2\u6570, Delta, Gamma, Vega, Theta, \u671F\u6743\u655E\u53E3\n## \u53C2\u6570\uFF1A\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SWAP/FUTURES/OPTION\u3002\u53EF\u9009\n## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u53EF\u9009\n## - uly: \u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USD\u3002\u53EF\u9009\n## - instId: \u4EA7\u54C1ID\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 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u98CE\u9669\u53C2\u6570 \u2192 okx_get_positions \u770B\u6301\u4ED3 \u2192 \u8C03\u6574\u5BF9\u51B2",
22570
+ {
22571
+ instType: external_exports.enum(INST_TYPE_TRADE).optional().describe("\u4EA7\u54C1\u7C7B\u578B\u3002SPOT/MARGIN/SWAP/FUTURES/OPTION"),
22572
+ instFamily: external_exports.string().optional().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD"),
22573
+ uly: external_exports.string().optional().describe("\u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USD"),
22574
+ instId: external_exports.string().optional().describe("\u4EA7\u54C1ID")
22575
+ },
22576
+ async ({ instType, instFamily, uly, instId }) => {
22577
+ if (!auth) return toError(AUTH_REQUIRED);
22578
+ try {
22579
+ const data = await privateApi.getAccountGreeks(auth, instType, instFamily, uly, instId);
22580
+ return toResult(data);
22581
+ } catch (e) {
22582
+ return toError(e);
22583
+ }
22584
+ }
22585
+ );
22586
+ server.tool(
22587
+ "okx_set_account_mode",
22588
+ "## \u529F\u80FD\uFF1A\u8BBE\u7F6E\u8D26\u6237\u6A21\u5F0F\uFF08\u5355\u5E01\u79CD/\u591A\u5E01\u79CD/\u7EC4\u5408\u4FDD\u8BC1\u91D1\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5207\u6362\u8D26\u6237\u6A21\u5F0F\u4EE5\u652F\u6301\u4E0D\u540C\u4EA4\u6613\u7B56\u7565\u3001\u5347\u7EA7\u5230\u9AD8\u7EA7\u4FDD\u8BC1\u91D1\u6A21\u5F0F\n## \u5173\u952E\u8BCD\uFF1A\u8D26\u6237\u6A21\u5F0F, set account level, \u4FDD\u8BC1\u91D1\u6A21\u5F0F, \u5355\u5E01\u79CD, \u591A\u5E01\u79CD, \u7EC4\u5408\u4FDD\u8BC1\u91D1\n## \u53C2\u6570\uFF1A\n## - acctLv: \u8D26\u6237\u5C42\u7EA7\u30021=\u7B80\u5355\u4EA4\u6613\u6A21\u5F0F, 2=\u5355\u5E01\u79CD\u4FDD\u8BC1\u91D1\u6A21\u5F0F, 3=\u591A\u5E01\u79CD\u4FDD\u8BC1\u91D1\u6A21\u5F0F, 4=\u7EC4\u5408\u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u4FEE\u6539\u8D26\u6237\u6A21\u5F0F\u5F71\u54CD\u8D44\u91D1\u4F7F\u7528\u65B9\u5F0F\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AADMIN \u2014 \u4FEE\u6539\u8D26\u6237\u914D\u7F6E\uFF0C\u5F71\u54CD\u6240\u6709\u4EA4\u6613\u884C\u4E3A\u548C\u4FDD\u8BC1\u91D1\u8BA1\u7B97\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u7531\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_account_config \u67E5\u770B\u5F53\u524D\u6A21\u5F0F \u2192 \u672C\u5DE5\u5177\u5207\u6362 \u2192 \u8C03\u6574\u4EA4\u6613\u7B56\u7565",
22589
+ {
22590
+ acctLv: external_exports.enum(["1", "2", "3", "4"]).describe("\u8D26\u6237\u5C42\u7EA7\u30021=\u7B80\u5355\u4EA4\u6613, 2=\u5355\u5E01\u79CD\u4FDD\u8BC1\u91D1, 3=\u591A\u5E01\u79CD\u4FDD\u8BC1\u91D1, 4=\u7EC4\u5408\u4FDD\u8BC1\u91D1")
22591
+ },
22592
+ async ({ acctLv }) => {
22593
+ if (!auth) return toError(AUTH_REQUIRED);
22594
+ try {
22595
+ const data = await privateApi.setAccountLevel(auth, { acctLv });
22596
+ return toResult(data);
22597
+ } catch (e) {
22598
+ return toError(e);
22599
+ }
22600
+ }
22601
+ );
22472
22602
  }
22473
22603
 
22474
22604
  // src/tools/trading.ts
@@ -22842,6 +22972,55 @@ function registerTradingTools(server, auth) {
22842
22972
  }
22843
22973
  }
22844
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
+ );
22845
23024
  }
22846
23025
 
22847
23026
  // src/tools/algo.ts
@@ -23073,6 +23252,56 @@ function registerFundingTools(server, auth) {
23073
23252
  }
23074
23253
  }
23075
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
+ );
23076
23305
  }
23077
23306
 
23078
23307
  // src/tools/stats.ts
@@ -23997,10 +24226,136 @@ function registerBotTools(server, auth) {
23997
24226
  }
23998
24227
  }
23999
24228
  );
24229
+ server.tool(
24230
+ "okx_create_recurring_plan",
24231
+ "## \u529F\u80FD\uFF1A\u521B\u5EFA\u5B9A\u6295\u8BA1\u5212\uFF08DCA\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8BBE\u7F6E\u5B9A\u671F\u4E70\u5165\u8BA1\u5212\u3001\u81EA\u52A8\u5316\u5B9A\u6295\u7B56\u7565\u3001\u5206\u6279\u5EFA\u4ED3\n## \u5173\u952E\u8BCD\uFF1A\u521B\u5EFA\u5B9A\u6295, create recurring, DCA, \u5B9A\u6295\u8BA1\u5212, \u81EA\u52A8\u5B9A\u6295\n## \u53C2\u6570\uFF1A\n## - instId: \u5B9A\u6295\u4EA7\u54C1ID\u3002\u5FC5\u586B\n## - currency: \u5B9A\u6295\u5E01\u79CD\u3002\u5FC5\u586B\n## - amount: \u6BCF\u671F\u6295\u8D44\u6570\u91CF\u3002\u5FC5\u586B\n## - period: \u5B9A\u6295\u5468\u671F\u3002daily=\u6BCF\u65E5, weekly=\u6BCF\u5468, monthly=\u6BCF\u6708\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u521B\u5EFA\u81EA\u52A8\u5B9A\u6295\u8BA1\u5212\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u521B\u5EFA\u5B9A\u6295\u8BA1\u5212\u540E\u7CFB\u7EDF\u5C06\u81EA\u52A8\u6267\u884C\u6295\u8D44\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_recurring_orders_pending \u67E5\u770B\u72B6\u6001 \u2192 okx_stop_recurring_plan \u505C\u6B62",
24232
+ {
24233
+ instId: external_exports.string().describe("\u5B9A\u6295\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
24234
+ currency: external_exports.string().describe("\u5B9A\u6295\u8D44\u91D1\u5E01\u79CD\u3002\u5FC5\u586B"),
24235
+ amount: external_exports.string().describe("\u6BCF\u671F\u6295\u8D44\u6570\u91CF\u3002\u5FC5\u586B"),
24236
+ period: external_exports.enum(["daily", "weekly", "monthly"]).describe("\u5B9A\u6295\u5468\u671F\u3002daily=\u6BCF\u65E5, weekly=\u6BCF\u5468, monthly=\u6BCF\u6708")
24237
+ },
24238
+ async ({ instId, currency, amount, period }) => {
24239
+ if (!auth) return toError(AUTH_REQUIRED);
24240
+ try {
24241
+ const data = await privateApi.createRecurringPlan(auth, { instId, currency, amount, period });
24242
+ return toResult(data);
24243
+ } catch (e) {
24244
+ return toError(e);
24245
+ }
24246
+ }
24247
+ );
24248
+ server.tool(
24249
+ "okx_stop_recurring_plan",
24250
+ "## \u529F\u80FD\uFF1A\u505C\u6B62\u5B9A\u6295\u8BA1\u5212\n## \u573A\u666F\uFF1A\u7528\u4E8E\u7EC8\u6B62\u8FD0\u884C\u4E2D\u7684\u5B9A\u6295\u8BA1\u5212\u3001\u4E0D\u518D\u7EE7\u7EED\u81EA\u52A8\u5B9A\u6295\n## \u5173\u952E\u8BCD\uFF1A\u505C\u6B62\u5B9A\u6295, stop recurring, \u7EC8\u6B62\u5B9A\u6295, \u53D6\u6D88\u5B9A\u6295\n## \u53C2\u6570\uFF1A\n## - algoId: \u5B9A\u6295\u8BA1\u5212ID\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u505C\u6B62\u81EA\u52A8\u5B9A\u6295\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u505C\u6B62\u540E\u4E0D\u518D\u81EA\u52A8\u6295\u8D44\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1Aokx_get_recurring_orders_pending \u67E5\u770B\u8FD0\u884C\u4E2D\u8BA1\u5212 \u2192 \u672C\u5DE5\u5177\u505C\u6B62",
24251
+ {
24252
+ algoId: external_exports.string().describe("\u5B9A\u6295\u8BA1\u5212ID\u3002\u5FC5\u586B")
24253
+ },
24254
+ async ({ algoId }) => {
24255
+ if (!auth) return toError(AUTH_REQUIRED);
24256
+ try {
24257
+ const data = await privateApi.stopRecurringPlan(auth, { algoId });
24258
+ return toResult(data);
24259
+ } catch (e) {
24260
+ return toError(e);
24261
+ }
24262
+ }
24263
+ );
24264
+ server.tool(
24265
+ "okx_get_recurring_sub_orders",
24266
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5B9A\u6295\u8BA1\u5212\u7684\u5B50\u8BA2\u5355\u5386\u53F2\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5B9A\u6295\u8BA1\u5212\u7684\u6BCF\u6B21\u6267\u884C\u8BB0\u5F55\u3001\u68C0\u67E5\u6BCF\u6B21\u6210\u4EA4\u4EF7\u683C\u548C\u6570\u91CF\n## \u5173\u952E\u8BCD\uFF1A\u5B9A\u6295\u5B50\u8BA2\u5355, recurring sub orders, \u5B9A\u6295\u660E\u7EC6, DCA\u8BA2\u5355, \u5B9A\u6295\u6210\u4EA4\n## \u53C2\u6570\uFF1A\n## - algoId: \u5B9A\u6295\u8BA1\u5212ID\u3002\u5FC5\u586B\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_recurring_orders_pending \u67E5\u8BA1\u5212 \u2192 \u672C\u5DE5\u5177\u67E5\u6BCF\u6B21\u6267\u884C \u2192 \u8BA1\u7B97\u5E73\u5747\u6210\u672C",
24267
+ {
24268
+ algoId: external_exports.string().describe("\u5B9A\u6295\u8BA1\u5212ID\u3002\u5FC5\u586B"),
24269
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
24270
+ },
24271
+ async ({ algoId, limit }) => {
24272
+ if (!auth) return toError(AUTH_REQUIRED);
24273
+ try {
24274
+ const data = await privateApi.getRecurringSubOrders(auth, algoId, limit);
24275
+ return toResult(data);
24276
+ } catch (e) {
24277
+ return toError(e);
24278
+ }
24279
+ }
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
+ );
24000
24355
  }
24001
24356
 
24002
24357
  // src/tools/spread.ts
24003
- function registerSpreadTools(server) {
24358
+ function registerSpreadTools(server, auth) {
24004
24359
  server.tool(
24005
24360
  "okx_get_spreads",
24006
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",
@@ -24108,6 +24463,61 @@ function registerSpreadTools(server) {
24108
24463
  }
24109
24464
  }
24110
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
+ );
24111
24521
  }
24112
24522
 
24113
24523
  // src/tools/copy.ts
@@ -24244,6 +24654,83 @@ function registerCopyTools(server, auth) {
24244
24654
  }
24245
24655
  }
24246
24656
  );
24657
+ server.tool(
24658
+ "okx_copy_trader",
24659
+ "## \u529F\u80FD\uFF1A\u8BBE\u7F6E\u8DDF\u5355\uFF08\u8DDF\u5355\u6307\u5B9A\u5E26\u5355\u5458\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5F00\u59CB\u8DDF\u5355\u67D0\u4E2A\u5E26\u5355\u5458\u3001\u8BBE\u7F6E\u8DDF\u5355\u53C2\u6570\n## \u5173\u952E\u8BCD\uFF1A\u8DDF\u5355, copy trade, \u5F00\u59CB\u8DDF\u5355, \u8BBE\u7F6E\u8DDF\u5355\n## \u53C2\u6570\uFF1A\n## - uniqueCode: \u5E26\u5355\u5458\u552F\u4E00\u6807\u8BC6\u7801\u3002\u5FC5\u586B\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272\u3002\u5FC5\u586B\n## - amount: \u8DDF\u5355\u6570\u91CF\u3002\u5FC5\u586B\n## - amountType: \u6570\u91CF\u7C7B\u578B\u30021=\u56FA\u5B9A\u5F20\u6570, 2=\u56FA\u5B9A\u91D1\u989D, 3=\u6BD4\u4F8B\u3002\u53EF\u9009\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u5F00\u59CB\u8DDF\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u5F00\u59CB\u8DDF\u5355\u540E\u7CFB\u7EDF\u5C06\u81EA\u52A8\u590D\u5236\u5E26\u5355\u5458\u4EA4\u6613\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_lead_trader_stats \u8BC4\u4F30\u5E26\u5355\u5458 \u2192 \u672C\u5DE5\u5177\u8DDF\u5355 \u2192 okx_get_copy_settings \u67E5\u770B\u8BBE\u7F6E",
24660
+ {
24661
+ uniqueCode: external_exports.string().describe("\u5E26\u5355\u5458\u552F\u4E00\u6807\u8BC6\u7801\u3002\u5FC5\u586B"),
24662
+ instType: external_exports.enum(INST_TYPE_SWAP_FUT).describe("\u4EA7\u54C1\u7C7B\u578B\u3002SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272"),
24663
+ amount: external_exports.string().describe("\u8DDF\u5355\u6570\u91CF"),
24664
+ amountType: external_exports.string().optional().describe("\u6570\u91CF\u7C7B\u578B\u30021=\u56FA\u5B9A\u5F20\u6570, 2=\u56FA\u5B9A\u91D1\u989D, 3=\u6BD4\u4F8B")
24665
+ },
24666
+ async ({ uniqueCode, instType, amount, amountType }) => {
24667
+ if (!auth) return toError(AUTH_REQUIRED);
24668
+ try {
24669
+ const body = { uniqueCode, instType, amount };
24670
+ if (amountType) body.amountType = amountType;
24671
+ const data = await privateApi.setCopySettings(auth, body);
24672
+ return toResult(data);
24673
+ } catch (e) {
24674
+ return toError(e);
24675
+ }
24676
+ }
24677
+ );
24678
+ server.tool(
24679
+ "okx_stop_copy_trader",
24680
+ "## \u529F\u80FD\uFF1A\u505C\u6B62\u8DDF\u5355\uFF08\u5173\u95ED\u5B50\u6301\u4ED3\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u505C\u6B62\u8DDF\u968F\u67D0\u5E26\u5355\u5458\u7684\u4EA4\u6613\u3001\u5E73\u6389\u6240\u6709\u8DDF\u968F\u4ED3\u4F4D\n## \u5173\u952E\u8BCD\uFF1A\u505C\u6B62\u8DDF\u5355, stop copy, \u5173\u95ED\u8DDF\u5355, \u53D6\u6D88\u8DDF\u5355\n## \u53C2\u6570\uFF1A\n## - subPosId: \u5B50\u6301\u4ED3ID\u3002\u53EF\u9009\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u5E73\u6389\u8DDF\u5355\u4ED3\u4F4D\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 ~300B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u505C\u6B62\u8DDF\u5355 \u2192 okx_get_my_lead_history \u786E\u8BA4\u7ED3\u679C",
24681
+ {
24682
+ subPosId: external_exports.string().optional().describe("\u5B50\u6301\u4ED3ID")
24683
+ },
24684
+ async ({ subPosId }) => {
24685
+ if (!auth) return toError(AUTH_REQUIRED);
24686
+ try {
24687
+ const body = {};
24688
+ if (subPosId) body.subPosId = subPosId;
24689
+ const data = await privateApi.closeSubposition(auth, body);
24690
+ return toResult(data);
24691
+ } catch (e) {
24692
+ return toError(e);
24693
+ }
24694
+ }
24695
+ );
24696
+ server.tool(
24697
+ "okx_get_copy_settings",
24698
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5F53\u524D\u8DDF\u5355\u8BBE\u7F6E\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5DF2\u8BBE\u7F6E\u7684\u8DDF\u5355\u89C4\u5219\u3001\u8DDF\u5355\u6570\u91CF\u548C\u7C7B\u578B\n## \u5173\u952E\u8BCD\uFF1A\u8DDF\u5355\u8BBE\u7F6E, copy settings, \u8DDF\u5355\u89C4\u5219, \u8DDF\u5355\u914D\u7F6E\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\u8BBE\u7F6E \u2192 okx_set_copy_settings \u4FEE\u6539 \u2192 \u7BA1\u7406\u8DDF\u5355\u7B56\u7565",
24699
+ {},
24700
+ async () => {
24701
+ if (!auth) return toError(AUTH_REQUIRED);
24702
+ try {
24703
+ const data = await privateApi.getCopySettings(auth);
24704
+ return toResult(data);
24705
+ } catch (e) {
24706
+ return toError(e);
24707
+ }
24708
+ }
24709
+ );
24710
+ server.tool(
24711
+ "okx_set_copy_settings",
24712
+ "## \u529F\u80FD\uFF1A\u4FEE\u6539\u8DDF\u5355\u8BBE\u7F6E\uFF08\u8DDF\u5355\u6570\u91CF/\u6BD4\u4F8B\u7B49\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8C03\u6574\u5DF2\u6709\u8DDF\u5355\u7684\u53C2\u6570\u3001\u4FEE\u6539\u8DDF\u5355\u91D1\u989D\u6216\u6BD4\u4F8B\n## \u5173\u952E\u8BCD\uFF1A\u4FEE\u6539\u8DDF\u5355, update copy settings, \u8C03\u6574\u8DDF\u5355, \u8DDF\u5355\u53C2\u6570\n## \u53C2\u6570\uFF1A\n## - uniqueCode: \u5E26\u5355\u5458\u552F\u4E00\u6807\u8BC6\u7801\u3002\u53EF\u9009\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SWAP/FUTURES\u3002\u53EF\u9009\n## - amount: \u8DDF\u5355\u6570\u91CF\u3002\u53EF\u9009\n## - amountType: \u6570\u91CF\u7C7B\u578B\u30021=\u56FA\u5B9A\u5F20\u6570, 2=\u56FA\u5B9A\u91D1\u989D, 3=\u6BD4\u4F8B\u3002\u53EF\u9009\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u4FEE\u6539\u8DDF\u5355\u8BBE\u7F6E\u5F71\u54CD\u540E\u7EED\u8DDF\u5355\uFF0C\u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u4FEE\u6539\u8DDF\u5355\u53C2\u6570\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_copy_settings \u67E5\u770B\u5F53\u524D \u2192 \u672C\u5DE5\u5177\u4FEE\u6539 \u2192 \u786E\u8BA4\u53D8\u66F4\u751F\u6548",
24713
+ {
24714
+ uniqueCode: external_exports.string().optional().describe("\u5E26\u5355\u5458\u552F\u4E00\u6807\u8BC6\u7801"),
24715
+ instType: external_exports.enum(INST_TYPE_SWAP_FUT).optional().describe("\u4EA7\u54C1\u7C7B\u578B"),
24716
+ amount: external_exports.string().optional().describe("\u8DDF\u5355\u6570\u91CF"),
24717
+ amountType: external_exports.string().optional().describe("\u6570\u91CF\u7C7B\u578B\u30021=\u56FA\u5B9A\u5F20\u6570, 2=\u56FA\u5B9A\u91D1\u989D, 3=\u6BD4\u4F8B")
24718
+ },
24719
+ async ({ uniqueCode, instType, amount, amountType }) => {
24720
+ if (!auth) return toError(AUTH_REQUIRED);
24721
+ try {
24722
+ const body = {};
24723
+ if (uniqueCode) body.uniqueCode = uniqueCode;
24724
+ if (instType) body.instType = instType;
24725
+ if (amount) body.amount = amount;
24726
+ if (amountType) body.amountType = amountType;
24727
+ const data = await privateApi.updateCopySettings(auth, body);
24728
+ return toResult(data);
24729
+ } catch (e) {
24730
+ return toError(e);
24731
+ }
24732
+ }
24733
+ );
24247
24734
  }
24248
24735
 
24249
24736
  // src/tools/signal.ts
@@ -24350,6 +24837,183 @@ function registerSignalTools(server, auth) {
24350
24837
  }
24351
24838
  }
24352
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
+ );
24903
+ }
24904
+
24905
+ // src/tools/rfq.ts
24906
+ function registerRfqTools(server, auth) {
24907
+ server.tool(
24908
+ "okx_create_rfq",
24909
+ `## \u529F\u80FD\uFF1A\u521B\u5EFA\u62A5\u4EF7\u8BF7\u6C42\uFF08RFQ\uFF0CRequest For Quote\uFF09\uFF0C\u7528\u4E8E\u5927\u5B97\u4EA4\u6613\u8BE2\u4EF7
24910
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u5411\u505A\u5E02\u5546\u6216\u5BF9\u624B\u65B9\u53D1\u8D77\u5927\u5B97\u4EA4\u6613\u8BE2\u4EF7\u3001\u83B7\u53D6\u5B9A\u5236\u62A5\u4EF7
24911
+ ## \u5173\u952E\u8BCD\uFF1A\u8BE2\u4EF7, RFQ, \u62A5\u4EF7\u8BF7\u6C42, \u5927\u5B97\u4EA4\u6613\u8BE2\u4EF7, \u8BF7\u6C42\u62A5\u4EF7
24912
+ ## \u53C2\u6570\uFF1A
24913
+ ## - instId: \u4EA7\u54C1ID\u3002\u5FC5\u586B
24914
+ ## - side: \u4E70\u5356\u65B9\u5411\u3002buy=\u4E70\u5165, sell=\u5356\u51FA\u3002\u5FC5\u586B
24915
+ ## - sz: \u6570\u91CF\u3002\u5FC5\u586B
24916
+ ## - szType: \u6570\u91CF\u7C7B\u578B\u3002base=\u6309\u5E01, quote=\u6309\u8BA1\u4EF7\u5E01\u3002\u53EF\u9009
24917
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u53D1\u9001\u5927\u5B97\u4EA4\u6613\u8BE2\u4EF7\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4
24918
+ ## \u98CE\u9669\uFF1AWRITE \u2014 \u53D1\u9001RFQ\u540E\u4F1A\u6536\u5230\u62A5\u4EF7\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4
24919
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B
24920
+ ## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u8BE2\u4EF7 \u2192 okx_get_quotes \u67E5\u6536\u5230\u7684\u62A5\u4EF7 \u2192 okx_execute_quote \u6267\u884C\u62A5\u4EF7`,
24921
+ {
24922
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
24923
+ side: external_exports.enum(["buy", "sell"]).describe("\u4E70\u5356\u65B9\u5411\u3002buy=\u4E70\u5165, sell=\u5356\u51FA"),
24924
+ sz: external_exports.string().describe("\u6570\u91CF\u3002\u5FC5\u586B"),
24925
+ szType: external_exports.enum(["base", "quote"]).optional().describe("\u6570\u91CF\u7C7B\u578B\u3002base=\u6309\u5E01, quote=\u6309\u8BA1\u4EF7\u5E01")
24926
+ },
24927
+ async ({ instId, side, sz, szType }) => {
24928
+ if (!auth) return toError(AUTH_REQUIRED);
24929
+ try {
24930
+ const body = { instId, side, sz };
24931
+ if (szType) body.szType = szType;
24932
+ const data = await privateApi.createRfq(auth, body);
24933
+ return toResult(data);
24934
+ } catch (e) {
24935
+ return toError(e);
24936
+ }
24937
+ }
24938
+ );
24939
+ server.tool(
24940
+ "okx_execute_quote",
24941
+ `## \u529F\u80FD\uFF1A\u6267\u884C\u62A5\u4EF7\uFF08\u63A5\u53D7\u5BF9\u624B\u65B9\u7684\u5927\u5B97\u4EA4\u6613\u62A5\u4EF7\uFF09
24942
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u63A5\u53D7RFQ\u62A5\u4EF7\u3001\u786E\u8BA4\u5927\u5B97\u4EA4\u6613\u6210\u4EA4
24943
+ ## \u5173\u952E\u8BCD\uFF1A\u6267\u884C\u62A5\u4EF7, execute quote, \u63A5\u53D7\u62A5\u4EF7, \u5927\u5B97\u6210\u4EA4, \u786E\u8BA4\u4EA4\u6613
24944
+ ## \u53C2\u6570\uFF1A
24945
+ ## - instId: \u4EA7\u54C1ID\u3002\u5FC5\u586B
24946
+ ## - quoteId: \u62A5\u4EF7ID\u3002\u5FC5\u586B
24947
+ ## - rfqId: RFQ ID\u3002\u5FC5\u586B
24948
+ ## - sz: \u6210\u4EA4\u6570\u91CF\u3002\u5FC5\u586B
24949
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u6267\u884C\u5927\u5B97\u4EA4\u6613\u6210\u4EA4\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4
24950
+ ## \u98CE\u9669\uFF1AWRITE \u2014 \u6267\u884C\u62A5\u4EF7\u540E\u5373\u6210\u4EA4\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4
24951
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B
24952
+ ## \u5173\u8054\uFF1Aokx_create_rfq \u53D1\u8D77\u8BE2\u4EF7 \u2192 okx_get_quotes \u67E5\u770B\u62A5\u4EF7 \u2192 \u672C\u5DE5\u5177\u6210\u4EA4`,
24953
+ {
24954
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
24955
+ quoteId: external_exports.string().describe("\u62A5\u4EF7ID\u3002\u5FC5\u586B"),
24956
+ rfqId: external_exports.string().describe("RFQ ID\u3002\u5FC5\u586B"),
24957
+ sz: external_exports.string().describe("\u6210\u4EA4\u6570\u91CF\u3002\u5FC5\u586B")
24958
+ },
24959
+ async ({ instId, quoteId, rfqId, sz }) => {
24960
+ if (!auth) return toError(AUTH_REQUIRED);
24961
+ try {
24962
+ const data = await privateApi.executeRfqQuote(auth, { instId, quoteId, rfqId, sz });
24963
+ return toResult(data);
24964
+ } catch (e) {
24965
+ return toError(e);
24966
+ }
24967
+ }
24968
+ );
24969
+ server.tool(
24970
+ "okx_get_rfqs",
24971
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u8BE2\u4EF7\u8BB0\u5F55\u5217\u8868
24972
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5386\u53F2RFQ\u3001\u8FFD\u8E2A\u8BE2\u4EF7\u72B6\u6001\u3001\u786E\u8BA4\u8BE2\u4EF7\u662F\u5426\u5DF2\u62A5\u4EF7
24973
+ ## \u5173\u952E\u8BCD\uFF1A\u8BE2\u4EF7\u8BB0\u5F55, RFQ\u5217\u8868, \u8BE2\u4EF7\u5386\u53F2, RFQ\u8BB0\u5F55, \u62A5\u4EF7\u8BF7\u6C42\u8BB0\u5F55
24974
+ ## \u53C2\u6570\uFF1A
24975
+ ## - state: \u72B6\u6001\u7B5B\u9009\u3002active=\u8FDB\u884C\u4E2D, executed=\u5DF2\u6210\u4EA4, canceled=\u5DF2\u53D6\u6D88\u3002\u53EF\u9009
24976
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
24977
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
24978
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB
24979
+ ## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u8BE2\u4EF7\u5217\u8868 \u2192 okx_get_quotes \u67E5\u770B\u5BF9\u5E94\u62A5\u4EF7 \u2192 \u7BA1\u7406\u5927\u5B97\u4EA4\u6613`,
24980
+ {
24981
+ state: external_exports.enum(["active", "executed", "canceled"]).optional().describe("\u72B6\u6001\u7B5B\u9009\u3002active=\u8FDB\u884C\u4E2D, executed=\u5DF2\u6210\u4EA4, canceled=\u5DF2\u53D6\u6D88")
24982
+ },
24983
+ async ({ state }) => {
24984
+ if (!auth) return toError(AUTH_REQUIRED);
24985
+ try {
24986
+ const data = await privateApi.getRfqs(auth, state);
24987
+ return toResult(data);
24988
+ } catch (e) {
24989
+ return toError(e);
24990
+ }
24991
+ }
24992
+ );
24993
+ server.tool(
24994
+ "okx_get_quotes",
24995
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u9488\u5BF9\u67D0RFQ\u7684\u62A5\u4EF7\u5217\u8868
24996
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5BF9\u624B\u65B9\u5BF9RFQ\u7684\u56DE\u590D\u62A5\u4EF7\u3001\u9009\u62E9\u6700\u4F18\u62A5\u4EF7\u6267\u884C
24997
+ ## \u5173\u952E\u8BCD\uFF1A\u62A5\u4EF7\u5217\u8868, quotes, RFQ\u62A5\u4EF7, \u67E5\u8BE2\u62A5\u4EF7, \u5BF9\u624B\u65B9\u62A5\u4EF7
24998
+ ## \u53C2\u6570\uFF1A
24999
+ ## - rfqId: RFQ ID\u3002\u5FC5\u586B
25000
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
25001
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
25002
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB
25003
+ ## \u5173\u8054\uFF1Aokx_get_rfqs \u67E5\u8BE2\u4EF7 \u2192 \u672C\u5DE5\u5177\u67E5\u770B\u62A5\u4EF7 \u2192 okx_execute_quote \u6267\u884C`,
25004
+ {
25005
+ rfqId: external_exports.string().describe("RFQ ID\u3002\u5FC5\u586B")
25006
+ },
25007
+ async ({ rfqId }) => {
25008
+ if (!auth) return toError(AUTH_REQUIRED);
25009
+ try {
25010
+ const data = await privateApi.getRfqQuotes(auth, rfqId);
25011
+ return toResult(data);
25012
+ } catch (e) {
25013
+ return toError(e);
25014
+ }
25015
+ }
25016
+ );
24353
25017
  }
24354
25018
 
24355
25019
  // src/index.ts
@@ -24359,7 +25023,7 @@ async function main() {
24359
25023
  registerMarketTools(server);
24360
25024
  registerPublicTools(server, auth);
24361
25025
  registerStatsTools(server);
24362
- registerSpreadTools(server);
25026
+ registerSpreadTools(server, auth);
24363
25027
  registerOutcomesTools(server);
24364
25028
  registerAccountTools(server, auth);
24365
25029
  registerTradingTools(server, auth);
@@ -24370,6 +25034,7 @@ async function main() {
24370
25034
  registerFundingTools(server, auth);
24371
25035
  registerSubAccountTools(server, auth);
24372
25036
  registerFinanceTools(server, auth);
25037
+ registerRfqTools(server, auth);
24373
25038
  const transport = new StdioServerTransport();
24374
25039
  await server.connect(transport);
24375
25040
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hvip-mcp-server",
3
- "version": "0.2.21",
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",