hvip-mcp 0.1.0
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.
- package/README.md +3 -0
- package/dist/adapters/hrails.d.ts +19 -0
- package/dist/adapters/hrails.d.ts.map +1 -0
- package/dist/adapters/hrails.js +44 -0
- package/dist/adapters/hrails.js.map +1 -0
- package/dist/adapters/okx.d.ts +47 -0
- package/dist/adapters/okx.d.ts.map +1 -0
- package/dist/adapters/okx.js +92 -0
- package/dist/adapters/okx.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/account.d.ts +4 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +56 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/algo.d.ts +4 -0
- package/dist/tools/algo.d.ts.map +1 -0
- package/dist/tools/algo.js +60 -0
- package/dist/tools/algo.js.map +1 -0
- package/dist/tools/finance.d.ts +4 -0
- package/dist/tools/finance.d.ts.map +1 -0
- package/dist/tools/finance.js +45 -0
- package/dist/tools/finance.js.map +1 -0
- package/dist/tools/funding.d.ts +4 -0
- package/dist/tools/funding.d.ts.map +1 -0
- package/dist/tools/funding.js +33 -0
- package/dist/tools/funding.js.map +1 -0
- package/dist/tools/market.d.ts +3 -0
- package/dist/tools/market.d.ts.map +1 -0
- package/dist/tools/market.js +61 -0
- package/dist/tools/market.js.map +1 -0
- package/dist/tools/outcomes.d.ts +3 -0
- package/dist/tools/outcomes.d.ts.map +1 -0
- package/dist/tools/outcomes.js +100 -0
- package/dist/tools/outcomes.js.map +1 -0
- package/dist/tools/public.d.ts +3 -0
- package/dist/tools/public.d.ts.map +1 -0
- package/dist/tools/public.js +69 -0
- package/dist/tools/public.js.map +1 -0
- package/dist/tools/shared.d.ts +19 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +48 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/stats.d.ts +3 -0
- package/dist/tools/stats.d.ts.map +1 -0
- package/dist/tools/stats.js +55 -0
- package/dist/tools/stats.js.map +1 -0
- package/dist/tools/subaccount.d.ts +4 -0
- package/dist/tools/subaccount.d.ts.map +1 -0
- package/dist/tools/subaccount.js +55 -0
- package/dist/tools/subaccount.js.map +1 -0
- package/dist/tools/trading.d.ts +4 -0
- package/dist/tools/trading.d.ts.map +1 -0
- package/dist/tools/trading.js +62 -0
- package/dist/tools/trading.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { publicApi } from "../adapters/okx.js";
|
|
3
|
+
import { toResult, toError } from "./shared.js";
|
|
4
|
+
export function registerMarketTools(server) {
|
|
5
|
+
server.tool("okx_get_ticker", "获取单个OKX产品的实时行情Ticker,包含最新价、买一价、卖一价、24h成交量等。适用于查询任意现货/合约的当前价格。", { instId: z.string().describe("产品ID,如 BTC-USDT、ETH-USDT-SWAP") }, async ({ instId }) => {
|
|
6
|
+
try {
|
|
7
|
+
const data = await publicApi.getTicker(instId);
|
|
8
|
+
return toResult(data);
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
return toError(e);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
server.tool("okx_get_tickers", "获取某类产品的全量行情列表。用于批量扫描市场、寻找异常价格或高成交量品种。", { instType: z.enum(["SPOT", "SWAP", "FUTURES", "OPTION"]).describe("产品类型") }, async ({ instType }) => {
|
|
15
|
+
try {
|
|
16
|
+
const data = await publicApi.getTickers(instType);
|
|
17
|
+
return toResult(data);
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
return toError(e);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
server.tool("okx_get_orderbook", "获取产品的订单簿深度,含买卖双方挂单价格和数量。用于分析流动性、判断支撑/压力位。", {
|
|
24
|
+
instId: z.string().describe("产品ID"),
|
|
25
|
+
sz: z.number().int().min(1).max(400).optional().describe("深度档位,默认20,最大400"),
|
|
26
|
+
}, async ({ instId, sz }) => {
|
|
27
|
+
try {
|
|
28
|
+
const data = await publicApi.getOrderbook(instId, sz);
|
|
29
|
+
return toResult(data);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
return toError(e);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
server.tool("okx_get_candles", "获取产品K线数据(OHLCV)。用于技术分析、趋势判断、回测数据准备。", {
|
|
36
|
+
instId: z.string().describe("产品ID"),
|
|
37
|
+
bar: z.enum(["1m", "3m", "5m", "15m", "30m", "1H", "4H", "1D", "1W"]).optional().describe("K线周期,默认1H"),
|
|
38
|
+
limit: z.number().int().min(1).max(300).optional().describe("返回条数,默认100"),
|
|
39
|
+
}, async ({ instId, bar, limit }) => {
|
|
40
|
+
try {
|
|
41
|
+
const data = await publicApi.getCandles(instId, bar, limit);
|
|
42
|
+
return toResult(data);
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
return toError(e);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
server.tool("okx_get_trades", "获取产品最新成交记录。用于分析短期买卖压力、判断主动买卖方向。", {
|
|
49
|
+
instId: z.string().describe("产品ID"),
|
|
50
|
+
limit: z.number().int().min(1).max(100).optional().describe("返回条数,默认20"),
|
|
51
|
+
}, async ({ instId, limit }) => {
|
|
52
|
+
try {
|
|
53
|
+
const data = await publicApi.getTrades(instId, limit);
|
|
54
|
+
return toResult(data);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
return toError(e);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=market.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/tools/market.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcomes.d.ts","sourceRoot":"","sources":["../../src/tools/outcomes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwG7D"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getHRailsClient, toResult, toError } from "./shared.js";
|
|
3
|
+
export function registerOutcomesTools(server) {
|
|
4
|
+
server.tool("outcomes_list_events", "列出OKX预测市场所有事件(世界杯、选举等)。每个事件包含标题、状态、总成交量和市场数量。", {
|
|
5
|
+
pageSize: z.number().int().min(1).max(100).optional().describe("每页数量,默认20"),
|
|
6
|
+
search: z.string().optional().describe("关键词搜索事件标题"),
|
|
7
|
+
includeMarkets: z.boolean().optional().describe("是否附带每个事件的市场列表"),
|
|
8
|
+
}, async ({ pageSize, search, includeMarkets }) => {
|
|
9
|
+
const client = getHRailsClient();
|
|
10
|
+
if (!client)
|
|
11
|
+
return toError("未配置 HRAILS_API_KEY", "hrails");
|
|
12
|
+
try {
|
|
13
|
+
const params = {};
|
|
14
|
+
if (pageSize !== undefined)
|
|
15
|
+
params.pageSize = pageSize;
|
|
16
|
+
if (search !== undefined)
|
|
17
|
+
params.search = search;
|
|
18
|
+
if (includeMarkets !== undefined)
|
|
19
|
+
params.includeMarkets = includeMarkets;
|
|
20
|
+
const data = await client.listEvents(params);
|
|
21
|
+
return toResult(data);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
return toError(e);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
server.tool("outcomes_get_event", "获取单个预测市场事件的完整信息,含所有市场列表及当前概率。", { eventId: z.string().describe("事件ID") }, async ({ eventId }) => {
|
|
28
|
+
const client = getHRailsClient();
|
|
29
|
+
if (!client)
|
|
30
|
+
return toError("未配置 HRAILS_API_KEY", "hrails");
|
|
31
|
+
try {
|
|
32
|
+
const data = await client.getEvent(eventId);
|
|
33
|
+
return toResult(data);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
return toError(e);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server.tool("outcomes_get_market", "获取单个预测市场详情,含问题描述、当前概率、成交量和结束时间。", { marketId: z.string().describe("市场ID") }, async ({ marketId }) => {
|
|
40
|
+
const client = getHRailsClient();
|
|
41
|
+
if (!client)
|
|
42
|
+
return toError("未配置 HRAILS_API_KEY", "hrails");
|
|
43
|
+
try {
|
|
44
|
+
const data = await client.getMarket(marketId);
|
|
45
|
+
return toResult(data);
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
return toError(e);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
server.tool("outcomes_get_ticker", "获取预测市场单边(YES或NO)的实时报价,含最优买卖价。YES价格代表该结果发生的概率。", {
|
|
52
|
+
marketId: z.string().describe("市场ID"),
|
|
53
|
+
outcome: z.enum(["YES", "NO"]).describe("结果方向"),
|
|
54
|
+
}, async ({ marketId, outcome }) => {
|
|
55
|
+
const client = getHRailsClient();
|
|
56
|
+
if (!client)
|
|
57
|
+
return toError("未配置 HRAILS_API_KEY", "hrails");
|
|
58
|
+
try {
|
|
59
|
+
const data = await client.getTicker(marketId, outcome);
|
|
60
|
+
return toResult(data);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
return toError(e);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
server.tool("outcomes_get_orderbook", "获取预测市场订单簿深度。YES_ask + NO_ask < 1.0 时存在无风险套利机会(买双边)。", {
|
|
67
|
+
marketId: z.string().describe("市场ID"),
|
|
68
|
+
outcome: z.enum(["YES", "NO"]).describe("结果方向"),
|
|
69
|
+
size: z.number().int().min(1).max(50).optional().describe("深度档位,默认20"),
|
|
70
|
+
}, async ({ marketId, outcome, size }) => {
|
|
71
|
+
const client = getHRailsClient();
|
|
72
|
+
if (!client)
|
|
73
|
+
return toError("未配置 HRAILS_API_KEY", "hrails");
|
|
74
|
+
try {
|
|
75
|
+
const data = await client.getOrderbook(marketId, outcome, size);
|
|
76
|
+
return toResult(data);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
return toError(e);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
server.tool("outcomes_get_candles", "获取预测市场K线数据,用于分析概率走势和交易量变化。", {
|
|
83
|
+
marketId: z.string().describe("市场ID"),
|
|
84
|
+
outcome: z.enum(["YES", "NO"]).describe("结果方向"),
|
|
85
|
+
bar: z.enum(["1m", "5m", "15m", "1H", "4H", "1D"]).optional().describe("K线周期,默认1H"),
|
|
86
|
+
limit: z.number().int().min(1).max(200).optional().describe("返回条数,默认48"),
|
|
87
|
+
}, async ({ marketId, outcome, bar, limit }) => {
|
|
88
|
+
const client = getHRailsClient();
|
|
89
|
+
if (!client)
|
|
90
|
+
return toError("未配置 HRAILS_API_KEY", "hrails");
|
|
91
|
+
try {
|
|
92
|
+
const data = await client.getCandles(marketId, outcome, bar, limit);
|
|
93
|
+
return toResult(data);
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
return toError(e);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=outcomes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcomes.js","sourceRoot":"","sources":["../../src/tools/outcomes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/tools/public.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAIxE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiF3D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { publicApi } from "../adapters/okx.js";
|
|
3
|
+
import { toResult, toError } from "./shared.js";
|
|
4
|
+
export function registerPublicTools(server) {
|
|
5
|
+
server.tool("okx_get_instruments", "获取OKX可交易产品列表,含产品规格、最小下单量、手续费等级等信息。用于确认某产品是否可交易、获取精度参数。", {
|
|
6
|
+
instType: z.enum(["SPOT", "MARGIN", "SWAP", "FUTURES", "OPTION"]).describe("产品类型"),
|
|
7
|
+
instId: z.string().optional().describe("指定产品ID,不填则返回全量"),
|
|
8
|
+
}, async ({ instType, instId }) => {
|
|
9
|
+
try {
|
|
10
|
+
const data = await publicApi.getInstruments(instType, instId);
|
|
11
|
+
return toResult(data);
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
return toError(e);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
server.tool("okx_get_funding_rate", "获取永续合约当前及预测资金费率。资金费率是永续合约多空博弈的核心指标,费率极端时往往是均值回归机会。", { instId: z.string().describe("永续合约产品ID,如 BTC-USDT-SWAP") }, async ({ instId }) => {
|
|
18
|
+
try {
|
|
19
|
+
const data = await publicApi.getFundingRate(instId);
|
|
20
|
+
return toResult(data);
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
return toError(e);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
server.tool("okx_get_mark_price", "获取标记价格。标记价格用于计算浮动盈亏和强平价格,与指数价格偏差过大时存在套利空间。", {
|
|
27
|
+
instType: z.enum(["MARGIN", "SWAP", "FUTURES", "OPTION"]).describe("产品类型"),
|
|
28
|
+
instId: z.string().optional().describe("产品ID,不填则返回该类型全量"),
|
|
29
|
+
}, async ({ instType, instId }) => {
|
|
30
|
+
try {
|
|
31
|
+
const data = await publicApi.getMarkPrice(instType, instId);
|
|
32
|
+
return toResult(data);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
return toError(e);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
server.tool("okx_get_index_price", "获取指数价格(多交易所加权均价)。用于判断现货市场整体价格基准,与标记价格对比可发现偏差。", { instId: z.string().describe("指数产品ID,如 BTC-USDT") }, async ({ instId }) => {
|
|
39
|
+
try {
|
|
40
|
+
const data = await publicApi.getIndexPrice(instId);
|
|
41
|
+
return toResult(data);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
return toError(e);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
server.tool("okx_get_open_interest", "获取合约持仓量。持仓量快速增加通常意味着新资金入场,结合价格方向可判断趋势强度。", {
|
|
48
|
+
instType: z.enum(["SWAP", "FUTURES", "OPTION"]).describe("产品类型"),
|
|
49
|
+
instId: z.string().optional().describe("产品ID,不填则返回全量"),
|
|
50
|
+
}, async ({ instType, instId }) => {
|
|
51
|
+
try {
|
|
52
|
+
const data = await publicApi.getOpenInterest(instType, instId);
|
|
53
|
+
return toResult(data);
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
return toError(e);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
server.tool("okx_get_system_time", "获取OKX服务器当前时间戳。用于校准本地时间偏差,确保签名请求的时间戳在有效范围内(±30秒)。", {}, async () => {
|
|
60
|
+
try {
|
|
61
|
+
const data = await publicApi.getSystemTime();
|
|
62
|
+
return toResult(data);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return toError(e);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=public.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/tools/public.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Auth } from "../adapters/okx.js";
|
|
2
|
+
import { type HRailsClient } from "../adapters/hrails.js";
|
|
3
|
+
export declare function getAuth(): Auth | null;
|
|
4
|
+
export declare function getHRailsClient(): HRailsClient | null;
|
|
5
|
+
export declare const AUTH_REQUIRED = "\u6B64\u529F\u80FD\u9700\u8981\u7ED1\u5B9A OKX API Key\u3002\n\n\u8BF7\u5728 Claude Desktop \u914D\u7F6E\u6587\u4EF6\u4E2D\u6DFB\u52A0\u4EE5\u4E0B\u5185\u5BB9\uFF08hvip \u4E0D\u5B58\u50A8\u60A8\u7684\u5BC6\u94A5\uFF0C\u5BC6\u94A5\u4EC5\u4FDD\u5B58\u5728\u60A8\u672C\u5730\uFF09\uFF1A\n\n{\n \"mcpServers\": {\n \"hvip\": {\n \"command\": \"npx\",\n \"args\": [\"hvip\"],\n \"env\": {\n \"OKX_API_KEY\": \"\u4F60\u7684 API Key\",\n \"OKX_SECRET_KEY\": \"\u4F60\u7684 Secret Key\",\n \"OKX_PASSPHRASE\": \"\u4F60\u7684 Passphrase\"\n }\n }\n }\n}\n\nAPI Key \u5728 OKX \u5B98\u7F51\u300C\u4E2A\u4EBA\u4E2D\u5FC3 \u2192 API\u300D\u4E2D\u521B\u5EFA\uFF0C\u53EA\u9700\u5F00\u901A\u300C\u8BFB\u53D6\u300D\u6743\u9650\u5373\u53EF\u67E5\u8BE2\u8D26\u6237\uFF0C\u4EA4\u6613\u529F\u80FD\u8FD8\u9700\u5F00\u901A\u300C\u4EA4\u6613\u300D\u6743\u9650\u3002";
|
|
6
|
+
export declare function toResult(data: unknown): {
|
|
7
|
+
content: [{
|
|
8
|
+
type: "text";
|
|
9
|
+
text: string;
|
|
10
|
+
}];
|
|
11
|
+
};
|
|
12
|
+
export declare function toError(e: unknown, _source?: string): {
|
|
13
|
+
content: [{
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}];
|
|
17
|
+
isError: true;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAE7E,wBAAgB,OAAO,IAAI,IAAI,GAAG,IAAI,CAWrC;AAED,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAKrD;AAED,eAAO,MAAM,aAAa,g4BAkBuC,CAAA;AAEjE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAErF;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAGlH"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createHRailsClient } from "../adapters/hrails.js";
|
|
2
|
+
export function getAuth() {
|
|
3
|
+
const apiKey = process.env["OKX_API_KEY"];
|
|
4
|
+
const secret = process.env["OKX_SECRET_KEY"];
|
|
5
|
+
const passphrase = process.env["OKX_PASSPHRASE"];
|
|
6
|
+
if (!apiKey || !secret || !passphrase)
|
|
7
|
+
return null;
|
|
8
|
+
return {
|
|
9
|
+
apiKey,
|
|
10
|
+
secret,
|
|
11
|
+
passphrase,
|
|
12
|
+
isDemo: process.env["OKX_IS_DEMO"] === "true",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function getHRailsClient() {
|
|
16
|
+
const apiKey = process.env["HRAILS_API_KEY"];
|
|
17
|
+
if (!apiKey)
|
|
18
|
+
return null;
|
|
19
|
+
const base = process.env["HRAILS_BASE_URL"];
|
|
20
|
+
return createHRailsClient(apiKey, base);
|
|
21
|
+
}
|
|
22
|
+
export const AUTH_REQUIRED = `此功能需要绑定 OKX API Key。
|
|
23
|
+
|
|
24
|
+
请在 Claude Desktop 配置文件中添加以下内容(hvip 不存储您的密钥,密钥仅保存在您本地):
|
|
25
|
+
|
|
26
|
+
{
|
|
27
|
+
"mcpServers": {
|
|
28
|
+
"hvip": {
|
|
29
|
+
"command": "npx",
|
|
30
|
+
"args": ["hvip"],
|
|
31
|
+
"env": {
|
|
32
|
+
"OKX_API_KEY": "你的 API Key",
|
|
33
|
+
"OKX_SECRET_KEY": "你的 Secret Key",
|
|
34
|
+
"OKX_PASSPHRASE": "你的 Passphrase"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
API Key 在 OKX 官网「个人中心 → API」中创建,只需开通「读取」权限即可查询账户,交易功能还需开通「交易」权限。`;
|
|
41
|
+
export function toResult(data) {
|
|
42
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
43
|
+
}
|
|
44
|
+
export function toError(e, _source) {
|
|
45
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
46
|
+
return { content: [{ type: "text", text: msg }], isError: true };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,uBAAuB,CAAA;AAE7E,MAAM,UAAU,OAAO;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAChD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAA;IAClD,OAAO;QACL,MAAM;QACN,MAAM;QACN,UAAU;QACV,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,MAAM;KAC9C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAC3C,OAAO,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;iEAkBoC,CAAA;AAEjE,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAU,EAAE,OAAgB;IAClD,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAClE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/tools/stats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAIxE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6D1D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { publicApi } from "../adapters/okx.js";
|
|
3
|
+
import { toResult, toError } from "./shared.js";
|
|
4
|
+
export function registerStatsTools(server) {
|
|
5
|
+
server.tool("okx_get_long_short_ratio", "获取合约多空账户比例。比值 > 1 说明多头账户更多,极端值(> 3 或 < 0.3)往往是市场情绪过热的信号,可能即将反转。", {
|
|
6
|
+
ccy: z.string().describe("币种,如 BTC、ETH"),
|
|
7
|
+
begin: z.string().optional().describe("开始时间戳(毫秒)"),
|
|
8
|
+
end: z.string().optional().describe("结束时间戳(毫秒)"),
|
|
9
|
+
}, async ({ ccy, begin, end }) => {
|
|
10
|
+
try {
|
|
11
|
+
const data = await publicApi.getLongShortRatio(ccy, begin, end);
|
|
12
|
+
return toResult(data);
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
return toError(e);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
server.tool("okx_get_taker_volume", "获取主动买卖量统计。主动买量持续大于主动卖量说明市场情绪偏多;用于判断资金流向和趋势强度。", {
|
|
19
|
+
ccy: z.string().describe("币种,如 BTC"),
|
|
20
|
+
instType: z.enum(["SPOT", "CONTRACTS"]).describe("产品类型"),
|
|
21
|
+
begin: z.string().optional().describe("开始时间戳(毫秒)"),
|
|
22
|
+
end: z.string().optional().describe("结束时间戳(毫秒)"),
|
|
23
|
+
}, async ({ ccy, instType, begin, end }) => {
|
|
24
|
+
try {
|
|
25
|
+
const data = await publicApi.getTakerVolume(ccy, instType, begin, end);
|
|
26
|
+
return toResult(data);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
return toError(e);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
server.tool("okx_get_open_interest_volume", "获取持仓量与成交量统计。持仓量/成交量比值上升说明投机性增加;结合价格方向可判断趋势是否可持续。", {
|
|
33
|
+
ccy: z.string().describe("币种,如 BTC"),
|
|
34
|
+
begin: z.string().optional().describe("开始时间戳(毫秒)"),
|
|
35
|
+
end: z.string().optional().describe("结束时间戳(毫秒)"),
|
|
36
|
+
}, async ({ ccy, begin, end }) => {
|
|
37
|
+
try {
|
|
38
|
+
const data = await publicApi.getOpenInterestVolume(ccy, begin, end);
|
|
39
|
+
return toResult(data);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
return toError(e);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
server.tool("okx_get_margin_lending_ratio", "获取杠杆借币利率及借币量。借币量快速增加说明投机性杠杆在积累,是短期行情加速的先行指标。", { ccy: z.string().describe("币种,如 BTC、USDT") }, async ({ ccy }) => {
|
|
46
|
+
try {
|
|
47
|
+
const data = await publicApi.getLendingRateHistory(ccy);
|
|
48
|
+
return toResult(data);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
return toError(e);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/tools/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subaccount.d.ts","sourceRoot":"","sources":["../../src/tools/subaccount.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAG1D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAqDlF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { privateApi } from "../adapters/okx.js";
|
|
3
|
+
import { toResult, toError, AUTH_REQUIRED } from "./shared.js";
|
|
4
|
+
export function registerSubAccountTools(server, auth) {
|
|
5
|
+
server.tool("okx_list_subaccounts", "获取所有子账户列表及其状态。用于多策略账户管理,查看各子账户的启用状态。⚠️ 需要主账户API Key鉴权。", {
|
|
6
|
+
enable: z.boolean().optional().describe("筛选启用状态,不填则返回全部"),
|
|
7
|
+
}, async ({ enable }) => {
|
|
8
|
+
if (!auth)
|
|
9
|
+
return toError(AUTH_REQUIRED);
|
|
10
|
+
try {
|
|
11
|
+
const data = await privateApi.listSubAccounts(auth, enable);
|
|
12
|
+
return toResult(data);
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
return toError(e);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
server.tool("okx_get_subaccount_balance", "查询指定子账户的交易账户余额。用于监控各策略账户的资金状况。⚠️ 需要主账户API Key鉴权。", {
|
|
19
|
+
subAcct: z.string().describe("子账户名称"),
|
|
20
|
+
}, async ({ subAcct }) => {
|
|
21
|
+
if (!auth)
|
|
22
|
+
return toError(AUTH_REQUIRED);
|
|
23
|
+
try {
|
|
24
|
+
const data = await privateApi.getSubAccountBalance(auth, subAcct);
|
|
25
|
+
return toResult(data);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
return toError(e);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
server.tool("okx_transfer_subaccount", "主子账户间资金划转。⚠️ 此操作会移动真实资金,调用前必须向用户确认划转方向和金额。需要主账户API Key鉴权。", {
|
|
32
|
+
ccy: z.string().describe("划转币种"),
|
|
33
|
+
amt: z.string().describe("划转数量"),
|
|
34
|
+
from: z.enum(["6", "18"]).describe("转出账户类型:6=资金账户,18=交易账户"),
|
|
35
|
+
to: z.enum(["6", "18"]).describe("转入账户类型:6=资金账户,18=交易账户"),
|
|
36
|
+
fromSubAccount: z.string().optional().describe("转出子账户名,不填则为主账户"),
|
|
37
|
+
toSubAccount: z.string().optional().describe("转入子账户名,不填则为主账户"),
|
|
38
|
+
}, async ({ ccy, amt, from, to, fromSubAccount, toSubAccount }) => {
|
|
39
|
+
if (!auth)
|
|
40
|
+
return toError(AUTH_REQUIRED);
|
|
41
|
+
try {
|
|
42
|
+
const body = { ccy, amt, from, to };
|
|
43
|
+
if (fromSubAccount)
|
|
44
|
+
body["fromSubAccount"] = fromSubAccount;
|
|
45
|
+
if (toSubAccount)
|
|
46
|
+
body["toSubAccount"] = toSubAccount;
|
|
47
|
+
const data = await privateApi.transferSubAccount(auth, body);
|
|
48
|
+
return toResult(data);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
return toError(e);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=subaccount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subaccount.js","sourceRoot":"","sources":["../../src/tools/subaccount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trading.d.ts","sourceRoot":"","sources":["../../src/tools/trading.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAG1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CA2D/E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { privateApi } from "../adapters/okx.js";
|
|
3
|
+
import { toResult, toError, AUTH_REQUIRED } from "./shared.js";
|
|
4
|
+
export function registerTradingTools(server, auth) {
|
|
5
|
+
server.tool("okx_place_order", "在OKX下单。⚠️ 此操作会产生真实订单,调用前必须向用户明确确认产品、方向、数量和价格。需要API Key鉴权。", {
|
|
6
|
+
instId: z.string().describe("产品ID,如 BTC-USDT"),
|
|
7
|
+
tdMode: z.enum(["cash", "isolated", "cross"]).describe("交易模式:cash=现货,isolated=逐仓,cross=全仓"),
|
|
8
|
+
side: z.enum(["buy", "sell"]).describe("买卖方向"),
|
|
9
|
+
ordType: z.enum(["market", "limit", "post_only", "fok", "ioc"]).describe("订单类型"),
|
|
10
|
+
sz: z.string().describe("委托数量"),
|
|
11
|
+
px: z.string().optional().describe("委托价格(限价单必填)"),
|
|
12
|
+
}, async ({ instId, tdMode, side, ordType, sz, px }) => {
|
|
13
|
+
if (!auth)
|
|
14
|
+
return toError(AUTH_REQUIRED);
|
|
15
|
+
try {
|
|
16
|
+
const body = { instId, tdMode, side, ordType, sz };
|
|
17
|
+
if (px)
|
|
18
|
+
body["px"] = px;
|
|
19
|
+
const data = await privateApi.placeOrder(auth, body);
|
|
20
|
+
return toResult(data);
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
return toError(e);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
server.tool("okx_cancel_order", "撤销指定订单。⚠️ 需要API Key鉴权。", {
|
|
27
|
+
instId: z.string().describe("产品ID"),
|
|
28
|
+
ordId: z.string().describe("订单ID"),
|
|
29
|
+
}, async ({ instId, ordId }) => {
|
|
30
|
+
if (!auth)
|
|
31
|
+
return toError(AUTH_REQUIRED);
|
|
32
|
+
try {
|
|
33
|
+
const data = await privateApi.cancelOrder(auth, instId, ordId);
|
|
34
|
+
return toResult(data);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
return toError(e);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
server.tool("okx_amend_order", "修改未成交订单的价格或数量。⚠️ 需要API Key鉴权。", {
|
|
41
|
+
instId: z.string().describe("产品ID"),
|
|
42
|
+
ordId: z.string().describe("订单ID"),
|
|
43
|
+
newSz: z.string().optional().describe("新委托数量"),
|
|
44
|
+
newPx: z.string().optional().describe("新委托价格"),
|
|
45
|
+
}, async ({ instId, ordId, newSz, newPx }) => {
|
|
46
|
+
if (!auth)
|
|
47
|
+
return toError(AUTH_REQUIRED);
|
|
48
|
+
try {
|
|
49
|
+
const body = { instId, ordId };
|
|
50
|
+
if (newSz)
|
|
51
|
+
body["newSz"] = newSz;
|
|
52
|
+
if (newPx)
|
|
53
|
+
body["newPx"] = newPx;
|
|
54
|
+
const data = await privateApi.amendOrder(auth, body);
|
|
55
|
+
return toResult(data);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
return toError(e);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=trading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trading.js","sourceRoot":"","sources":["../../src/tools/trading.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ApiResponse<T = unknown> {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
source: string;
|
|
4
|
+
data: T | null;
|
|
5
|
+
meta: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export declare function ok<T>(data: T, source: string, meta?: Record<string, unknown>): ApiResponse<T>;
|
|
8
|
+
export declare function err(message: string, source: string, code?: string): ApiResponse<null>;
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,wBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAEjG;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAEjF"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,EAAE,CAAI,IAAO,EAAE,MAAc,EAAE,OAAgC,EAAE;IAC/E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,MAAc,EAAE,IAAI,GAAG,EAAE;IAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAA;AAC1E,CAAC"}
|