hvip-mcp-server 0.2.21 → 0.2.22

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 +353 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21301,7 +21301,26 @@ 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 })
21305
21324
  };
21306
21325
 
21307
21326
  // src/adapters/hrails.ts
@@ -22469,6 +22488,95 @@ function registerAccountTools(server, auth) {
22469
22488
  }
22470
22489
  }
22471
22490
  );
22491
+ server.tool(
22492
+ "okx_get_bills",
22493
+ "## \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",
22494
+ {
22495
+ instType: external_exports.enum(INST_TYPE_TRADE).optional().describe("\u4EA7\u54C1\u7C7B\u578B\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
22496
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 USDT"),
22497
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22498
+ },
22499
+ async ({ instType, ccy, limit }) => {
22500
+ if (!auth) return toError(AUTH_REQUIRED);
22501
+ try {
22502
+ const data = await privateApi.getAccountBills(auth, instType, ccy, limit);
22503
+ return toResult(data);
22504
+ } catch (e) {
22505
+ return toError(e);
22506
+ }
22507
+ }
22508
+ );
22509
+ server.tool(
22510
+ "okx_get_interest_rates",
22511
+ "## \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",
22512
+ {
22513
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 USDT\u3001BTC\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8")
22514
+ },
22515
+ async ({ ccy }) => {
22516
+ if (!auth) return toError(AUTH_REQUIRED);
22517
+ try {
22518
+ const data = await privateApi.getInterestRate(auth, ccy);
22519
+ const enriched = data.map((item) => ({
22520
+ ...item,
22521
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
22522
+ }));
22523
+ return toResult(enriched);
22524
+ } catch (e) {
22525
+ return toError(e);
22526
+ }
22527
+ }
22528
+ );
22529
+ server.tool(
22530
+ "okx_get_max_withdrawal",
22531
+ "## \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",
22532
+ {
22533
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 USDT\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8")
22534
+ },
22535
+ async ({ ccy }) => {
22536
+ if (!auth) return toError(AUTH_REQUIRED);
22537
+ try {
22538
+ const data = await privateApi.getMaxWithdrawal(auth, ccy);
22539
+ return toResult(data);
22540
+ } catch (e) {
22541
+ return toError(e);
22542
+ }
22543
+ }
22544
+ );
22545
+ server.tool(
22546
+ "okx_get_account_greeks",
22547
+ "## \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",
22548
+ {
22549
+ instType: external_exports.enum(INST_TYPE_TRADE).optional().describe("\u4EA7\u54C1\u7C7B\u578B\u3002SPOT/MARGIN/SWAP/FUTURES/OPTION"),
22550
+ instFamily: external_exports.string().optional().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD"),
22551
+ uly: external_exports.string().optional().describe("\u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USD"),
22552
+ instId: external_exports.string().optional().describe("\u4EA7\u54C1ID")
22553
+ },
22554
+ async ({ instType, instFamily, uly, instId }) => {
22555
+ if (!auth) return toError(AUTH_REQUIRED);
22556
+ try {
22557
+ const data = await privateApi.getAccountGreeks(auth, instType, instFamily, uly, instId);
22558
+ return toResult(data);
22559
+ } catch (e) {
22560
+ return toError(e);
22561
+ }
22562
+ }
22563
+ );
22564
+ server.tool(
22565
+ "okx_set_account_mode",
22566
+ "## \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",
22567
+ {
22568
+ 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")
22569
+ },
22570
+ async ({ acctLv }) => {
22571
+ if (!auth) return toError(AUTH_REQUIRED);
22572
+ try {
22573
+ const data = await privateApi.setAccountLevel(auth, { acctLv });
22574
+ return toResult(data);
22575
+ } catch (e) {
22576
+ return toError(e);
22577
+ }
22578
+ }
22579
+ );
22472
22580
  }
22473
22581
 
22474
22582
  // src/tools/trading.ts
@@ -23997,6 +24105,58 @@ function registerBotTools(server, auth) {
23997
24105
  }
23998
24106
  }
23999
24107
  );
24108
+ server.tool(
24109
+ "okx_create_recurring_plan",
24110
+ "## \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",
24111
+ {
24112
+ instId: external_exports.string().describe("\u5B9A\u6295\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
24113
+ currency: external_exports.string().describe("\u5B9A\u6295\u8D44\u91D1\u5E01\u79CD\u3002\u5FC5\u586B"),
24114
+ amount: external_exports.string().describe("\u6BCF\u671F\u6295\u8D44\u6570\u91CF\u3002\u5FC5\u586B"),
24115
+ period: external_exports.enum(["daily", "weekly", "monthly"]).describe("\u5B9A\u6295\u5468\u671F\u3002daily=\u6BCF\u65E5, weekly=\u6BCF\u5468, monthly=\u6BCF\u6708")
24116
+ },
24117
+ async ({ instId, currency, amount, period }) => {
24118
+ if (!auth) return toError(AUTH_REQUIRED);
24119
+ try {
24120
+ const data = await privateApi.createRecurringPlan(auth, { instId, currency, amount, period });
24121
+ return toResult(data);
24122
+ } catch (e) {
24123
+ return toError(e);
24124
+ }
24125
+ }
24126
+ );
24127
+ server.tool(
24128
+ "okx_stop_recurring_plan",
24129
+ "## \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",
24130
+ {
24131
+ algoId: external_exports.string().describe("\u5B9A\u6295\u8BA1\u5212ID\u3002\u5FC5\u586B")
24132
+ },
24133
+ async ({ algoId }) => {
24134
+ if (!auth) return toError(AUTH_REQUIRED);
24135
+ try {
24136
+ const data = await privateApi.stopRecurringPlan(auth, { algoId });
24137
+ return toResult(data);
24138
+ } catch (e) {
24139
+ return toError(e);
24140
+ }
24141
+ }
24142
+ );
24143
+ server.tool(
24144
+ "okx_get_recurring_sub_orders",
24145
+ "## \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",
24146
+ {
24147
+ algoId: external_exports.string().describe("\u5B9A\u6295\u8BA1\u5212ID\u3002\u5FC5\u586B"),
24148
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
24149
+ },
24150
+ async ({ algoId, limit }) => {
24151
+ if (!auth) return toError(AUTH_REQUIRED);
24152
+ try {
24153
+ const data = await privateApi.getRecurringSubOrders(auth, algoId, limit);
24154
+ return toResult(data);
24155
+ } catch (e) {
24156
+ return toError(e);
24157
+ }
24158
+ }
24159
+ );
24000
24160
  }
24001
24161
 
24002
24162
  // src/tools/spread.ts
@@ -24244,6 +24404,83 @@ function registerCopyTools(server, auth) {
24244
24404
  }
24245
24405
  }
24246
24406
  );
24407
+ server.tool(
24408
+ "okx_copy_trader",
24409
+ "## \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",
24410
+ {
24411
+ uniqueCode: external_exports.string().describe("\u5E26\u5355\u5458\u552F\u4E00\u6807\u8BC6\u7801\u3002\u5FC5\u586B"),
24412
+ instType: external_exports.enum(INST_TYPE_SWAP_FUT).describe("\u4EA7\u54C1\u7C7B\u578B\u3002SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272"),
24413
+ amount: external_exports.string().describe("\u8DDF\u5355\u6570\u91CF"),
24414
+ amountType: external_exports.string().optional().describe("\u6570\u91CF\u7C7B\u578B\u30021=\u56FA\u5B9A\u5F20\u6570, 2=\u56FA\u5B9A\u91D1\u989D, 3=\u6BD4\u4F8B")
24415
+ },
24416
+ async ({ uniqueCode, instType, amount, amountType }) => {
24417
+ if (!auth) return toError(AUTH_REQUIRED);
24418
+ try {
24419
+ const body = { uniqueCode, instType, amount };
24420
+ if (amountType) body.amountType = amountType;
24421
+ const data = await privateApi.setCopySettings(auth, body);
24422
+ return toResult(data);
24423
+ } catch (e) {
24424
+ return toError(e);
24425
+ }
24426
+ }
24427
+ );
24428
+ server.tool(
24429
+ "okx_stop_copy_trader",
24430
+ "## \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",
24431
+ {
24432
+ subPosId: external_exports.string().optional().describe("\u5B50\u6301\u4ED3ID")
24433
+ },
24434
+ async ({ subPosId }) => {
24435
+ if (!auth) return toError(AUTH_REQUIRED);
24436
+ try {
24437
+ const body = {};
24438
+ if (subPosId) body.subPosId = subPosId;
24439
+ const data = await privateApi.closeSubposition(auth, body);
24440
+ return toResult(data);
24441
+ } catch (e) {
24442
+ return toError(e);
24443
+ }
24444
+ }
24445
+ );
24446
+ server.tool(
24447
+ "okx_get_copy_settings",
24448
+ "## \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",
24449
+ {},
24450
+ async () => {
24451
+ if (!auth) return toError(AUTH_REQUIRED);
24452
+ try {
24453
+ const data = await privateApi.getCopySettings(auth);
24454
+ return toResult(data);
24455
+ } catch (e) {
24456
+ return toError(e);
24457
+ }
24458
+ }
24459
+ );
24460
+ server.tool(
24461
+ "okx_set_copy_settings",
24462
+ "## \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",
24463
+ {
24464
+ uniqueCode: external_exports.string().optional().describe("\u5E26\u5355\u5458\u552F\u4E00\u6807\u8BC6\u7801"),
24465
+ instType: external_exports.enum(INST_TYPE_SWAP_FUT).optional().describe("\u4EA7\u54C1\u7C7B\u578B"),
24466
+ amount: external_exports.string().optional().describe("\u8DDF\u5355\u6570\u91CF"),
24467
+ amountType: external_exports.string().optional().describe("\u6570\u91CF\u7C7B\u578B\u30021=\u56FA\u5B9A\u5F20\u6570, 2=\u56FA\u5B9A\u91D1\u989D, 3=\u6BD4\u4F8B")
24468
+ },
24469
+ async ({ uniqueCode, instType, amount, amountType }) => {
24470
+ if (!auth) return toError(AUTH_REQUIRED);
24471
+ try {
24472
+ const body = {};
24473
+ if (uniqueCode) body.uniqueCode = uniqueCode;
24474
+ if (instType) body.instType = instType;
24475
+ if (amount) body.amount = amount;
24476
+ if (amountType) body.amountType = amountType;
24477
+ const data = await privateApi.updateCopySettings(auth, body);
24478
+ return toResult(data);
24479
+ } catch (e) {
24480
+ return toError(e);
24481
+ }
24482
+ }
24483
+ );
24247
24484
  }
24248
24485
 
24249
24486
  // src/tools/signal.ts
@@ -24352,6 +24589,120 @@ function registerSignalTools(server, auth) {
24352
24589
  );
24353
24590
  }
24354
24591
 
24592
+ // src/tools/rfq.ts
24593
+ function registerRfqTools(server, auth) {
24594
+ server.tool(
24595
+ "okx_create_rfq",
24596
+ `## \u529F\u80FD\uFF1A\u521B\u5EFA\u62A5\u4EF7\u8BF7\u6C42\uFF08RFQ\uFF0CRequest For Quote\uFF09\uFF0C\u7528\u4E8E\u5927\u5B97\u4EA4\u6613\u8BE2\u4EF7
24597
+ ## \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
24598
+ ## \u5173\u952E\u8BCD\uFF1A\u8BE2\u4EF7, RFQ, \u62A5\u4EF7\u8BF7\u6C42, \u5927\u5B97\u4EA4\u6613\u8BE2\u4EF7, \u8BF7\u6C42\u62A5\u4EF7
24599
+ ## \u53C2\u6570\uFF1A
24600
+ ## - instId: \u4EA7\u54C1ID\u3002\u5FC5\u586B
24601
+ ## - side: \u4E70\u5356\u65B9\u5411\u3002buy=\u4E70\u5165, sell=\u5356\u51FA\u3002\u5FC5\u586B
24602
+ ## - sz: \u6570\u91CF\u3002\u5FC5\u586B
24603
+ ## - szType: \u6570\u91CF\u7C7B\u578B\u3002base=\u6309\u5E01, quote=\u6309\u8BA1\u4EF7\u5E01\u3002\u53EF\u9009
24604
+ ## \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
24605
+ ## \u98CE\u9669\uFF1AWRITE \u2014 \u53D1\u9001RFQ\u540E\u4F1A\u6536\u5230\u62A5\u4EF7\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4
24606
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B
24607
+ ## \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`,
24608
+ {
24609
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
24610
+ side: external_exports.enum(["buy", "sell"]).describe("\u4E70\u5356\u65B9\u5411\u3002buy=\u4E70\u5165, sell=\u5356\u51FA"),
24611
+ sz: external_exports.string().describe("\u6570\u91CF\u3002\u5FC5\u586B"),
24612
+ szType: external_exports.enum(["base", "quote"]).optional().describe("\u6570\u91CF\u7C7B\u578B\u3002base=\u6309\u5E01, quote=\u6309\u8BA1\u4EF7\u5E01")
24613
+ },
24614
+ async ({ instId, side, sz, szType }) => {
24615
+ if (!auth) return toError(AUTH_REQUIRED);
24616
+ try {
24617
+ const body = { instId, side, sz };
24618
+ if (szType) body.szType = szType;
24619
+ const data = await privateApi.createRfq(auth, body);
24620
+ return toResult(data);
24621
+ } catch (e) {
24622
+ return toError(e);
24623
+ }
24624
+ }
24625
+ );
24626
+ server.tool(
24627
+ "okx_execute_quote",
24628
+ `## \u529F\u80FD\uFF1A\u6267\u884C\u62A5\u4EF7\uFF08\u63A5\u53D7\u5BF9\u624B\u65B9\u7684\u5927\u5B97\u4EA4\u6613\u62A5\u4EF7\uFF09
24629
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u63A5\u53D7RFQ\u62A5\u4EF7\u3001\u786E\u8BA4\u5927\u5B97\u4EA4\u6613\u6210\u4EA4
24630
+ ## \u5173\u952E\u8BCD\uFF1A\u6267\u884C\u62A5\u4EF7, execute quote, \u63A5\u53D7\u62A5\u4EF7, \u5927\u5B97\u6210\u4EA4, \u786E\u8BA4\u4EA4\u6613
24631
+ ## \u53C2\u6570\uFF1A
24632
+ ## - instId: \u4EA7\u54C1ID\u3002\u5FC5\u586B
24633
+ ## - quoteId: \u62A5\u4EF7ID\u3002\u5FC5\u586B
24634
+ ## - rfqId: RFQ ID\u3002\u5FC5\u586B
24635
+ ## - sz: \u6210\u4EA4\u6570\u91CF\u3002\u5FC5\u586B
24636
+ ## \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
24637
+ ## \u98CE\u9669\uFF1AWRITE \u2014 \u6267\u884C\u62A5\u4EF7\u540E\u5373\u6210\u4EA4\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4
24638
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B
24639
+ ## \u5173\u8054\uFF1Aokx_create_rfq \u53D1\u8D77\u8BE2\u4EF7 \u2192 okx_get_quotes \u67E5\u770B\u62A5\u4EF7 \u2192 \u672C\u5DE5\u5177\u6210\u4EA4`,
24640
+ {
24641
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
24642
+ quoteId: external_exports.string().describe("\u62A5\u4EF7ID\u3002\u5FC5\u586B"),
24643
+ rfqId: external_exports.string().describe("RFQ ID\u3002\u5FC5\u586B"),
24644
+ sz: external_exports.string().describe("\u6210\u4EA4\u6570\u91CF\u3002\u5FC5\u586B")
24645
+ },
24646
+ async ({ instId, quoteId, rfqId, sz }) => {
24647
+ if (!auth) return toError(AUTH_REQUIRED);
24648
+ try {
24649
+ const data = await privateApi.executeRfqQuote(auth, { instId, quoteId, rfqId, sz });
24650
+ return toResult(data);
24651
+ } catch (e) {
24652
+ return toError(e);
24653
+ }
24654
+ }
24655
+ );
24656
+ server.tool(
24657
+ "okx_get_rfqs",
24658
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u8BE2\u4EF7\u8BB0\u5F55\u5217\u8868
24659
+ ## \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
24660
+ ## \u5173\u952E\u8BCD\uFF1A\u8BE2\u4EF7\u8BB0\u5F55, RFQ\u5217\u8868, \u8BE2\u4EF7\u5386\u53F2, RFQ\u8BB0\u5F55, \u62A5\u4EF7\u8BF7\u6C42\u8BB0\u5F55
24661
+ ## \u53C2\u6570\uFF1A
24662
+ ## - state: \u72B6\u6001\u7B5B\u9009\u3002active=\u8FDB\u884C\u4E2D, executed=\u5DF2\u6210\u4EA4, canceled=\u5DF2\u53D6\u6D88\u3002\u53EF\u9009
24663
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
24664
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
24665
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB
24666
+ ## \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`,
24667
+ {
24668
+ 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")
24669
+ },
24670
+ async ({ state }) => {
24671
+ if (!auth) return toError(AUTH_REQUIRED);
24672
+ try {
24673
+ const data = await privateApi.getRfqs(auth, state);
24674
+ return toResult(data);
24675
+ } catch (e) {
24676
+ return toError(e);
24677
+ }
24678
+ }
24679
+ );
24680
+ server.tool(
24681
+ "okx_get_quotes",
24682
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u9488\u5BF9\u67D0RFQ\u7684\u62A5\u4EF7\u5217\u8868
24683
+ ## \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
24684
+ ## \u5173\u952E\u8BCD\uFF1A\u62A5\u4EF7\u5217\u8868, quotes, RFQ\u62A5\u4EF7, \u67E5\u8BE2\u62A5\u4EF7, \u5BF9\u624B\u65B9\u62A5\u4EF7
24685
+ ## \u53C2\u6570\uFF1A
24686
+ ## - rfqId: RFQ ID\u3002\u5FC5\u586B
24687
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
24688
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
24689
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB
24690
+ ## \u5173\u8054\uFF1Aokx_get_rfqs \u67E5\u8BE2\u4EF7 \u2192 \u672C\u5DE5\u5177\u67E5\u770B\u62A5\u4EF7 \u2192 okx_execute_quote \u6267\u884C`,
24691
+ {
24692
+ rfqId: external_exports.string().describe("RFQ ID\u3002\u5FC5\u586B")
24693
+ },
24694
+ async ({ rfqId }) => {
24695
+ if (!auth) return toError(AUTH_REQUIRED);
24696
+ try {
24697
+ const data = await privateApi.getRfqQuotes(auth, rfqId);
24698
+ return toResult(data);
24699
+ } catch (e) {
24700
+ return toError(e);
24701
+ }
24702
+ }
24703
+ );
24704
+ }
24705
+
24355
24706
  // src/index.ts
24356
24707
  async function main() {
24357
24708
  const server = new McpServer({ name: "hvip", version: "0.2.1" });
@@ -24370,6 +24721,7 @@ async function main() {
24370
24721
  registerFundingTools(server, auth);
24371
24722
  registerSubAccountTools(server, auth);
24372
24723
  registerFinanceTools(server, auth);
24724
+ registerRfqTools(server, auth);
24373
24725
  const transport = new StdioServerTransport();
24374
24726
  await server.connect(transport);
24375
24727
  }
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.22",
4
4
  "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",