hchain-mcp 1.0.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.
Files changed (56) hide show
  1. package/.env.example +5 -0
  2. package/AGENT-MCP-RULES.md +248 -0
  3. package/OnchainOS-API/345/257/271/346/216/245/350/247/204/350/214/203.md +329 -0
  4. package/README.md +106 -0
  5. package/dist/adapters/onchainos-ws.d.ts +31 -0
  6. package/dist/adapters/onchainos-ws.js +103 -0
  7. package/dist/adapters/onchainos.d.ts +343 -0
  8. package/dist/adapters/onchainos.js +275 -0
  9. package/dist/adapters/shared.d.ts +23 -0
  10. package/dist/adapters/shared.js +107 -0
  11. package/dist/http.d.ts +9 -0
  12. package/dist/http.js +124 -0
  13. package/dist/index.d.ts +6 -0
  14. package/dist/index.js +54 -0
  15. package/dist/tools/balance.d.ts +4 -0
  16. package/dist/tools/balance.js +69 -0
  17. package/dist/tools/defi.d.ts +4 -0
  18. package/dist/tools/defi.js +268 -0
  19. package/dist/tools/gateway.d.ts +4 -0
  20. package/dist/tools/gateway.js +107 -0
  21. package/dist/tools/intent.d.ts +4 -0
  22. package/dist/tools/intent.js +111 -0
  23. package/dist/tools/market.d.ts +4 -0
  24. package/dist/tools/market.js +612 -0
  25. package/dist/tools/payments.d.ts +4 -0
  26. package/dist/tools/payments.js +100 -0
  27. package/dist/tools/skills.d.ts +4 -0
  28. package/dist/tools/skills.js +464 -0
  29. package/dist/tools/trade.d.ts +4 -0
  30. package/dist/tools/trade.js +195 -0
  31. package/dist/tools/txhistory.d.ts +4 -0
  32. package/dist/tools/txhistory.js +49 -0
  33. package/dist/tools/ws.d.ts +4 -0
  34. package/dist/tools/ws.js +64 -0
  35. package/docs/DEFI.md +65 -0
  36. package/docs/GATEWAY.md +45 -0
  37. package/docs/MARKET.md +109 -0
  38. package/docs/PAYMENTS.md +83 -0
  39. package/docs/TRADE.md +103 -0
  40. package/package.json +25 -0
  41. package/src/adapters/onchainos-ws.ts +126 -0
  42. package/src/adapters/onchainos.ts +488 -0
  43. package/src/adapters/shared.ts +100 -0
  44. package/src/http.ts +132 -0
  45. package/src/index.ts +57 -0
  46. package/src/tools/balance.ts +67 -0
  47. package/src/tools/defi.ts +224 -0
  48. package/src/tools/gateway.ts +115 -0
  49. package/src/tools/intent.ts +106 -0
  50. package/src/tools/market.ts +543 -0
  51. package/src/tools/payments.ts +105 -0
  52. package/src/tools/skills.ts +489 -0
  53. package/src/tools/trade.ts +197 -0
  54. package/src/tools/txhistory.ts +51 -0
  55. package/src/tools/ws.ts +72 -0
  56. package/tsconfig.json +18 -0
package/.env.example ADDED
@@ -0,0 +1,5 @@
1
+ # OKX Onchain OS API 凭证
2
+ # 获取: https://web3.okx.com/onchainos/dev-portal
3
+ OKX_API_KEY=your_api_key_here
4
+ OKX_SECRET_KEY=your_secret_key_here
5
+ OKX_PASSPHRASE=your_passphrase_here
@@ -0,0 +1,248 @@
1
+ # Agent-First MCP 开发规则
2
+
3
+ ## 总纲
4
+
5
+ MCP Server 的唯一用户是 AI Agent。不是给人看的,不是给前端调的。
6
+ 所有决策从 Agent 的认知局限和能力边界出发。
7
+
8
+ ---
9
+
10
+ ## 规则 1:Token 经济学——省即是快
11
+
12
+ Agent 的上下文窗口是有限资源。每个工具的 name、description、inputSchema 每轮对话都占 token。
13
+
14
+ | 红线 | 标准 |
15
+ |------|------|
16
+ | 工具数量 | ≤20。超出用 search+execute 模式 |
17
+ | 工具名 | ≤40 字符,纯动作动词+名词,kebab-case |
18
+ | 描述 | 1-2 句。说什么、返回什么、不说什么 |
19
+ | 参数数 | ≤5 必填,≤3 可选。超出拆工具 |
20
+ | 参数描述 | 每个参数必写 `.describe()`,但一句话说清 |
21
+ | enum 优先 | 能用 enum 就不用 string,减少 Agent 猜测 |
22
+
23
+ ```
24
+ # 好
25
+ get_quote — 获取最优 swap 报价。返回输出金额、价格影响、路由明细。不构造交易。
26
+
27
+ # 坏
28
+ get_quote — 这个工具用于获取去中心化交易所的聚合报价信息,它会查询多个流动性源...
29
+ ```
30
+
31
+ ---
32
+
33
+ ## 规则 2:零猜测——不让 Agent 蒙
34
+
35
+ Agent 的弱点是不懂你的 API 内部逻辑。每个模糊点都是出错机会。
36
+
37
+ - **参数永远带 `.describe()`**,告诉 Agent 这参数是什么格式、从哪来
38
+ - **错误消息必须可执行**,不只说"错了",要说"怎么做才对"
39
+ - **返回值必须包含后续步骤需要的 ID**,别让 Agent 自己编
40
+
41
+ ```
42
+ # 好
43
+ "Token address 0xabc not found on chain 1. Use search_tokens to find valid addresses."
44
+
45
+ # 坏
46
+ "INVALID_ADDRESS"
47
+ ```
48
+
49
+ ---
50
+
51
+ ## 规则 3:读写分离——安全基线
52
+
53
+ Agent 的宿主(Claude Code 等)依赖 `readOnlyHint` / `destructiveHint` 做自动审批决策。
54
+
55
+ - **一个工具不能既读又写**
56
+ - **所有只读工具标记 `readOnlyHint: true`**
57
+ - **所有写操作标记 `destructiveHint: true`**
58
+ - **写操作返回摘要而非裸数据**,让用户一眼看懂发生了什么
59
+
60
+ ```
61
+ 只读:get_quote, get_balance, search_tokens, get_candlesticks
62
+ 写入:build_swap, broadcast_transaction, build_approve
63
+ ```
64
+
65
+ ---
66
+
67
+ ## 规则 4:结构化返回——Agent 要的是 JSON,不是散文
68
+
69
+ Agent 解析你的返回做下一步决策。返回格式必须:
70
+
71
+ - **始终是合法的 JSON 字符串**(放在 `content[0].text` 里)
72
+ - **顶层结构固定**:`{ success, data, error?, warnings?, nextSteps?, meta? }`
73
+ - **涉及金额的字段用 string 而非 number**,避免精度丢失
74
+ - **截断时明确告知**:"返回 10/847 条,用 limit 参数翻页"
75
+
76
+ ```typescript
77
+ // 标准返回结构
78
+ {
79
+ success: true,
80
+ data: { ... },
81
+ warnings: ["价格影响 3.2%,偏高"],
82
+ nextSteps: ["如需交易,先调 build_approve_transaction,再调 build_swap_transaction"],
83
+ meta: { source: "api", cached: false, requestId: "xyz" }
84
+ }
85
+ ```
86
+
87
+ ---
88
+
89
+ ## 规则 5:命名即文档
90
+
91
+ Agent 靠工具名和描述做路由。命名混乱 → 调错工具 → 用户骂你。
92
+
93
+ - **动词在前**:`get_`, `search_`, `build_`, `list_`
94
+ - **`get_` vs `search_`**:get 是精确取一条,search 是模糊搜多条
95
+ - **`list_` vs `get_`**:list 是枚举全部,get 是条件查询
96
+ - **`build_` vs `execute_`**:build 只构造不发送,execute 直接干了
97
+
98
+ ```
99
+ list_supported_chains → 枚举所有链
100
+ get_quote → 拿一个报价
101
+ search_tokens → 模糊搜代币
102
+ build_swap_transaction → 构造交易,不广播
103
+ ```
104
+
105
+ ---
106
+
107
+ ## 规则 6:参数从 Agent 视角设计
108
+
109
+ Agent 手里有什么信息,就用什么做参数。不要让 Agent 内部转换数据格式。
110
+
111
+ - **Agent 有地址** → 参数要地址
112
+ - **Agent 有链名** → 同时支持 chainIndex 和 chainName
113
+ - **Agent 有上一个工具的返回** → 下一个工具的参数格式要对齐,能直接透传
114
+ - **不要要求 Agent 自己算 decimals** → 接受人类可读数量,内部转换
115
+
116
+ ```
117
+ # 好 — Agent 从 get_quote 拿到的 allowanceTarget 直接传
118
+ build_approve_transaction({
119
+ tokenAddress: "0x...", // 从搜索结果拿
120
+ spenderAddress: "0x...", // 从报价的 allowanceTarget 拿
121
+ amount: "1000000"
122
+ })
123
+
124
+ # 坏 — 要求 Agent 自己拼
125
+ build_approve_transaction({
126
+ rawCalldataParams: "0x..."
127
+ })
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 规则 7:渐进式复杂度
133
+
134
+ 工具分三层,Agent 按需深入:
135
+
136
+ | 层 | 特征 | 示例 |
137
+ |----|------|------|
138
+ | L1 快速 | 0-1 参数,秒回,Agent 随手调 | `list_supported_chains` |
139
+ | L2 核心 | 3-5 参数,业务主力 | `get_quote`, `get_balance` |
140
+ | L3 高级 | 5+ 参数,专家才用 | `build_swap_transaction` |
141
+
142
+ Agent 的典型路径:L1 探索 → L2 操作 → L3 执行。不要一上来就让 Agent 填 8 个参数。
143
+
144
+ ---
145
+
146
+ ## 规则 8:错误分级——帮 Agent 自我修正
147
+
148
+ | 级别 | HTTP | 含义 | 返回 |
149
+ |------|------|------|------|
150
+ | 可重试 | 429/503 | 临时问题,等一下就好 | `retryAfter` 字段,Agent 知道等多久 |
151
+ | 参数错 | 400 | Agent 传错了,修正后可重试 | 指出哪个参数错、正确格式是什么 |
152
+ | 业务拒绝 | 422 | 逻辑上不可行(余额不足、滑点超限) | 给出替代方案 |
153
+ | 系统错 | 500 | 不是 Agent 的问题 | 简单说明,不让 Agent 反复重试 |
154
+
155
+ ```json
156
+ // 参数错误返回
157
+ {
158
+ "success": false,
159
+ "error": {
160
+ "code": "INVALID_CHAIN",
161
+ "param": "chainIndex",
162
+ "message": "chainIndex '999' 不支持",
163
+ "fix": "调用 list_supported_chains 获取可用链列表"
164
+ }
165
+ }
166
+ ```
167
+
168
+ ---
169
+
170
+ ## 规则 9:幂等与缓存——别让 Agent 等
171
+
172
+ - **所有 L1 工具结果缓存**(TTL 按数据新鲜度分级)
173
+ - **缓存在返回中透明标注** `meta: { cached: true, cachedAt: "..." }`
174
+ - **相同参数相同结果**,Agent 可以安全重试读操作
175
+ - **写操作永远不走缓存**
176
+
177
+ | 数据 | TTL |
178
+ |------|-----|
179
+ | 链列表 | 300s |
180
+ | 代币搜索 | 120s |
181
+ | 实时价格 | 15s |
182
+ | K线 | 30s |
183
+ | 报价 | 不缓存 |
184
+ | 余额 | 30s |
185
+
186
+ ---
187
+
188
+ ## 规则 10:链式提示——Agent 的导航系统
189
+
190
+ Agent 不知道业务流程。当你返回 quote 时,它不知道下一步要 approve 再 swap。
191
+
192
+ - **返回中包含 `nextSteps`**:人类可读的后续步骤列表
193
+ - **每个步骤写明要调哪个工具**:Agent 可以直接执行
194
+ - **不要强行规定**:是提示不是命令,Agent 可能因为用户意图跳过
195
+
196
+ ```json
197
+ {
198
+ "data": { /* quote */ },
199
+ "nextSteps": [
200
+ { "action": "检查授权", "tool": "get_allowance", "params": { "tokenAddress": "...", "ownerAddress": "..." } },
201
+ { "action": "授权代币", "tool": "build_approve_transaction", "condition": "如果 allowance 不足" },
202
+ { "action": "执行交易", "tool": "build_swap_transaction", "condition": "授权完成后" }
203
+ ]
204
+ }
205
+ ```
206
+
207
+ ---
208
+
209
+ ## 规则 11:不要教 Agent 做事
210
+
211
+ MCP tool description 中**不能**包含对 Agent 行为的指令。这是 prompt injection,会导致 Anthropic Directory 审核被拒。
212
+
213
+ ```
214
+ # 违规
215
+ "Always call this tool before get_quote. You must check the chain first."
216
+
217
+ # 合规
218
+ "返回支持的链列表。调用 get_quote 前建议先确认目标链是否在列表中。"
219
+ ```
220
+
221
+ 差别:前者是命令 Agent,后者是陈述事实。
222
+
223
+ ---
224
+
225
+ ## 规则 12:传输层透明
226
+
227
+ 不管是 stdio 还是 HTTP,Agent 感知不到。但:
228
+
229
+ - **HTTP 必须无状态**:每个请求独立,`sessionIdGenerator: undefined`
230
+ - **超时策略**:读 15s,写 30s
231
+ - **健康检查独立于 /mcp**:`GET /health` 返回 200,主机用它判断存活
232
+
233
+ ---
234
+
235
+ ## 检查清单
236
+
237
+ 每加一个工具,过一遍:
238
+
239
+ - [ ] 工具名 ≤ 40 字符,动词+名词,kebab-case
240
+ - [ ] 描述 1-2 句,说了做什么、不做什么
241
+ - [ ] 每个参数有 `.describe()`
242
+ - [ ] 能用 enum 的地方没用 string
243
+ - [ ] `readOnlyHint` 或 `destructiveHint` 已标记
244
+ - [ ] 返回是 JSON,有 `success` 字段
245
+ - [ ] 错误返回有 `fix` 字段
246
+ - [ ] 涉及金额用 string
247
+ - [ ] 对应缓存 TTL 已配置(如果是读操作)
248
+ - [ ] 如果输出能被下个工具用,加了 `nextSteps`
@@ -0,0 +1,329 @@
1
+ # Onchain OS API 对接开发规范
2
+
3
+ > 基于 hvip MCP 代码标准 · 接收方:所有 AI 工程师
4
+ > 阅读本文后即可开始编写 Onchain OS MCP 工具
5
+
6
+ ---
7
+
8
+ ## 一、目录结构
9
+
10
+ ```
11
+ onchainos-mcp/
12
+ src/
13
+ adapters/
14
+ onchainos.ts ← Onchain OS REST API 适配层
15
+ onchainos-ws.ts ← 如需:Onchain OS WebSocket 适配层
16
+ tools/
17
+ onchainos.ts ← Onchain OS MCP 工具注册
18
+ ```
19
+
20
+ ---
21
+
22
+ ## 二、9 字段描述模板(强制)
23
+
24
+ 每个 `server.tool()` 的描述字符串必须包含以下 9 个字段,按顺序用 `\n## ` 分隔:
25
+
26
+ ```typescript
27
+ "CAT:[分类名] | ## 功能:一句话描述\n
28
+ ## 场景:用于xxx、xxx\n
29
+ ## 关键词:xxx, xxx, xxx\n
30
+ ## 参数:\n## - paramName: 参数说明\n
31
+ ## 鉴权:PUBLIC — 公开接口,不需要 API Key | ⚠️ 需要 API Key(只读)| ⚠️ 需要 API Key(交易)\n
32
+ ## 风险:READ — 只读查询 | WRITE — 写操作\n
33
+ ## 返回量:微小 ~2KB | 中等 ~10KB | 大 ~100KB\n
34
+ ## 关联:前置工具 → 本工具 → 后续工具"
35
+ ```
36
+
37
+ **9 个字段缺一不可:** `CAT:` | `功能` | `场景` | `关键词` | `参数` | `鉴权` | `风险` | `返回量` | `关联`
38
+
39
+ ### 参考范例
40
+
41
+ ```typescript
42
+ server.tool(
43
+ "onchainos_get_price",
44
+ "CAT:[链上-行情] | ## 功能:获取指定代币在多链上的实时价格\n## 场景:用于查询代币当前币价、多链比价、发现价差机会\n## 关键词:链上行情, 代币价格, onchain price, 多链\n## 参数:\n## - chainId: 链ID。1=ETH, 56=BSC, 137=Polygon, 8453=Base\n## - tokenAddress: 代币合约地址(必填)\n## 鉴权:PUBLIC — 公开接口,不需要 API Key\n## 风险:READ — 只读查询,Agent 可自动调用\n## 返回量:微小 ~1KB\n## 关联:onchainos_search_token 搜索代币 → 本工具查价 → onchainos_get_pool 看流动性",
45
+ {
46
+ chainId: z.number().int().describe("链ID。1=ETH, 56=BSC, 137=Polygon, 8453=Base"),
47
+ tokenAddress: z.string().describe("代币合约地址(必填)"),
48
+ },
49
+ async ({ chainId, tokenAddress }) => {
50
+ try {
51
+ const data = await onchainosApi.getPrice(chainId, tokenAddress)
52
+ return toResult(data)
53
+ } catch (e) { return toError(e) }
54
+ }
55
+ )
56
+ ```
57
+
58
+ ---
59
+
60
+ ## 三、CAT 分类名
61
+
62
+ Onchain OS 工具使用以下分类:
63
+
64
+ | CAT 标签 | 对应 API 模块 | 示例工具 |
65
+ |----------|-------------|---------|
66
+ | `[链上-行情]` | Market Price / Token / Index Price | getPrice, getTokenInfo |
67
+ | `[链上-Swap]` | DEX Swap / Quote / Bridge | getQuote, swap |
68
+ | `[链上-账户]` | Balance / Transaction History | getBalance, getTxHistory |
69
+ | `[链上-分析]` | Address Analysis / Portfolio | getPortfolio, getPnL |
70
+ | `[链上-信号]` | Signal / Leaderboard / Trenches | getSignals |
71
+ | `[链上-WS]` | WebSocket 实时频道 | subscribePrice |
72
+ | `[链上-网关]` | Onchain Gateway / Gas / Broadcast | simulate, broadcast |
73
+
74
+ ---
75
+
76
+ ## 四、适配器模板
77
+
78
+ ### 4.1 公共接口(无需鉴权)
79
+
80
+ 在 `src/adapters/onchainos.ts` 中:
81
+
82
+ ```typescript
83
+ import crypto from "node:crypto"
84
+
85
+ const BASE = "https://web3.okx.com"
86
+
87
+ function timestamp(): string {
88
+ return new Date().toISOString().replace(/(\.\d{3})\d*Z/, "$1Z")
89
+ }
90
+
91
+ function buildQuery(params: Record<string, string | number | boolean | undefined>): string {
92
+ const p = new URLSearchParams()
93
+ for (const [k, v] of Object.entries(params)) {
94
+ if (v !== undefined && v !== "") p.append(k, String(v))
95
+ }
96
+ return p.size ? "?" + p.toString() : ""
97
+ }
98
+
99
+ async function request<T>(
100
+ method: "GET" | "POST",
101
+ path: string,
102
+ options: {
103
+ params?: Record<string, string | number | boolean | undefined>
104
+ body?: unknown
105
+ auth?: { apiKey: string; secret: string; passphrase: string }
106
+ } = {}
107
+ ): Promise<T> {
108
+ const query = options.params ? buildQuery(options.params) : ""
109
+ const fullPath = path + query
110
+ const bodyStr = options.body ? JSON.stringify(options.body) : ""
111
+
112
+ const headers: Record<string, string> = {
113
+ "Content-Type": "application/json",
114
+ "Accept": "application/json",
115
+ }
116
+
117
+ if (options.auth) {
118
+ const ts = timestamp()
119
+ const msg = ts + method + fullPath + bodyStr
120
+ const sign = crypto.createHmac("sha256", options.auth.secret).update(msg).digest("base64")
121
+ headers["OK-ACCESS-KEY"] = options.auth.apiKey
122
+ headers["OK-ACCESS-SIGN"] = sign
123
+ headers["OK-ACCESS-TIMESTAMP"] = ts
124
+ headers["OK-ACCESS-PASSPHRASE"] = options.auth.passphrase
125
+ }
126
+
127
+ const res = await fetch(BASE + fullPath, {
128
+ method, headers,
129
+ ...(bodyStr ? { body: bodyStr } : {}),
130
+ })
131
+
132
+ if (!res.ok) throw new Error(`HTTP ${res.status} ${res.statusText}`)
133
+ const json = await res.json() as { code: string; msg?: string; data?: T }
134
+ if (json.code !== "0") throw new Error(`OKX ${json.code}: ${json.msg ?? "unknown error"}`)
135
+ return (json.data ?? json) as T
136
+ }
137
+
138
+ // ── 公共接口 ──────────────────────────────────────────────
139
+
140
+ export const onchainosApi = {
141
+ // 行情价格
142
+ getPrice: (chainId: number, tokenAddress: string) =>
143
+ request<unknown>("GET", "/api/v6/dex/market/price", { params: { chainId, tokenAddress } }),
144
+
145
+ // 搜索代币
146
+ searchToken: (keyword: string) =>
147
+ request<unknown[]>("GET", "/api/v6/dex/market/search", { params: { keyword } }),
148
+ }
149
+ ```
150
+
151
+ ### 4.2 鉴权接口
152
+
153
+ ```typescript
154
+ export const onchainosPrivateApi = {
155
+ // 余额查询
156
+ getBalance: (auth: Auth, address: string, chainId: number) =>
157
+ request<unknown[]>("GET", "/api/v6/dex/asset/balance", { params: { address, chainId }, auth }),
158
+
159
+ // Swap 下单
160
+ swap: (auth: Auth, body: Record<string, unknown>) =>
161
+ request<unknown>("POST", "/api/v6/dex/swap", { body, auth }),
162
+ }
163
+ ```
164
+
165
+ **规则:** 公开端点放 `onchainosApi`(无 `auth` 参数),鉴权端点放 `onchainosPrivateApi`(第一个参数是 `auth: Auth`)。
166
+
167
+ ---
168
+
169
+ ## 五、工具注册模板
170
+
171
+ 每个工具文件导出一个注册函数:
172
+
173
+ ```typescript
174
+ import { z } from "zod"
175
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
176
+ import { onchainosApi, type Auth } from "../adapters/onchainos.js"
177
+ import { toResult, toError, AUTH_REQUIRED } from "./shared.js"
178
+
179
+ export function registerOnchainOSTools(server: McpServer, auth: Auth | null): void {
180
+
181
+ server.tool(
182
+ "onchainos_get_price",
183
+ "CAT:[链上-行情] | ## 功能:...\n...\n## 关联:...",
184
+ { /* Zod schema */ },
185
+ async ({ /* params */ }) => {
186
+ try {
187
+ const data = await onchainosApi.getPrice(...)
188
+ return toResult(data)
189
+ } catch (e) { return toError(e) }
190
+ }
191
+ )
192
+ }
193
+ ```
194
+
195
+ **注册到 `src/index.ts`:**
196
+
197
+ ```typescript
198
+ import { registerOnchainOSTools } from "./tools/onchainos.js"
199
+ // 在 main() 中:
200
+ registerOnchainOSTools(server, auth)
201
+ ```
202
+
203
+ ---
204
+
205
+ ## 六、强制规则
206
+
207
+ ### 6.1 防幻觉(最重要)
208
+
209
+ **每个端点接之前必须 curl 验证,确认返回 200 真实数据再写代码。**
210
+
211
+ ```bash
212
+ # 验证端点真实存在
213
+ curl -s "https://web3.okx.com/api/v6/dex/market/price?chainId=1&tokenAddress=0x..." \
214
+ -H "OK-ACCESS-KEY: $OKX_API_KEY" \
215
+ -H "OK-ACCESS-SIGN: ..." \
216
+ -H "OK-ACCESS-TIMESTAMP: ..." \
217
+ -H "OK-ACCESS-PASSPHRASE: ..."
218
+ ```
219
+
220
+ **404 跳过,200 接。编造的端点直接拒。**
221
+
222
+ ### 6.2 tsIso 时间戳
223
+
224
+ 所有 `toResult()` 返回数据必须包含 `tsIso` 字段:
225
+
226
+ ```typescript
227
+ return toResult({
228
+ ...data,
229
+ tsIso: new Date().toISOString(),
230
+ })
231
+ ```
232
+
233
+ ### 6.3 错误处理
234
+
235
+ ```typescript
236
+ try {
237
+ const data = await api.xxx()
238
+ return toResult(data)
239
+ } catch (e) { return toError(e) }
240
+ ```
241
+
242
+ ### 6.4 枚举使用
243
+
244
+ 产品类型参数使用 `INST_TYPE_*` 常量,禁止硬编码:
245
+
246
+ ```typescript
247
+ // ✅ 正确
248
+ instType: z.enum(INST_TYPE_MARKET).describe("产品类型")
249
+
250
+ // ❌ 错误
251
+ instType: z.enum(["SPOT","SWAP","FUTURES"]).describe("产品类型")
252
+ ```
253
+
254
+ ### 6.5 分支命名
255
+
256
+ ```
257
+ feat/onchainos-<feature> 新功能
258
+ fix/onchainos-<bug> Bug 修复
259
+ task/onchainos-<编号> 任务池工单
260
+ ```
261
+
262
+ ### 6.6 提交之前
263
+
264
+ ```bash
265
+ npm run build # 必须通过
266
+ ```
267
+
268
+ ### 6.7 Tool 命名规范
269
+
270
+ ```
271
+ onchainos_<模块>_<操作>
272
+ ```
273
+
274
+ 示例:
275
+ ```
276
+ onchainos_market_price — 行情价格
277
+ onchainos_token_search — 搜索代币
278
+ onchainos_dex_quote — DEX 报价
279
+ onchainos_balance_total — 总余额
280
+ onchainos_swap_execute — 执行 Swap
281
+ onchainos_ws_price_subscribe — WS 价格订阅
282
+ ```
283
+
284
+ ---
285
+
286
+ ## 七、审核检查清单
287
+
288
+ 提交前自查,审核员也会逐项检查:
289
+
290
+ - [ ] `npm run build` 通过
291
+ - [ ] 9 字段描述完整(CAT / 功能 / 场景 / 关键词 / 参数 / 鉴权 / 风险 / 返回量 / 关联)
292
+ - [ ] 端点经 curl 验证存在(不是编的)
293
+ - [ ] `tsIso` 时间戳
294
+ - [ ] `toResult()` / `toError()` 错误处理
295
+ - [ ] `INST_TYPE_*` 枚举(如涉及产品类型)
296
+ - [ ] 公开端点放 `onchainosApi`,鉴权端点放 `onchainosPrivateApi`
297
+ - [ ] Tool 命名以 `onchainos_` 前缀
298
+ - [ ] CAT 分类标签正确
299
+ - [ ] 分支名符合规范
300
+ - [ ] 不修改无关文件
301
+
302
+ ---
303
+
304
+ ## 八、开发流程
305
+
306
+ ```
307
+ 1. 阅读本文档 + CLAUDE.md
308
+ 2. 从 Onchain OS 文档选择要接的 API 模块
309
+ 3. curl 验证端点
310
+ 4. git checkout -b feat/onchainos-<模块>
311
+ 5. 写 src/adapters/onchainos.ts + src/tools/onchainos.ts
312
+ 6. npm run build
313
+ 7. git push origin feat/onchainos-<模块>
314
+ 8. 通知审核员(WS Hub 发 task:done)
315
+ 9. 等待审核 → 通过后合并
316
+ ```
317
+
318
+ ---
319
+
320
+ ## 九、参考示例
321
+
322
+ | 文件 | 参考价值 |
323
+ |------|---------|
324
+ | `src/tools/market.ts` | 9 字段描述模板 |
325
+ | `src/adapters/okx.ts` | `publicApi` / `privateApi` 适配器模式 |
326
+ | `src/tools/shared.ts` | `toResult` / `toError` / `AUTH_REQUIRED` / `INST_TYPE_*` |
327
+ | `CLAUDE.md` | 项目架构 + 开发规范 |
328
+ | `CONTRIBUTING.md` | 分支协作流程 |
329
+ | `docs/OKX-MCP-防幻觉对接SOP-v1.0.md` | 防幻觉标准操作流程 |
package/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # h-mcp
2
+
3
+ AI-native multi-chain trading MCP Server — 99 tools, HTTP & stdio dual transport.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g h-mcp
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### stdio (local Agent)
14
+
15
+ ```bash
16
+ h-mcp
17
+ ```
18
+
19
+ Set API Key:
20
+
21
+ ```bash
22
+ export OKX_API_KEY=xxx
23
+ export OKX_SECRET_KEY=xxx
24
+ export OKX_PASSPHRASE=xxx
25
+ h-mcp
26
+ ```
27
+
28
+ ### HTTP (remote Agent)
29
+
30
+ ```bash
31
+ h-mcp start:http
32
+ # → http://127.0.0.1:3000
33
+
34
+ # or custom port
35
+ PORT=3099 h-mcp start:http
36
+ ```
37
+
38
+ Endpoints:
39
+
40
+ | Method | Path | Description |
41
+ |--------|------|-------------|
42
+ | POST | `/mcp` | MCP StreamableHTTP |
43
+ | GET | `/health` | Health check |
44
+
45
+ ### Claude Code Config
46
+
47
+ ```json
48
+ {
49
+ "mcpServers": {
50
+ "h-mcp": {
51
+ "command": "npx",
52
+ "args": ["h-mcp"],
53
+ "env": {
54
+ "OKX_API_KEY": "xxx",
55
+ "OKX_SECRET_KEY": "xxx",
56
+ "OKX_PASSPHRASE": "xxx"
57
+ }
58
+ }
59
+ }
60
+ }
61
+ ```
62
+
63
+ Or HTTP mode:
64
+
65
+ ```json
66
+ {
67
+ "mcpServers": {
68
+ "h-mcp": {
69
+ "url": "http://127.0.0.1:3099/mcp"
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ ## Tools (99)
76
+
77
+ ### Phase 1 — Base APIs (95 tools)
78
+
79
+ | Module | Count | Description |
80
+ |--------|:-----:|-------------|
81
+ | Market | 45 | Prices, candles, token info, signals, social |
82
+ | DeFi | 14 | Yield, staking, lending, pool |
83
+ | Trade | 8 | DEX aggregation, quote, swap |
84
+ | Intent | 6 | Intent-based swap + auction |
85
+ | Gateway | 6 | Gas, simulate, broadcast |
86
+ | Payments | 5 | Agent-to-Agent payments (x402) |
87
+ | Balance | 4 | Multi-chain balance |
88
+ | WS | 4 | WebSocket connect/subscribe |
89
+ | TxHistory | 3 | Transaction history |
90
+
91
+ ### Phase 2 — API Composition Skills (4 tools)
92
+
93
+ | Tool | Description |
94
+ |------|-------------|
95
+ | `onchainos_skill_trade_pipeline` | One-shot swap: quote → approve → swap → simulate |
96
+ | `onchainos_skill_risk_detect` | 4-dimension risk scan with 0-100 scoring |
97
+ | `onchainos_skill_smart_slippage` | Volatility-based slippage recommendation |
98
+ | `onchainos_skill_signal_aggregate` | Signal discovery with automatic risk filtering |
99
+
100
+ ## Supported Chains
101
+
102
+ Ethereum, BSC, Polygon, Arbitrum, Base, Optimism, Solana, Sui, TON, Avalanche, Fantom, and 40+ more.
103
+
104
+ ## License
105
+
106
+ MIT