hvip-mcp-server 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +165 -165
  2. package/dist/hub-server.js +61 -12
  3. package/dist/index.js +493 -38905
  4. package/package.json +76 -76
package/README.md CHANGED
@@ -1,165 +1,165 @@
1
- # hvip MCP Server
2
-
3
- > OKX 全部能力接入 AI —— 365 个 MCP 工具,覆盖 97.7% OKX REST API
4
-
5
- [![npm version](https://img.shields.io/npm/v/hvip-mcp-server)](https://www.npmjs.com/package/hvip-mcp-server)
6
- [![License](https://img.shields.io/npm/l/hvip-mcp-server)](https://github.com/okx-wallet-H/hvip-mcp/blob/master/LICENSE)
7
-
8
- 📦 [github.com/okx-wallet-H/hvip-mcp](https://github.com/okx-wallet-H/hvip-mcp) · 🐛 [提交反馈](https://github.com/okx-wallet-H/hvip-mcp/issues/new)
9
-
10
- ---
11
-
12
- ## 🚀 一行安装
13
-
14
- ```bash
15
- npx -y hvip-mcp-server
16
- ```
17
-
18
- 就这么简单。MCP 客户端(Claude Desktop / Claude Code / Cursor / VS Code)会自动接管。
19
-
20
- ---
21
-
22
- ## 配置到 AI 客户端
23
-
24
- **这不是命令行工具**——hvip-mcp 是 MCP (Model Context Protocol) 服务器,由 AI 客户端在后台自动运行。你只需要在配置文件中加一行 JSON,AI 自己会启动它。
25
-
26
- ### Claude Desktop
27
-
28
- Claude Desktop → 设置 → Developer → Edit Config:
29
-
30
- ```json
31
- {
32
- "mcpServers": {
33
- "hvip": {
34
- "command": "npx",
35
- "args": ["-y", "hvip-mcp-server"]
36
- }
37
- }
38
- }
39
- ```
40
-
41
- ### Claude Code
42
-
43
- 在项目根目录或全局 `.claude/settings.json`:
44
-
45
- ```json
46
- {
47
- "mcpServers": {
48
- "hvip": {
49
- "command": "npx",
50
- "args": ["-y", "hvip-mcp-server@latest"]
51
- }
52
- }
53
- }
54
- ```
55
-
56
- ### VS Code / Cline / 其他 MCP 客户端
57
-
58
- 在 MCP 配置中添加同样的 JSON。
59
-
60
- > **配置完需要完全退出并重启客户端**,重开后 AI 自动连接 hvip。
61
-
62
- ### 需要 API Key?
63
-
64
- 行情、技术指标、市场扫描等公开数据无需 Key。查看账户、下单交易需要 OKX API Key:
65
-
66
- ```json
67
- {
68
- "mcpServers": {
69
- "hvip": {
70
- "command": "npx",
71
- "args": ["-y", "hvip-mcp-server"],
72
- "env": {
73
- "OKX_API_KEY": "<你的 API Key>",
74
- "OKX_SECRET_KEY": "<你的 Secret Key>",
75
- "OKX_PASSPHRASE": "<你的 Passphrase>"
76
- }
77
- }
78
- }
79
- }
80
- ```
81
-
82
- > API Key 在 [OKX 官网](https://www.okx.com) → 个人中心 → API 中创建,开通「读取」权限即可查账户,「交易」权限可下单。
83
-
84
- ---
85
-
86
- ## 工作流
87
-
88
- AI 连接 hvip 后自动执行:
89
-
90
- ```
91
- 1. tools/list → 365 个工具,但只有 agent_catalog 带完整描述
92
- 2. agent_catalog → 15 个域的地图(7 公开 + 8 需 Key),按需直达
93
- 3. 用户说 "BTC 怎么样" → AI 调 okx_quick_market
94
- 4. 用户说 "买 0.1 BTC" → AI 先预检再下单
95
- ```
96
-
97
- **无需手动操作,全程 AI 自己来。**
98
-
99
- ---
100
-
101
- ## 工具覆盖
102
-
103
- | 模块 | 工具数 | 说明 |
104
- |------|--------|------|
105
- | 🔹 账户 | 40+ | 余额/持仓/配置/杠杆/估值 |
106
- | 🔹 行情 | 17 | Ticker/K线/深度/成交 |
107
- | 🔹 交易 | 27 | 下单/撤单/改单/批量/平仓 |
108
- | 🔹 公共数据 | 34 | 产品规格/资金费率/标记价 |
109
- | 🔹 资金 | 18 | 划转/提现/充值/兑换 |
110
- | 🔹 策略委托 | 6 | 止损止盈/冰山/移动止盈 |
111
- | 🔹 网格 | 13 | 现货网格/合约网格/定投 |
112
- | 🔹 跟单 | 23 | 交易员/跟单/带单 |
113
- | 🔹 信号 | 10 | 信号订阅/历史信号 |
114
- | 🔹 价差 | 16 | 跨品种/跨期价差 |
115
- | 🔹 RFQ | 12 | 大宗询价/报价/成交 |
116
- | 🔹 金融 | 27 | 赚币/质押/借贷 |
117
- | 🔹 预测市场 | 36 | 事件合约/预测交易 |
118
- | 🔹 技术指标 | 2 | RSI/MACD/布林带等 17 种 |
119
- | 🔹 聪明钱 | 3 | 交易员排行榜/市场情绪 |
120
- | 🔹 WebSocket | 5 | 55 频道实时推送 |
121
- | 🔹 代码图谱 | 2 | 函数调用链/符号搜索 |
122
- | 🔹 系统工具 | 19 | 导航/偏好/反馈/Agent 协作 |
123
-
124
- **365 个 MCP 工具 · 覆盖 97.7% OKX REST API**
125
-
126
- ---
127
-
128
- ## 本地开发
129
-
130
- ```bash
131
- git clone https://github.com/okx-wallet-H/hvip-mcp.git
132
- cd hvip-mcp
133
- npm install
134
- npm run build
135
- npm start
136
- ```
137
-
138
- ---
139
-
140
- ## 架构
141
-
142
- ```
143
- 原子层 (350 工具) → [L:READ] 权限标记 → AI Agent 按需调用
144
-
145
- Skill 组合层 (13 个) → 串联多工具,一次完成复杂任务
146
-
147
- agent_catalog → 15 域地图 → 按意图路由 → 直达目标工具
148
- ```
149
-
150
- ---
151
-
152
- ## 贡献
153
-
154
- 1. 阅读 [`CLAUDE.md`](./CLAUDE.md) 了解项目规范
155
- 2. 阅读 [`CONTRIBUTING.md`](./CONTRIBUTING.md) 了解提交流程
156
- 3. Fork → 创建分支 → 开发 → `npm run build` → 提 PR
157
-
158
- ---
159
-
160
- ## 文档
161
-
162
- - [`CLAUDE.md`](./CLAUDE.md) — AI Agent 项目指南
163
- - [`CONTRIBUTING.md`](./CONTRIBUTING.md) — 贡献流程
164
- - [`docs/OKX-MCP-API对接标准-v0.2.49.md`](./docs/OKX-MCP-API对接标准-v0.2.49.md) — API 对接规范
165
- - [`docs/OKX-MCP-防幻觉对接SOP-v1.0.md`](./docs/OKX-MCP-防幻觉对接SOP-v1.0.md) — 防幻觉 SOP
1
+ # hvip MCP Server
2
+
3
+ > OKX 全部能力接入 AI —— 365 个 MCP 工具,覆盖 97.7% OKX REST API
4
+
5
+ [![npm version](https://img.shields.io/npm/v/hvip-mcp-server)](https://www.npmjs.com/package/hvip-mcp-server)
6
+ [![License](https://img.shields.io/npm/l/hvip-mcp-server)](https://github.com/okx-wallet-H/hvip-mcp/blob/master/LICENSE)
7
+
8
+ 📦 [github.com/okx-wallet-H/hvip-mcp](https://github.com/okx-wallet-H/hvip-mcp) · 🐛 [提交反馈](https://github.com/okx-wallet-H/hvip-mcp/issues/new)
9
+
10
+ ---
11
+
12
+ ## 🚀 一行安装
13
+
14
+ ```bash
15
+ npx -y hvip-mcp-server
16
+ ```
17
+
18
+ 就这么简单。MCP 客户端(Claude Desktop / Claude Code / Cursor / VS Code)会自动接管。
19
+
20
+ ---
21
+
22
+ ## 配置到 AI 客户端
23
+
24
+ **这不是命令行工具**——hvip-mcp 是 MCP (Model Context Protocol) 服务器,由 AI 客户端在后台自动运行。你只需要在配置文件中加一行 JSON,AI 自己会启动它。
25
+
26
+ ### Claude Desktop
27
+
28
+ Claude Desktop → 设置 → Developer → Edit Config:
29
+
30
+ ```json
31
+ {
32
+ "mcpServers": {
33
+ "hvip": {
34
+ "command": "npx",
35
+ "args": ["-y", "hvip-mcp-server"]
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ ### Claude Code
42
+
43
+ 在项目根目录或全局 `.claude/settings.json`:
44
+
45
+ ```json
46
+ {
47
+ "mcpServers": {
48
+ "hvip": {
49
+ "command": "npx",
50
+ "args": ["-y", "hvip-mcp-server@latest"]
51
+ }
52
+ }
53
+ }
54
+ ```
55
+
56
+ ### VS Code / Cline / 其他 MCP 客户端
57
+
58
+ 在 MCP 配置中添加同样的 JSON。
59
+
60
+ > **配置完需要完全退出并重启客户端**,重开后 AI 自动连接 hvip。
61
+
62
+ ### 需要 API Key?
63
+
64
+ 行情、技术指标、市场扫描等公开数据无需 Key。查看账户、下单交易需要 OKX API Key:
65
+
66
+ ```json
67
+ {
68
+ "mcpServers": {
69
+ "hvip": {
70
+ "command": "npx",
71
+ "args": ["-y", "hvip-mcp-server"],
72
+ "env": {
73
+ "OKX_API_KEY": "<你的 API Key>",
74
+ "OKX_SECRET_KEY": "<你的 Secret Key>",
75
+ "OKX_PASSPHRASE": "<你的 Passphrase>"
76
+ }
77
+ }
78
+ }
79
+ }
80
+ ```
81
+
82
+ > API Key 在 [OKX 官网](https://www.okx.com) → 个人中心 → API 中创建,开通「读取」权限即可查账户,「交易」权限可下单。
83
+
84
+ ---
85
+
86
+ ## 工作流
87
+
88
+ AI 连接 hvip 后自动执行:
89
+
90
+ ```
91
+ 1. tools/list → 365 个工具,但只有 agent_catalog 带完整描述
92
+ 2. agent_catalog → 15 个域的地图(7 公开 + 8 需 Key),按需直达
93
+ 3. 用户说 "BTC 怎么样" → AI 调 okx_quick_market
94
+ 4. 用户说 "买 0.1 BTC" → AI 先预检再下单
95
+ ```
96
+
97
+ **无需手动操作,全程 AI 自己来。**
98
+
99
+ ---
100
+
101
+ ## 工具覆盖
102
+
103
+ | 模块 | 工具数 | 说明 |
104
+ |------|--------|------|
105
+ | 🔹 账户 | 40+ | 余额/持仓/配置/杠杆/估值 |
106
+ | 🔹 行情 | 17 | Ticker/K线/深度/成交 |
107
+ | 🔹 交易 | 27 | 下单/撤单/改单/批量/平仓 |
108
+ | 🔹 公共数据 | 34 | 产品规格/资金费率/标记价 |
109
+ | 🔹 资金 | 18 | 划转/提现/充值/兑换 |
110
+ | 🔹 策略委托 | 6 | 止损止盈/冰山/移动止盈 |
111
+ | 🔹 网格 | 13 | 现货网格/合约网格/定投 |
112
+ | 🔹 跟单 | 23 | 交易员/跟单/带单 |
113
+ | 🔹 信号 | 10 | 信号订阅/历史信号 |
114
+ | 🔹 价差 | 16 | 跨品种/跨期价差 |
115
+ | 🔹 RFQ | 12 | 大宗询价/报价/成交 |
116
+ | 🔹 金融 | 27 | 赚币/质押/借贷 |
117
+ | 🔹 预测市场 | 36 | 事件合约/预测交易 |
118
+ | 🔹 技术指标 | 2 | RSI/MACD/布林带等 17 种 |
119
+ | 🔹 聪明钱 | 3 | 交易员排行榜/市场情绪 |
120
+ | 🔹 WebSocket | 5 | 55 频道实时推送 |
121
+ | 🔹 代码图谱 | 2 | 函数调用链/符号搜索 |
122
+ | 🔹 系统工具 | 19 | 导航/偏好/反馈/Agent 协作 |
123
+
124
+ **365 个 MCP 工具 · 覆盖 97.7% OKX REST API**
125
+
126
+ ---
127
+
128
+ ## 本地开发
129
+
130
+ ```bash
131
+ git clone https://github.com/okx-wallet-H/hvip-mcp.git
132
+ cd hvip-mcp
133
+ npm install
134
+ npm run build
135
+ npm start
136
+ ```
137
+
138
+ ---
139
+
140
+ ## 架构
141
+
142
+ ```
143
+ 原子层 (350 工具) → [L:READ] 权限标记 → AI Agent 按需调用
144
+
145
+ Skill 组合层 (13 个) → 串联多工具,一次完成复杂任务
146
+
147
+ agent_catalog → 15 域地图 → 按意图路由 → 直达目标工具
148
+ ```
149
+
150
+ ---
151
+
152
+ ## 贡献
153
+
154
+ 1. 阅读 [`CLAUDE.md`](./CLAUDE.md) 了解项目规范
155
+ 2. 阅读 [`CONTRIBUTING.md`](./CONTRIBUTING.md) 了解提交流程
156
+ 3. Fork → 创建分支 → 开发 → `npm run build` → 提 PR
157
+
158
+ ---
159
+
160
+ ## 文档
161
+
162
+ - [`CLAUDE.md`](./CLAUDE.md) — AI Agent 项目指南
163
+ - [`CONTRIBUTING.md`](./CONTRIBUTING.md) — 贡献流程
164
+ - [`docs/OKX-MCP-API对接标准-v0.2.49.md`](./docs/OKX-MCP-API对接标准-v0.2.49.md) — API 对接规范
165
+ - [`docs/OKX-MCP-防幻觉对接SOP-v1.0.md`](./docs/OKX-MCP-防幻觉对接SOP-v1.0.md) — 防幻觉 SOP
@@ -5012,11 +5012,29 @@ var HubCosts = class {
5012
5012
  var CircuitBreaker = class {
5013
5013
  circuits = /* @__PURE__ */ new Map();
5014
5014
  failureThreshold = 3;
5015
- cooldownMs = 6e4;
5016
- // 1 minute default
5015
+ baseCooldownMs = 6e4;
5016
+ // 1 minute base
5017
+ maxCooldownMs = 3e5;
5018
+ // 5 minutes max
5019
+ listeners = /* @__PURE__ */ new Set();
5017
5020
  constructor(opts) {
5018
5021
  if (opts?.failureThreshold) this.failureThreshold = opts.failureThreshold;
5019
- if (opts?.cooldownMs) this.cooldownMs = opts.cooldownMs;
5022
+ if (opts?.cooldownMs) this.baseCooldownMs = opts.cooldownMs;
5023
+ if (opts?.maxCooldownMs) this.maxCooldownMs = opts.maxCooldownMs;
5024
+ }
5025
+ /** 注册状态变更监听 */
5026
+ onStateChange(handler) {
5027
+ this.listeners.add(handler);
5028
+ return () => this.listeners.delete(handler);
5029
+ }
5030
+ /** 内部通知 */
5031
+ notify(event, name, entry) {
5032
+ for (const h of this.listeners) {
5033
+ try {
5034
+ h(event, name, entry);
5035
+ } catch {
5036
+ }
5037
+ }
5020
5038
  }
5021
5039
  /** 获取或创建熔断器 */
5022
5040
  get(name) {
@@ -5031,7 +5049,8 @@ var CircuitBreaker = class {
5031
5049
  lastFailure: null,
5032
5050
  lastSuccess: null,
5033
5051
  openedAt: null,
5034
- cooldownMs: this.cooldownMs
5052
+ cooldownMs: this.baseCooldownMs,
5053
+ backoffMultiplier: 1
5035
5054
  };
5036
5055
  this.circuits.set(name, c);
5037
5056
  }
@@ -5046,6 +5065,7 @@ var CircuitBreaker = class {
5046
5065
  const elapsed = Date.now() - new Date(c.openedAt).getTime();
5047
5066
  if (elapsed >= c.cooldownMs) {
5048
5067
  c.state = "HALF_OPEN";
5068
+ this.notify("half_open", name, c);
5049
5069
  return true;
5050
5070
  }
5051
5071
  }
@@ -5059,27 +5079,36 @@ var CircuitBreaker = class {
5059
5079
  if (c.state === "HALF_OPEN") {
5060
5080
  c.state = "CLOSED";
5061
5081
  c.failures = 0;
5082
+ c.backoffMultiplier = 1;
5083
+ this.notify("closed", name, c);
5062
5084
  }
5063
5085
  if (c.state === "CLOSED") {
5064
5086
  c.failures = 0;
5065
5087
  }
5066
5088
  }
5067
- /** 调用失败 */
5089
+ /** 调用失败 — 带指数退避 */
5068
5090
  onFailure(name) {
5069
5091
  const c = this.get(name);
5070
5092
  c.failures++;
5071
5093
  c.failureCount++;
5072
5094
  c.lastFailure = (/* @__PURE__ */ new Date()).toISOString();
5073
5095
  if (c.failures >= this.failureThreshold) {
5096
+ const backoffMs = Math.min(
5097
+ this.baseCooldownMs * Math.pow(2, c.backoffMultiplier - 1),
5098
+ this.maxCooldownMs
5099
+ );
5100
+ c.cooldownMs = backoffMs;
5101
+ c.backoffMultiplier++;
5074
5102
  c.state = "OPEN";
5075
5103
  c.openedAt = (/* @__PURE__ */ new Date()).toISOString();
5104
+ this.notify("opened", name, c);
5076
5105
  }
5077
5106
  }
5078
- /** 包裹一个异步函数 */
5079
- async wrap(name, fn, fallback) {
5107
+ /** 包裹一个异步函数,支持重试和 fallback */
5108
+ async wrap(name, fn, fallback, retries = 0) {
5080
5109
  if (!this.canCall(name)) {
5081
5110
  if (fallback) return fallback();
5082
- throw new Error(`Circuit OPEN: ${name}`);
5111
+ throw new Error(`Circuit OPEN: ${name} (\u51B7\u5374\u4E2D, ${this.get(name).cooldownMs}ms)`);
5083
5112
  }
5084
5113
  try {
5085
5114
  const result = await fn();
@@ -5087,6 +5116,11 @@ var CircuitBreaker = class {
5087
5116
  return result;
5088
5117
  } catch (e) {
5089
5118
  this.onFailure(name);
5119
+ if (retries > 0) {
5120
+ const wait = Math.min(1e3 * Math.pow(2, 3 - retries), 9e3);
5121
+ await new Promise((r) => setTimeout(r, wait));
5122
+ return this.wrap(name, fn, fallback, retries - 1);
5123
+ }
5090
5124
  if (fallback) return fallback();
5091
5125
  throw e;
5092
5126
  }
@@ -5095,12 +5129,27 @@ var CircuitBreaker = class {
5095
5129
  status() {
5096
5130
  return [...this.circuits.values()];
5097
5131
  }
5098
- /** 重置指定熔断器 */
5132
+ /** 重置指定熔断器 — 立即清除状态 */
5099
5133
  reset(name) {
5100
- this.circuits.delete(name);
5134
+ const c = this.circuits.get(name);
5135
+ if (c) {
5136
+ this.notify("reset", name, c);
5137
+ this.circuits.delete(name);
5138
+ }
5139
+ }
5140
+ /** 重置所有熔断器 */
5141
+ resetAll() {
5142
+ for (const [name, c] of this.circuits) {
5143
+ this.notify("reset", name, c);
5144
+ }
5145
+ this.circuits.clear();
5101
5146
  }
5102
5147
  };
5103
- var circuitBreaker = new CircuitBreaker({ failureThreshold: 3, cooldownMs: 6e4 });
5148
+ var circuitBreaker = new CircuitBreaker({
5149
+ failureThreshold: 3,
5150
+ cooldownMs: 6e4,
5151
+ maxCooldownMs: 3e5
5152
+ });
5104
5153
 
5105
5154
  // src/hub-server.ts
5106
5155
  var import_node_fs3 = require("node:fs");
@@ -6098,7 +6147,7 @@ if ((0, import_node_fs3.existsSync)(envPath)) {
6098
6147
  }
6099
6148
  });
6100
6149
  }
6101
- var VERSION = "0.6.0";
6150
+ var VERSION = "0.6.1";
6102
6151
  function getDashboardHtml(host2, port) {
6103
6152
  const paths = [(0, import_node_path3.join)(__dirname, "web", "dashboard.html"), (0, import_node_path3.join)(__dirname, "..", "src", "web", "dashboard.html")];
6104
6153
  for (const p of paths) {