hvip-mcp-server 0.2.24 → 0.2.26

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 +499 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21201,7 +21201,13 @@ var publicApi = {
21201
21201
  getCallAuctionDetails: (instId) => request("GET", "/api/v5/market/call-auction-details", { params: { instId } }),
21202
21202
  getOptionInstrumentFamilyTrades: (instFamily, limit) => request("GET", "/api/v5/market/option/instrument-family-trades", { params: { instFamily, limit } }),
21203
21203
  getOptionTrades: (instFamily, instId, limit) => request("GET", "/api/v5/public/option-trades", { params: { instFamily, instId, limit } }),
21204
- getExchangeRate: () => request("GET", "/api/v5/market/exchange-rate")
21204
+ getExchangeRate: () => request("GET", "/api/v5/market/exchange-rate"),
21205
+ getIndexComponents: (index) => request("GET", "/api/v5/market/index-components", { params: { index } }),
21206
+ getEstimatedPrice: (instId) => request("GET", "/api/v5/public/estimated-price", { params: { instId } }),
21207
+ getDiscountRateInterestFreeQuota: () => request("GET", "/api/v5/public/discount-rate-interest-free-quota"),
21208
+ getOptionOiExpiry: (ccy) => request("GET", "/api/v5/rubik/stat/option/open-interest-volume-expiry", { params: { ccy } }),
21209
+ getOptionOiStrike: (ccy, expTime) => request("GET", "/api/v5/rubik/stat/option/open-interest-volume-strike", { params: { ccy, expTime } }),
21210
+ getOptionOpenInterestVolume: (ccy) => request("GET", "/api/v5/rubik/stat/option/open-interest-volume", { params: { ccy } })
21205
21211
  };
21206
21212
  var privateApi = {
21207
21213
  getBalance: (auth, ccy) => request("GET", "/api/v5/account/balance", { params: { ccy }, auth }),
@@ -21342,7 +21348,28 @@ var privateApi = {
21342
21348
  // ── 资金收尾(第十七批新增) ──────────────────────────────────────────
21343
21349
  getDepositLightning: (auth, ccy) => request("GET", "/api/v5/asset/deposit-lightning", { params: { ccy }, auth }),
21344
21350
  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 })
21351
+ getTransferState: (auth, transferId) => request("GET", "/api/v5/asset/transfer-state", { params: { transferId }, auth }),
21352
+ // ── 第二批价差操作 ────────────────────────────────────────────────────────
21353
+ amendSpreadOrder: (auth, body) => request("POST", "/api/v5/sprd/amend-order", { body, auth }),
21354
+ getSpreadOrdersHistory: (auth, sprdId, limit) => request("GET", "/api/v5/sprd/orders-history", { params: { sprdId, limit }, auth }),
21355
+ getSpreadFills: (auth, sprdId, limit) => request("GET", "/api/v5/sprd/fills", { params: { sprdId, limit }, auth }),
21356
+ // ── 第三批交易收尾 ─────────────────────────────────────────────────────────
21357
+ resetMmp: (auth, body) => request("POST", "/api/v5/account/mmp-reset", { body, auth }),
21358
+ // ── NEW: sprd affiliate ──
21359
+ getOrderByClientId: (auth, instId, clOrdId) => request("GET", "/api/v5/trade/order", { params: { instId, clOrdId }, auth }),
21360
+ // ── 价差收尾(第一批新缺口) ──────────────────────────────────────────
21361
+ getSpreadOrdersHistoryArchive: (auth, sprdId) => request("GET", "/api/v5/sprd/orders-history-archive", { params: { sprdId }, auth }),
21362
+ getSpreadPublicTrades: (sprdId) => request("GET", "/api/v5/sprd/public-trades", { params: { sprdId } }),
21363
+ getSpreadTradeFills: (auth, sprdId) => request("GET", "/api/v5/sprd/trades", { params: { sprdId }, auth }),
21364
+ // ── 子账户+推广(第三批新缺口) ──────────────────────────────────────
21365
+ createSubAccount: (auth, body) => request("POST", "/api/v5/users/subaccount/create-subaccount", { body, auth }),
21366
+ getEntrustSubAccountList: (auth) => request("GET", "/api/v5/users/entrust-subaccount-list", { auth }),
21367
+ getAffiliateInviteeList: (auth) => request("GET", "/api/v5/affiliate/invitee/list", { auth }),
21368
+ getAffiliateInviteeDetail: (auth, uid) => request("GET", "/api/v5/affiliate/invitee/detail", { params: { uid }, auth }),
21369
+ getAffiliateLinkList: (auth) => request("GET", "/api/v5/affiliate/link/list", { auth }),
21370
+ getAffiliatePerformance: (auth) => request("GET", "/api/v5/affiliate/performance/summary", { auth }),
21371
+ getAffiliateCoInviterList: (auth) => request("GET", "/api/v5/affiliate/co-inviter/list", { auth }),
21372
+ getAffiliateSubAffiliateList: (auth) => request("GET", "/api/v5/affiliate/sub-affiliate/list", { auth })
21346
21373
  };
21347
21374
 
21348
21375
  // src/adapters/hrails.ts
@@ -22194,6 +22221,76 @@ function registerPublicTools(server, auth) {
22194
22221
  }
22195
22222
  }
22196
22223
  );
22224
+ server.tool(
22225
+ "okx_get_index_components",
22226
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u6307\u6570\u7684\u6210\u5206\u5E01\u79CD\u53CA\u5176\u6743\u91CD\n## \u573A\u666F\uFF1A\u7528\u4E8E\u4E86\u89E3\u6307\u6570\u6784\u6210\u3001\u5206\u6790\u5404\u4EA4\u6613\u6240\u5BF9\u6307\u6570\u4EF7\u683C\u7684\u5F71\u54CD\u6743\u91CD\n## \u5173\u952E\u8BCD\uFF1A\u6307\u6570\u6210\u5206, index components, \u6307\u6570\u6743\u91CD, \u6210\u5206\u5E01\u79CD, \u6210\u5206\u4EA4\u6613\u6240\n## \u53C2\u6570\uFF1A\n## - index: \u6307\u6570\u540D\u79F0\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u6307\u6570\u6210\u5206 \u2192 okx_get_index_tickers \u770B\u6307\u6570\u4EF7\u683C \u2192 \u5206\u6790\u504F\u5DEE",
22227
+ {
22228
+ index: external_exports.string().describe("\u6307\u6570\u540D\u79F0\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B")
22229
+ },
22230
+ async ({ index }) => {
22231
+ try {
22232
+ const data = await publicApi.getIndexComponents(index);
22233
+ const enriched = typeof data === "object" && !Array.isArray(data) ? {
22234
+ ...data,
22235
+ tsIso: data.ts ? new Date(parseInt(data.ts)).toISOString() : void 0
22236
+ } : data;
22237
+ return toResult(enriched);
22238
+ } catch (e) {
22239
+ return toError(e);
22240
+ }
22241
+ }
22242
+ );
22243
+ server.tool(
22244
+ "okx_get_index_components_market",
22245
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5E02\u573A\u4EF7\u683C\u6307\u6570\u7684\u6210\u5206\u6570\u636E\n## \u573A\u666F\uFF1A\u7528\u4E8E\u83B7\u53D6\u6307\u6570\u6210\u5206\u7684\u6700\u9AD8/\u6700\u4F4E\u4EF7\u3001\u5404\u4EA4\u6613\u6240\u62A5\u4EF7\n## \u5173\u952E\u8BCD\uFF1A\u5E02\u573A\u6307\u6570\u6210\u5206, market index components, \u5E02\u573A\u4EF7\u683C\u6307\u6570\n## \u53C2\u6570\uFF1A\n## - index: \u6307\u6570\u540D\u79F0\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u5E02\u573A\u6307\u6570\u6210\u5206 \u2192 \u5BF9\u6BD4\u5404\u4EA4\u6613\u6240\u4EF7\u5DEE \u2192 \u53D1\u73B0\u5957\u5229\u673A\u4F1A",
22246
+ {
22247
+ index: external_exports.string().describe("\u6307\u6570\u540D\u79F0\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B")
22248
+ },
22249
+ async ({ index }) => {
22250
+ try {
22251
+ const data = await publicApi.getIndexComponents(index);
22252
+ const enriched = typeof data === "object" && !Array.isArray(data) ? {
22253
+ ...data,
22254
+ tsIso: data.ts ? new Date(parseInt(data.ts)).toISOString() : void 0
22255
+ } : data;
22256
+ return toResult(enriched);
22257
+ } catch (e) {
22258
+ return toError(e);
22259
+ }
22260
+ }
22261
+ );
22262
+ server.tool(
22263
+ "okx_get_discount_info",
22264
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u5404\u5E01\u79CD\u7684\u62B5\u62BC\u54C1\u6298\u6263\u7387\u548C\u514D\u606F\u989D\u5EA6\n## \u573A\u666F\uFF1A\u7528\u4E8E\u4E86\u89E3\u5404\u5E01\u79CD\u4F5C\u4E3A\u62B5\u62BC\u54C1\u7684\u4EF7\u503C\u6298\u6263\u3001\u8BA1\u7B97\u53EF\u7528\u62B5\u62BC\u989D\u5EA6\n## \u5173\u952E\u8BCD\uFF1A\u62B5\u62BC\u6298\u6263, discount info, \u62B5\u62BC\u54C1\u6298\u6263\u7387, \u514D\u606F\u989D\u5EA6, \u62C5\u4FDD\u54C1\n## \u53C2\u6570\uFF1A\u65E0\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u6298\u6263\u7387 \u2192 \u8BA1\u7B97\u5B9E\u9645\u62B5\u62BC\u4EF7\u503C \u2192 okx_get_max_loan \u67E5\u53EF\u501F",
22265
+ {},
22266
+ async () => {
22267
+ try {
22268
+ const data = await publicApi.getDiscountRateInterestFreeQuota();
22269
+ return toResult(data);
22270
+ } catch (e) {
22271
+ return toError(e);
22272
+ }
22273
+ }
22274
+ );
22275
+ server.tool(
22276
+ "okx_get_estimated_price",
22277
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u671F\u6743\u9884\u4F30\u884C\u6743\u7ED3\u7B97\u4EF7\n## \u573A\u666F\uFF1A\u7528\u4E8E\u671F\u6743\u5230\u671F\u524D\u9884\u4F30\u7ED3\u7B97\u4EF7\u3001\u8BC4\u4F30\u671F\u6743\u5230\u671F\u4EF7\u503C\n## \u5173\u952E\u8BCD\uFF1A\u9884\u4F30\u7ED3\u7B97, estimated price, \u671F\u6743\u7ED3\u7B97, \u884C\u6743\u9884\u4F30, \u4EA4\u5272\u9884\u4F30\u4EF7\n## \u53C2\u6570\uFF1A\n## - instId: \u671F\u6743\u4EA7\u54C1ID\uFF0C\u5982 BTC-USD-260612-64000-C\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u9884\u4F30\u7ED3\u7B97\u4EF7 \u2192 okx_get_opt_summary \u770B\u6CE2\u52A8\u7387 \u2192 \u8BC4\u4F30\u671F\u6743\u4EF7\u503C",
22278
+ {
22279
+ instId: external_exports.string().describe("\u671F\u6743\u4EA7\u54C1ID\uFF0C\u5982 BTC-USD-260612-64000-C\u3002\u5FC5\u586B")
22280
+ },
22281
+ async ({ instId }) => {
22282
+ try {
22283
+ const data = await publicApi.getEstimatedPrice(instId);
22284
+ const enriched = data.map((item) => ({
22285
+ ...item,
22286
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
22287
+ }));
22288
+ return toResult(enriched);
22289
+ } catch (e) {
22290
+ return toError(e);
22291
+ }
22292
+ }
22293
+ );
22197
22294
  }
22198
22295
 
22199
22296
  // src/tools/account.ts
@@ -23021,6 +23118,56 @@ function registerTradingTools(server, auth) {
23021
23118
  }
23022
23119
  }
23023
23120
  );
23121
+ server.tool(
23122
+ "okx_reset_mmp",
23123
+ "## \u529F\u80FD\uFF1A\u91CD\u7F6EMMP\uFF08\u505A\u5E02\u5546\u4FDD\u62A4\uFF09\u72B6\u6001\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5728\u89E6\u53D1MMP\u4FDD\u62A4\u540E\u624B\u52A8\u91CD\u7F6E\u3001\u6062\u590D\u505A\u5E02\u4EA4\u6613\n## \u5173\u952E\u8BCD\uFF1A\u91CD\u7F6EMMP, reset mmp, \u505A\u5E02\u5546\u91CD\u7F6E, MMP\u590D\u4F4D\n## \u53C2\u6570\uFF1A\n## - instFamily: \u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u91CD\u7F6EMMP\u4FDD\u62A4\u72B6\u6001\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u91CD\u7F6EMMP\u540E\u505A\u5E02\u5546\u53EF\u6062\u590D\u4EA4\u6613\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1Aokx_get_mmp_config \u67E5\u770BMMP\u72B6\u6001 \u2192 \u672C\u5DE5\u5177\u91CD\u7F6E \u2192 \u6062\u590D\u6B63\u5E38\u505A\u5E02",
23124
+ {
23125
+ instFamily: external_exports.string().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B")
23126
+ },
23127
+ async ({ instFamily }) => {
23128
+ if (!auth) return toError(AUTH_REQUIRED);
23129
+ try {
23130
+ const data = await privateApi.resetMmp(auth, { instFamily });
23131
+ return toResult(data);
23132
+ } catch (e) {
23133
+ return toError(e);
23134
+ }
23135
+ }
23136
+ );
23137
+ server.tool(
23138
+ "okx_get_orders_archive",
23139
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE23\u4E2A\u6708\u4EE5\u524D\u7684\u5B8C\u6574\u5386\u53F2\u8BA2\u5355\uFF08\u5F52\u6863\u6570\u636E\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u957F\u671F\u4EA4\u6613\u8BB0\u5F55\u5206\u6790\u3001\u5E74\u5EA6\u590D\u76D8\n## \u5173\u952E\u8BCD\uFF1A\u5F52\u6863\u8BA2\u5355, orders archive, \u5386\u53F2\u5F52\u6863, \u8BA2\u5355\u5B58\u6863\n## \u53C2\u6570\uFF1A\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u3002SPOT=\u73B0\u8D27, MARGIN=\u6760\u6746, SWAP=\u6C38\u7EED, FUTURES=\u4EA4\u5272, OPTION=\u671F\u6743\n## - limit: \u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA450\uFF0C\u6700\u5927100\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 API Key\uFF08\u53EA\u8BFB\uFF09\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~10KB\n## \u5173\u8054\uFF1Aokx_get_orders_history \u67E5\u8FD1\u671F\u8BA2\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u5F52\u6863 \u2192 \u5B8C\u6574\u590D\u76D8",
23140
+ {
23141
+ instType: external_exports.enum(INST_TYPE_TRADE).describe("\u4EA7\u54C1\u7C7B\u578B"),
23142
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA450")
23143
+ },
23144
+ async ({ instType, limit }) => {
23145
+ if (!auth) return toError(AUTH_REQUIRED);
23146
+ try {
23147
+ const data = await privateApi.getOrdersHistoryArchive(auth, instType, limit);
23148
+ return toResult(data);
23149
+ } catch (e) {
23150
+ return toError(e);
23151
+ }
23152
+ }
23153
+ );
23154
+ server.tool(
23155
+ "okx_get_order_by_clOrdId",
23156
+ "## \u529F\u80FD\uFF1A\u901A\u8FC7\u5BA2\u6237\u7AEF\u81EA\u5B9A\u4E49ID\u67E5\u8BE2\u8BA2\u5355\u8BE6\u60C5\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8FFD\u8E2A\u4F7F\u7528\u81EA\u5B9A\u4E49\u8BA2\u5355ID\u4E0B\u5355\u540E\u7684\u6267\u884C\u72B6\u6001\u3001\u5728\u81EA\u6709\u7CFB\u7EDF\u4E2D\u5173\u8054\u8BA2\u5355\n## \u5173\u952E\u8BCD\uFF1A\u8BA2\u5355ID, clOrdId, \u81EA\u5B9A\u4E49\u8BA2\u5355, \u5BA2\u6237\u7AEFID, \u8BA2\u5355\u67E5\u8BE2\n## \u53C2\u6570\uFF1A\n## - instId: \u4EA7\u54C1ID\u3002\u5FC5\u586B\n## - clOrdId: \u5BA2\u6237\u7AEF\u81EA\u5B9A\u4E49\u8BA2\u5355ID\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_place_order \u4E0B\u5355\u65F6\u8BBE\u7F6EclOrdId \u2192 \u672C\u5DE5\u5177\u67E5\u8BE2 \u2192 \u786E\u8BA4\u8BA2\u5355\u72B6\u6001",
23157
+ {
23158
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
23159
+ clOrdId: external_exports.string().describe("\u5BA2\u6237\u7AEF\u81EA\u5B9A\u4E49\u8BA2\u5355ID\u3002\u5FC5\u586B")
23160
+ },
23161
+ async ({ instId, clOrdId }) => {
23162
+ if (!auth) return toError(AUTH_REQUIRED);
23163
+ try {
23164
+ const data = await privateApi.getOrderByClientId(auth, instId, clOrdId);
23165
+ return toResult(data);
23166
+ } catch (e) {
23167
+ return toError(e);
23168
+ }
23169
+ }
23170
+ );
23024
23171
  }
23025
23172
 
23026
23173
  // src/tools/algo.ts
@@ -23598,6 +23745,83 @@ function registerStatsTools(server) {
23598
23745
  }
23599
23746
  }
23600
23747
  );
23748
+ server.tool(
23749
+ "okx_get_margin_lending_ratio_history",
23750
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u6760\u6746\u501F\u5E01\u5229\u7387\u5386\u53F2\u8D70\u52BF\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u501F\u5E01\u5229\u7387\u53D8\u5316\u8D8B\u52BF\u3001\u5224\u65AD\u6760\u6746\u8D44\u91D1\u6210\u672C\u53D8\u5316\n## \u5173\u952E\u8BCD\uFF1A\u501F\u5E01\u5229\u7387\u5386\u53F2, margin lending history, \u5229\u7387\u8D70\u52BF, \u6760\u6746\u6210\u672C\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3001USDT\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u5229\u7387\u5386\u53F2 \u2192 okx_get_margin_lending_ratio \u770B\u5F53\u524D \u2192 \u5224\u65AD\u6760\u6746\u53D8\u5316",
23751
+ { ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001USDT") },
23752
+ async ({ ccy }) => {
23753
+ try {
23754
+ const data = await publicApi.getLendingRateHistory(ccy);
23755
+ const enriched = data.map((item) => ({
23756
+ ...item,
23757
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
23758
+ }));
23759
+ return toResult(enriched);
23760
+ } catch (e) {
23761
+ return toError(e);
23762
+ }
23763
+ }
23764
+ );
23765
+ server.tool(
23766
+ "okx_get_option_open_interest",
23767
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u671F\u6743\u672A\u5E73\u4ED3\u91CF\u548C\u6210\u4EA4\u91CF\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u671F\u6743\u5E02\u573A\u6D3B\u8DC3\u5EA6\u3001\u5224\u65AD\u8D44\u91D1\u6D41\u5165\u6D41\u51FA\u8D8B\u52BF\n## \u5173\u952E\u8BCD\uFF1A\u671F\u6743\u6301\u4ED3, option oi, \u671F\u6743\u672A\u5E73\u4ED3, \u671F\u6743\u6210\u4EA4\u91CF, \u671F\u6743\u6301\u4ED3\u91CF\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u671F\u6743\u6301\u4ED3 \u2192 okx_get_put_call_ratio \u5206\u6790\u60C5\u7EEA \u2192 okx_get_opt_summary \u770B\u6CE2\u52A8\u7387",
23768
+ { ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B") },
23769
+ async ({ ccy }) => {
23770
+ try {
23771
+ const data = await publicApi.getOptionOpenInterestVolume(ccy);
23772
+ return toResult(data);
23773
+ } catch (e) {
23774
+ return toError(e);
23775
+ }
23776
+ }
23777
+ );
23778
+ server.tool(
23779
+ "okx_get_option_oi_expiry",
23780
+ "## \u529F\u80FD\uFF1A\u6309\u5230\u671F\u65E5\u83B7\u53D6\u671F\u6743\u672A\u5E73\u4ED3\u91CF\u548C\u6210\u4EA4\u91CF\u5206\u5E03\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u4E0D\u540C\u5230\u671F\u65E5\u7684\u671F\u6743\u6301\u4ED3\u5206\u5E03\u3001\u5224\u65AD\u5E02\u573A\u7126\u70B9\u5230\u671F\u65E5\n## \u5173\u952E\u8BCD\uFF1A\u671F\u6743\u5230\u671F\u6301\u4ED3, option oi expiry, \u5230\u671F\u65E5\u5206\u5E03, \u5404\u671F\u9650\u6301\u4ED3\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u6309\u5230\u671F\u65E5\u770B\u6301\u4ED3 \u2192 okx_get_option_open_interest \u770B\u603B\u91CF \u2192 \u5206\u6790\u5230\u671F\u65E5\u96C6\u4E2D\u5EA6",
23781
+ { ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B") },
23782
+ async ({ ccy }) => {
23783
+ try {
23784
+ const data = await publicApi.getOptionOiExpiry(ccy);
23785
+ const enriched = data.map((row) => ({
23786
+ ts: row[0],
23787
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
23788
+ expTime: row[1],
23789
+ oi: row[2],
23790
+ oiUsd: row[3],
23791
+ vol: row[4],
23792
+ volUsd: row[5]
23793
+ }));
23794
+ return toResult(enriched);
23795
+ } catch (e) {
23796
+ return toError(e);
23797
+ }
23798
+ }
23799
+ );
23800
+ server.tool(
23801
+ "okx_get_option_oi_strike",
23802
+ "## \u529F\u80FD\uFF1A\u6309\u884C\u6743\u4EF7\u83B7\u53D6\u671F\u6743\u672A\u5E73\u4ED3\u91CF\u548C\u6210\u4EA4\u91CF\u5206\u5E03\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u4E0D\u540C\u884C\u6743\u4EF7\u7684\u671F\u6743\u6301\u4ED3\u96C6\u4E2D\u5EA6\u3001\u53D1\u73B0\u6700\u5927\u75DB\u70B9\u3001\u5224\u65AD\u5E02\u573A\u9884\u671F\u4EF7\u683C\u533A\u95F4\n## \u5173\u952E\u8BCD\uFF1A\u671F\u6743\u884C\u6743\u6301\u4ED3, option oi strike, \u884C\u6743\u4EF7\u5206\u5E03, \u6700\u5927\u75DB\u70B9, max pain\n## \u53C2\u6570\uFF1A\n## - ccy: \u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B\n## - expTime: \u5230\u671F\u65E5\uFF0C\u683C\u5F0F YYYYMMDD\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u770B\u884C\u6743\u4EF7\u5206\u5E03 \u2192 \u8BA1\u7B97\u6700\u5927\u75DB\u70B9 \u2192 \u9884\u5224\u5230\u671F\u65E5\u4EF7\u683C\u8D70\u52BF",
23803
+ {
23804
+ ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B"),
23805
+ expTime: external_exports.string().describe("\u5230\u671F\u65E5\uFF0C\u683C\u5F0F YYYYMMDD\u3002\u5FC5\u586B")
23806
+ },
23807
+ async ({ ccy, expTime }) => {
23808
+ try {
23809
+ const data = await publicApi.getOptionOiStrike(ccy, expTime);
23810
+ const enriched = data.map((row) => ({
23811
+ ts: row[0],
23812
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
23813
+ strike: row[1],
23814
+ putOi: row[2],
23815
+ callOi: row[3],
23816
+ putVol: row[4],
23817
+ callVol: row[5]
23818
+ }));
23819
+ return toResult(enriched);
23820
+ } catch (e) {
23821
+ return toError(e);
23822
+ }
23823
+ }
23824
+ );
23601
23825
  }
23602
23826
 
23603
23827
  // src/tools/subaccount.ts
@@ -23805,6 +24029,39 @@ function registerSubAccountTools(server, auth) {
23805
24029
  }
23806
24030
  }
23807
24031
  );
24032
+ server.tool(
24033
+ "okx_create_subaccount",
24034
+ "## \u529F\u80FD\uFF1A\u521B\u5EFA\u65B0\u7684\u5B50\u8D26\u6237\n## \u573A\u666F\uFF1A\u7528\u4E8E\u521B\u5EFA\u5B50\u8D26\u6237\u7BA1\u7406\u591A\u4E2A\u4EA4\u6613\u7B56\u7565\u3001\u9694\u79BB\u8D44\u91D1\u548C\u98CE\u9669\n## \u5173\u952E\u8BCD\uFF1A\u521B\u5EFA\u5B50\u8D26\u6237, create subaccount, \u65B0\u589E\u5B50\u8D26\u53F7\n## \u53C2\u6570\uFF1A\n## - subAcct: \u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B\n## - label: \u5B50\u8D26\u6237\u5907\u6CE8\u3002\u53EF\u9009\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981\u4E3B\u8D26\u6237 API Key\uFF08\u7BA1\u7406\uFF09- \u5C06\u521B\u5EFA\u65B0\u5B50\u8D26\u6237\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u98CE\u9669\uFF1AADMIN \u2014 \u521B\u5EFA\u5B50\u8D26\u6237\u5F71\u54CD\u8D26\u6237\u7ED3\u6784\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u7531\u7528\u6237\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u521B\u5EFA \u2192 okx_list_subaccounts \u67E5\u770B \u2192 okx_create_subaccount_api_key \u8BBE\u7F6EAPI",
24035
+ {
24036
+ subAcct: external_exports.string().describe("\u5B50\u8D26\u6237\u540D\u79F0\u3002\u5FC5\u586B"),
24037
+ label: external_exports.string().optional().describe("\u5B50\u8D26\u6237\u5907\u6CE8")
24038
+ },
24039
+ async ({ subAcct, label }) => {
24040
+ if (!auth) return toError(AUTH_REQUIRED);
24041
+ try {
24042
+ const body = { subAcct };
24043
+ if (label) body.label = label;
24044
+ const data = await privateApi.createSubAccount(auth, body);
24045
+ return toResult(data);
24046
+ } catch (e) {
24047
+ return toError(e);
24048
+ }
24049
+ }
24050
+ );
24051
+ server.tool(
24052
+ "okx_get_entrust_subaccount_list",
24053
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u59D4\u6258\u5B50\u8D26\u6237\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u6258\u7BA1\u5B50\u8D26\u6237\u3001\u7BA1\u7406\u59D4\u6258\u4EA4\u6613\u6743\u9650\n## \u5173\u952E\u8BCD\uFF1A\u59D4\u6258\u5B50\u8D26\u6237, entrust subaccount, \u6258\u7BA1\u8D26\u6237, \u59D4\u6258\u7BA1\u7406\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\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u59D4\u6258\u5B50\u8D26\u6237 \u2192 \u7BA1\u7406\u5B50\u8D26\u6237\u6743\u9650",
24054
+ {},
24055
+ async () => {
24056
+ if (!auth) return toError(AUTH_REQUIRED);
24057
+ try {
24058
+ const data = await privateApi.getEntrustSubAccountList(auth);
24059
+ return toResult(data);
24060
+ } catch (e) {
24061
+ return toError(e);
24062
+ }
24063
+ }
24064
+ );
23808
24065
  }
23809
24066
 
23810
24067
  // src/tools/finance.ts
@@ -24518,6 +24775,155 @@ function registerSpreadTools(server, auth) {
24518
24775
  }
24519
24776
  }
24520
24777
  );
24778
+ server.tool(
24779
+ "okx_amend_spread_order",
24780
+ "## \u529F\u80FD\uFF1A\u4FEE\u6539\u4EF7\u5DEE\u5408\u7EA6\u672A\u6210\u4EA4\u8BA2\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u8C03\u6574\u4EF7\u5DEE\u6302\u5355\u7684\u4EF7\u683C\u6216\u6570\u91CF\n## \u5173\u952E\u8BCD\uFF1A\u4FEE\u6539\u4EF7\u5DEE, amend spread, \u4EF7\u5DEE\u6539\u5355, \u4EF7\u5DEE\u6539\u4EF7\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B\n## - ordId: \u8BA2\u5355ID\u3002\u5FC5\u586B\n## - newSz: \u65B0\u6570\u91CF\u3002\u53EF\u9009\n## - newPx: \u65B0\u4EF7\u683C\u3002\u53EF\u9009\n## \u9274\u6743\uFF1A\u{1F534} \u9700\u8981 API Key\uFF08\u4EA4\u6613\uFF09- \u5C06\u4FEE\u6539\u4EF7\u5DEE\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u98CE\u9669\uFF1AWRITE \u2014 \u4FEE\u6539\u8BA2\u5355\uFF0C\u8C03\u7528\u524D\u5FC5\u987B\u786E\u8BA4\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~500B\n## \u5173\u8054\uFF1Aokx_get_spread_orders \u67E5\u770B\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u4FEE\u6539 \u2192 \u786E\u8BA4\u4FEE\u6539\u7ED3\u679C",
24781
+ {
24782
+ sprdId: external_exports.string().describe("\u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B"),
24783
+ ordId: external_exports.string().describe("\u8BA2\u5355ID\u3002\u5FC5\u586B"),
24784
+ newSz: external_exports.string().optional().describe("\u65B0\u6570\u91CF"),
24785
+ newPx: external_exports.string().optional().describe("\u65B0\u4EF7\u683C")
24786
+ },
24787
+ async ({ sprdId, ordId, newSz, newPx }) => {
24788
+ if (!auth) return toError(AUTH_REQUIRED);
24789
+ try {
24790
+ const body = { sprdId, ordId };
24791
+ if (newSz) body.newSz = newSz;
24792
+ if (newPx) body.newPx = newPx;
24793
+ const data = await privateApi.amendSpreadOrder(auth, body);
24794
+ return toResult(data);
24795
+ } catch (e) {
24796
+ return toError(e);
24797
+ }
24798
+ }
24799
+ );
24800
+ server.tool(
24801
+ "okx_get_spread_orders_history",
24802
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u4EF7\u5DEE\u5408\u7EA6\u5386\u53F2\u8BA2\u5355\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5DF2\u5B8C\u6210\u7684\u5386\u53F2\u4EF7\u5DEE\u8BA2\u5355\u3001\u590D\u76D8\u4EF7\u5DEE\u4EA4\u6613\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u5386\u53F2\u8BA2\u5355, spread orders history, \u4EF7\u5DEE\u6210\u4EA4\u5386\u53F2\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\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 ~5KB\n## \u5173\u8054\uFF1Aokx_get_spread_orders \u67E5\u5F53\u524D\u6302\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u5386\u53F2 \u2192 \u590D\u76D8\u4EA4\u6613",
24803
+ {
24804
+ sprdId: external_exports.string().optional().describe("\u4EF7\u5DEE\u5408\u7EA6ID"),
24805
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
24806
+ },
24807
+ async ({ sprdId, limit }) => {
24808
+ if (!auth) return toError(AUTH_REQUIRED);
24809
+ try {
24810
+ const data = await privateApi.getSpreadOrdersHistory(auth, sprdId, limit);
24811
+ return toResult(data);
24812
+ } catch (e) {
24813
+ return toError(e);
24814
+ }
24815
+ }
24816
+ );
24817
+ server.tool(
24818
+ "okx_get_spread_fills",
24819
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u4EF7\u5DEE\u5408\u7EA6\u6210\u4EA4\u660E\u7EC6\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u4EF7\u5DEE\u8BA2\u5355\u7684\u9010\u7B14\u6210\u4EA4\u8BB0\u5F55\u3001\u6838\u5BF9\u6210\u4EA4\u4EF7\u683C\u548C\u6570\u91CF\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u6210\u4EA4, spread fills, \u4EF7\u5DEE\u6210\u4EA4\u660E\u7EC6, \u4EF7\u5DEE\u9010\u7B14\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\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 ~5KB\n## \u5173\u8054\uFF1Aokx_get_spread_orders \u67E5\u8BA2\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u6210\u4EA4 \u2192 \u6838\u7B97\u6210\u672C",
24820
+ {
24821
+ sprdId: external_exports.string().optional().describe("\u4EF7\u5DEE\u5408\u7EA6ID"),
24822
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
24823
+ },
24824
+ async ({ sprdId, limit }) => {
24825
+ if (!auth) return toError(AUTH_REQUIRED);
24826
+ try {
24827
+ const data = await privateApi.getSpreadFills(auth, sprdId, limit);
24828
+ return toResult(data);
24829
+ } catch (e) {
24830
+ return toError(e);
24831
+ }
24832
+ }
24833
+ );
24834
+ server.tool(
24835
+ "okx_get_spread_books",
24836
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u4EF7\u5DEE\u5408\u7EA6\u5168\u6DF1\u5EA6\u8BA2\u5355\u7C3F\n## \u573A\u666F\uFF1A\u7528\u4E8E\u5206\u6790\u4EF7\u5DEE\u5E02\u573A\u6D41\u52A8\u6027\u5168\u8C8C\u3001\u53D1\u73B0\u9690\u85CF\u7684\u5927\u989D\u6302\u5355\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u5168\u6DF1\u5EA6, spread books, \u4EF7\u5DEE\u5B8C\u6574\u6DF1\u5EA6, \u4EF7\u5DEE\u6240\u6709\u6863\u4F4D\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u4E2D\u7B49 ~10KB\n## \u5173\u8054\uFF1Aokx_get_spread_orderbook \u770B\u6709\u9650\u6DF1\u5EA6 \u2192 \u672C\u5DE5\u5177\u770B\u5168\u6DF1\u5EA6 \u2192 \u5206\u6790\u6D41\u52A8\u6027",
24837
+ {
24838
+ sprdId: external_exports.string().describe("\u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B")
24839
+ },
24840
+ async ({ sprdId }) => {
24841
+ try {
24842
+ const data = await publicApi.getSpreadOrderbook(sprdId);
24843
+ const enriched = data.data || data;
24844
+ if (enriched && typeof enriched === "object" && !Array.isArray(enriched)) {
24845
+ return toResult({
24846
+ ...enriched,
24847
+ tsIso: enriched.ts ? new Date(parseInt(enriched.ts)).toISOString() : void 0
24848
+ });
24849
+ }
24850
+ return toResult(data);
24851
+ } catch (e) {
24852
+ return toError(e);
24853
+ }
24854
+ }
24855
+ );
24856
+ server.tool(
24857
+ "okx_get_spread_orders_pending",
24858
+ "## \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 pending, \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",
24859
+ {
24860
+ sprdId: external_exports.string().optional().describe("\u4EF7\u5DEE\u5408\u7EA6ID")
24861
+ },
24862
+ async ({ sprdId }) => {
24863
+ if (!auth) return toError(AUTH_REQUIRED);
24864
+ try {
24865
+ const data = await privateApi.getSpreadOrdersPending(auth, sprdId);
24866
+ return toResult(data);
24867
+ } catch (e) {
24868
+ return toError(e);
24869
+ }
24870
+ }
24871
+ );
24872
+ server.tool(
24873
+ "okx_get_spread_orders_history_archive",
24874
+ "## \u529F\u80FD\uFF1A\u67E5\u8BE2\u4EF7\u5DEE\u5408\u7EA6\u5F52\u6863\u5386\u53F2\u8BA2\u5355\uFF083\u4E2A\u6708\u524D\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u957F\u671F\u590D\u76D8\u4EF7\u5DEE\u4EA4\u6613\u3001\u5E74\u5EA6\u4EA4\u6613\u7EDF\u8BA1\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u5F52\u6863, spread archive, \u4EF7\u5DEE\u5386\u53F2\u5F52\u6863, \u4EF7\u5DEE\u5B58\u6863\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\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1Aokx_get_spread_orders_history \u67E5\u8FD1\u671F \u2192 \u672C\u5DE5\u5177\u67E5\u5F52\u6863 \u2192 \u5B8C\u6574\u590D\u76D8",
24875
+ {
24876
+ sprdId: external_exports.string().optional().describe("\u4EF7\u5DEE\u5408\u7EA6ID")
24877
+ },
24878
+ async ({ sprdId }) => {
24879
+ if (!auth) return toError(AUTH_REQUIRED);
24880
+ try {
24881
+ const data = await privateApi.getSpreadOrdersHistoryArchive(auth, sprdId);
24882
+ return toResult(data);
24883
+ } catch (e) {
24884
+ return toError(e);
24885
+ }
24886
+ }
24887
+ );
24888
+ server.tool(
24889
+ "okx_get_spread_trades_public",
24890
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u4EF7\u5DEE\u5408\u7EA6\u516C\u5F00\u6210\u4EA4\u8BB0\u5F55\n## \u573A\u666F\uFF1A\u7528\u4E8E\u65E0\u9700\u9274\u6743\u67E5\u770B\u4EF7\u5DEE\u5E02\u573A\u7684\u6210\u4EA4\u60C5\u51B5\u3001\u5206\u6790\u4EF7\u683C\u8D70\u52BF\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u516C\u5F00\u6210\u4EA4, spread public trades, \u516C\u5F00\u6210\u4EA4, \u4EF7\u5DEE\u6210\u4EA4\n## \u53C2\u6570\uFF1A\n## - sprdId: \u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B\n## \u9274\u6743\uFF1APUBLIC \u2014 \u516C\u5F00\u63A5\u53E3\uFF0C\u4E0D\u9700\u8981 API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u67E5\u8BE2\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~2KB\n## \u5173\u8054\uFF1Aokx_get_spread_trades \u770B\u5E26\u8BE6\u60C5\u6210\u4EA4 \u2192 \u672C\u5DE5\u5177\u516C\u5F00\u67E5\u8BE2",
24891
+ {
24892
+ sprdId: external_exports.string().describe("\u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B")
24893
+ },
24894
+ async ({ sprdId }) => {
24895
+ try {
24896
+ const data = await publicApi.getSpreadPublicTrades(sprdId);
24897
+ const enriched = data.map((item) => ({
24898
+ ...item,
24899
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
24900
+ }));
24901
+ return toResult(enriched);
24902
+ } catch (e) {
24903
+ return toError(e);
24904
+ }
24905
+ }
24906
+ );
24907
+ server.tool(
24908
+ "okx_get_spread_trades_fills",
24909
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u4EF7\u5DEE\u5408\u7EA6\u7684\u6210\u4EA4\u660E\u7EC6\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u4EF7\u5DEE\u8BA2\u5355\u7684\u9010\u7B14\u6210\u4EA4\u8BB0\u5F55\u3001\u6838\u5BF9\u6210\u4EA4\u4EF7\n## \u5173\u952E\u8BCD\uFF1A\u4EF7\u5DEE\u6210\u4EA4\u660E\u7EC6, spread fills, \u4EF7\u5DEE\u9010\u7B14, \u4EF7\u5DEE\u6210\u4EA4\u8BB0\u5F55\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\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1Aokx_get_spread_orders \u67E5\u8BA2\u5355 \u2192 \u672C\u5DE5\u5177\u67E5\u6210\u4EA4 \u2192 \u6838\u7B97\u6210\u672C",
24910
+ {
24911
+ sprdId: external_exports.string().optional().describe("\u4EF7\u5DEE\u5408\u7EA6ID")
24912
+ },
24913
+ async ({ sprdId }) => {
24914
+ if (!auth) return toError(AUTH_REQUIRED);
24915
+ try {
24916
+ const data = await privateApi.getSpreadTradeFills(auth, sprdId);
24917
+ const enriched = data.map((item) => ({
24918
+ ...item,
24919
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
24920
+ }));
24921
+ return toResult(enriched);
24922
+ } catch (e) {
24923
+ return toError(e);
24924
+ }
24925
+ }
24926
+ );
24521
24927
  }
24522
24928
 
24523
24929
  // src/tools/copy.ts
@@ -25016,6 +25422,96 @@ function registerRfqTools(server, auth) {
25016
25422
  );
25017
25423
  }
25018
25424
 
25425
+ // src/tools/affiliate.ts
25426
+ function registerAffiliateTools(server, auth) {
25427
+ server.tool(
25428
+ "okx_get_affiliate_invitee_list",
25429
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u63A8\u5E7F\u9080\u8BF7\u7684\u7528\u6237\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u63A8\u5E7F\u5458\u67E5\u770B\u9080\u8BF7\u4E86\u54EA\u4E9B\u7528\u6237\u3001\u7EDF\u8BA1\u63A8\u5E7F\u6548\u679C\n## \u5173\u952E\u8BCD\uFF1A\u63A8\u5E7F\u5217\u8868, invitee list, \u9080\u8BF7\u5217\u8868, \u63A8\u5E7F\u5927\u4F7F\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\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u9080\u8BF7\u5217\u8868 \u2192 okx_get_affiliate_performance \u67E5\u770B\u63A8\u5E7F\u7EE9\u6548",
25430
+ {},
25431
+ async () => {
25432
+ if (!auth) return toError(AUTH_REQUIRED);
25433
+ try {
25434
+ const data = await privateApi.getAffiliateInviteeList(auth);
25435
+ return toResult(data);
25436
+ } catch (e) {
25437
+ return toError(e);
25438
+ }
25439
+ }
25440
+ );
25441
+ server.tool(
25442
+ "okx_get_affiliate_invitee_detail",
25443
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u63A8\u5E7F\u9080\u8BF7\u7684\u67D0\u4E2A\u7528\u6237\u8BE6\u7EC6\u4FE1\u606F\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u7279\u5B9A\u88AB\u9080\u8BF7\u7528\u6237\u7684\u4EA4\u6613\u91CF\u548C\u8FD4\u4F63\u8BE6\u60C5\n## \u5173\u952E\u8BCD\uFF1A\u9080\u8BF7\u8BE6\u60C5, invitee detail, \u63A8\u5E7F\u660E\u7EC6, \u7528\u6237\u8BE6\u60C5\n## \u53C2\u6570\uFF1A\n## - uid: \u7528\u6237ID\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_affiliate_invitee_list \u83B7\u53D6\u7528\u6237\u5217\u8868 \u2192 \u672C\u5DE5\u5177\u67E5\u8BE6\u60C5",
25444
+ {
25445
+ uid: external_exports.string().optional().describe("\u7528\u6237ID")
25446
+ },
25447
+ async ({ uid }) => {
25448
+ if (!auth) return toError(AUTH_REQUIRED);
25449
+ try {
25450
+ const data = await privateApi.getAffiliateInviteeDetail(auth, uid);
25451
+ return toResult(data);
25452
+ } catch (e) {
25453
+ return toError(e);
25454
+ }
25455
+ }
25456
+ );
25457
+ server.tool(
25458
+ "okx_get_affiliate_link_list",
25459
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u63A8\u5E7F\u94FE\u63A5\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5DF2\u521B\u5EFA\u7684\u63A8\u5E7F\u94FE\u63A5\u3001\u7BA1\u7406\u63A8\u5E7F\u6E20\u9053\n## \u5173\u952E\u8BCD\uFF1A\u63A8\u5E7F\u94FE\u63A5, affiliate link, \u9080\u8BF7\u94FE\u63A5, \u63A8\u5E7F\u6E20\u9053\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\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u94FE\u63A5 \u2192 \u5206\u4EAB\u7ED9\u7528\u6237 \u2192 \u8FFD\u8E2A\u63A8\u5E7F\u6548\u679C",
25460
+ {},
25461
+ async () => {
25462
+ if (!auth) return toError(AUTH_REQUIRED);
25463
+ try {
25464
+ const data = await privateApi.getAffiliateLinkList(auth);
25465
+ return toResult(data);
25466
+ } catch (e) {
25467
+ return toError(e);
25468
+ }
25469
+ }
25470
+ );
25471
+ server.tool(
25472
+ "okx_get_affiliate_performance",
25473
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u63A8\u5E7F\u7EE9\u6548\u6C47\u603B\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u63A8\u5E7F\u6536\u76CA\u3001\u4EA4\u6613\u91CF\u3001\u8FD4\u4F63\u6BD4\u4F8B\u7B49\u6838\u5FC3\u6570\u636E\n## \u5173\u952E\u8BCD\uFF1A\u63A8\u5E7F\u7EE9\u6548, affiliate performance, \u63A8\u5E7F\u6536\u76CA, \u8FD4\u4F63, \u4F63\u91D1\u7EDF\u8BA1\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\u603B\u7EE9\u6548 \u2192 okx_get_affiliate_invitee_list \u770B\u660E\u7EC6 \u2192 \u4F18\u5316\u63A8\u5E7F\u7B56\u7565",
25474
+ {},
25475
+ async () => {
25476
+ if (!auth) return toError(AUTH_REQUIRED);
25477
+ try {
25478
+ const data = await privateApi.getAffiliatePerformance(auth);
25479
+ return toResult(data);
25480
+ } catch (e) {
25481
+ return toError(e);
25482
+ }
25483
+ }
25484
+ );
25485
+ server.tool(
25486
+ "okx_get_co_inviter_list",
25487
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u8054\u5408\u9080\u8BF7\u4EBA\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u5408\u4F5C\u63A8\u5E7F\u7684\u8054\u5408\u9080\u8BF7\u4EBA\n## \u5173\u952E\u8BCD\uFF1A\u8054\u5408\u9080\u8BF7, co-inviter, \u5408\u4F5C\u63A8\u5E7F, \u5408\u9080\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\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u8054\u5408\u9080\u8BF7\u4EBA \u2192 \u7BA1\u7406\u5408\u4F5C\u63A8\u5E7F\u5173\u7CFB",
25488
+ {},
25489
+ async () => {
25490
+ if (!auth) return toError(AUTH_REQUIRED);
25491
+ try {
25492
+ const data = await privateApi.getAffiliateCoInviterList(auth);
25493
+ return toResult(data);
25494
+ } catch (e) {
25495
+ return toError(e);
25496
+ }
25497
+ }
25498
+ );
25499
+ server.tool(
25500
+ "okx_get_sub_affiliate_list",
25501
+ "## \u529F\u80FD\uFF1A\u83B7\u53D6\u4E0B\u7EA7\u63A8\u5E7F\u5458\u5217\u8868\n## \u573A\u666F\uFF1A\u7528\u4E8E\u67E5\u770B\u81EA\u5DF1\u7684\u4E0B\u7EA7\u63A8\u5E7F\u5458\u3001\u7BA1\u7406\u63A8\u5E7F\u56E2\u961F\n## \u5173\u952E\u8BCD\uFF1A\u4E0B\u7EA7\u63A8\u5E7F, sub affiliate, \u4E0B\u7EA7\u4EE3\u7406, \u63A8\u5E7F\u56E2\u961F\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\u4E2D\u7B49 ~5KB\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u67E5\u770B\u4E0B\u7EA7\u63A8\u5E7F\u5458 \u2192 \u7BA1\u7406\u63A8\u5E7F\u56E2\u961F \u2192 \u5E26\u52A8\u56E2\u961F\u4E1A\u7EE9",
25502
+ {},
25503
+ async () => {
25504
+ if (!auth) return toError(AUTH_REQUIRED);
25505
+ try {
25506
+ const data = await privateApi.getAffiliateSubAffiliateList(auth);
25507
+ return toResult(data);
25508
+ } catch (e) {
25509
+ return toError(e);
25510
+ }
25511
+ }
25512
+ );
25513
+ }
25514
+
25019
25515
  // src/index.ts
25020
25516
  async function main() {
25021
25517
  const server = new McpServer({ name: "hvip", version: "0.2.1" });
@@ -25034,6 +25530,7 @@ async function main() {
25034
25530
  registerFundingTools(server, auth);
25035
25531
  registerSubAccountTools(server, auth);
25036
25532
  registerFinanceTools(server, auth);
25533
+ registerAffiliateTools(server, auth);
25037
25534
  registerRfqTools(server, auth);
25038
25535
  const transport = new StdioServerTransport();
25039
25536
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hvip-mcp-server",
3
- "version": "0.2.24",
3
+ "version": "0.2.26",
4
4
  "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",