hvip-mcp-server 0.2.24 → 0.2.25

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 +290 -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,14 @@ 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
+ getOrderByClientId: (auth, instId, clOrdId) => request("GET", "/api/v5/trade/order", { params: { instId, clOrdId }, auth })
21346
21359
  };
21347
21360
 
21348
21361
  // src/adapters/hrails.ts
@@ -22194,6 +22207,76 @@ function registerPublicTools(server, auth) {
22194
22207
  }
22195
22208
  }
22196
22209
  );
22210
+ server.tool(
22211
+ "okx_get_index_components",
22212
+ "## \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",
22213
+ {
22214
+ index: external_exports.string().describe("\u6307\u6570\u540D\u79F0\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B")
22215
+ },
22216
+ async ({ index }) => {
22217
+ try {
22218
+ const data = await publicApi.getIndexComponents(index);
22219
+ const enriched = typeof data === "object" && !Array.isArray(data) ? {
22220
+ ...data,
22221
+ tsIso: data.ts ? new Date(parseInt(data.ts)).toISOString() : void 0
22222
+ } : data;
22223
+ return toResult(enriched);
22224
+ } catch (e) {
22225
+ return toError(e);
22226
+ }
22227
+ }
22228
+ );
22229
+ server.tool(
22230
+ "okx_get_index_components_market",
22231
+ "## \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",
22232
+ {
22233
+ index: external_exports.string().describe("\u6307\u6570\u540D\u79F0\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B")
22234
+ },
22235
+ async ({ index }) => {
22236
+ try {
22237
+ const data = await publicApi.getIndexComponents(index);
22238
+ const enriched = typeof data === "object" && !Array.isArray(data) ? {
22239
+ ...data,
22240
+ tsIso: data.ts ? new Date(parseInt(data.ts)).toISOString() : void 0
22241
+ } : data;
22242
+ return toResult(enriched);
22243
+ } catch (e) {
22244
+ return toError(e);
22245
+ }
22246
+ }
22247
+ );
22248
+ server.tool(
22249
+ "okx_get_discount_info",
22250
+ "## \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",
22251
+ {},
22252
+ async () => {
22253
+ try {
22254
+ const data = await publicApi.getDiscountRateInterestFreeQuota();
22255
+ return toResult(data);
22256
+ } catch (e) {
22257
+ return toError(e);
22258
+ }
22259
+ }
22260
+ );
22261
+ server.tool(
22262
+ "okx_get_estimated_price",
22263
+ "## \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",
22264
+ {
22265
+ instId: external_exports.string().describe("\u671F\u6743\u4EA7\u54C1ID\uFF0C\u5982 BTC-USD-260612-64000-C\u3002\u5FC5\u586B")
22266
+ },
22267
+ async ({ instId }) => {
22268
+ try {
22269
+ const data = await publicApi.getEstimatedPrice(instId);
22270
+ const enriched = data.map((item) => ({
22271
+ ...item,
22272
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
22273
+ }));
22274
+ return toResult(enriched);
22275
+ } catch (e) {
22276
+ return toError(e);
22277
+ }
22278
+ }
22279
+ );
22197
22280
  }
22198
22281
 
22199
22282
  // src/tools/account.ts
@@ -23021,6 +23104,56 @@ function registerTradingTools(server, auth) {
23021
23104
  }
23022
23105
  }
23023
23106
  );
23107
+ server.tool(
23108
+ "okx_reset_mmp",
23109
+ "## \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",
23110
+ {
23111
+ instFamily: external_exports.string().describe("\u4EA7\u54C1\u65CF\uFF0C\u5982 BTC-USD\u3002\u5FC5\u586B")
23112
+ },
23113
+ async ({ instFamily }) => {
23114
+ if (!auth) return toError(AUTH_REQUIRED);
23115
+ try {
23116
+ const data = await privateApi.resetMmp(auth, { instFamily });
23117
+ return toResult(data);
23118
+ } catch (e) {
23119
+ return toError(e);
23120
+ }
23121
+ }
23122
+ );
23123
+ server.tool(
23124
+ "okx_get_orders_archive",
23125
+ "## \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",
23126
+ {
23127
+ instType: external_exports.enum(INST_TYPE_TRADE).describe("\u4EA7\u54C1\u7C7B\u578B"),
23128
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA450")
23129
+ },
23130
+ async ({ instType, limit }) => {
23131
+ if (!auth) return toError(AUTH_REQUIRED);
23132
+ try {
23133
+ const data = await privateApi.getOrdersHistoryArchive(auth, instType, limit);
23134
+ return toResult(data);
23135
+ } catch (e) {
23136
+ return toError(e);
23137
+ }
23138
+ }
23139
+ );
23140
+ server.tool(
23141
+ "okx_get_order_by_clOrdId",
23142
+ "## \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",
23143
+ {
23144
+ instId: external_exports.string().describe("\u4EA7\u54C1ID\u3002\u5FC5\u586B"),
23145
+ clOrdId: external_exports.string().describe("\u5BA2\u6237\u7AEF\u81EA\u5B9A\u4E49\u8BA2\u5355ID\u3002\u5FC5\u586B")
23146
+ },
23147
+ async ({ instId, clOrdId }) => {
23148
+ if (!auth) return toError(AUTH_REQUIRED);
23149
+ try {
23150
+ const data = await privateApi.getOrderByClientId(auth, instId, clOrdId);
23151
+ return toResult(data);
23152
+ } catch (e) {
23153
+ return toError(e);
23154
+ }
23155
+ }
23156
+ );
23024
23157
  }
23025
23158
 
23026
23159
  // src/tools/algo.ts
@@ -23598,6 +23731,83 @@ function registerStatsTools(server) {
23598
23731
  }
23599
23732
  }
23600
23733
  );
23734
+ server.tool(
23735
+ "okx_get_margin_lending_ratio_history",
23736
+ "## \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",
23737
+ { ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001USDT") },
23738
+ async ({ ccy }) => {
23739
+ try {
23740
+ const data = await publicApi.getLendingRateHistory(ccy);
23741
+ const enriched = data.map((item) => ({
23742
+ ...item,
23743
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
23744
+ }));
23745
+ return toResult(enriched);
23746
+ } catch (e) {
23747
+ return toError(e);
23748
+ }
23749
+ }
23750
+ );
23751
+ server.tool(
23752
+ "okx_get_option_open_interest",
23753
+ "## \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",
23754
+ { ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B") },
23755
+ async ({ ccy }) => {
23756
+ try {
23757
+ const data = await publicApi.getOptionOpenInterestVolume(ccy);
23758
+ return toResult(data);
23759
+ } catch (e) {
23760
+ return toError(e);
23761
+ }
23762
+ }
23763
+ );
23764
+ server.tool(
23765
+ "okx_get_option_oi_expiry",
23766
+ "## \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",
23767
+ { ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B") },
23768
+ async ({ ccy }) => {
23769
+ try {
23770
+ const data = await publicApi.getOptionOiExpiry(ccy);
23771
+ const enriched = data.map((row) => ({
23772
+ ts: row[0],
23773
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
23774
+ expTime: row[1],
23775
+ oi: row[2],
23776
+ oiUsd: row[3],
23777
+ vol: row[4],
23778
+ volUsd: row[5]
23779
+ }));
23780
+ return toResult(enriched);
23781
+ } catch (e) {
23782
+ return toError(e);
23783
+ }
23784
+ }
23785
+ );
23786
+ server.tool(
23787
+ "okx_get_option_oi_strike",
23788
+ "## \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",
23789
+ {
23790
+ ccy: external_exports.string().describe("\u5E01\u79CD\uFF0C\u5982 BTC\u3001ETH\u3002\u5FC5\u586B"),
23791
+ expTime: external_exports.string().describe("\u5230\u671F\u65E5\uFF0C\u683C\u5F0F YYYYMMDD\u3002\u5FC5\u586B")
23792
+ },
23793
+ async ({ ccy, expTime }) => {
23794
+ try {
23795
+ const data = await publicApi.getOptionOiStrike(ccy, expTime);
23796
+ const enriched = data.map((row) => ({
23797
+ ts: row[0],
23798
+ tsIso: row[0] ? new Date(parseInt(row[0])).toISOString() : void 0,
23799
+ strike: row[1],
23800
+ putOi: row[2],
23801
+ callOi: row[3],
23802
+ putVol: row[4],
23803
+ callVol: row[5]
23804
+ }));
23805
+ return toResult(enriched);
23806
+ } catch (e) {
23807
+ return toError(e);
23808
+ }
23809
+ }
23810
+ );
23601
23811
  }
23602
23812
 
23603
23813
  // src/tools/subaccount.ts
@@ -24518,6 +24728,84 @@ function registerSpreadTools(server, auth) {
24518
24728
  }
24519
24729
  }
24520
24730
  );
24731
+ server.tool(
24732
+ "okx_amend_spread_order",
24733
+ "## \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",
24734
+ {
24735
+ sprdId: external_exports.string().describe("\u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B"),
24736
+ ordId: external_exports.string().describe("\u8BA2\u5355ID\u3002\u5FC5\u586B"),
24737
+ newSz: external_exports.string().optional().describe("\u65B0\u6570\u91CF"),
24738
+ newPx: external_exports.string().optional().describe("\u65B0\u4EF7\u683C")
24739
+ },
24740
+ async ({ sprdId, ordId, newSz, newPx }) => {
24741
+ if (!auth) return toError(AUTH_REQUIRED);
24742
+ try {
24743
+ const body = { sprdId, ordId };
24744
+ if (newSz) body.newSz = newSz;
24745
+ if (newPx) body.newPx = newPx;
24746
+ const data = await privateApi.amendSpreadOrder(auth, body);
24747
+ return toResult(data);
24748
+ } catch (e) {
24749
+ return toError(e);
24750
+ }
24751
+ }
24752
+ );
24753
+ server.tool(
24754
+ "okx_get_spread_orders_history",
24755
+ "## \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",
24756
+ {
24757
+ sprdId: external_exports.string().optional().describe("\u4EF7\u5DEE\u5408\u7EA6ID"),
24758
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
24759
+ },
24760
+ async ({ sprdId, limit }) => {
24761
+ if (!auth) return toError(AUTH_REQUIRED);
24762
+ try {
24763
+ const data = await privateApi.getSpreadOrdersHistory(auth, sprdId, limit);
24764
+ return toResult(data);
24765
+ } catch (e) {
24766
+ return toError(e);
24767
+ }
24768
+ }
24769
+ );
24770
+ server.tool(
24771
+ "okx_get_spread_fills",
24772
+ "## \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",
24773
+ {
24774
+ sprdId: external_exports.string().optional().describe("\u4EF7\u5DEE\u5408\u7EA6ID"),
24775
+ limit: external_exports.number().int().min(1).max(100).optional().describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4100")
24776
+ },
24777
+ async ({ sprdId, limit }) => {
24778
+ if (!auth) return toError(AUTH_REQUIRED);
24779
+ try {
24780
+ const data = await privateApi.getSpreadFills(auth, sprdId, limit);
24781
+ return toResult(data);
24782
+ } catch (e) {
24783
+ return toError(e);
24784
+ }
24785
+ }
24786
+ );
24787
+ server.tool(
24788
+ "okx_get_spread_books",
24789
+ "## \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",
24790
+ {
24791
+ sprdId: external_exports.string().describe("\u4EF7\u5DEE\u5408\u7EA6ID\u3002\u5FC5\u586B")
24792
+ },
24793
+ async ({ sprdId }) => {
24794
+ try {
24795
+ const data = await publicApi.getSpreadOrderbook(sprdId);
24796
+ const enriched = data.data || data;
24797
+ if (enriched && typeof enriched === "object" && !Array.isArray(enriched)) {
24798
+ return toResult({
24799
+ ...enriched,
24800
+ tsIso: enriched.ts ? new Date(parseInt(enriched.ts)).toISOString() : void 0
24801
+ });
24802
+ }
24803
+ return toResult(data);
24804
+ } catch (e) {
24805
+ return toError(e);
24806
+ }
24807
+ }
24808
+ );
24521
24809
  }
24522
24810
 
24523
24811
  // src/tools/copy.ts
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.25",
4
4
  "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",