hvip-mcp-server 0.1.8 → 0.2.1

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 +546 -8
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -21157,11 +21157,13 @@ var publicApi = {
21157
21157
  getLongShortRatio: (ccy, begin, end) => request("GET", "/api/v5/rubik/stat/contracts/long-short-account-ratio", { params: { ccy, begin, end } }),
21158
21158
  getTakerVolume: (ccy, instType, begin, end) => request("GET", "/api/v5/rubik/stat/taker-volume", { params: { ccy, instType, begin, end } }),
21159
21159
  getOpenInterestVolume: (ccy, begin, end) => request("GET", "/api/v5/rubik/stat/contracts/open-interest-volume", { params: { ccy, begin, end } }),
21160
+ getOpenInterestHistory: (instId, period, limit) => request("GET", "/api/v5/rubik/stat/contracts/open-interest-history", { params: { instId, period, limit } }),
21160
21161
  getLendingRateHistory: (ccy) => request("GET", "/api/v5/rubik/stat/margin/loan-ratio", { params: { ccy } }),
21161
21162
  getHistoryCandles: (instId, bar, after, before, limit) => request("GET", "/api/v5/market/history-candles", { params: { instId, bar, after, before, limit } }),
21162
21163
  getHistoryTrades: (instId, limit) => request("GET", "/api/v5/market/history-trades", { params: { instId, limit } }),
21163
21164
  getSystemStatus: () => request("GET", "/api/v5/system/status"),
21164
21165
  getPriceLimitBatch: (instType, uly, instId) => request("GET", "/api/v5/public/price-limit", { params: { instType, uly, instId } }),
21166
+ getPositionTiers: (instType, tdMode, instFamily, uly) => request("GET", "/api/v5/public/position-tiers", { params: { instType, tdMode, instFamily, uly } }),
21165
21167
  getOptSummary: (uly, expTime) => request("GET", "/api/v5/public/opt-summary", { params: { uly, expTime } }),
21166
21168
  getInsuranceFund: (instType, uly) => request("GET", "/api/v5/public/insurance-fund", { params: { instType, uly } }),
21167
21169
  convertContractCoin: (instId, sz, unit, opType) => request("GET", "/api/v5/public/convert-contract-coin", { params: { instId, sz, unit, opType } }),
@@ -21185,7 +21187,9 @@ var publicApi = {
21185
21187
  getSpreadCandles: (sprdId, bar, limit) => request("GET", "/api/v5/sprd/candles", { params: { sprdId, bar, limit } }),
21186
21188
  // ── 公告(公共) ──────────────────────────────────────────────────────────────
21187
21189
  getAnnouncements: (annType, lang) => request("GET", "/api/v5/support/announcements", { params: { annType, lang } }),
21188
- getAnnouncementTypes: () => request("GET", "/api/v5/support/announcement-types")
21190
+ getAnnouncementTypes: () => request("GET", "/api/v5/support/announcement-types"),
21191
+ getUnderlying: (instType) => request("GET", "/api/v5/public/underlying", { params: { instType } }),
21192
+ getTakerFlow: (ccy, instType, begin, end) => request("GET", "/api/v5/rubik/stat/taker-flow", { params: { ccy, instType, begin, end } })
21189
21193
  };
21190
21194
  var privateApi = {
21191
21195
  getBalance: (auth, ccy) => request("GET", "/api/v5/account/balance", { params: { ccy }, auth }),
@@ -21202,6 +21206,18 @@ var privateApi = {
21202
21206
  getAccountBills: (auth, instType, ccy, limit) => request("GET", "/api/v5/account/bills", { params: { instType, ccy, limit }, auth }),
21203
21207
  getAccountConfig: (auth) => request("GET", "/api/v5/account/config", { auth }),
21204
21208
  getLeverageInfo: (auth, instId, mgnMode) => request("GET", "/api/v5/account/leverage-info", { params: { instId, mgnMode }, auth }),
21209
+ getMaxSize: (auth, instId, tdMode, ccy) => request("GET", "/api/v5/account/max-size", { params: { instId, tdMode, ccy }, auth }),
21210
+ getFeeRates: (auth, instType, instId, uly) => request("GET", "/api/v5/account/trade-fee", { params: { instType, instId, uly }, auth }),
21211
+ getPositionsHistory: (auth, instType, instId, limit) => request("GET", "/api/v5/account/positions-history", { params: { instType, instId, limit }, auth }),
21212
+ setLeverage: (auth, body) => request("POST", "/api/v5/account/set-leverage", { body, auth }),
21213
+ batchOrders: (auth, body) => request("POST", "/api/v5/trade/batch-orders", { body, auth }),
21214
+ cancelBatchOrders: (auth, body) => request("POST", "/api/v5/trade/cancel-batch-orders", { body, auth }),
21215
+ closePosition: (auth, body) => request("POST", "/api/v5/trade/close-position", { body, auth }),
21216
+ amendBatchOrders: (auth, body) => request("POST", "/api/v5/trade/amend-batch-orders", { body, auth }),
21217
+ getFillsHistory: (auth, instType, instId, limit) => request("GET", "/api/v5/trade/fills-history", { params: { instType, instId, limit }, auth }),
21218
+ massCancel: (auth, instType, instFamily) => request("POST", "/api/v5/trade/mass-cancel", { body: { instType, instFamily }, auth }),
21219
+ getMaxLoan: (auth, instId, mgnMode) => request("GET", "/api/v5/account/max-loan", { params: { instId, mgnMode }, auth }),
21220
+ getInterestAccrued: (auth, instId, ccy, limit) => request("GET", "/api/v5/account/interest-accrued", { params: { instId, ccy, limit }, auth }),
21205
21221
  getOrdersPending: (auth, instType, instId, ordType) => request("GET", "/api/v5/trade/orders-pending", { params: { instType, instId, ordType }, auth }),
21206
21222
  getFills: (auth, instType, instId, limit) => request("GET", "/api/v5/trade/fills", { params: { instType, instId, limit }, auth }),
21207
21223
  getOrdersHistoryArchive: (auth, instType, limit) => request("GET", "/api/v5/trade/orders-history-archive", { params: { instType, limit }, auth }),
@@ -21327,9 +21343,34 @@ API Key \u5728 OKX \u5B98\u7F51\u300C\u4E2A\u4EBA\u4E2D\u5FC3 \u2192 API\u300D\u
21327
21343
  function toResult(data) {
21328
21344
  return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
21329
21345
  }
21330
- function toError(e, _source) {
21346
+ function classifyError(msg) {
21347
+ const okxMatch = msg.match(/OKX (\d+):/);
21348
+ if (okxMatch && okxMatch[1]) {
21349
+ const code = parseInt(okxMatch[1]);
21350
+ if (code >= 5e4 && code < 50100) return { errorCode: `OKX_${code}`, errorCategory: "AUTH" };
21351
+ if (code >= 51e3) return { errorCode: `OKX_${code}`, errorCategory: "BUSINESS" };
21352
+ if (code >= 50004 && code <= 50014) return { errorCode: `OKX_${code}`, errorCategory: "VALIDATION" };
21353
+ return { errorCode: `OKX_${code}`, errorCategory: "BUSINESS" };
21354
+ }
21355
+ if (msg.startsWith("HTTP ")) {
21356
+ const httpMatch = msg.match(/HTTP (\d+)/);
21357
+ const status = httpMatch && httpMatch[1] ? parseInt(httpMatch[1]) : 0;
21358
+ if (status === 401 || status === 403) return { errorCode: "HTTP_401", errorCategory: "AUTH" };
21359
+ if (status === 429) return { errorCode: "HTTP_429", errorCategory: "RATE_LIMIT" };
21360
+ return { errorCode: "NETWORK_ERROR", errorCategory: "NETWORK" };
21361
+ }
21362
+ if (msg.includes("API Key")) return { errorCode: "AUTH_REQUIRED", errorCategory: "AUTH" };
21363
+ return { errorCode: "UNKNOWN_ERROR", errorCategory: "BUSINESS" };
21364
+ }
21365
+ function toError(e) {
21331
21366
  const msg = e instanceof Error ? e.message : String(e);
21332
- return { content: [{ type: "text", text: msg }], isError: true };
21367
+ const { errorCode, errorCategory } = classifyError(msg);
21368
+ return {
21369
+ content: [{ type: "text", text: msg }],
21370
+ isError: true,
21371
+ errorCode,
21372
+ errorCategory
21373
+ };
21333
21374
  }
21334
21375
 
21335
21376
  // src/tools/market.ts
@@ -21354,7 +21395,9 @@ function registerMarketTools(server) {
21354
21395
  async ({ instType }) => {
21355
21396
  try {
21356
21397
  const data = await publicApi.getTickers(instType);
21357
- return toResult(data);
21398
+ const arr = data;
21399
+ const top = arr.length > 20 ? arr.slice(0, 20) : arr;
21400
+ return toResult({ total: arr.length, returned: top.length, data: top });
21358
21401
  } catch (e) {
21359
21402
  return toError(e);
21360
21403
  }
@@ -21387,7 +21430,17 @@ function registerMarketTools(server) {
21387
21430
  async ({ instId, bar, limit }) => {
21388
21431
  try {
21389
21432
  const data = await publicApi.getCandles(instId, bar, limit);
21390
- return toResult(data);
21433
+ const enriched = data.map((row) => ({
21434
+ ts: row[0],
21435
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
21436
+ open: row[1],
21437
+ high: row[2],
21438
+ low: row[3],
21439
+ close: row[4],
21440
+ vol: row[5],
21441
+ volCcy: row[6]
21442
+ }));
21443
+ return toResult(enriched);
21391
21444
  } catch (e) {
21392
21445
  return toError(e);
21393
21446
  }
@@ -21422,7 +21475,17 @@ function registerMarketTools(server) {
21422
21475
  async ({ instId, bar, after, before, limit }) => {
21423
21476
  try {
21424
21477
  const data = await publicApi.getHistoryCandles(instId, bar, after, before, limit);
21425
- return toResult(data);
21478
+ const enriched = data.map((row) => ({
21479
+ ts: row[0],
21480
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
21481
+ open: row[1],
21482
+ high: row[2],
21483
+ low: row[3],
21484
+ close: row[4],
21485
+ vol: row[5],
21486
+ volCcy: row[6]
21487
+ }));
21488
+ return toResult(enriched);
21426
21489
  } catch (e) {
21427
21490
  return toError(e);
21428
21491
  }
@@ -21466,7 +21529,9 @@ function registerMarketTools(server) {
21466
21529
  async ({ instType }) => {
21467
21530
  try {
21468
21531
  const data = await publicApi.getBlockTickers(instType);
21469
- return toResult(data);
21532
+ const arr = data;
21533
+ const top = arr.length > 20 ? arr.slice(0, 20) : arr;
21534
+ return toResult({ total: arr.length, returned: top.length, data: top });
21470
21535
  } catch (e) {
21471
21536
  return toError(e);
21472
21537
  }
@@ -21642,6 +21707,148 @@ function registerPublicTools(server) {
21642
21707
  }
21643
21708
  }
21644
21709
  );
21710
+ server.tool(
21711
+ "okx_get_price_limit",
21712
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u4EA7\u54C1\u7684\u9650\u4EF7\u4E0A\u4E0B\u9650\uFF08\u6DA8\u8DCC\u505C\u4EF7\u683C\uFF09
21713
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u67D0\u4EA7\u54C1\u5F53\u524D\u662F\u5426\u63A5\u8FD1\u9650\u4EF7\u3001\u8BA1\u7B97\u53EF\u7528\u4E0B\u5355\u4EF7\u683C\u533A\u95F4\u3001\u6781\u7AEF\u884C\u60C5\u4E0B\u9650\u4EF7\u9884\u8B66
21714
+ ## \u5173\u952E\u8BCD\uFF1A\u9650\u4EF7, \u6DA8\u8DCC\u505C, price limit, \u4E0A\u4E0B\u9650, \u4EF7\u683C\u4FDD\u62A4, \u9650\u4EF7\u5355\u8303\u56F4
21715
+ ## \u53C2\u6570\uFF1A
21716
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B\uFF0C\u4E0D\u652F\u6301\u5168\u91CF\u67E5\u8BE2
21717
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
21718
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
21719
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5355\u4EA7\u54C1 ~200B \u2014 \u5FAE\u5C0F
21720
+ ## \u5173\u8054\uFF1A\u5148\u8C03 okx_get_instruments \u83B7\u53D6\u53EF\u4EA4\u6613\u4EA7\u54C1\u5217\u8868 \u2192 \u672C\u5DE5\u5177\u67E5\u9650\u4EF7\u8303\u56F4 \u2192 \u7ED3\u5408 okx_get_ticker \u5224\u65AD\u5F53\u524D\u4EF7\u662F\u5426\u63A5\u8FD1\u9650\u4EF7`,
21721
+ {
21722
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B\uFF0C\u4E0D\u652F\u6301\u5168\u91CF\u67E5\u8BE2")
21723
+ },
21724
+ async ({ instId }) => {
21725
+ try {
21726
+ const data = await publicApi.getPriceLimitBatch("", void 0, instId);
21727
+ const enriched = data.map((item) => ({
21728
+ ...item,
21729
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21730
+ }));
21731
+ return toResult(enriched);
21732
+ } catch (e) {
21733
+ return toError(e);
21734
+ }
21735
+ }
21736
+ );
21737
+ server.tool(
21738
+ "okx_get_position_tiers",
21739
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u6301\u4ED3\u6863\u4F4D\u8868\uFF08\u51B3\u5B9A\u6760\u6746\u4E0A\u9650\u548C\u4FDD\u8BC1\u91D1\u7387\uFF09
21740
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u4E0D\u540C\u6301\u4ED3\u91CF\u5BF9\u5E94\u7684\u6700\u5927\u6760\u6746\u3001\u8BA1\u7B97\u4FDD\u8BC1\u91D1\u9700\u6C42\u3001\u8BC4\u4F30\u5927\u4ED3\u4F4D\u7206\u4ED3\u98CE\u9669\u3001\u8BBE\u7F6E\u6760\u6746\u524D\u786E\u8BA4\u6863\u4F4D\u9650\u5236
21741
+ ## \u5173\u952E\u8BCD\uFF1A\u4ED3\u4F4D\u6863\u4F4D, \u6760\u6746\u9650\u5236, position tiers, \u4FDD\u8BC1\u91D1\u7387, \u6301\u4ED3\u4E0A\u9650, \u6863\u4F4D\u8868, \u6760\u6746\u500D\u6570
21742
+ ## \u53C2\u6570\uFF1A
21743
+ ## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SWAP=\u6C38\u7EED\u5408\u7EA6, FUTURES=\u4EA4\u5272\u5408\u7EA6\u3002\u5FC5\u586B
21744
+ ## - tdMode: \u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3\u3002\u5FC5\u586B
21745
+ ## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USDT\u3002\u4E0E uly \u4E8C\u9009\u4E00\u5FC5\u586B
21746
+ ## - uly: \u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USDT\u3002\u4E0E instFamily \u4E8C\u9009\u4E00\u5FC5\u586B
21747
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
21748
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
21749
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5927\u578B ~30KB \u2014 \u5355\u4E2A\u4EA7\u54C1\u65CF\u542B\u6570\u5341\u4E2A\u6863\u4F4D\uFF0C\u6570\u636E\u91CF\u5927
21750
+ ## \u5173\u8054\uFF1A\u5148\u8C03 okx_get_instruments \u83B7\u53D6 instFamily \u2192 \u672C\u5DE5\u5177\u67E5\u6863\u4F4D \u2192 okx_get_leverage_info \u8BBE\u7F6E\u6760\u6746`,
21751
+ {
21752
+ instType: external_exports.enum(["SWAP", "FUTURES"]).describe("\u4EA7\u54C1\u7C7B\u578B\u3002SWAP=\u6C38\u7EED\u5408\u7EA6, FUTURES=\u4EA4\u5272\u5408\u7EA6"),
21753
+ tdMode: external_exports.enum(["cross", "isolated"]).describe("\u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3"),
21754
+ instFamily: external_exports.string().optional().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USDT\u3002\u4E0E uly \u4E8C\u9009\u4E00\u5FC5\u586B"),
21755
+ uly: external_exports.string().optional().describe("\u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USDT\u3002\u4E0E instFamily \u4E8C\u9009\u4E00\u5FC5\u586B")
21756
+ },
21757
+ async ({ instType, tdMode, instFamily, uly }) => {
21758
+ try {
21759
+ const data = await publicApi.getPositionTiers(instType, tdMode, instFamily, uly);
21760
+ return toResult(data);
21761
+ } catch (e) {
21762
+ return toError(e);
21763
+ }
21764
+ }
21765
+ );
21766
+ server.tool(
21767
+ "okx_get_open_interest_history",
21768
+ `## \u529F\u80FD\uFF1A\u83B7\u53D6\u5408\u7EA6\u6301\u4ED3\u91CF\u5386\u53F2\u8D70\u52BF\u6570\u636E
21769
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u6301\u4ED3\u91CF\u8D8B\u52BF\uFF08\u589E\u4ED3/\u51CF\u4ED3\u65B9\u5411\uFF09\u3001\u5224\u65AD\u8D44\u91D1\u6D41\u5165\u6D41\u51FA\u3001\u7ED3\u5408\u4EF7\u683C\u8D70\u52BF\u5224\u65AD\u8D8B\u52BF\u5F3A\u5EA6
21770
+ ## \u5173\u952E\u8BCD\uFF1A\u6301\u4ED3\u91CF\u5386\u53F2, \u6301\u4ED3\u8D70\u52BF, open interest history, OI\u53D8\u52A8, \u6301\u4ED3\u8D8B\u52BF, \u8D44\u91D1\u6D41\u5165
21771
+ ## \u53C2\u6570\uFF1A
21772
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B
21773
+ ## - period: \u65F6\u95F4\u7C92\u5EA6\u30025m/15m/30m/1H/2H/4H/6H/12H/1D/1W\u3002\u9ED8\u8BA45m
21774
+ ## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\uFF0C\u6700\u592714400
21775
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
21776
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
21777
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5355\u4EA7\u54C1 ~5KB \u2014 \u5FAE\u5C0F
21778
+ ## \u5173\u8054\uFF1A\u5148\u8C03 okx_get_instruments(instType=SWAP) \u83B7\u53D6\u5408\u7EA6\u4EA7\u54C1 \u2192 \u672C\u5DE5\u5177\u67E5\u6301\u4ED3\u8D8B\u52BF \u2192 \u7ED3\u5408 okx_get_ticker \u5224\u65AD\u91CF\u4EF7\u5173\u7CFB`,
21779
+ {
21780
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B"),
21781
+ period: external_exports.enum(["5m", "15m", "30m", "1H", "2H", "4H", "6H", "12H", "1D", "1W"]).optional().describe("\u65F6\u95F4\u7C92\u5EA6\uFF0C\u9ED8\u8BA45m"),
21782
+ limit: external_exports.string().optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100\uFF0C\u6700\u592714400")
21783
+ },
21784
+ async ({ instId, period, limit }) => {
21785
+ try {
21786
+ const data = await publicApi.getOpenInterestHistory(instId, period, limit);
21787
+ const enriched = data.map((row) => ({
21788
+ ts: row[0],
21789
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
21790
+ oi: row[1],
21791
+ oiCcy: row[2],
21792
+ vol: row[3]
21793
+ }));
21794
+ return toResult(enriched);
21795
+ } catch (e) {
21796
+ return toError(e);
21797
+ }
21798
+ }
21799
+ );
21800
+ server.tool(
21801
+ "okx_get_underlying",
21802
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2OKX\u652F\u6301\u7684\u6807\u7684\u6307\u6570\u5217\u8868
21803
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u83B7\u53D6\u53EF\u4EA4\u6613\u7684\u5E95\u5C42\u8D44\u4EA7\u5217\u8868\u3001\u7B5B\u9009\u7279\u5B9A\u7C7B\u578B\u7684\u5408\u7EA6\u6807\u7684
21804
+ ## \u5173\u952E\u8BCD\uFF1A\u6807\u7684\u6307\u6570, \u5E95\u5C42\u8D44\u4EA7, underlying, \u5408\u7EA6\u6807\u7684, \u6307\u6570\u5217\u8868
21805
+ ## \u53C2\u6570\uFF1A
21806
+ ## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SWAP/FUTURES/OPTION\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8
21807
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
21808
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
21809
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB
21810
+ ## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u83B7\u53D6\u6807\u7684 \u2192 okx_get_instruments \u67E5\u5177\u4F53\u4EA7\u54C1 \u2192 okx_get_ticker \u67E5\u884C\u60C5`,
21811
+ {
21812
+ instType: external_exports.enum(["SWAP", "FUTURES", "OPTION"]).optional().describe("\u4EA7\u54C1\u7C7B\u578B\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8")
21813
+ },
21814
+ async ({ instType }) => {
21815
+ try {
21816
+ const data = await publicApi.getUnderlying(instType);
21817
+ return toResult(data);
21818
+ } catch (e) {
21819
+ return toError(e);
21820
+ }
21821
+ }
21822
+ );
21823
+ server.tool(
21824
+ "okx_get_taker_flow",
21825
+ `## \u529F\u80FD\uFF1A\u83B7\u53D6\u4E3B\u52A8\u4E70\u5356\u6210\u4EA4\u6570\u636E\uFF08Taker\u6D41\u91CF\uFF09
21826
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u5224\u65AD\u591A\u7A7A\u529B\u91CF\u5BF9\u6BD4\uFF08\u4E70\u5165Taker\u591A=\u591A\u5934\u5F3A\uFF09\u3001\u5206\u6790\u8D44\u91D1\u6D41\u5411\u8D8B\u52BF
21827
+ ## \u5173\u952E\u8BCD\uFF1A\u4E3B\u52A8\u6210\u4EA4, taker flow, \u4E70\u5356\u529B\u91CF, \u8D44\u91D1\u6D41\u5411, \u4E3B\u52A8\u4E70\u5356
21828
+ ## \u53C2\u6570\uFF1A
21829
+ ## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B
21830
+ ## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SWAP/FUTURES\u3002\u53EF\u9009
21831
+ ## - begin: \u5F00\u59CB\u65F6\u95F4\u6233(ms)\u3002\u53EF\u9009
21832
+ ## - end: \u7ED3\u675F\u65F6\u95F4\u6233(ms)\u3002\u53EF\u9009
21833
+ ## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key
21834
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
21835
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB
21836
+ ## \u5173\u8054\uFF1Aokx_get_taker_volume \u67E5\u6210\u4EA4\u91CF \u2192 \u672C\u5DE5\u5177\u67E5Taker\u6D41\u5411 \u2192 \u5224\u65AD\u591A\u7A7A\u65B9\u5411`,
21837
+ {
21838
+ ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3002\u5FC5\u586B"),
21839
+ instType: external_exports.enum(["SWAP", "FUTURES"]).optional().describe("\u4EA7\u54C1\u7C7B\u578B"),
21840
+ begin: external_exports.string().optional().describe("\u5F00\u59CB\u65F6\u95F4\u6233(ms)"),
21841
+ end: external_exports.string().optional().describe("\u7ED3\u675F\u65F6\u95F4\u6233(ms)")
21842
+ },
21843
+ async ({ ccy, instType, begin, end }) => {
21844
+ try {
21845
+ const data = await publicApi.getTakerFlow(ccy, instType, begin, end);
21846
+ return toResult(data);
21847
+ } catch (e) {
21848
+ return toError(e);
21849
+ }
21850
+ }
21851
+ );
21645
21852
  }
21646
21853
 
21647
21854
  // src/tools/account.ts
@@ -21757,6 +21964,174 @@ function registerAccountTools(server, auth) {
21757
21964
  }
21758
21965
  }
21759
21966
  );
21967
+ server.tool(
21968
+ "okx_get_max_size",
21969
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u67D0\u4EA7\u54C1\u6700\u5927\u53EF\u5F00\u4ED3\u6570\u91CF
21970
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u4E0B\u5355\u524D\u5224\u65AD\u6700\u5927\u53EF\u4E70\u5356\u6570\u91CF\u3001\u9A8C\u8BC1\u7528\u6237\u8F93\u5165\u7684\u6570\u91CF\u662F\u5426\u8D85\u9650
21971
+ ## \u5173\u952E\u8BCD\uFF1A\u6700\u5927\u53EF\u5F00, \u6700\u5927\u4E0B\u5355\u91CF, max size, \u53EF\u5F00\u6570\u91CF, \u4E0B\u5355\u4E0A\u9650
21972
+ ## \u53C2\u6570\uFF1A
21973
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B
21974
+ ## - tdMode: \u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3, cash=\u975E\u4FDD\u8BC1\u91D1\u3002\u5FC5\u586B
21975
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
21976
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
21977
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5355\u4EA7\u54C1 ~200B \u2014 \u5FAE\u5C0F
21978
+ ## \u5173\u8054\uFF1A\u5148\u8C03 okx_get_instruments \u83B7\u53D6\u4EA7\u54C1 \u2192 \u672C\u5DE5\u5177\u67E5\u6700\u5927\u53EF\u5F00 \u2192 okx_place_order \u4E0B\u5355`,
21979
+ {
21980
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B"),
21981
+ tdMode: external_exports.enum(["cross", "isolated", "cash"]).describe("\u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3, cash=\u975E\u4FDD\u8BC1\u91D1"),
21982
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF08\u4EC5MARGIN\u5168\u4ED3\u65F6\u9700\u8981\uFF09\uFF0C\u5982 USDT")
21983
+ },
21984
+ async ({ instId, tdMode, ccy }) => {
21985
+ if (!auth) return toError(AUTH_REQUIRED);
21986
+ try {
21987
+ const data = await privateApi.getMaxSize(auth, instId, tdMode, ccy);
21988
+ return toResult(data);
21989
+ } catch (e) {
21990
+ return toError(e);
21991
+ }
21992
+ }
21993
+ );
21994
+ server.tool(
21995
+ "okx_get_fee_rates",
21996
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u8D26\u6237\u5F53\u524D\u624B\u7EED\u8D39\u7387
21997
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u8BA1\u7B97\u4EA4\u6613\u6210\u672C\u3001\u6BD4\u8F83\u4E0D\u540C\u7B49\u7EA7\u8D39\u7387\u5DEE\u5F02\u3001\u4E0B\u5355\u524D\u4F30\u7B97\u624B\u7EED\u8D39
21998
+ ## \u5173\u952E\u8BCD\uFF1A\u624B\u7EED\u8D39, \u8D39\u7387, fee rate, \u4EA4\u6613\u8D39, maker, taker
21999
+ ## \u53C2\u6570\uFF1A
22000
+ ## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, SWAP=\u6C38\u7EED\u5408\u7EA6\u3002\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8
22001
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u53EF\u9009
22002
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
22003
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22004
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~1KB
22005
+ ## \u5173\u8054\uFF1Aokx_get_account_config \u67E5\u8D26\u6237\u914D\u7F6E \u2192 \u672C\u5DE5\u5177\u67E5\u8D39\u7387 \u2192 okx_place_order \u4E0B\u5355\u8BA1\u7B97\u6210\u672C`,
22006
+ {
22007
+ instType: external_exports.enum(["SPOT", "MARGIN", "SWAP", "FUTURES", "OPTION"]).optional().describe("\u4EA7\u54C1\u7C7B\u578B\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
22008
+ instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT"),
22009
+ uly: external_exports.string().optional().describe("\u6807\u7684\u6307\u6570\uFF0C\u5982 BTC-USDT")
22010
+ },
22011
+ async ({ instType, instId, uly }) => {
22012
+ if (!auth) return toError(AUTH_REQUIRED);
22013
+ try {
22014
+ const data = await privateApi.getFeeRates(auth, instType, instId, uly);
22015
+ return toResult(data);
22016
+ } catch (e) {
22017
+ return toError(e);
22018
+ }
22019
+ }
22020
+ );
22021
+ server.tool(
22022
+ "okx_get_positions_history",
22023
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5386\u53F2\u6301\u4ED3\u8BB0\u5F55\uFF08\u5DF2\u5E73\u4ED3\u4ED3\u4F4D\uFF09
22024
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u590D\u76D8\u5386\u53F2\u4EA4\u6613\u3001\u5206\u6790\u5E73\u4ED3\u76C8\u4E8F\u3001\u7EDF\u8BA1\u80DC\u7387\u3001\u5BA1\u8BA1\u4EA4\u6613\u8BB0\u5F55
22025
+ ## \u5173\u952E\u8BCD\uFF1A\u5386\u53F2\u6301\u4ED3, \u5E73\u4ED3\u8BB0\u5F55, positions history, \u5DF2\u5E73\u4ED3, \u5E73\u4ED3\u76C8\u4E8F, \u4EA4\u6613\u590D\u76D8
22026
+ ## \u53C2\u6570\uFF1A
22027
+ ## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002\u53EF\u9009\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8
22028
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u53EF\u9009
22029
+ ## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100
22030
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
22031
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22032
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~10KB
22033
+ ## \u5173\u8054\uFF1Aokx_get_positions \u67E5\u5F53\u524D\u6301\u4ED3 \u2192 \u672C\u5DE5\u5177\u67E5\u5386\u53F2\u5E73\u4ED3 \u2192 okx_get_order_history \u6838\u5BF9\u8BA2\u5355`,
22034
+ {
22035
+ instType: external_exports.enum(["MARGIN", "SWAP", "FUTURES", "OPTION"]).optional().describe("\u4EA7\u54C1\u7C7B\u578B\uFF0C\u4E0D\u586B\u8FD4\u56DE\u5168\u90E8"),
22036
+ instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP"),
22037
+ limit: external_exports.number().optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22038
+ },
22039
+ async ({ instType, instId, limit }) => {
22040
+ if (!auth) return toError(AUTH_REQUIRED);
22041
+ try {
22042
+ const data = await privateApi.getPositionsHistory(auth, instType, instId, limit);
22043
+ return toResult(data);
22044
+ } catch (e) {
22045
+ return toError(e);
22046
+ }
22047
+ }
22048
+ );
22049
+ server.tool(
22050
+ "okx_set_leverage",
22051
+ `## \u529F\u80FD\uFF1A\u8BBE\u7F6E\u67D0\u4EA7\u54C1\u7684\u6760\u6746\u500D\u6570
22052
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u8C03\u6574\u6760\u6746\uFF08\u4E0D\u540C\u6301\u4ED3\u91CF\u6863\u4F4D\u5BF9\u5E94\u4E0D\u540C\u6700\u5927\u6760\u6746\uFF09\u3001\u5728\u884C\u60C5\u6CE2\u52A8\u5927\u65F6\u964D\u4F4E\u6760\u6746\u63A7\u5236\u98CE\u9669
22053
+ ## \u5173\u952E\u8BCD\uFF1A\u8BBE\u7F6E\u6760\u6746, \u8C03\u6574\u6760\u6746, set leverage, \u6760\u6746\u500D\u6570, \u5168\u4ED3\u9010\u4ED3
22054
+ ## \u53C2\u6570\uFF1A
22055
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B
22056
+ ## - lever: \u6760\u6746\u500D\u6570\uFF0C\u5982 10\u3002\u5FC5\u586B\uFF08\u9700\u5728 okx_get_position_tiers \u8FD4\u56DE\u7684\u8303\u56F4\u5185\uFF09
22057
+ ## - mgnMode: \u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3\u3002\u5FC5\u586B
22058
+ ## - posSide: \u6301\u4ED3\u65B9\u5411\u3002\u4E0D\u586B\u5219\u53CC\u5411\u751F\u6548
22059
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4
22060
+ ## \u98CE\u9669\uFF1AADMIN \u2014 \u4FEE\u6539\u8D26\u6237\u914D\u7F6E\uFF0C\u987B\u5411\u7528\u6237\u89E3\u91CA\u6760\u6746\u500D\u6570\u548C\u7206\u4ED3\u98CE\u9669\u540E\u518D\u786E\u8BA4
22061
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~200B
22062
+ ## \u5173\u8054\uFF1A\u5148\u8C03 okx_get_position_tiers \u786E\u8BA4\u6760\u6746\u4E0A\u9650 \u2192 \u672C\u5DE5\u5177\u8BBE\u7F6E\u6760\u6746 \u2192 okx_place_order \u4E0B\u5355`,
22063
+ {
22064
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B"),
22065
+ lever: external_exports.string().describe("\u6760\u6746\u500D\u6570\uFF0C\u5982 10\u3002\u5FC5\u987B\u5728\u4ED3\u4F4D\u6863\u4F4D\u5141\u8BB8\u8303\u56F4\u5185"),
22066
+ mgnMode: external_exports.enum(["cross", "isolated"]).describe("\u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3"),
22067
+ posSide: external_exports.enum(["long", "short"]).optional().describe("\u6301\u4ED3\u65B9\u5411\u3002\u4E0D\u586B\u5219\u53CC\u5411\u751F\u6548")
22068
+ },
22069
+ async ({ instId, lever, mgnMode, posSide }) => {
22070
+ if (!auth) return toError(AUTH_REQUIRED);
22071
+ try {
22072
+ const body = { instId, lever, mgnMode };
22073
+ if (posSide) body.posSide = posSide;
22074
+ const data = await privateApi.setLeverage(auth, body);
22075
+ return toResult(data);
22076
+ } catch (e) {
22077
+ return toError(e);
22078
+ }
22079
+ }
22080
+ );
22081
+ server.tool(
22082
+ "okx_get_max_loan",
22083
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u67D0\u4EA7\u54C1\u7684\u6700\u5927\u53EF\u501F\u6570\u91CF
22084
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u6760\u6746\u4EA4\u6613\u524D\u5224\u65AD\u6700\u5927\u53EF\u501F\u989D\u5EA6\u3001\u8BA1\u7B97\u4FDD\u8BC1\u91D1\u4F7F\u7528\u7387
22085
+ ## \u5173\u952E\u8BCD\uFF1A\u6700\u5927\u53EF\u501F, \u501F\u6B3E\u4E0A\u9650, max loan, \u6760\u6746\u501F\u6B3E, \u53EF\u501F\u989D\u5EA6
22086
+ ## \u53C2\u6570\uFF1A
22087
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u5FC5\u586B
22088
+ ## - mgnMode: \u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3\u3002\u5FC5\u586B
22089
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
22090
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22091
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5355\u4EA7\u54C1 ~200B \u2014 \u5FAE\u5C0F
22092
+ ## \u5173\u8054\uFF1Aokx_get_max_size \u67E5\u53EF\u5F00\u6570\u91CF \u2192 \u672C\u5DE5\u5177\u67E5\u53EF\u501F\u989D\u5EA6 \u2192 okx_place_order \u4E0B\u5355`,
22093
+ {
22094
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u5FC5\u586B"),
22095
+ mgnMode: external_exports.enum(["cross", "isolated"]).describe("\u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3")
22096
+ },
22097
+ async ({ instId, mgnMode }) => {
22098
+ if (!auth) return toError(AUTH_REQUIRED);
22099
+ try {
22100
+ const data = await privateApi.getMaxLoan(auth, instId, mgnMode);
22101
+ return toResult(data);
22102
+ } catch (e) {
22103
+ return toError(e);
22104
+ }
22105
+ }
22106
+ );
22107
+ server.tool(
22108
+ "okx_get_interest_accrued",
22109
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u501F\u5E01\u5229\u606F\u7D2F\u8BA1\u660E\u7EC6
22110
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u8BA1\u7B97\u5F53\u524D\u501F\u5E01\u6210\u672C\u3001\u8BC4\u4F30\u6301\u4ED3\u5229\u606F\u8D1F\u62C5\u3001\u51B3\u5B9A\u662F\u5426\u63D0\u524D\u8FD8\u6B3E
22111
+ ## \u5173\u952E\u8BCD\uFF1A\u501F\u5E01\u5229\u606F, \u5229\u606F\u660E\u7EC6, interest accrued, \u501F\u6B3E\u6210\u672C, \u5229\u606F\u7D2F\u8BA1
22112
+ ## \u53C2\u6570\uFF1A
22113
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u53EF\u9009
22114
+ ## - ccy: \u5E01\u79CD\uFF0C\u5982 USDT\u3002\u53EF\u9009
22115
+ ## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100
22116
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
22117
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22118
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB
22119
+ ## \u5173\u8054\uFF1Aokx_get_balance \u67E5\u4F59\u989D \u2192 \u672C\u5DE5\u5177\u67E5\u5229\u606F \u2192 \u8BA1\u7B97\u51C0\u6536\u76CA`,
22120
+ {
22121
+ instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u53EF\u9009"),
22122
+ ccy: external_exports.string().optional().describe("\u5E01\u79CD\uFF0C\u5982 USDT"),
22123
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22124
+ },
22125
+ async ({ instId, ccy, limit }) => {
22126
+ if (!auth) return toError(AUTH_REQUIRED);
22127
+ try {
22128
+ const data = await privateApi.getInterestAccrued(auth, instId, ccy, limit);
22129
+ return toResult(data);
22130
+ } catch (e) {
22131
+ return toError(e);
22132
+ }
22133
+ }
22134
+ );
21760
22135
  }
21761
22136
 
21762
22137
  // src/tools/trading.ts
@@ -21876,6 +22251,169 @@ function registerTradingTools(server, auth) {
21876
22251
  }
21877
22252
  }
21878
22253
  );
22254
+ server.tool(
22255
+ "okx_batch_orders",
22256
+ `## \u529F\u80FD\uFF1A\u6279\u91CF\u4E0B\u5355\uFF08\u6700\u591A20\u7B14\uFF09
22257
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u9700\u8981\u540C\u65F6\u4E0B\u591A\u4E2A\u8BA2\u5355\u7684\u7B56\u7565\uFF08\u5982\u4E00\u7BEE\u5B50\u5EFA\u4ED3\u3001\u591A\u4EA7\u54C1\u5957\u5229\u5E03\u5C40\uFF09
22258
+ ## \u5173\u952E\u8BCD\uFF1A\u6279\u91CF\u4E0B\u5355, \u6279\u91CF\u59D4\u6258, batch orders, \u4E00\u7BEE\u5B50\u8BA2\u5355, \u7EC4\u5408\u4E0B\u5355
22259
+ ## \u53C2\u6570\uFF1A
22260
+ ## - orders: \u8BA2\u5355\u6570\u7EC4\uFF08JSON\u6570\u7EC4\u5B57\u7B26\u4E32\uFF09\uFF0C\u6BCF\u9879\u542B instId/tdMode/side/ordType/sz/px \u7B49\u5B57\u6BB5\u3002\u6700\u591A20\u7B14
22261
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4\u6BCF\u7B14\u8BA2\u5355\u5185\u5BB9
22262
+ ## \u98CE\u9669\uFF1AWRITE \u2014 \u521B\u5EFA\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u9010\u7B14\u786E\u8BA4
22263
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB
22264
+ ## \u5173\u8054\uFF1Aokx_get_instruments \u83B7\u53D6\u4EA7\u54C1\u5217\u8868 \u2192 \u672C\u5DE5\u5177\u6279\u91CF\u4E0B\u5355 \u2192 okx_batch_cancel_orders \u64A4\u9500`,
22265
+ {
22266
+ orders: external_exports.string().describe(`\u8BA2\u5355\u6570\u7EC4JSON\u5B57\u7B26\u4E32\uFF0C\u5982 '[{"instId":"BTC-USDT","tdMode":"cash","side":"buy","ordType":"limit","sz":"0.001","px":"60000"}]'\u3002\u6700\u591A20\u7B14`)
22267
+ },
22268
+ async ({ orders }) => {
22269
+ if (!auth) return toError(AUTH_REQUIRED);
22270
+ try {
22271
+ const parsed = JSON.parse(orders);
22272
+ const data = await privateApi.batchOrders(auth, parsed);
22273
+ return toResult(data);
22274
+ } catch (e) {
22275
+ return toError(e);
22276
+ }
22277
+ }
22278
+ );
22279
+ server.tool(
22280
+ "okx_batch_cancel_orders",
22281
+ `## \u529F\u80FD\uFF1A\u6279\u91CF\u64A4\u9500\u8BA2\u5355
22282
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u4E00\u952E\u64A4\u9500\u6240\u6709\u672A\u6210\u4EA4\u6302\u5355\u3001\u6E05\u7A7A\u7279\u5B9A\u4EA7\u54C1\u7684\u8BA2\u5355\u961F\u5217
22283
+ ## \u5173\u952E\u8BCD\uFF1A\u6279\u91CF\u64A4\u5355, \u6279\u91CF\u64A4\u9500, batch cancel, \u4E00\u952E\u64A4\u5355, \u6E05\u7A7A\u6302\u5355
22284
+ ## \u53C2\u6570\uFF1A
22285
+ ## - orders: \u64A4\u5355\u6570\u7EC4\uFF08JSON\u6570\u7EC4\u5B57\u7B26\u4E32\uFF09\uFF0C\u6BCF\u9879\u542B instId/ordId\u3002\u4E0D\u586BinstId\u5219\u64A4\u9500\u8BE5\u4EA7\u54C1\u6240\u6709\u6302\u5355
22286
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4
22287
+ ## \u98CE\u9669\uFF1AWRITE \u2014 \u64A4\u9500\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4
22288
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB
22289
+ ## \u5173\u8054\uFF1Aokx_get_orders_pending \u67E5\u770B\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u6279\u91CF\u64A4\u9500 \u2192 okx_get_orders_history \u786E\u8BA4\u64A4\u9500`,
22290
+ {
22291
+ orders: external_exports.string().describe(`\u64A4\u5355\u6570\u7EC4JSON\u5B57\u7B26\u4E32\uFF0C\u5982 '[{"instId":"BTC-USDT","ordId":"123456"}]'`)
22292
+ },
22293
+ async ({ orders }) => {
22294
+ if (!auth) return toError(AUTH_REQUIRED);
22295
+ try {
22296
+ const parsed = JSON.parse(orders);
22297
+ const data = await privateApi.cancelBatchOrders(auth, parsed);
22298
+ return toResult(data);
22299
+ } catch (e) {
22300
+ return toError(e);
22301
+ }
22302
+ }
22303
+ );
22304
+ server.tool(
22305
+ "okx_close_position",
22306
+ `## \u529F\u80FD\uFF1A\u5E02\u4EF7\u5168\u5E73\u67D0\u4ED3\u4F4D
22307
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u7D27\u6025\u5E73\u4ED3\u6B62\u635F/\u6B62\u76C8\u3001\u6E05\u7A7A\u67D0\u65B9\u5411\u5168\u90E8\u6301\u4ED3
22308
+ ## \u5173\u952E\u8BCD\uFF1A\u5E73\u4ED3, \u5E02\u4EF7\u5168\u5E73, close position, \u6B62\u635F\u5E73\u4ED3, \u6E05\u4ED3, \u7D27\u6025\u5E73\u4ED3
22309
+ ## \u53C2\u6570\uFF1A
22310
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B
22311
+ ## - posSide: \u6301\u4ED3\u65B9\u5411\u3002long=\u5E73\u591A\u5934, short=\u5E73\u7A7A\u5934\u3002\u4E0D\u586B\u5219\u6309mgnMode\u81EA\u52A8\u5224\u65AD
22312
+ ## - mgnMode: \u4FDD\u8BC1\u91D1\u6A21\u5F0F\u3002cross=\u5168\u4ED3, isolated=\u9010\u4ED3
22313
+ ## - ccy: \u4FDD\u8BC1\u91D1\u5E01\u79CD\uFF08\u5168\u4ED3\u65F6\u9009\u586B\uFF09
22314
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u98CE\u63A7\u6838\u5FC3\u5DE5\u5177\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u4E8C\u6B21\u786E\u8BA4
22315
+ ## \u98CE\u9669\uFF1AFUND_TRANSFER \u2014 \u5E73\u4ED3\u64CD\u4F5C\u76F4\u63A5\u5F71\u54CD\u6301\u4ED3\u548C\u8D44\u91D1\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4
22316
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B
22317
+ ## \u5173\u8054\uFF1Aokx_get_positions \u786E\u8BA4\u6301\u4ED3 \u2192 \u672C\u5DE5\u5177\u5E02\u4EF7\u5168\u5E73 \u2192 okx_get_orders_history \u786E\u8BA4\u6210\u4EA4`,
22318
+ {
22319
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT-SWAP\u3002\u5FC5\u586B"),
22320
+ posSide: external_exports.enum(["long", "short"]).optional().describe("\u6301\u4ED3\u65B9\u5411\u3002long=\u5E73\u591A\u5934, short=\u5E73\u7A7A\u5934\u3002\u5168\u4ED3\u5FC5\u586B"),
22321
+ mgnMode: external_exports.enum(["cross", "isolated"]).optional().describe("\u4FDD\u8BC1\u91D1\u6A21\u5F0F"),
22322
+ ccy: external_exports.string().optional().describe("\u4FDD\u8BC1\u91D1\u5E01\u79CD\uFF08\u5168\u4ED3\u53EF\u9009\u586B\uFF09")
22323
+ },
22324
+ async ({ instId, posSide, mgnMode, ccy }) => {
22325
+ if (!auth) return toError(AUTH_REQUIRED);
22326
+ try {
22327
+ const body = { instId };
22328
+ if (posSide) body.posSide = posSide;
22329
+ if (mgnMode) body.mgnMode = mgnMode;
22330
+ if (ccy) body.ccy = ccy;
22331
+ const data = await privateApi.closePosition(auth, body);
22332
+ return toResult(data);
22333
+ } catch (e) {
22334
+ return toError(e);
22335
+ }
22336
+ }
22337
+ );
22338
+ server.tool(
22339
+ "okx_amend_batch_orders",
22340
+ `## \u529F\u80FD\uFF1A\u6279\u91CF\u4FEE\u6539\u672A\u6210\u4EA4\u8BA2\u5355
22341
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u540C\u65F6\u8C03\u6574\u591A\u4E2A\u9650\u4EF7\u5355\u7684\u4EF7\u683C\u6216\u6570\u91CF\u3001\u6279\u91CF\u66F4\u65B0\u6302\u5355\u7B56\u7565
22342
+ ## \u5173\u952E\u8BCD\uFF1A\u6279\u91CF\u6539\u5355, \u6279\u91CF\u4FEE\u6539, amend batch orders, \u6279\u91CF\u6539\u4EF7, \u6279\u91CF\u8C03\u91CF
22343
+ ## \u53C2\u6570\uFF1A
22344
+ ## - orders: \u6539\u5355\u6570\u7EC4\uFF08JSON\u6570\u7EC4\u5B57\u7B26\u4E32\uFF09\uFF0C\u6BCF\u9879\u542B instId/ordId/newSz/newPx\u3002\u6700\u591A20\u7B14
22345
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4
22346
+ ## \u98CE\u9669\uFF1AWRITE \u2014 \u4FEE\u6539\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4
22347
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB
22348
+ ## \u5173\u8054\uFF1Aokx_get_orders_pending \u67E5\u770B\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u6279\u91CF\u6539\u5355 \u2192 okx_get_order \u786E\u8BA4\u4FEE\u6539`,
22349
+ {
22350
+ orders: external_exports.string().describe(`\u6539\u5355\u6570\u7EC4JSON\u5B57\u7B26\u4E32\uFF0C\u5982 '[{"instId":"BTC-USDT","ordId":"123","newPx":"62000"}]'\u3002\u6700\u591A20\u7B14`)
22351
+ },
22352
+ async ({ orders }) => {
22353
+ if (!auth) return toError(AUTH_REQUIRED);
22354
+ try {
22355
+ const parsed = JSON.parse(orders);
22356
+ const data = await privateApi.amendBatchOrders(auth, parsed);
22357
+ return toResult(data);
22358
+ } catch (e) {
22359
+ return toError(e);
22360
+ }
22361
+ }
22362
+ );
22363
+ server.tool(
22364
+ "okx_get_fills_history",
22365
+ `## \u529F\u80FD\uFF1A\u67E5\u8BE2\u5386\u53F2\u6210\u4EA4\u660E\u7EC6\uFF08\u6700\u8FD13\u4E2A\u6708\uFF09
22366
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u7CBE\u786E\u8BA1\u7B97\u5386\u53F2\u6210\u4EA4\u5747\u4EF7\u3001\u590D\u76D8\u4EA4\u6613\u8868\u73B0\u3001\u6838\u5BF9\u6210\u4EA4\u8BB0\u5F55
22367
+ ## \u5173\u952E\u8BCD\uFF1A\u6210\u4EA4\u5386\u53F2, \u6210\u4EA4\u660E\u7EC6, fills history, \u5386\u53F2\u6210\u4EA4, \u9010\u7B14\u6210\u4EA4\u5386\u53F2
22368
+ ## \u53C2\u6570\uFF1A
22369
+ ## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002\u53EF\u9009
22370
+ ## - instId: \u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3002\u53EF\u9009
22371
+ ## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100
22372
+ ## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09
22373
+ ## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528
22374
+ ## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~10KB
22375
+ ## \u5173\u8054\uFF1Aokx_get_fills \u67E5\u6700\u8FD1\u6210\u4EA4 \u2192 \u672C\u5DE5\u5177\u67E5\u5386\u53F2\u6210\u4EA4 \u2192 okx_get_orders_history \u5BF9\u8D26`,
22376
+ {
22377
+ instType: external_exports.enum(["SPOT", "MARGIN", "SWAP", "FUTURES", "OPTION"]).optional().describe("\u4EA7\u54C1\u7C7B\u578B"),
22378
+ instId: external_exports.string().optional().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT"),
22379
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
22380
+ },
22381
+ async ({ instType, instId, limit }) => {
22382
+ if (!auth) return toError(AUTH_REQUIRED);
22383
+ try {
22384
+ const data = await privateApi.getFillsHistory(auth, instType, instId, limit);
22385
+ return toResult(data);
22386
+ } catch (e) {
22387
+ return toError(e);
22388
+ }
22389
+ }
22390
+ );
22391
+ server.tool(
22392
+ "okx_mass_cancel",
22393
+ `## \u529F\u80FD\uFF1A\u6279\u91CF\u64A4\u9500\u67D0\u4EA7\u54C1\u7C7B\u578B\u4E0B\u6240\u6709\u6302\u5355
22394
+ ## \u573A\u666F\uFF1A\u7528\u4E8E\u6781\u7AEF\u884C\u60C5\u4E0B\u7D27\u6025\u6E05\u7A7A\u6240\u6709\u6302\u5355\u3001\u5FEB\u901F\u91CD\u7F6E\u4EA4\u6613\u7B56\u7565
22395
+ ## \u5173\u952E\u8BCD\uFF1A\u6279\u91CF\u64A4\u5355, \u5168\u90E8\u64A4\u5355, mass cancel, \u6E05\u7A7A\u6302\u5355, \u7D27\u6025\u64A4\u5355
22396
+ ## \u53C2\u6570\uFF1A
22397
+ ## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SPOT/MARGIN/SWAP/FUTURES/OPTION\u3002\u5FC5\u586B
22398
+ ## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USDT\u3002\u53EF\u9009\uFF08\u4EC5\u5408\u7EA6\u9700\u8981\uFF09
22399
+ ## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u8C03\u7528\u524D\u987B\u5411\u7528\u6237\u786E\u8BA4
22400
+ ## \u98CE\u9669\uFF1AWRITE \u2014 \u64A4\u9500\u6240\u6709\u6302\u5355\uFF0C\u5F71\u54CD\u8303\u56F4\u5927\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4
22401
+ ## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B
22402
+ ## \u5173\u8054\uFF1Aokx_get_orders_pending \u786E\u8BA4\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u5168\u90E8\u64A4\u9500 \u2192 okx_get_orders_history \u786E\u8BA4`,
22403
+ {
22404
+ instType: external_exports.enum(["SPOT", "MARGIN", "SWAP", "FUTURES", "OPTION"]).describe("\u4EA7\u54C1\u7C7B\u578B"),
22405
+ instFamily: external_exports.string().optional().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USDT\u3002\u4EC5\u5408\u7EA6\u9700\u586B")
22406
+ },
22407
+ async ({ instType, instFamily }) => {
22408
+ if (!auth) return toError(AUTH_REQUIRED);
22409
+ try {
22410
+ const data = await privateApi.massCancel(auth, instType, instFamily);
22411
+ return toResult(data);
22412
+ } catch (e) {
22413
+ return toError(e);
22414
+ }
22415
+ }
22416
+ );
21879
22417
  }
21880
22418
 
21881
22419
  // src/tools/algo.ts
@@ -22879,7 +23417,7 @@ function registerSignalTools(server, auth) {
22879
23417
 
22880
23418
  // src/index.ts
22881
23419
  async function main() {
22882
- const server = new McpServer({ name: "hvip", version: "0.1.8" });
23420
+ const server = new McpServer({ name: "hvip", version: "0.2.1" });
22883
23421
  const auth = getAuth();
22884
23422
  registerMarketTools(server);
22885
23423
  registerPublicTools(server);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hvip-mcp-server",
3
- "version": "0.1.8",
4
- "description": "OKX ecosystem MCP server full API coverage for AI agents",
3
+ "version": "0.2.1",
4
+ "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",
7
7
  "bin": {