@catalyst-team/poly-sdk 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.
Files changed (244) hide show
  1. package/.env +0 -0
  2. package/README.md +803 -0
  3. package/dist/__tests__/clob-api.test.d.ts +5 -0
  4. package/dist/__tests__/clob-api.test.d.ts.map +1 -0
  5. package/dist/__tests__/clob-api.test.js +240 -0
  6. package/dist/__tests__/clob-api.test.js.map +1 -0
  7. package/dist/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
  8. package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
  9. package/dist/__tests__/integration/bridge-client.integration.test.js +260 -0
  10. package/dist/__tests__/integration/bridge-client.integration.test.js.map +1 -0
  11. package/dist/__tests__/integration/clob-api.integration.test.d.ts +13 -0
  12. package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration/clob-api.integration.test.js +170 -0
  14. package/dist/__tests__/integration/clob-api.integration.test.js.map +1 -0
  15. package/dist/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
  16. package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/integration/ctf-client.integration.test.js +234 -0
  18. package/dist/__tests__/integration/ctf-client.integration.test.js.map +1 -0
  19. package/dist/__tests__/integration/data-api.integration.test.d.ts +9 -0
  20. package/dist/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
  21. package/dist/__tests__/integration/data-api.integration.test.js +161 -0
  22. package/dist/__tests__/integration/data-api.integration.test.js.map +1 -0
  23. package/dist/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
  24. package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
  25. package/dist/__tests__/integration/gamma-api.integration.test.js +170 -0
  26. package/dist/__tests__/integration/gamma-api.integration.test.js.map +1 -0
  27. package/dist/__tests__/test-utils.d.ts +92 -0
  28. package/dist/__tests__/test-utils.d.ts.map +1 -0
  29. package/dist/__tests__/test-utils.js +143 -0
  30. package/dist/__tests__/test-utils.js.map +1 -0
  31. package/dist/clients/bridge-client.d.ts +388 -0
  32. package/dist/clients/bridge-client.d.ts.map +1 -0
  33. package/dist/clients/bridge-client.js +587 -0
  34. package/dist/clients/bridge-client.js.map +1 -0
  35. package/dist/clients/clob-api.d.ts +318 -0
  36. package/dist/clients/clob-api.d.ts.map +1 -0
  37. package/dist/clients/clob-api.js +388 -0
  38. package/dist/clients/clob-api.js.map +1 -0
  39. package/dist/clients/ctf-client.d.ts +473 -0
  40. package/dist/clients/ctf-client.d.ts.map +1 -0
  41. package/dist/clients/ctf-client.js +915 -0
  42. package/dist/clients/ctf-client.js.map +1 -0
  43. package/dist/clients/data-api.d.ts +134 -0
  44. package/dist/clients/data-api.d.ts.map +1 -0
  45. package/dist/clients/data-api.js +265 -0
  46. package/dist/clients/data-api.js.map +1 -0
  47. package/dist/clients/gamma-api.d.ts +401 -0
  48. package/dist/clients/gamma-api.d.ts.map +1 -0
  49. package/dist/clients/gamma-api.js +352 -0
  50. package/dist/clients/gamma-api.js.map +1 -0
  51. package/dist/clients/trading-client.d.ts +252 -0
  52. package/dist/clients/trading-client.d.ts.map +1 -0
  53. package/dist/clients/trading-client.js +543 -0
  54. package/dist/clients/trading-client.js.map +1 -0
  55. package/dist/clients/websocket-manager.d.ts +100 -0
  56. package/dist/clients/websocket-manager.d.ts.map +1 -0
  57. package/dist/clients/websocket-manager.js +193 -0
  58. package/dist/clients/websocket-manager.js.map +1 -0
  59. package/dist/core/cache-adapter-bridge.d.ts +36 -0
  60. package/dist/core/cache-adapter-bridge.d.ts.map +1 -0
  61. package/dist/core/cache-adapter-bridge.js +81 -0
  62. package/dist/core/cache-adapter-bridge.js.map +1 -0
  63. package/dist/core/cache.d.ts +40 -0
  64. package/dist/core/cache.d.ts.map +1 -0
  65. package/dist/core/cache.js +71 -0
  66. package/dist/core/cache.js.map +1 -0
  67. package/dist/core/errors.d.ts +38 -0
  68. package/dist/core/errors.d.ts.map +1 -0
  69. package/dist/core/errors.js +84 -0
  70. package/dist/core/errors.js.map +1 -0
  71. package/dist/core/rate-limiter.d.ts +31 -0
  72. package/dist/core/rate-limiter.d.ts.map +1 -0
  73. package/dist/core/rate-limiter.js +70 -0
  74. package/dist/core/rate-limiter.js.map +1 -0
  75. package/dist/core/types.d.ts +314 -0
  76. package/dist/core/types.d.ts.map +1 -0
  77. package/dist/core/types.js +19 -0
  78. package/dist/core/types.js.map +1 -0
  79. package/dist/core/unified-cache.d.ts +63 -0
  80. package/dist/core/unified-cache.d.ts.map +1 -0
  81. package/dist/core/unified-cache.js +114 -0
  82. package/dist/core/unified-cache.js.map +1 -0
  83. package/dist/index.d.ts +94 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +258 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/mcp/errors.d.ts +33 -0
  88. package/dist/mcp/errors.d.ts.map +1 -0
  89. package/dist/mcp/errors.js +86 -0
  90. package/dist/mcp/errors.js.map +1 -0
  91. package/dist/mcp/index.d.ts +62 -0
  92. package/dist/mcp/index.d.ts.map +1 -0
  93. package/dist/mcp/index.js +173 -0
  94. package/dist/mcp/index.js.map +1 -0
  95. package/dist/mcp/server.d.ts +17 -0
  96. package/dist/mcp/server.d.ts.map +1 -0
  97. package/dist/mcp/server.js +155 -0
  98. package/dist/mcp/server.js.map +1 -0
  99. package/dist/mcp/tools/guide.d.ts +12 -0
  100. package/dist/mcp/tools/guide.d.ts.map +1 -0
  101. package/dist/mcp/tools/guide.js +801 -0
  102. package/dist/mcp/tools/guide.js.map +1 -0
  103. package/dist/mcp/tools/index.d.ts +11 -0
  104. package/dist/mcp/tools/index.d.ts.map +1 -0
  105. package/dist/mcp/tools/index.js +27 -0
  106. package/dist/mcp/tools/index.js.map +1 -0
  107. package/dist/mcp/tools/market.d.ts +11 -0
  108. package/dist/mcp/tools/market.d.ts.map +1 -0
  109. package/dist/mcp/tools/market.js +314 -0
  110. package/dist/mcp/tools/market.js.map +1 -0
  111. package/dist/mcp/tools/order.d.ts +10 -0
  112. package/dist/mcp/tools/order.d.ts.map +1 -0
  113. package/dist/mcp/tools/order.js +258 -0
  114. package/dist/mcp/tools/order.js.map +1 -0
  115. package/dist/mcp/tools/trade.d.ts +38 -0
  116. package/dist/mcp/tools/trade.d.ts.map +1 -0
  117. package/dist/mcp/tools/trade.js +314 -0
  118. package/dist/mcp/tools/trade.js.map +1 -0
  119. package/dist/mcp/tools/trader.d.ts +11 -0
  120. package/dist/mcp/tools/trader.d.ts.map +1 -0
  121. package/dist/mcp/tools/trader.js +277 -0
  122. package/dist/mcp/tools/trader.js.map +1 -0
  123. package/dist/mcp/tools/wallet.d.ts +274 -0
  124. package/dist/mcp/tools/wallet.d.ts.map +1 -0
  125. package/dist/mcp/tools/wallet.js +579 -0
  126. package/dist/mcp/tools/wallet.js.map +1 -0
  127. package/dist/mcp/types.d.ts +413 -0
  128. package/dist/mcp/types.d.ts.map +1 -0
  129. package/dist/mcp/types.js +5 -0
  130. package/dist/mcp/types.js.map +1 -0
  131. package/dist/services/authorization-service.d.ts +97 -0
  132. package/dist/services/authorization-service.d.ts.map +1 -0
  133. package/dist/services/authorization-service.js +279 -0
  134. package/dist/services/authorization-service.js.map +1 -0
  135. package/dist/services/market-service.d.ts +108 -0
  136. package/dist/services/market-service.d.ts.map +1 -0
  137. package/dist/services/market-service.js +458 -0
  138. package/dist/services/market-service.js.map +1 -0
  139. package/dist/services/realtime-service.d.ts +82 -0
  140. package/dist/services/realtime-service.d.ts.map +1 -0
  141. package/dist/services/realtime-service.js +150 -0
  142. package/dist/services/realtime-service.js.map +1 -0
  143. package/dist/services/swap-service.d.ts +217 -0
  144. package/dist/services/swap-service.d.ts.map +1 -0
  145. package/dist/services/swap-service.js +695 -0
  146. package/dist/services/swap-service.js.map +1 -0
  147. package/dist/services/wallet-service.d.ts +94 -0
  148. package/dist/services/wallet-service.d.ts.map +1 -0
  149. package/dist/services/wallet-service.js +173 -0
  150. package/dist/services/wallet-service.js.map +1 -0
  151. package/dist/utils/price-utils.d.ts +153 -0
  152. package/dist/utils/price-utils.d.ts.map +1 -0
  153. package/dist/utils/price-utils.js +236 -0
  154. package/dist/utils/price-utils.js.map +1 -0
  155. package/docs/00-design.md +760 -0
  156. package/docs/01-mcp.md +2041 -0
  157. package/docs/02-API.md +1148 -0
  158. package/docs/e2e/01-trader-tools.md +159 -0
  159. package/docs/e2e/02-market-tools.md +180 -0
  160. package/docs/e2e/03-order-tools.md +166 -0
  161. package/docs/e2e/04-wallet-tools.md +224 -0
  162. package/docs/e2e/05-trading-tools.md +327 -0
  163. package/docs/e2e/06-integration-scenarios.md +481 -0
  164. package/docs/e2e/coordinator.md +376 -0
  165. package/examples/01-basic-usage.ts +68 -0
  166. package/examples/02-smart-money.ts +95 -0
  167. package/examples/03-market-analysis.ts +108 -0
  168. package/examples/04-kline-aggregation.ts +158 -0
  169. package/examples/05-follow-wallet-strategy.ts +156 -0
  170. package/examples/06-services-demo.ts +124 -0
  171. package/examples/07-realtime-websocket.ts +117 -0
  172. package/examples/08-trading-orders.ts +278 -0
  173. package/examples/09-rewards-tracking.ts +187 -0
  174. package/examples/10-ctf-operations.ts +336 -0
  175. package/examples/11-live-arbitrage-scan.ts +221 -0
  176. package/examples/12-trending-arb-monitor.ts +406 -0
  177. package/examples/README.md +179 -0
  178. package/package.json +62 -0
  179. package/scripts/README.md +163 -0
  180. package/scripts/approvals/approve-erc1155.ts +129 -0
  181. package/scripts/approvals/approve-neg-risk-erc1155.ts +149 -0
  182. package/scripts/approvals/approve-neg-risk.ts +102 -0
  183. package/scripts/approvals/check-all-allowances.ts +150 -0
  184. package/scripts/approvals/check-allowance.ts +129 -0
  185. package/scripts/approvals/check-ctf-approval.ts +158 -0
  186. package/scripts/datas/001-report.md +486 -0
  187. package/scripts/datas/clone-modal-screenshot.png +0 -0
  188. package/scripts/deposit/deposit-native-usdc.ts +179 -0
  189. package/scripts/deposit/deposit-usdc.ts +155 -0
  190. package/scripts/deposit/swap-usdc-to-usdce.ts +375 -0
  191. package/scripts/research/research-markets.ts +166 -0
  192. package/scripts/trading/check-orders.ts +50 -0
  193. package/scripts/trading/sell-nvidia-positions.ts +206 -0
  194. package/scripts/trading/test-order.ts +172 -0
  195. package/scripts/truth.md +440 -0
  196. package/scripts/verify/test-approve-trading.ts +98 -0
  197. package/scripts/verify/test-provider-fix.ts +43 -0
  198. package/scripts/verify/test-search-mcp.ts +113 -0
  199. package/scripts/verify/verify-all-apis.ts +160 -0
  200. package/scripts/wallet/check-wallet-balances.ts +75 -0
  201. package/scripts/wallet/test-wallet-operations.ts +191 -0
  202. package/scripts/wallet/verify-wallet-tools.ts +124 -0
  203. package/src/__tests__/clob-api.test.ts +301 -0
  204. package/src/__tests__/integration/bridge-client.integration.test.ts +314 -0
  205. package/src/__tests__/integration/clob-api.integration.test.ts +218 -0
  206. package/src/__tests__/integration/ctf-client.integration.test.ts +331 -0
  207. package/src/__tests__/integration/data-api.integration.test.ts +194 -0
  208. package/src/__tests__/integration/gamma-api.integration.test.ts +206 -0
  209. package/src/__tests__/test-utils.ts +170 -0
  210. package/src/clients/bridge-client.ts +841 -0
  211. package/src/clients/clob-api.ts +629 -0
  212. package/src/clients/ctf-client.ts +1216 -0
  213. package/src/clients/data-api.ts +469 -0
  214. package/src/clients/gamma-api.ts +597 -0
  215. package/src/clients/trading-client.ts +749 -0
  216. package/src/clients/websocket-manager.ts +267 -0
  217. package/src/core/cache-adapter-bridge.ts +94 -0
  218. package/src/core/cache.ts +85 -0
  219. package/src/core/errors.ts +117 -0
  220. package/src/core/rate-limiter.ts +74 -0
  221. package/src/core/types.ts +360 -0
  222. package/src/core/unified-cache.ts +153 -0
  223. package/src/index.ts +455 -0
  224. package/src/mcp/README.md +380 -0
  225. package/src/mcp/errors.ts +124 -0
  226. package/src/mcp/index.ts +309 -0
  227. package/src/mcp/server.ts +183 -0
  228. package/src/mcp/tools/guide.ts +821 -0
  229. package/src/mcp/tools/index.ts +73 -0
  230. package/src/mcp/tools/market.ts +363 -0
  231. package/src/mcp/tools/order.ts +326 -0
  232. package/src/mcp/tools/trade.ts +417 -0
  233. package/src/mcp/tools/trader.ts +322 -0
  234. package/src/mcp/tools/wallet.ts +683 -0
  235. package/src/mcp/types.ts +472 -0
  236. package/src/services/authorization-service.ts +357 -0
  237. package/src/services/market-service.ts +544 -0
  238. package/src/services/realtime-service.ts +196 -0
  239. package/src/services/swap-service.ts +896 -0
  240. package/src/services/wallet-service.ts +259 -0
  241. package/src/utils/price-utils.ts +307 -0
  242. package/tsconfig.json +8 -0
  243. package/vitest.config.ts +19 -0
  244. package/vitest.integration.config.ts +18 -0
package/docs/01-mcp.md ADDED
@@ -0,0 +1,2041 @@
1
+ # Poly-SDK MCP Server Design
2
+
3
+ > Product-First Thinking: 先验证 API 返回什么,再设计工具
4
+
5
+ ## 1. 功能本质
6
+
7
+ **用户目标**: AI Agent 能够查询 Polymarket 数据并执行交易
8
+ **一句话**: 这是让 AI 访问预测市场的工具集
9
+ **成功标准**: Agent 能回答 "这个钱包表现如何?" "这个市场什么价?" "帮我下单买 YES"
10
+
11
+ ---
12
+
13
+ ## 2. API 能力验证(真实数据)
14
+
15
+ ### 2.1 Positions API
16
+
17
+ ```bash
18
+ GET https://data-api.polymarket.com/positions?user={address}
19
+ ```
20
+
21
+ **实际返回字段**:
22
+ ```json
23
+ {
24
+ "proxyWallet": "0xc2e7800b...",
25
+ "conditionId": "0x39e493c3...",
26
+ "title": "Spread: Grizzlies (-12.5)",
27
+ "slug": "nba-was-mem-2025-12-20-spread-home-12pt5",
28
+ "outcome": "Wizards",
29
+ "outcomeIndex": 1,
30
+ "size": 1346825.46,
31
+ "avgPrice": 0.520337,
32
+ "curPrice": 1,
33
+ "initialValue": 700803.12,
34
+ "currentValue": 1346825.46,
35
+ "cashPnl": 646022.34,
36
+ "percentPnl": 92.18,
37
+ "realizedPnl": 0,
38
+ "redeemable": true,
39
+ "endDate": "2025-12-21"
40
+ }
41
+ ```
42
+
43
+ ### 2.2 Activity API
44
+
45
+ ```bash
46
+ GET https://data-api.polymarket.com/activity?user={address}&limit=N
47
+ ```
48
+
49
+ **实际返回字段**:
50
+ ```json
51
+ {
52
+ "proxyWallet": "0xc2e7800b...",
53
+ "type": "TRADE",
54
+ "side": "BUY",
55
+ "conditionId": "0x39e493c3...",
56
+ "title": "Spread: Grizzlies (-12.5)",
57
+ "outcome": "Wizards",
58
+ "size": 17307.69,
59
+ "price": 0.52,
60
+ "usdcSize": 9000,
61
+ "timestamp": 1766278645,
62
+ "transactionHash": "0x5fd43582..."
63
+ }
64
+ ```
65
+
66
+ ### 2.3 Leaderboard API
67
+
68
+ ```bash
69
+ GET https://data-api.polymarket.com/v1/leaderboard?limit=N
70
+ ```
71
+
72
+ **实际返回字段**:
73
+ ```json
74
+ {
75
+ "rank": "1",
76
+ "proxyWallet": "0xc2e7800b...",
77
+ "userName": "beachboy4",
78
+ "xUsername": "",
79
+ "verifiedBadge": false,
80
+ "vol": 1346825.46,
81
+ "pnl": 802943.86,
82
+ "profileImage": ""
83
+ }
84
+ ```
85
+
86
+ ### 2.4 Gamma Market API
87
+
88
+ ```bash
89
+ GET https://gamma-api.polymarket.com/markets?slug={slug}
90
+ ```
91
+
92
+ **实际返回字段**:
93
+ ```json
94
+ {
95
+ "conditionId": "0xfa48a993...",
96
+ "question": "US recession in 2025?",
97
+ "slug": "us-recession-in-2025",
98
+ "description": "This market will resolve to...",
99
+ "outcomePrices": "[\"0.0065\", \"0.9935\"]",
100
+ "volume": "11010561.19",
101
+ "liquidity": "110917.70",
102
+ "spread": 0.001,
103
+ "active": true,
104
+ "closed": false,
105
+ "endDate": "2025-12-31T12:00:00Z"
106
+ }
107
+ ```
108
+
109
+ ### 2.5 CLOB Market API
110
+
111
+ ```bash
112
+ GET https://clob.polymarket.com/markets/{conditionId}
113
+ ```
114
+
115
+ **实际返回字段**:
116
+ ```json
117
+ {
118
+ "question": "US recession in 2025?",
119
+ "tokens": [
120
+ { "token_id": "10417...", "outcome": "Yes", "price": 0.0065 },
121
+ { "token_id": "44528...", "outcome": "No", "price": 0.9935 }
122
+ ],
123
+ "active": true,
124
+ "closed": false,
125
+ "minimum_tick_size": 0.001,
126
+ "minimum_order_size": 5
127
+ }
128
+ ```
129
+
130
+ ### 2.6 Orderbook API
131
+
132
+ ```bash
133
+ GET https://clob.polymarket.com/book?token_id={tokenId}
134
+ ```
135
+
136
+ **实际返回字段**:
137
+ ```json
138
+ {
139
+ "market": "0xfa48a993...",
140
+ "asset_id": "10417...",
141
+ "bids": [{ "price": "0.001", "size": "128351" }],
142
+ "asks": [{ "price": "0.999", "size": "3103559" }]
143
+ }
144
+ ```
145
+
146
+ ### 2.7 Trades API
147
+
148
+ ```bash
149
+ GET https://data-api.polymarket.com/trades?market={conditionId}
150
+ ```
151
+
152
+ **实际返回字段**:
153
+ ```json
154
+ {
155
+ "proxyWallet": "0xdb07e53d...",
156
+ "side": "SELL",
157
+ "conditionId": "0xfa48a993...",
158
+ "title": "US recession in 2025?",
159
+ "outcome": "Yes",
160
+ "size": 142.85,
161
+ "price": 0.006,
162
+ "timestamp": 1766318459,
163
+ "transactionHash": "0x85b3dcd4..."
164
+ }
165
+ ```
166
+
167
+ ---
168
+
169
+ ## 3. 工具分类
170
+
171
+ 基于实际 API 能力,分为 **5 类工具**:
172
+
173
+ | 类别 | 核心问题 | 数据来源 |
174
+ |------|----------|----------|
175
+ | **Trader Tools** | "这个交易者怎么样?" | Data API |
176
+ | **Market Tools** | "这个市场什么情况?" | Gamma + CLOB |
177
+ | **Order Tools** | "盘口深度如何?" | CLOB |
178
+ | **Trade Tools** | "帮我交易" | Trading Client |
179
+ | **Wallet Tools** | "如何充值和授权?" | Bridge API + 合约调用 |
180
+
181
+ ### 分类说明
182
+
183
+ - **Trader Tools**: 分析交易者的持仓、交易记录、排名(公开数据)
184
+ - **Wallet Tools**: 管理用户自己钱包的充值和授权(需要私钥)
185
+
186
+ ---
187
+
188
+ ## 4. Trader Tools(交易者分析)
189
+
190
+ ### 工具列表
191
+
192
+ | Tool | 用户问题 | 返回 |
193
+ |------|----------|------|
194
+ | `get_trader_positions` | "他持有什么仓位?" | 持仓列表 + PnL |
195
+ | `get_trader_trades` | "他最近交易了什么?" | 交易历史 |
196
+ | `get_trader_profile` | "他是什么水平?" | 综合分析 |
197
+ | `get_leaderboard` | "谁是顶级交易者?" | 排行榜 |
198
+
199
+ ### 4.1 `get_trader_positions`
200
+
201
+ **用户场景**: "0xc2e7800b 这个钱包持有什么仓位?赚了多少?"
202
+
203
+ **MCP Tool Definition**:
204
+ ```json
205
+ {
206
+ "name": "get_trader_positions",
207
+ "description": "Get all positions held by a trader with PnL breakdown",
208
+ "inputSchema": {
209
+ "type": "object",
210
+ "properties": {
211
+ "address": {
212
+ "type": "string",
213
+ "description": "Trader wallet address (0x...)"
214
+ }
215
+ },
216
+ "required": ["address"]
217
+ }
218
+ }
219
+ ```
220
+
221
+ **Input**:
222
+ ```json
223
+ {
224
+ "address": "0xc2e7800b5af46e6093872b177b7a5e7f0563be51"
225
+ }
226
+ ```
227
+
228
+ **Output** (基于真实 API):
229
+ ```json
230
+ {
231
+ "trader": {
232
+ "address": "0xc2e7800b...",
233
+ "displayName": "beachboy4"
234
+ },
235
+ "positions": [
236
+ {
237
+ "market": {
238
+ "conditionId": "0x39e493c3...",
239
+ "title": "Spread: Grizzlies (-12.5)",
240
+ "slug": "nba-was-mem-2025-12-20-spread-home-12pt5"
241
+ },
242
+ "holding": {
243
+ "outcome": "Wizards",
244
+ "size": 1346825.46,
245
+ "avgPrice": 0.52,
246
+ "curPrice": 1.00
247
+ },
248
+ "pnl": {
249
+ "unrealized": 646022.34,
250
+ "unrealizedPercent": 92.18,
251
+ "realized": 0
252
+ },
253
+ "status": {
254
+ "redeemable": true,
255
+ "endDate": "2025-12-21"
256
+ }
257
+ }
258
+ ],
259
+ "summary": {
260
+ "totalPositions": 5,
261
+ "totalUnrealizedPnl": 1192449.91,
262
+ "totalRealizedPnl": 0,
263
+ "winningPositions": 4,
264
+ "losingPositions": 1
265
+ }
266
+ }
267
+ ```
268
+
269
+ ### 4.2 `get_trader_trades`
270
+
271
+ **用户场景**: "他最近买了什么?卖了什么?"
272
+
273
+ **MCP Tool Definition**:
274
+ ```json
275
+ {
276
+ "name": "get_trader_trades",
277
+ "description": "Get recent trading activity for a trader",
278
+ "inputSchema": {
279
+ "type": "object",
280
+ "properties": {
281
+ "address": {
282
+ "type": "string",
283
+ "description": "Trader wallet address"
284
+ },
285
+ "limit": {
286
+ "type": "number",
287
+ "description": "Maximum number of trades to return",
288
+ "default": 20
289
+ },
290
+ "side": {
291
+ "type": "string",
292
+ "enum": ["BUY", "SELL"],
293
+ "description": "Filter by trade side"
294
+ }
295
+ },
296
+ "required": ["address"]
297
+ }
298
+ }
299
+ ```
300
+
301
+ **Input**:
302
+ ```json
303
+ {
304
+ "address": "0xc2e7800b...",
305
+ "limit": 20,
306
+ "side": "BUY"
307
+ }
308
+ ```
309
+
310
+ **Output**:
311
+ ```json
312
+ {
313
+ "trader": {
314
+ "address": "0xc2e7800b...",
315
+ "displayName": "beachboy4"
316
+ },
317
+ "trades": [
318
+ {
319
+ "type": "TRADE",
320
+ "side": "BUY",
321
+ "market": {
322
+ "conditionId": "0x39e493c3...",
323
+ "title": "Spread: Grizzlies (-12.5)"
324
+ },
325
+ "outcome": "Wizards",
326
+ "execution": {
327
+ "size": 17307.69,
328
+ "price": 0.52,
329
+ "usdcValue": 9000
330
+ },
331
+ "timestamp": "2025-12-20T15:30:45Z",
332
+ "txHash": "0x5fd43582..."
333
+ }
334
+ ],
335
+ "summary": {
336
+ "totalTrades": 20,
337
+ "buyCount": 15,
338
+ "sellCount": 5,
339
+ "buyVolume": 50000,
340
+ "sellVolume": 10000
341
+ }
342
+ }
343
+ ```
344
+
345
+ ### 4.3 `get_trader_profile`
346
+
347
+ **用户场景**: "这个人厉害吗?值得跟单吗?"
348
+
349
+ **MCP Tool Definition**:
350
+ ```json
351
+ {
352
+ "name": "get_trader_profile",
353
+ "description": "Get comprehensive trader profile with performance metrics",
354
+ "inputSchema": {
355
+ "type": "object",
356
+ "properties": {
357
+ "address": {
358
+ "type": "string",
359
+ "description": "Trader wallet address"
360
+ }
361
+ },
362
+ "required": ["address"]
363
+ }
364
+ }
365
+ ```
366
+
367
+ **Input**:
368
+ ```json
369
+ {
370
+ "address": "0xc2e7800b..."
371
+ }
372
+ ```
373
+
374
+ **Output**:
375
+ ```json
376
+ {
377
+ "trader": {
378
+ "address": "0xc2e7800b...",
379
+ "displayName": "beachboy4",
380
+ "xUsername": null,
381
+ "verified": false,
382
+ "profileImage": null
383
+ },
384
+ "ranking": {
385
+ "rank": 1,
386
+ "totalTraders": 10000
387
+ },
388
+ "performance": {
389
+ "officialPnl": 802943.86,
390
+ "totalVolume": 1346825.46,
391
+ "unrealizedPnl": 1192449.91,
392
+ "realizedPnl": 0
393
+ },
394
+ "stats": {
395
+ "positionCount": 5,
396
+ "winRate": 0.80,
397
+ "avgPercentPnl": 92.18,
398
+ "smartScore": 85
399
+ },
400
+ "activity": {
401
+ "lastTradeAt": "2025-12-20T15:30:45Z",
402
+ "isActive": true
403
+ }
404
+ }
405
+ ```
406
+
407
+ ### 4.4 `get_leaderboard`
408
+
409
+ **用户场景**: "谁是最赚钱的交易者?"
410
+
411
+ **MCP Tool Definition**:
412
+ ```json
413
+ {
414
+ "name": "get_leaderboard",
415
+ "description": "Get top traders by PnL",
416
+ "inputSchema": {
417
+ "type": "object",
418
+ "properties": {
419
+ "limit": {
420
+ "type": "number",
421
+ "description": "Number of traders to return",
422
+ "default": 10
423
+ },
424
+ "offset": {
425
+ "type": "number",
426
+ "description": "Pagination offset",
427
+ "default": 0
428
+ }
429
+ }
430
+ }
431
+ }
432
+ ```
433
+
434
+ **Input**:
435
+ ```json
436
+ {
437
+ "limit": 10,
438
+ "offset": 0
439
+ }
440
+ ```
441
+
442
+ **Output**:
443
+ ```json
444
+ {
445
+ "traders": [
446
+ {
447
+ "rank": 1,
448
+ "address": "0xc2e7800b...",
449
+ "displayName": "beachboy4",
450
+ "pnl": 802943.86,
451
+ "volume": 1346825.46,
452
+ "verified": false
453
+ }
454
+ ],
455
+ "pagination": {
456
+ "total": 10000,
457
+ "offset": 0,
458
+ "limit": 10
459
+ }
460
+ }
461
+ ```
462
+
463
+ ---
464
+
465
+ ## 5. Market Tools(市场查询)
466
+
467
+ ### 工具列表
468
+
469
+ | Tool | 用户问题 | 返回 |
470
+ |------|----------|------|
471
+ | `get_market` | "这个市场什么情况?" | 市场详情 |
472
+ | `search_markets` | "有什么关于 XX 的市场?" | 搜索结果 |
473
+ | `get_trending_markets` | "现在什么市场热门?" | 热门列表 |
474
+ | `get_market_trades` | "这个市场最近成交如何?" | 成交记录 |
475
+
476
+ ### 5.1 `get_market`
477
+
478
+ **用户场景**: "US recession 2025 这个市场现在什么价?"
479
+
480
+ **MCP Tool Definition**:
481
+ ```json
482
+ {
483
+ "name": "get_market",
484
+ "description": "Get market details including prices, volume, and status",
485
+ "inputSchema": {
486
+ "type": "object",
487
+ "properties": {
488
+ "identifier": {
489
+ "type": "string",
490
+ "description": "Market slug (e.g., 'us-recession-in-2025') or conditionId (0x...)"
491
+ }
492
+ },
493
+ "required": ["identifier"]
494
+ }
495
+ }
496
+ ```
497
+
498
+ **Input**:
499
+ ```json
500
+ {
501
+ "identifier": "us-recession-in-2025"
502
+ }
503
+ ```
504
+
505
+ **Output**:
506
+ ```json
507
+ {
508
+ "market": {
509
+ "conditionId": "0xfa48a993...",
510
+ "question": "US recession in 2025?",
511
+ "slug": "us-recession-in-2025",
512
+ "description": "This market will resolve to..."
513
+ },
514
+ "prices": {
515
+ "yes": 0.0065,
516
+ "no": 0.9935,
517
+ "spread": 0.001
518
+ },
519
+ "tokens": {
520
+ "yes": { "tokenId": "10417...", "price": 0.0065 },
521
+ "no": { "tokenId": "44528...", "price": 0.9935 }
522
+ },
523
+ "stats": {
524
+ "volume": 11010561.19,
525
+ "liquidity": 110917.70
526
+ },
527
+ "status": {
528
+ "active": true,
529
+ "closed": false,
530
+ "acceptingOrders": true,
531
+ "endDate": "2025-12-31T12:00:00Z"
532
+ },
533
+ "trading": {
534
+ "minTickSize": 0.001,
535
+ "minOrderSize": 5
536
+ }
537
+ }
538
+ ```
539
+
540
+ ### 5.2 `search_markets`
541
+
542
+ **用户场景**: "有什么关于 Trump 的市场?"
543
+
544
+ **实现说明**: Gamma API 不支持服务端文本搜索,所以我们获取活跃市场后在客户端过滤。搜索结果按 24h 交易量排序,精确匹配短语优先。
545
+
546
+ **MCP Tool Definition**:
547
+ ```json
548
+ {
549
+ "name": "search_markets",
550
+ "description": "Search for markets by keyword. Searches in question text and slug. Returns markets sorted by 24h volume.",
551
+ "inputSchema": {
552
+ "type": "object",
553
+ "properties": {
554
+ "query": {
555
+ "type": "string",
556
+ "description": "Search keyword (e.g., 'Trump', 'Bitcoin', 'recession'). Multi-word queries match any word."
557
+ },
558
+ "active": {
559
+ "type": "boolean",
560
+ "description": "Only return active markets",
561
+ "default": true
562
+ },
563
+ "limit": {
564
+ "type": "number",
565
+ "description": "Maximum results",
566
+ "default": 10
567
+ }
568
+ },
569
+ "required": ["query"]
570
+ }
571
+ }
572
+ ```
573
+
574
+ **Input**:
575
+ ```json
576
+ {
577
+ "query": "Trump",
578
+ "active": true,
579
+ "limit": 5
580
+ }
581
+ ```
582
+
583
+ **Output** (真实数据验证 - 2024-12-22):
584
+ ```json
585
+ {
586
+ "markets": [
587
+ {
588
+ "conditionId": "0xac9c6628a5398bb2a06f566854270a9fbc7f2badec4329d3b5fdc1407291c35b",
589
+ "question": "Will Trump release the Epstein files by December 19?",
590
+ "slug": "will-trump-release-the-epstein-files-by-december-19-771",
591
+ "prices": { "yes": 0.9975, "no": 0.0025 },
592
+ "volume": 67321563.56,
593
+ "volume24h": 22684085.39
594
+ },
595
+ {
596
+ "conditionId": "0x8e6ff03d48ea73396ca8c8eac6a8cada2a7507545a78901c4769776be351eaf5",
597
+ "question": "Will Trump release the Epstein files by December 22?",
598
+ "slug": "will-trump-release-the-epstein-files-by-december-22",
599
+ "prices": { "yes": 0.125, "no": 0.875 },
600
+ "volume": 173550.94,
601
+ "volume24h": 123824.96,
602
+ "endDate": "2025-12-26T00:00:00.000Z"
603
+ }
604
+ ],
605
+ "total": 41
606
+ }
607
+ ```
608
+
609
+ ### 5.3 `get_trending_markets`
610
+
611
+ **用户场景**: "现在什么市场交易量大?"
612
+
613
+ **MCP Tool Definition**:
614
+ ```json
615
+ {
616
+ "name": "get_trending_markets",
617
+ "description": "Get trending markets sorted by volume or liquidity",
618
+ "inputSchema": {
619
+ "type": "object",
620
+ "properties": {
621
+ "limit": {
622
+ "type": "number",
623
+ "default": 10
624
+ },
625
+ "sortBy": {
626
+ "type": "string",
627
+ "enum": ["volume", "liquidity", "newest"],
628
+ "default": "volume"
629
+ }
630
+ }
631
+ }
632
+ }
633
+ ```
634
+
635
+ **Input**:
636
+ ```json
637
+ {
638
+ "limit": 10,
639
+ "sortBy": "volume"
640
+ }
641
+ ```
642
+
643
+ **Output**:
644
+ ```json
645
+ {
646
+ "markets": [
647
+ {
648
+ "conditionId": "0x...",
649
+ "question": "...",
650
+ "volume24h": 1000000,
651
+ "priceChange24h": 0.05,
652
+ "prices": { "yes": 0.65, "no": 0.35 }
653
+ }
654
+ ]
655
+ }
656
+ ```
657
+
658
+ ### 5.4 `get_market_trades`
659
+
660
+ **用户场景**: "这个市场最近有什么大单?"
661
+
662
+ **MCP Tool Definition**:
663
+ ```json
664
+ {
665
+ "name": "get_market_trades",
666
+ "description": "Get recent trades for a specific market",
667
+ "inputSchema": {
668
+ "type": "object",
669
+ "properties": {
670
+ "conditionId": {
671
+ "type": "string",
672
+ "description": "Market condition ID"
673
+ },
674
+ "limit": {
675
+ "type": "number",
676
+ "default": 20
677
+ }
678
+ },
679
+ "required": ["conditionId"]
680
+ }
681
+ }
682
+ ```
683
+
684
+ **Input**:
685
+ ```json
686
+ {
687
+ "conditionId": "0xfa48a993...",
688
+ "limit": 20
689
+ }
690
+ ```
691
+
692
+ **Output**:
693
+ ```json
694
+ {
695
+ "market": {
696
+ "conditionId": "0xfa48a993...",
697
+ "question": "US recession in 2025?"
698
+ },
699
+ "trades": [
700
+ {
701
+ "trader": "0xdb07e53d...",
702
+ "traderName": "dontletmecook",
703
+ "side": "SELL",
704
+ "outcome": "Yes",
705
+ "size": 142.85,
706
+ "price": 0.006,
707
+ "timestamp": "2025-12-21T08:20:59Z"
708
+ }
709
+ ],
710
+ "summary": {
711
+ "buyVolume24h": 50000,
712
+ "sellVolume24h": 30000,
713
+ "netFlow": 20000
714
+ }
715
+ }
716
+ ```
717
+
718
+ ---
719
+
720
+ ## 6. Order Tools(订单簿分析)
721
+
722
+ ### 工具列表
723
+
724
+ | Tool | 用户问题 | 返回 |
725
+ |------|----------|------|
726
+ | `get_orderbook` | "盘口深度如何?" | 买卖盘 |
727
+ | `get_best_prices` | "现在最好的价格是?" | 最优价格 |
728
+ | `estimate_execution` | "我买 1000 USDC 会成交在什么价?" | 成交预估 |
729
+
730
+ ### 6.1 `get_orderbook`
731
+
732
+ **用户场景**: "这个市场的盘口深度怎么样?"
733
+
734
+ **MCP Tool Definition**:
735
+ ```json
736
+ {
737
+ "name": "get_orderbook",
738
+ "description": "Get orderbook depth for a market outcome",
739
+ "inputSchema": {
740
+ "type": "object",
741
+ "properties": {
742
+ "conditionId": {
743
+ "type": "string",
744
+ "description": "Market condition ID"
745
+ },
746
+ "outcome": {
747
+ "type": "string",
748
+ "enum": ["Yes", "No"],
749
+ "description": "Which outcome's orderbook to fetch"
750
+ },
751
+ "depth": {
752
+ "type": "number",
753
+ "description": "Number of price levels",
754
+ "default": 10
755
+ }
756
+ },
757
+ "required": ["conditionId", "outcome"]
758
+ }
759
+ }
760
+ ```
761
+
762
+ **Input**:
763
+ ```json
764
+ {
765
+ "conditionId": "0xfa48a993...",
766
+ "outcome": "Yes",
767
+ "depth": 10
768
+ }
769
+ ```
770
+
771
+ **Output**:
772
+ ```json
773
+ {
774
+ "market": {
775
+ "conditionId": "0xfa48a993...",
776
+ "question": "US recession in 2025?"
777
+ },
778
+ "outcome": "Yes",
779
+ "tokenId": "10417...",
780
+ "orderbook": {
781
+ "bids": [
782
+ { "price": 0.006, "size": 128351, "total": 770.11 },
783
+ { "price": 0.005, "size": 51922, "total": 259.61 }
784
+ ],
785
+ "asks": [
786
+ { "price": 0.007, "size": 100000, "total": 700.00 },
787
+ { "price": 0.008, "size": 50000, "total": 400.00 }
788
+ ]
789
+ },
790
+ "summary": {
791
+ "bestBid": 0.006,
792
+ "bestAsk": 0.007,
793
+ "spread": 0.001,
794
+ "spreadPercent": 14.29,
795
+ "bidDepth": 180273,
796
+ "askDepth": 150000
797
+ }
798
+ }
799
+ ```
800
+
801
+ ### 6.2 `get_best_prices`
802
+
803
+ **用户场景**: "YES 现在什么价能买到?"
804
+
805
+ **MCP Tool Definition**:
806
+ ```json
807
+ {
808
+ "name": "get_best_prices",
809
+ "description": "Get best bid/ask prices for both outcomes",
810
+ "inputSchema": {
811
+ "type": "object",
812
+ "properties": {
813
+ "conditionId": {
814
+ "type": "string",
815
+ "description": "Market condition ID"
816
+ }
817
+ },
818
+ "required": ["conditionId"]
819
+ }
820
+ }
821
+ ```
822
+
823
+ **Input**:
824
+ ```json
825
+ {
826
+ "conditionId": "0xfa48a993..."
827
+ }
828
+ ```
829
+
830
+ **Output**:
831
+ ```json
832
+ {
833
+ "market": "US recession in 2025?",
834
+ "yes": {
835
+ "bestBid": 0.006,
836
+ "bestAsk": 0.007,
837
+ "midPrice": 0.0065,
838
+ "spread": 0.001
839
+ },
840
+ "no": {
841
+ "bestBid": 0.993,
842
+ "bestAsk": 0.994,
843
+ "midPrice": 0.9935,
844
+ "spread": 0.001
845
+ }
846
+ }
847
+ ```
848
+
849
+ ### 6.3 `estimate_execution`
850
+
851
+ **用户场景**: "如果我花 1000 USDC 买 YES,平均成交价是多少?"
852
+
853
+ **MCP Tool Definition**:
854
+ ```json
855
+ {
856
+ "name": "estimate_execution",
857
+ "description": "Estimate execution price and slippage for a trade",
858
+ "inputSchema": {
859
+ "type": "object",
860
+ "properties": {
861
+ "conditionId": {
862
+ "type": "string"
863
+ },
864
+ "outcome": {
865
+ "type": "string",
866
+ "enum": ["Yes", "No"]
867
+ },
868
+ "side": {
869
+ "type": "string",
870
+ "enum": ["BUY", "SELL"]
871
+ },
872
+ "amount": {
873
+ "type": "number",
874
+ "description": "Amount in USDC"
875
+ }
876
+ },
877
+ "required": ["conditionId", "outcome", "side", "amount"]
878
+ }
879
+ }
880
+ ```
881
+
882
+ **Input**:
883
+ ```json
884
+ {
885
+ "conditionId": "0xfa48a993...",
886
+ "outcome": "Yes",
887
+ "side": "BUY",
888
+ "amount": 1000
889
+ }
890
+ ```
891
+
892
+ **Output**:
893
+ ```json
894
+ {
895
+ "market": "US recession in 2025?",
896
+ "order": {
897
+ "side": "BUY",
898
+ "outcome": "Yes",
899
+ "usdcAmount": 1000
900
+ },
901
+ "estimate": {
902
+ "avgPrice": 0.0072,
903
+ "sharesReceived": 138889,
904
+ "priceImpact": 0.03,
905
+ "worstPrice": 0.008
906
+ },
907
+ "warning": null
908
+ }
909
+ ```
910
+
911
+ ---
912
+
913
+ ## 7. Trade Tools(交易执行)
914
+
915
+ ### 工具列表
916
+
917
+ | Tool | 用户问题 | 需要 |
918
+ |------|----------|------|
919
+ | `place_limit_order` | "帮我挂单买 YES" | API Key |
920
+ | `place_market_order` | "帮我市价买入" | API Key |
921
+ | `cancel_order` | "取消这个订单" | API Key |
922
+ | `get_my_orders` | "我有什么挂单?" | API Key |
923
+
924
+ ### 7.1 `place_limit_order`
925
+
926
+ **用户场景**: "帮我在 0.50 买入 100 股 YES"
927
+
928
+ **MCP Tool Definition**:
929
+ ```json
930
+ {
931
+ "name": "place_limit_order",
932
+ "description": "Place a limit order on a market",
933
+ "inputSchema": {
934
+ "type": "object",
935
+ "properties": {
936
+ "conditionId": {
937
+ "type": "string"
938
+ },
939
+ "outcome": {
940
+ "type": "string",
941
+ "enum": ["Yes", "No"]
942
+ },
943
+ "side": {
944
+ "type": "string",
945
+ "enum": ["BUY", "SELL"]
946
+ },
947
+ "price": {
948
+ "type": "number",
949
+ "description": "Limit price (0.001 to 0.999)"
950
+ },
951
+ "size": {
952
+ "type": "number",
953
+ "description": "Number of shares"
954
+ },
955
+ "orderType": {
956
+ "type": "string",
957
+ "enum": ["GTC", "GTD"],
958
+ "default": "GTC"
959
+ }
960
+ },
961
+ "required": ["conditionId", "outcome", "side", "price", "size"]
962
+ }
963
+ }
964
+ ```
965
+
966
+ **Input**:
967
+ ```json
968
+ {
969
+ "conditionId": "0xfa48a993...",
970
+ "outcome": "Yes",
971
+ "side": "BUY",
972
+ "price": 0.50,
973
+ "size": 100,
974
+ "orderType": "GTC"
975
+ }
976
+ ```
977
+
978
+ **Output**:
979
+ ```json
980
+ {
981
+ "success": true,
982
+ "order": {
983
+ "orderId": "0x123...",
984
+ "status": "LIVE",
985
+ "tokenId": "10417...",
986
+ "side": "BUY",
987
+ "price": 0.50,
988
+ "size": 100,
989
+ "filled": 0,
990
+ "createdAt": "2025-12-21T10:00:00Z"
991
+ }
992
+ }
993
+ ```
994
+
995
+ ### 7.2 `place_market_order`
996
+
997
+ **用户场景**: "帮我用 500 USDC 市价买入 YES"
998
+
999
+ **MCP Tool Definition**:
1000
+ ```json
1001
+ {
1002
+ "name": "place_market_order",
1003
+ "description": "Place a market order on a market",
1004
+ "inputSchema": {
1005
+ "type": "object",
1006
+ "properties": {
1007
+ "conditionId": {
1008
+ "type": "string"
1009
+ },
1010
+ "outcome": {
1011
+ "type": "string",
1012
+ "enum": ["Yes", "No"]
1013
+ },
1014
+ "side": {
1015
+ "type": "string",
1016
+ "enum": ["BUY", "SELL"]
1017
+ },
1018
+ "amount": {
1019
+ "type": "number",
1020
+ "description": "Amount in USDC"
1021
+ },
1022
+ "maxSlippage": {
1023
+ "type": "number",
1024
+ "description": "Maximum acceptable slippage (e.g., 0.02 for 2%)",
1025
+ "default": 0.02
1026
+ }
1027
+ },
1028
+ "required": ["conditionId", "outcome", "side", "amount"]
1029
+ }
1030
+ }
1031
+ ```
1032
+
1033
+ **Input**:
1034
+ ```json
1035
+ {
1036
+ "conditionId": "0xfa48a993...",
1037
+ "outcome": "Yes",
1038
+ "side": "BUY",
1039
+ "amount": 500,
1040
+ "maxSlippage": 0.02
1041
+ }
1042
+ ```
1043
+
1044
+ **Output**:
1045
+ ```json
1046
+ {
1047
+ "success": true,
1048
+ "execution": {
1049
+ "orderId": "0x456...",
1050
+ "side": "BUY",
1051
+ "usdcSpent": 500,
1052
+ "sharesReceived": 714.29,
1053
+ "avgPrice": 0.70,
1054
+ "fee": 0
1055
+ }
1056
+ }
1057
+ ```
1058
+
1059
+ ### 7.3 `cancel_order`
1060
+
1061
+ **MCP Tool Definition**:
1062
+ ```json
1063
+ {
1064
+ "name": "cancel_order",
1065
+ "description": "Cancel an open order",
1066
+ "inputSchema": {
1067
+ "type": "object",
1068
+ "properties": {
1069
+ "orderId": {
1070
+ "type": "string",
1071
+ "description": "Order ID to cancel"
1072
+ }
1073
+ },
1074
+ "required": ["orderId"]
1075
+ }
1076
+ }
1077
+ ```
1078
+
1079
+ **Input**:
1080
+ ```json
1081
+ {
1082
+ "orderId": "0x123..."
1083
+ }
1084
+ ```
1085
+
1086
+ **Output**:
1087
+ ```json
1088
+ {
1089
+ "success": true,
1090
+ "cancelledOrderId": "0x123..."
1091
+ }
1092
+ ```
1093
+
1094
+ ### 7.4 `get_my_orders`
1095
+
1096
+ **MCP Tool Definition**:
1097
+ ```json
1098
+ {
1099
+ "name": "get_my_orders",
1100
+ "description": "Get your open orders",
1101
+ "inputSchema": {
1102
+ "type": "object",
1103
+ "properties": {
1104
+ "status": {
1105
+ "type": "string",
1106
+ "enum": ["LIVE", "FILLED", "CANCELLED"],
1107
+ "default": "LIVE"
1108
+ }
1109
+ }
1110
+ }
1111
+ }
1112
+ ```
1113
+
1114
+ **Input**:
1115
+ ```json
1116
+ {
1117
+ "status": "LIVE"
1118
+ }
1119
+ ```
1120
+
1121
+ **Output**:
1122
+ ```json
1123
+ {
1124
+ "orders": [
1125
+ {
1126
+ "orderId": "0x123...",
1127
+ "market": "US recession in 2025?",
1128
+ "outcome": "Yes",
1129
+ "side": "BUY",
1130
+ "price": 0.50,
1131
+ "originalSize": 100,
1132
+ "remainingSize": 100,
1133
+ "status": "LIVE",
1134
+ "createdAt": "2025-12-21T10:00:00Z"
1135
+ }
1136
+ ]
1137
+ }
1138
+ ```
1139
+
1140
+ ---
1141
+
1142
+ ## 8. Wallet Tools(钱包管理)
1143
+
1144
+ ### ⚠️ CRITICAL: USDC.e vs Native USDC
1145
+
1146
+ Polymarket CTF **only accepts USDC.e** (bridged USDC), NOT native USDC!
1147
+
1148
+ | Token | Address | CTF Compatible |
1149
+ |-------|---------|----------------|
1150
+ | USDC.e (Bridged) | `0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174` | ✅ **Required** |
1151
+ | Native USDC | `0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359` | ❌ Not accepted |
1152
+
1153
+ **常见错误**:
1154
+ - 钱包有 100 USDC(Native)→ CTF 操作失败
1155
+ - 原因:CTF 需要 USDC.e,不是 Native USDC
1156
+
1157
+ **解决方案**:
1158
+ - `swap('USDC', 'USDC_E', amount)` - 将 Native USDC 换成 USDC.e
1159
+ - `transferUsdcE(to, amount)` - 给 session 钱包转 USDC.e(用于 CTF)
1160
+ - `CTFClient.checkReadyForCTF(amount)` - 检查钱包是否准备好 CTF 操作
1161
+
1162
+ ### 工具列表
1163
+
1164
+ | Tool | 用户问题 | 需要 |
1165
+ |------|----------|------|
1166
+ | `get_supported_deposit_assets` | "支持哪些资产充值?" | ❌ |
1167
+ | `get_deposit_addresses` | "充值地址是什么?" | 私钥 |
1168
+ | `deposit_usdc` | "帮我充值到交易账户" | 私钥 |
1169
+ | `check_allowances` | "我的授权状态如何?" | 私钥 |
1170
+ | `approve_trading` | "帮我授权所有合约" | 私钥 |
1171
+ | `swap` | "帮我换币" | 私钥 |
1172
+ | `swap_and_deposit` | "帮我换币并充值" | 私钥 |
1173
+ | `get_token_balances` | "我钱包有什么余额?" | 私钥 |
1174
+ | `get_wallet_balances` | "查看某个钱包余额" | ❌ |
1175
+
1176
+ ### 8.1 `get_supported_deposit_assets`
1177
+
1178
+ **用户场景**: "Polymarket 支持从哪些链充值?"
1179
+
1180
+ **MCP Tool Definition**:
1181
+ ```json
1182
+ {
1183
+ "name": "get_supported_deposit_assets",
1184
+ "description": "Get list of supported assets for cross-chain deposits to Polymarket",
1185
+ "inputSchema": {
1186
+ "type": "object",
1187
+ "properties": {
1188
+ "chainId": {
1189
+ "type": "number",
1190
+ "description": "Filter by chain ID (optional)"
1191
+ }
1192
+ }
1193
+ }
1194
+ }
1195
+ ```
1196
+
1197
+ **Input**:
1198
+ ```json
1199
+ {}
1200
+ ```
1201
+
1202
+ **Output** (基于真实 API - 已验证):
1203
+ ```json
1204
+ {
1205
+ "assets": [
1206
+ {
1207
+ "chainId": 1,
1208
+ "chainName": "ethereum",
1209
+ "tokenSymbol": "USDC",
1210
+ "tokenAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
1211
+ "minDepositUsd": 5
1212
+ },
1213
+ {
1214
+ "chainId": 137,
1215
+ "chainName": "polygon",
1216
+ "tokenSymbol": "USDC",
1217
+ "tokenAddress": "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359",
1218
+ "minDepositUsd": 1
1219
+ }
1220
+ ],
1221
+ "summary": {
1222
+ "totalAssets": 207,
1223
+ "chains": ["ethereum", "polygon", "arbitrum", "optimism", "base", "solana", "bitcoin"]
1224
+ }
1225
+ }
1226
+ ```
1227
+
1228
+ ### 8.2 `get_deposit_addresses`
1229
+
1230
+ **用户场景**: "我的跨链充值地址是什么?"
1231
+
1232
+ **MCP Tool Definition**:
1233
+ ```json
1234
+ {
1235
+ "name": "get_deposit_addresses",
1236
+ "description": "Get deposit addresses for cross-chain deposits",
1237
+ "inputSchema": {
1238
+ "type": "object",
1239
+ "properties": {}
1240
+ }
1241
+ }
1242
+ ```
1243
+
1244
+ **Output** (基于真实 API - 已验证):
1245
+ ```json
1246
+ {
1247
+ "polymarketAddress": "0x1234...your wallet",
1248
+ "depositAddresses": {
1249
+ "evm": "0xabcd...deposit address",
1250
+ "solana": "ABC123...solana address",
1251
+ "bitcoin": "bc1q...bitcoin address"
1252
+ }
1253
+ }
1254
+ ```
1255
+
1256
+ ### 8.3 `deposit_usdc`
1257
+
1258
+ **用户场景**: "帮我把 100 USDC 充值到交易账户"
1259
+
1260
+ **MCP Tool Definition**:
1261
+ ```json
1262
+ {
1263
+ "name": "deposit_usdc",
1264
+ "description": "Deposit USDC from Polygon wallet to Polymarket trading account",
1265
+ "inputSchema": {
1266
+ "type": "object",
1267
+ "properties": {
1268
+ "amount": {
1269
+ "type": "number",
1270
+ "description": "Amount of USDC to deposit"
1271
+ },
1272
+ "token": {
1273
+ "type": "string",
1274
+ "enum": ["NATIVE_USDC", "USDC_E"],
1275
+ "description": "Which USDC token to deposit",
1276
+ "default": "NATIVE_USDC"
1277
+ }
1278
+ },
1279
+ "required": ["amount"]
1280
+ }
1281
+ }
1282
+ ```
1283
+
1284
+ **Input**:
1285
+ ```json
1286
+ {
1287
+ "amount": 100,
1288
+ "token": "NATIVE_USDC"
1289
+ }
1290
+ ```
1291
+
1292
+ **Output**:
1293
+ ```json
1294
+ {
1295
+ "success": true,
1296
+ "transaction": {
1297
+ "hash": "0x5fd43582...",
1298
+ "amount": 100,
1299
+ "token": "NATIVE_USDC",
1300
+ "from": "0x1234...your wallet",
1301
+ "to": "0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E"
1302
+ }
1303
+ }
1304
+ ```
1305
+
1306
+ ### 8.4 `check_allowances`
1307
+
1308
+ **用户场景**: "我的钱包授权好了吗?可以交易了吗?"
1309
+
1310
+ **MCP Tool Definition**:
1311
+ ```json
1312
+ {
1313
+ "name": "check_allowances",
1314
+ "description": "Check if wallet has required USDC and ERC1155 approvals for trading",
1315
+ "inputSchema": {
1316
+ "type": "object",
1317
+ "properties": {}
1318
+ }
1319
+ }
1320
+ ```
1321
+
1322
+ **Output** (基于真实合约调用 - 已验证):
1323
+ ```json
1324
+ {
1325
+ "address": "0x1234...your wallet",
1326
+ "usdcBalance": "1000.00",
1327
+ "tradingReady": false,
1328
+ "erc20Allowances": [
1329
+ {
1330
+ "contract": "CTF Exchange",
1331
+ "address": "0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E",
1332
+ "approved": true,
1333
+ "allowance": "unlimited"
1334
+ },
1335
+ {
1336
+ "contract": "Neg Risk CTF Exchange",
1337
+ "address": "0xC5d563A36AE78145C45a50134d48A1215220f80a",
1338
+ "approved": false,
1339
+ "allowance": "0"
1340
+ },
1341
+ {
1342
+ "contract": "Neg Risk Adapter",
1343
+ "address": "0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296",
1344
+ "approved": false,
1345
+ "allowance": "0"
1346
+ }
1347
+ ],
1348
+ "erc1155Approvals": [
1349
+ {
1350
+ "contract": "CTF Exchange",
1351
+ "address": "0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E",
1352
+ "approved": true
1353
+ },
1354
+ {
1355
+ "contract": "Neg Risk CTF Exchange",
1356
+ "address": "0xC5d563A36AE78145C45a50134d48A1215220f80a",
1357
+ "approved": false
1358
+ }
1359
+ ],
1360
+ "issues": [
1361
+ "USDC not approved for Neg Risk CTF Exchange",
1362
+ "USDC not approved for Neg Risk Adapter",
1363
+ "ERC1155 not approved for Neg Risk CTF Exchange"
1364
+ ]
1365
+ }
1366
+ ```
1367
+
1368
+ ### 8.5 `approve_trading`
1369
+
1370
+ **用户场景**: "帮我完成所有授权,让我可以交易"
1371
+
1372
+ **MCP Tool Definition**:
1373
+ ```json
1374
+ {
1375
+ "name": "approve_trading",
1376
+ "description": "Approve all required contracts for trading on Polymarket",
1377
+ "inputSchema": {
1378
+ "type": "object",
1379
+ "properties": {}
1380
+ }
1381
+ }
1382
+ ```
1383
+
1384
+ **Output**:
1385
+ ```json
1386
+ {
1387
+ "success": true,
1388
+ "transactions": [
1389
+ {
1390
+ "type": "ERC20_APPROVAL",
1391
+ "contract": "CTF Exchange",
1392
+ "hash": "0xabc..."
1393
+ },
1394
+ {
1395
+ "type": "ERC20_APPROVAL",
1396
+ "contract": "Neg Risk CTF Exchange",
1397
+ "hash": "0xdef..."
1398
+ },
1399
+ {
1400
+ "type": "ERC20_APPROVAL",
1401
+ "contract": "Neg Risk Adapter",
1402
+ "hash": "0x123..."
1403
+ },
1404
+ {
1405
+ "type": "ERC1155_APPROVAL",
1406
+ "contract": "CTF Exchange",
1407
+ "hash": "0x456..."
1408
+ },
1409
+ {
1410
+ "type": "ERC1155_APPROVAL",
1411
+ "contract": "Neg Risk CTF Exchange",
1412
+ "hash": "0x789..."
1413
+ }
1414
+ ],
1415
+ "message": "All 5 approvals completed. Your wallet is now ready for trading."
1416
+ }
1417
+ ```
1418
+
1419
+ ### 8.6 `swap`
1420
+
1421
+ **用户场景**: "帮我把 100 MATIC 换成 USDC"
1422
+
1423
+ **MCP Tool Definition**:
1424
+ ```json
1425
+ {
1426
+ "name": "swap",
1427
+ "description": "Swap between tokens on Polygon using QuickSwap V3",
1428
+ "inputSchema": {
1429
+ "type": "object",
1430
+ "properties": {
1431
+ "tokenIn": {
1432
+ "type": "string",
1433
+ "description": "Token to swap from (MATIC, WETH, USDC, USDC_E, USDT, DAI)"
1434
+ },
1435
+ "tokenOut": {
1436
+ "type": "string",
1437
+ "description": "Token to swap to (MATIC, WETH, USDC, USDC_E, USDT, DAI)"
1438
+ },
1439
+ "amount": {
1440
+ "type": "string",
1441
+ "description": "Amount to swap in token units"
1442
+ },
1443
+ "slippage": {
1444
+ "type": "number",
1445
+ "description": "Slippage tolerance in percent (default: 0.5)"
1446
+ }
1447
+ },
1448
+ "required": ["tokenIn", "tokenOut", "amount"]
1449
+ }
1450
+ }
1451
+ ```
1452
+
1453
+ **Input**:
1454
+ ```json
1455
+ {
1456
+ "tokenIn": "MATIC",
1457
+ "tokenOut": "USDC",
1458
+ "amount": "100",
1459
+ "slippage": 0.5
1460
+ }
1461
+ ```
1462
+
1463
+ **Output**:
1464
+ ```json
1465
+ {
1466
+ "success": true,
1467
+ "wallet": "0x1234...",
1468
+ "tokenIn": "MATIC",
1469
+ "tokenOut": "USDC",
1470
+ "amountIn": "100",
1471
+ "amountOut": "55.23",
1472
+ "txHash": "0xabc...",
1473
+ "gasUsed": "150000",
1474
+ "explorerUrl": "https://polygonscan.com/tx/0xabc..."
1475
+ }
1476
+ ```
1477
+
1478
+ ### 8.7 `swap_and_deposit`
1479
+
1480
+ **用户场景**: "帮我把 MATIC 换成 USDC 并充值到 Polymarket"
1481
+
1482
+ **MCP Tool Definition**:
1483
+ ```json
1484
+ {
1485
+ "name": "swap_and_deposit",
1486
+ "description": "Swap any token to USDC and deposit to Polymarket in one operation",
1487
+ "inputSchema": {
1488
+ "type": "object",
1489
+ "properties": {
1490
+ "token": {
1491
+ "type": "string",
1492
+ "description": "Token to deposit (MATIC, WETH, USDT, DAI, USDC)"
1493
+ },
1494
+ "amount": {
1495
+ "type": "string",
1496
+ "description": "Amount to deposit in token units"
1497
+ },
1498
+ "slippage": {
1499
+ "type": "number",
1500
+ "description": "Slippage tolerance for swap in percent (default: 0.5)"
1501
+ }
1502
+ },
1503
+ "required": ["token", "amount"]
1504
+ }
1505
+ }
1506
+ ```
1507
+
1508
+ **Input**:
1509
+ ```json
1510
+ {
1511
+ "token": "MATIC",
1512
+ "amount": "100",
1513
+ "slippage": 0.5
1514
+ }
1515
+ ```
1516
+
1517
+ **Output**:
1518
+ ```json
1519
+ {
1520
+ "success": true,
1521
+ "wallet": "0x1234...",
1522
+ "tokenIn": "MATIC",
1523
+ "amountIn": "100",
1524
+ "usdcAmount": "55.23",
1525
+ "swapTxHash": "0xabc...",
1526
+ "depositTxHash": "0xdef...",
1527
+ "depositAddress": "0x4bFb41d5...",
1528
+ "message": "Swapped 100 MATIC to 55.23 USDC, then deposited to Polymarket.",
1529
+ "explorerUrl": "https://polygonscan.com/tx/0xdef..."
1530
+ }
1531
+ ```
1532
+
1533
+ ### 8.8 `get_token_balances`
1534
+
1535
+ **用户场景**: "我的钱包里有什么余额?"(需要私钥配置)
1536
+
1537
+ **MCP Tool Definition**:
1538
+ ```json
1539
+ {
1540
+ "name": "get_token_balances",
1541
+ "description": "Get balances for all supported tokens on Polygon for the configured wallet",
1542
+ "inputSchema": {
1543
+ "type": "object",
1544
+ "properties": {}
1545
+ }
1546
+ }
1547
+ ```
1548
+
1549
+ **Output**:
1550
+ ```json
1551
+ {
1552
+ "wallet": "0x1234...",
1553
+ "balances": [
1554
+ { "token": "MATIC", "symbol": "MATIC", "balance": "150.5", "decimals": 18 },
1555
+ { "token": "USDC", "symbol": "USDC", "balance": "1000.00", "decimals": 6 },
1556
+ { "token": "USDC_E", "symbol": "USDC.e", "balance": "500.00", "decimals": 6 },
1557
+ { "token": "USDT", "symbol": "USDT", "balance": "0", "decimals": 6 },
1558
+ { "token": "DAI", "symbol": "DAI", "balance": "0", "decimals": 18 },
1559
+ { "token": "WETH", "symbol": "WETH", "balance": "0.5", "decimals": 18 }
1560
+ ],
1561
+ "nonZeroBalances": [
1562
+ { "token": "MATIC", "balance": "150.5" },
1563
+ { "token": "USDC", "balance": "1000.00" },
1564
+ { "token": "USDC_E", "balance": "500.00" },
1565
+ { "token": "WETH", "balance": "0.5" }
1566
+ ],
1567
+ "supportedTokens": ["MATIC", "USDC", "USDC_E", "USDT", "DAI", "WETH"]
1568
+ }
1569
+ ```
1570
+
1571
+ ### 8.9 `get_wallet_balances`
1572
+
1573
+ **用户场景**: "查看某个钱包有什么余额?"(不需要私钥)
1574
+
1575
+ **MCP Tool Definition**:
1576
+ ```json
1577
+ {
1578
+ "name": "get_wallet_balances",
1579
+ "description": "Get Polygon token balances for any wallet address (no private key required)",
1580
+ "inputSchema": {
1581
+ "type": "object",
1582
+ "properties": {
1583
+ "address": {
1584
+ "type": "string",
1585
+ "description": "Wallet address to check (0x...)"
1586
+ }
1587
+ },
1588
+ "required": ["address"]
1589
+ }
1590
+ }
1591
+ ```
1592
+
1593
+ **Input**:
1594
+ ```json
1595
+ {
1596
+ "address": "0xc2e7800b5af46e6093872b177b7a5e7f0563be51"
1597
+ }
1598
+ ```
1599
+
1600
+ **Output** (真实数据验证 - 2024-12-22):
1601
+ ```json
1602
+ {
1603
+ "address": "0xc2e7800b5af46e6093872b177b7a5e7f0563be51",
1604
+ "balances": [
1605
+ { "token": "MATIC", "symbol": "MATIC", "balance": "0.0956", "decimals": 18 },
1606
+ { "token": "USDC", "symbol": "USDC", "balance": "0", "decimals": 6 },
1607
+ { "token": "USDC_E", "symbol": "USDC.e", "balance": "2648315.63", "decimals": 6 },
1608
+ { "token": "USDT", "symbol": "USDT", "balance": "0", "decimals": 6 },
1609
+ { "token": "DAI", "symbol": "DAI", "balance": "0", "decimals": 18 },
1610
+ { "token": "WETH", "symbol": "WETH", "balance": "0", "decimals": 18 }
1611
+ ],
1612
+ "nonZeroBalances": [
1613
+ { "token": "MATIC", "balance": "0.0956" },
1614
+ { "token": "USDC_E", "balance": "2648315.63" }
1615
+ ],
1616
+ "summary": {
1617
+ "totalTokens": 2,
1618
+ "stablecoinValue": "2648315.63"
1619
+ },
1620
+ "supportedTokens": ["MATIC", "USDC", "USDC_E", "USDT", "DAI", "WETH"]
1621
+ }
1622
+ ```
1623
+
1624
+ ### 8.10 合约地址参考
1625
+
1626
+ **Polygon Mainnet (chainId: 137)**:
1627
+
1628
+ | Contract | Address | 用途 |
1629
+ |----------|---------|------|
1630
+ | USDC (Native) | `0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359` | ERC20 代币 |
1631
+ | USDC.e (Bridged) | `0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174` | ERC20 代币 |
1632
+ | USDT | `0xc2132D05D31c914a87C6611C10748AEb04B58e8F` | ERC20 代币 |
1633
+ | DAI | `0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063` | ERC20 代币 |
1634
+ | WMATIC | `0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270` | Wrapped MATIC |
1635
+ | WETH | `0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619` | Wrapped ETH |
1636
+ | Conditional Tokens | `0x4D97DCd97eC945f40cF65F87097ACe5EA0476045` | ERC1155 代币 |
1637
+ | CTF Exchange | `0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E` | 交易合约 |
1638
+ | Neg Risk CTF Exchange | `0xC5d563A36AE78145C45a50134d48A1215220f80a` | Neg Risk 交易 |
1639
+ | Neg Risk Adapter | `0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296` | Neg Risk 适配器 |
1640
+ | QuickSwap V3 Router | `0xf5b509bB0909a69B1c207E495f687a596C168E12` | DEX Swap 路由 |
1641
+
1642
+ ---
1643
+
1644
+ ## 9. 数据字段映射
1645
+
1646
+ ### 9.1 可直接使用的字段
1647
+
1648
+ | 需要 | API | 字段 | 状态 |
1649
+ |------|-----|------|------|
1650
+ | 持仓 | positions | size, avgPrice, curPrice | ✅ |
1651
+ | PnL | positions | cashPnl, realizedPnl, percentPnl | ✅ |
1652
+ | 市场标题 | positions/activity | title, slug | ✅ |
1653
+ | 交易历史 | activity | type, side, size, price, timestamp | ✅ |
1654
+ | 排行榜 | leaderboard | rank, pnl, vol | ✅ |
1655
+ | 市场价格 | gamma | outcomePrices | ✅ |
1656
+ | 订单簿 | clob/book | bids, asks | ✅ |
1657
+
1658
+ ### 9.2 需要计算的字段
1659
+
1660
+ | 需要 | 计算方式 |
1661
+ |------|----------|
1662
+ | winRate | positions.filter(p => p.cashPnl > 0).length / total |
1663
+ | netFlow | buyVolume - sellVolume |
1664
+ | priceImpact | 遍历订单簿计算 |
1665
+ | smartScore | WalletService.calculateSmartScore() |
1666
+
1667
+ ### 9.3 不可用的字段
1668
+
1669
+ | 需要 | 问题 | 解决方案 |
1670
+ |------|------|----------|
1671
+ | 精确 officialPnl 计算方式 | API 黑盒 | 显示两种 PnL |
1672
+ | 历史价格走势 | 需要自己收集 | 后续增加 |
1673
+
1674
+ ---
1675
+
1676
+ ## 10. 实现架构
1677
+
1678
+ ```
1679
+ packages/
1680
+ └── poly-sdk/
1681
+ ├── src/
1682
+ │ ├── index.ts # SDK 入口
1683
+ │ ├── clients/
1684
+ │ │ ├── bridge-client.ts # Bridge API + depositUsdc
1685
+ │ │ └── ...
1686
+ │ ├── services/
1687
+ │ │ ├── authorization-service.ts # 授权管理
1688
+ │ │ └── ...
1689
+ │ └── mcp/
1690
+ │ ├── index.ts # MCP Handler
1691
+ │ └── tools/
1692
+ │ ├── trader.ts # Trader Tools (4个)
1693
+ │ ├── market.ts # Market Tools (4个)
1694
+ │ ├── order.ts # Order Tools (3个)
1695
+ │ ├── trade.ts # Trade Tools (4个)
1696
+ │ └── wallet.ts # Wallet Tools (9个)
1697
+ ├── package.json
1698
+ └── README.md
1699
+ ```
1700
+
1701
+ ### 10.1 MCP Server 入口
1702
+
1703
+ ```typescript
1704
+ // src/index.ts
1705
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
1706
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
1707
+ import { PolymarketSDK } from '@prediction-router/poly-sdk';
1708
+ import { registerTraderTools } from './tools/trader.js';
1709
+ import { registerMarketTools } from './tools/market.js';
1710
+ import { registerOrderTools } from './tools/order.js';
1711
+ import { registerTradeTools } from './tools/trade.js';
1712
+ import { registerWalletTools } from './tools/wallet.js';
1713
+
1714
+ const server = new Server(
1715
+ { name: 'poly-mcp', version: '1.0.0' },
1716
+ { capabilities: { tools: {} } }
1717
+ );
1718
+
1719
+ const sdk = new PolymarketSDK();
1720
+
1721
+ // Register all tools
1722
+ registerTraderTools(server, sdk);
1723
+ registerMarketTools(server, sdk);
1724
+ registerOrderTools(server, sdk);
1725
+ registerTradeTools(server, sdk);
1726
+ registerWalletTools(server, sdk);
1727
+
1728
+ // Start server
1729
+ const transport = new StdioServerTransport();
1730
+ await server.connect(transport);
1731
+ ```
1732
+
1733
+ ### 10.2 工具注册示例
1734
+
1735
+ ```typescript
1736
+ // src/tools/trader.ts
1737
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
1738
+ import { PolymarketSDK } from '@prediction-router/poly-sdk';
1739
+ import { CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
1740
+
1741
+ export function registerTraderTools(server: Server, sdk: PolymarketSDK) {
1742
+ // List available tools
1743
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
1744
+ tools: [
1745
+ {
1746
+ name: 'get_trader_positions',
1747
+ description: 'Get all positions held by a trader with PnL breakdown',
1748
+ inputSchema: {
1749
+ type: 'object',
1750
+ properties: {
1751
+ address: {
1752
+ type: 'string',
1753
+ description: 'Trader wallet address (0x...)'
1754
+ }
1755
+ },
1756
+ required: ['address']
1757
+ }
1758
+ },
1759
+ // ... more tools
1760
+ ]
1761
+ }));
1762
+
1763
+ // Handle tool calls
1764
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1765
+ const { name, arguments: args } = request.params;
1766
+
1767
+ switch (name) {
1768
+ case 'get_trader_positions': {
1769
+ const { address } = args as { address: string };
1770
+ const positions = await sdk.wallets.getWalletPositions(address);
1771
+ const profile = await sdk.wallets.getWalletProfile(address);
1772
+
1773
+ return {
1774
+ content: [{
1775
+ type: 'text',
1776
+ text: JSON.stringify({
1777
+ trader: {
1778
+ address,
1779
+ displayName: profile.displayName || null
1780
+ },
1781
+ positions: positions.map(p => ({
1782
+ market: {
1783
+ conditionId: p.conditionId,
1784
+ title: p.title,
1785
+ slug: p.slug
1786
+ },
1787
+ holding: {
1788
+ outcome: p.outcome,
1789
+ size: p.size,
1790
+ avgPrice: p.avgPrice,
1791
+ curPrice: p.curPrice
1792
+ },
1793
+ pnl: {
1794
+ unrealized: p.cashPnl,
1795
+ unrealizedPercent: p.percentPnl,
1796
+ realized: p.realizedPnl
1797
+ },
1798
+ status: {
1799
+ redeemable: p.redeemable,
1800
+ endDate: p.endDate
1801
+ }
1802
+ })),
1803
+ summary: {
1804
+ totalPositions: positions.length,
1805
+ totalUnrealizedPnl: positions.reduce((s, p) => s + (p.cashPnl || 0), 0),
1806
+ totalRealizedPnl: positions.reduce((s, p) => s + (p.realizedPnl || 0), 0),
1807
+ winningPositions: positions.filter(p => (p.cashPnl || 0) > 0).length,
1808
+ losingPositions: positions.filter(p => (p.cashPnl || 0) < 0).length
1809
+ }
1810
+ }, null, 2)
1811
+ }]
1812
+ };
1813
+ }
1814
+ // ... more cases
1815
+ }
1816
+ });
1817
+ }
1818
+ ```
1819
+
1820
+ ---
1821
+
1822
+ ## 10. 配置与认证
1823
+
1824
+ ### 10.1 环境变量
1825
+
1826
+ ```bash
1827
+ # .env
1828
+ POLY_API_KEY=your-api-key # 用于 Trade Tools
1829
+ POLY_API_SECRET=your-secret # 用于签名
1830
+ POLY_PASSPHRASE=your-passphrase
1831
+ POLY_CHAIN_ID=137 # Polygon Mainnet
1832
+ ```
1833
+
1834
+ ### 10.2 MCP 配置
1835
+
1836
+ ```json
1837
+ // Claude Desktop config: ~/Library/Application Support/Claude/claude_desktop_config.json
1838
+ {
1839
+ "mcpServers": {
1840
+ "polymarket": {
1841
+ "command": "npx",
1842
+ "args": ["poly-mcp"],
1843
+ "env": {
1844
+ "POLY_API_KEY": "your-api-key",
1845
+ "POLY_API_SECRET": "your-secret",
1846
+ "POLY_PASSPHRASE": "your-passphrase"
1847
+ }
1848
+ }
1849
+ }
1850
+ }
1851
+ ```
1852
+
1853
+ ### 10.3 工具权限
1854
+
1855
+ | 工具类别 | 需要认证 | 说明 |
1856
+ |---------|---------|------|
1857
+ | Trader Tools | ❌ | 公开数据查询 |
1858
+ | Market Tools | ❌ | 公开数据查询 |
1859
+ | Order Tools | ❌ | 公开数据查询 |
1860
+ | Trade Tools | ✅ | 需要 API Key |
1861
+ | Wallet Tools | ⚠️ | 部分需要私钥(swap, deposit, allowance),get_wallet_balances 和 get_supported_deposit_assets 不需要 |
1862
+
1863
+ ---
1864
+
1865
+ ## 11. 错误处理
1866
+
1867
+ ### 11.1 统一错误格式
1868
+
1869
+ ```typescript
1870
+ interface McpError {
1871
+ error: {
1872
+ code: string;
1873
+ message: string;
1874
+ details?: Record<string, unknown>;
1875
+ };
1876
+ }
1877
+ ```
1878
+
1879
+ ### 11.2 错误码
1880
+
1881
+ | Code | 说明 | 示例 |
1882
+ |------|------|------|
1883
+ | `INVALID_ADDRESS` | 无效钱包地址 | "Address must start with 0x" |
1884
+ | `MARKET_NOT_FOUND` | 市场不存在 | "Market 0x... not found" |
1885
+ | `INSUFFICIENT_BALANCE` | 余额不足 | "Insufficient USDC balance" |
1886
+ | `ORDER_REJECTED` | 订单被拒绝 | "Price outside valid range" |
1887
+ | `RATE_LIMITED` | 请求过于频繁 | "Rate limit exceeded" |
1888
+ | `AUTH_REQUIRED` | 需要认证 | "Trade tools require API key" |
1889
+ | `INTERNAL_ERROR` | 内部错误 | "Unexpected error occurred" |
1890
+
1891
+ ### 11.3 错误处理实现
1892
+
1893
+ ```typescript
1894
+ // src/utils/errors.ts
1895
+ export class McpToolError extends Error {
1896
+ constructor(
1897
+ public code: string,
1898
+ message: string,
1899
+ public details?: Record<string, unknown>
1900
+ ) {
1901
+ super(message);
1902
+ }
1903
+
1904
+ toResponse() {
1905
+ return {
1906
+ content: [{
1907
+ type: 'text',
1908
+ text: JSON.stringify({
1909
+ error: {
1910
+ code: this.code,
1911
+ message: this.message,
1912
+ details: this.details
1913
+ }
1914
+ })
1915
+ }],
1916
+ isError: true
1917
+ };
1918
+ }
1919
+ }
1920
+
1921
+ // 使用
1922
+ try {
1923
+ const positions = await sdk.wallets.getWalletPositions(address);
1924
+ // ...
1925
+ } catch (err) {
1926
+ if (err instanceof PolymarketError) {
1927
+ throw new McpToolError(
1928
+ err.code,
1929
+ err.message,
1930
+ { originalError: err.details }
1931
+ );
1932
+ }
1933
+ throw new McpToolError('INTERNAL_ERROR', 'Unexpected error occurred');
1934
+ }
1935
+ ```
1936
+
1937
+ ---
1938
+
1939
+ ## 12. 优先级
1940
+
1941
+ | Phase | Tools | 说明 |
1942
+ |-------|-------|------|
1943
+ | **P0** | get_trader_positions, get_market, get_orderbook | 核心查询 |
1944
+ | **P1** | get_trader_trades, get_leaderboard, search_markets, check_allowances, get_supported_deposit_assets, get_deposit_addresses, get_token_balances, get_wallet_balances | 分析 + 钱包状态 |
1945
+ | **P2** | place_limit_order, place_market_order, deposit_usdc, approve_trading, swap, swap_and_deposit | 交易执行 + 钱包操作 |
1946
+ | **P3** | estimate_execution, get_trending_markets | 高级功能 |
1947
+
1948
+ ---
1949
+
1950
+ ## 13. 测试计划
1951
+
1952
+ ### 13.1 单元测试
1953
+
1954
+ ```typescript
1955
+ // tests/tools/trader.test.ts
1956
+ describe('get_trader_positions', () => {
1957
+ it('returns positions for valid address', async () => {
1958
+ const result = await callTool('get_trader_positions', {
1959
+ address: '0xc2e7800b5af46e6093872b177b7a5e7f0563be51'
1960
+ });
1961
+
1962
+ expect(result.trader.address).toBe('0xc2e7800b...');
1963
+ expect(result.positions).toBeInstanceOf(Array);
1964
+ expect(result.summary.totalPositions).toBeGreaterThanOrEqual(0);
1965
+ });
1966
+
1967
+ it('returns error for invalid address', async () => {
1968
+ const result = await callTool('get_trader_positions', {
1969
+ address: 'invalid'
1970
+ });
1971
+
1972
+ expect(result.error.code).toBe('INVALID_ADDRESS');
1973
+ });
1974
+ });
1975
+ ```
1976
+
1977
+ ### 13.2 集成测试
1978
+
1979
+ ```bash
1980
+ # 使用 MCP Inspector 测试
1981
+ npx @anthropic/mcp-inspector poly-mcp
1982
+
1983
+ # 手动测试
1984
+ echo '{"method":"tools/call","params":{"name":"get_trader_positions","arguments":{"address":"0xc2e7800b5af46e6093872b177b7a5e7f0563be51"}}}' | npx poly-mcp
1985
+ ```
1986
+
1987
+ ---
1988
+
1989
+ ## 14. 工具汇总
1990
+
1991
+ | # | Tool | 类别 | 优先级 |
1992
+ |---|------|------|--------|
1993
+ | 1 | `get_trader_positions` | Trader | P0 |
1994
+ | 2 | `get_trader_trades` | Trader | P1 |
1995
+ | 3 | `get_trader_profile` | Trader | P1 |
1996
+ | 4 | `get_leaderboard` | Trader | P1 |
1997
+ | 5 | `get_market` | Market | P0 |
1998
+ | 6 | `search_markets` | Market | P1 |
1999
+ | 7 | `get_trending_markets` | Market | P3 |
2000
+ | 8 | `get_market_trades` | Market | P1 |
2001
+ | 9 | `get_orderbook` | Order | P0 |
2002
+ | 10 | `get_best_prices` | Order | P1 |
2003
+ | 11 | `estimate_execution` | Order | P3 |
2004
+ | 12 | `place_limit_order` | Trade | P2 |
2005
+ | 13 | `place_market_order` | Trade | P2 |
2006
+ | 14 | `cancel_order` | Trade | P2 |
2007
+ | 15 | `get_my_orders` | Trade | P2 |
2008
+ | 16 | `get_supported_deposit_assets` | Wallet | P1 |
2009
+ | 17 | `get_deposit_addresses` | Wallet | P1 |
2010
+ | 18 | `deposit_usdc` | Wallet | P2 |
2011
+ | 19 | `check_allowances` | Wallet | P1 |
2012
+ | 20 | `approve_trading` | Wallet | P2 |
2013
+ | 21 | `swap` | Wallet | P2 |
2014
+ | 22 | `swap_and_deposit` | Wallet | P2 |
2015
+ | 23 | `get_token_balances` | Wallet | P1 |
2016
+ | 24 | `get_wallet_balances` | Wallet | P1 |
2017
+
2018
+ **Total: 24 Tools**
2019
+
2020
+ ---
2021
+
2022
+ ## 15. 后续优化
2023
+
2024
+ ### 15.1 性能优化
2025
+
2026
+ - [ ] 批量查询:合并多个钱包的查询
2027
+ - [ ] 流式响应:对大数据量使用流式传输
2028
+ - [ ] 缓存策略:MCP 层缓存热点数据
2029
+
2030
+ ### 15.2 功能扩展
2031
+
2032
+ - [ ] 历史价格图表数据
2033
+ - [ ] 钱包对比分析
2034
+ - [ ] 市场相关性分析
2035
+ - [ ] 套利机会检测
2036
+
2037
+ ### 15.3 监控与日志
2038
+
2039
+ - [ ] 请求追踪
2040
+ - [ ] 性能指标收集
2041
+ - [ ] 错误报警