hvip-mcp-server 0.2.7 → 0.2.9

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 +109 -15
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -21378,12 +21378,21 @@ function toError(e) {
21378
21378
  function registerMarketTools(server) {
21379
21379
  server.tool(
21380
21380
  "okx_get_ticker",
21381
- "\u83B7\u53D6\u5355\u4E2AOKX\u4EA7\u54C1\u7684\u5B9E\u65F6\u884C\u60C5Ticker\uFF0C\u5305\u542B\u6700\u65B0\u4EF7\u3001\u4E70\u4E00\u4EF7\u3001\u5356\u4E00\u4EF7\u300124h\u6210\u4EA4\u91CF\u7B49\u3002\u9002\u7528\u4E8E\u67E5\u8BE2\u4EFB\u610F\u73B0\u8D27/\u5408\u7EA6\u7684\u5F53\u524D\u4EF7\u683C\u3002",
21382
- { instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3001ETH-USDT-SWAP") },
21381
+ "\u83B7\u53D6\u5355\u4E2A\u6216\u591A\u4E2A\u4EA7\u54C1\u7684\u5B9E\u65F6\u884C\u60C5Ticker\uFF0C\u5305\u542B\u6700\u65B0\u4EF7\u3001\u4E70\u4E00\u4EF7\u3001\u5356\u4E00\u4EF7\u300124h\u6210\u4EA4\u91CF\u7B49\u3002\u652F\u6301\u9017\u53F7\u5206\u9694\u591A\u4EA7\u54C1\u6279\u91CF\u67E5\u8BE2\uFF08\u5982 BTC-USDT,ETH-USDT,SOL-USDT\uFF09\u3002",
21382
+ { instId: external_exports.string().describe("\u4EA7\u54C1ID\uFF0C\u5982 BTC-USDT\u3001ETH-USDT-SWAP\u3002\u652F\u6301\u9017\u53F7\u5206\u9694\u6279\u91CF\u67E5\u8BE2\uFF0C\u5982 BTC-USDT,ETH-USDT,SOL-USDT") },
21383
21383
  async ({ instId }) => {
21384
21384
  try {
21385
- const data = await publicApi.getTicker(instId);
21386
- return toResult(data);
21385
+ const ids = instId.split(",").map((s) => s.trim()).filter(Boolean);
21386
+ const allData = [];
21387
+ for (const id of ids) {
21388
+ const data = await publicApi.getTicker(id);
21389
+ const enriched = data.map((item) => ({
21390
+ ...item,
21391
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21392
+ }));
21393
+ allData.push(...enriched);
21394
+ }
21395
+ return toResult(allData);
21387
21396
  } catch (e) {
21388
21397
  return toError(e);
21389
21398
  }
@@ -21396,7 +21405,10 @@ function registerMarketTools(server) {
21396
21405
  async ({ instType }) => {
21397
21406
  try {
21398
21407
  const data = await publicApi.getTickers(instType);
21399
- const arr = data;
21408
+ const arr = data.map((item) => ({
21409
+ ...item,
21410
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21411
+ }));
21400
21412
  const top = arr.length > 20 ? arr.slice(0, 20) : arr;
21401
21413
  return toResult({ total: arr.length, returned: top.length, data: top });
21402
21414
  } catch (e) {
@@ -21457,7 +21469,11 @@ function registerMarketTools(server) {
21457
21469
  async ({ instId, limit }) => {
21458
21470
  try {
21459
21471
  const data = await publicApi.getTrades(instId, limit);
21460
- return toResult(data);
21472
+ const enriched = data.map((item) => ({
21473
+ ...item,
21474
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21475
+ }));
21476
+ return toResult(enriched);
21461
21477
  } catch (e) {
21462
21478
  return toError(e);
21463
21479
  }
@@ -21502,7 +21518,11 @@ function registerMarketTools(server) {
21502
21518
  async ({ instId, limit }) => {
21503
21519
  try {
21504
21520
  const data = await publicApi.getHistoryTrades(instId, limit);
21505
- return toResult(data);
21521
+ const enriched = data.map((item) => ({
21522
+ ...item,
21523
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21524
+ }));
21525
+ return toResult(enriched);
21506
21526
  } catch (e) {
21507
21527
  return toError(e);
21508
21528
  }
@@ -21530,7 +21550,10 @@ function registerMarketTools(server) {
21530
21550
  async ({ instType }) => {
21531
21551
  try {
21532
21552
  const data = await publicApi.getBlockTickers(instType);
21533
- const arr = data;
21553
+ const arr = data.map((item) => ({
21554
+ ...item,
21555
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21556
+ }));
21534
21557
  const top = arr.length > 20 ? arr.slice(0, 20) : arr;
21535
21558
  return toResult({ total: arr.length, returned: top.length, data: top });
21536
21559
  } catch (e) {
@@ -21567,7 +21590,13 @@ function registerPublicTools(server) {
21567
21590
  async ({ instId }) => {
21568
21591
  try {
21569
21592
  const data = await publicApi.getFundingRate(instId);
21570
- return toResult(data);
21593
+ const enriched = data.map((item) => ({
21594
+ ...item,
21595
+ fundingTimeIso: item.fundingTime ? new Date(parseInt(item.fundingTime)).toISOString() : void 0,
21596
+ nextFundingTimeIso: item.nextFundingTime ? new Date(parseInt(item.nextFundingTime)).toISOString() : void 0,
21597
+ tsIso: item.ts ? new Date(parseInt(item.ts)).toISOString() : void 0
21598
+ }));
21599
+ return toResult(enriched);
21571
21600
  } catch (e) {
21572
21601
  return toError(e);
21573
21602
  }
@@ -21808,6 +21837,32 @@ function registerPublicTools(server) {
21808
21837
  }
21809
21838
  }
21810
21839
  );
21840
+ server.tool(
21841
+ "okx_search_instruments",
21842
+ "## \u529F\u80FD\uFF1A\u6309\u5173\u952E\u8BCD\u641C\u7D22\u53EF\u4EA4\u6613\u4EA7\u54C1\uFF08\u73B0\u8D27/\u5408\u7EA6/\u671F\u6743\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u7528\u6237\u8F93\u5165\u4EA7\u54C1\u540D\u79F0\u6A21\u7CCA\u67E5\u627E instId\u3001\u53D1\u73B0\u65B0\u4EA7\u54C1\u3001\u786E\u8BA4\u67D0\u5E01\u79CD\u6709\u54EA\u4E9B\u53EF\u4EA4\u6613\u4EA7\u54C1\n## \u5173\u952E\u8BCD\uFF1A\u641C\u7D22, \u67E5\u627E\u4EA7\u54C1, search instruments, \u4EA7\u54C1\u641C\u7D22, \u6A21\u7CCA\u67E5\u8BE2, \u5E01\u79CD\u641C\u7D22, find instrument\n## \u53C2\u6570\uFF1A\n## - keyword: \u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u5982 BTC\u3001ETH\u3001SOL\u3002\u5FC5\u586B\uFF0C\u6700\u5C112\u5B57\u7B26\n## - instType: \u4EA7\u54C1\u7C7B\u578B\u7B5B\u9009\u3002\u4E0D\u586B\u5219\u641C\u7D22\u5168\u90E8\u7C7B\u578B\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 \u2014 \u6700\u591A\u8FD4\u56DE top 20 \u5339\u914D\u7ED3\u679C\n## \u5173\u8054\uFF1A\u672C\u5DE5\u5177\u641C\u7D22\u4EA7\u54C1 \u2192 okx_get_ticker \u67E5\u884C\u60C5 \u2192 okx_place_order \u4E0B\u5355",
21843
+ {
21844
+ keyword: external_exports.string().min(2).describe("\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u5982 BTC\u3001ETH\u3001SOL\u3002\u6700\u5C112\u4E2A\u5B57\u7B26"),
21845
+ instType: external_exports.enum(["SPOT", "MARGIN", "SWAP", "FUTURES", "OPTION"]).optional().describe("\u4EA7\u54C1\u7C7B\u578B\u7B5B\u9009\uFF0C\u4E0D\u586B\u641C\u7D22\u5168\u90E8")
21846
+ },
21847
+ async ({ keyword, instType }) => {
21848
+ try {
21849
+ const types = instType ? [instType] : ["SPOT", "SWAP", "FUTURES", "OPTION"];
21850
+ const allResults = [];
21851
+ for (const t of types) {
21852
+ const data = await publicApi.getInstruments(t);
21853
+ const kw = keyword.toUpperCase();
21854
+ const matches = data.filter(
21855
+ (item) => item.instId?.toUpperCase().includes(kw) || item.baseCcy?.toUpperCase().includes(kw) || item.uly?.toUpperCase().includes(kw) || item.quoteCcy?.toUpperCase().includes(kw)
21856
+ );
21857
+ allResults.push(...matches);
21858
+ }
21859
+ const top = allResults.slice(0, 20);
21860
+ return toResult({ keyword, total: allResults.length, returned: top.length, data: top });
21861
+ } catch (e) {
21862
+ return toError(e);
21863
+ }
21864
+ }
21865
+ );
21811
21866
  }
21812
21867
 
21813
21868
  // src/tools/account.ts
@@ -22905,7 +22960,7 @@ function registerOutcomesTools(server) {
22905
22960
  },
22906
22961
  async ({ pageSize, search, includeMarkets }) => {
22907
22962
  const client = getHRailsClient();
22908
- if (!client) return toError("\u672A\u914D\u7F6E HRAILS_API_KEY", "hrails");
22963
+ if (!client) return toError(new Error("\u672A\u914D\u7F6E HRAILS_API_KEY"));
22909
22964
  try {
22910
22965
  const params = {};
22911
22966
  if (pageSize !== void 0) params.pageSize = pageSize;
@@ -22924,7 +22979,7 @@ function registerOutcomesTools(server) {
22924
22979
  { eventId: external_exports.string().describe("\u4E8B\u4EF6ID") },
22925
22980
  async ({ eventId }) => {
22926
22981
  const client = getHRailsClient();
22927
- if (!client) return toError("\u672A\u914D\u7F6E HRAILS_API_KEY", "hrails");
22982
+ if (!client) return toError(new Error("\u672A\u914D\u7F6E HRAILS_API_KEY"));
22928
22983
  try {
22929
22984
  const data = await client.getEvent(eventId);
22930
22985
  return toResult(data);
@@ -22939,7 +22994,7 @@ function registerOutcomesTools(server) {
22939
22994
  { marketId: external_exports.string().describe("\u5E02\u573AID") },
22940
22995
  async ({ marketId }) => {
22941
22996
  const client = getHRailsClient();
22942
- if (!client) return toError("\u672A\u914D\u7F6E HRAILS_API_KEY", "hrails");
22997
+ if (!client) return toError(new Error("\u672A\u914D\u7F6E HRAILS_API_KEY"));
22943
22998
  try {
22944
22999
  const data = await client.getMarket(marketId);
22945
23000
  return toResult(data);
@@ -22957,7 +23012,7 @@ function registerOutcomesTools(server) {
22957
23012
  },
22958
23013
  async ({ marketId, outcome }) => {
22959
23014
  const client = getHRailsClient();
22960
- if (!client) return toError("\u672A\u914D\u7F6E HRAILS_API_KEY", "hrails");
23015
+ if (!client) return toError(new Error("\u672A\u914D\u7F6E HRAILS_API_KEY"));
22961
23016
  try {
22962
23017
  const data = await client.getTicker(marketId, outcome);
22963
23018
  return toResult(data);
@@ -22976,7 +23031,7 @@ function registerOutcomesTools(server) {
22976
23031
  },
22977
23032
  async ({ marketId, outcome, size }) => {
22978
23033
  const client = getHRailsClient();
22979
- if (!client) return toError("\u672A\u914D\u7F6E HRAILS_API_KEY", "hrails");
23034
+ if (!client) return toError(new Error("\u672A\u914D\u7F6E HRAILS_API_KEY"));
22980
23035
  try {
22981
23036
  const data = await client.getOrderbook(marketId, outcome, size);
22982
23037
  return toResult(data);
@@ -22996,7 +23051,7 @@ function registerOutcomesTools(server) {
22996
23051
  },
22997
23052
  async ({ marketId, outcome, bar, limit }) => {
22998
23053
  const client = getHRailsClient();
22999
- if (!client) return toError("\u672A\u914D\u7F6E HRAILS_API_KEY", "hrails");
23054
+ if (!client) return toError(new Error("\u672A\u914D\u7F6E HRAILS_API_KEY"));
23000
23055
  try {
23001
23056
  const data = await client.getCandles(marketId, outcome, bar, limit);
23002
23057
  return toResult(data);
@@ -23005,6 +23060,45 @@ function registerOutcomesTools(server) {
23005
23060
  }
23006
23061
  }
23007
23062
  );
23063
+ server.tool(
23064
+ "outcomes_check_arbitrage",
23065
+ "## \u529F\u80FD\uFF1A\u68C0\u6D4B\u9884\u6D4B\u5E02\u573A\u65E0\u98CE\u9669\u5957\u5229\u673A\u4F1A\uFF08YES+NO\u4E70\u4EF7\u4E4B\u548C < 1.0\uFF09\n## \u573A\u666F\uFF1A\u7528\u4E8E\u81EA\u52A8\u626B\u63CF\u5957\u5229\u7A97\u53E3\u3001\u4F4E\u98CE\u9669\u5957\u5229\u51B3\u7B56\u53C2\u8003\n## \u5173\u952E\u8BCD\uFF1A\u5957\u5229, \u9884\u6D4B\u5E02\u573A\u5957\u5229, arbitrage, \u65E0\u98CE\u9669\u5957\u5229, YES+NO, \u53CC\u8FB9\u5957\u5229\n## \u53C2\u6570\uFF1A\n## - marketId: \u5E02\u573AID\uFF0C\u5FC5\u586B\n## \u9274\u6743\uFF1A\u26A0\uFE0F \u9700\u8981 HRAILS API Key\n## \u98CE\u9669\uFF1AREAD \u2014 \u53EA\u8BFB\u68C0\u6D4B\uFF0CAgent \u53EF\u81EA\u52A8\u8C03\u7528\n## \u8FD4\u56DE\u91CF\uFF1A\u5FAE\u5C0F ~300B\n## \u5173\u8054\uFF1A\u5148\u8C03 outcomes_get_market \u83B7\u53D6\u5E02\u573A \u2192 \u672C\u5DE5\u5177\u68C0\u6D4B\u5957\u5229 \u2192 \u624B\u52A8\u4E0B\u5355",
23066
+ {
23067
+ marketId: external_exports.string().describe("\u5E02\u573AID\uFF0C\u5FC5\u586B")
23068
+ },
23069
+ async ({ marketId }) => {
23070
+ const client = getHRailsClient();
23071
+ if (!client) return toError(new Error("\u672A\u914D\u7F6E HRAILS_API_KEY"));
23072
+ try {
23073
+ const [yesData, noData] = await Promise.all([
23074
+ client.getTicker(marketId, "YES"),
23075
+ client.getTicker(marketId, "NO")
23076
+ ]);
23077
+ const yd = yesData;
23078
+ const nd = noData;
23079
+ const yesAsk = parseFloat(yd?.bestAsk ?? yd?.ask ?? "0");
23080
+ const noAsk = parseFloat(nd?.bestAsk ?? nd?.ask ?? "0");
23081
+ const yesBid = parseFloat(yd?.bestBid ?? yd?.bid ?? "0");
23082
+ const noBid = parseFloat(nd?.bestBid ?? nd?.bid ?? "0");
23083
+ const askSum = yesAsk + noAsk;
23084
+ const bidSum = yesBid + noBid;
23085
+ const hasArbitrage = askSum > 0 && askSum < 1;
23086
+ return toResult({
23087
+ marketId,
23088
+ yesAsk,
23089
+ noAsk,
23090
+ askSum: askSum.toFixed(6),
23091
+ hasArbitrage,
23092
+ arbitrageReturn: hasArbitrage ? ((1 - askSum) / askSum * 100).toFixed(4) + "%" : "\u65E0",
23093
+ tip: hasArbitrage ? `\u540C\u65F6\u4E70\u5165 YES@${yesAsk} + NO@${noAsk}\uFF0C\u6210\u672C=${askSum.toFixed(6)}\uFF0C\u5230\u671F\u4EF7\u503C=1.0\uFF0C\u65E0\u98CE\u9669\u6536\u76CA=${(1 - askSum).toFixed(6)} (${((1 - askSum) / askSum * 100).toFixed(2)}%)` : "\u5F53\u524D\u65E0\u5957\u5229\u673A\u4F1A\uFF08YES\u4E70\u4EF7+NO\u4E70\u4EF7 \u2265 1.0\uFF09",
23094
+ bidSum: bidSum.toFixed(6),
23095
+ spread: (askSum - bidSum).toFixed(6)
23096
+ });
23097
+ } catch (e) {
23098
+ return toError(e);
23099
+ }
23100
+ }
23101
+ );
23008
23102
  }
23009
23103
 
23010
23104
  // src/tools/bot.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hvip-mcp-server",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "description": "OKX ecosystem MCP server - full API coverage for AI agents",
5
5
  "homepage": "https://hvip.one",
6
6
  "license": "MIT",