@catalyst-team/poly-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +317 -0
  2. package/dist/errors.d.ts +33 -0
  3. package/dist/errors.d.ts.map +1 -0
  4. package/dist/errors.js +86 -0
  5. package/dist/errors.js.map +1 -0
  6. package/dist/index.d.ts +62 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +173 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/server.d.ts +17 -0
  11. package/dist/server.d.ts.map +1 -0
  12. package/dist/server.js +155 -0
  13. package/dist/server.js.map +1 -0
  14. package/dist/tools/guide.d.ts +12 -0
  15. package/dist/tools/guide.d.ts.map +1 -0
  16. package/dist/tools/guide.js +801 -0
  17. package/dist/tools/guide.js.map +1 -0
  18. package/dist/tools/index.d.ts +11 -0
  19. package/dist/tools/index.d.ts.map +1 -0
  20. package/dist/tools/index.js +27 -0
  21. package/dist/tools/index.js.map +1 -0
  22. package/dist/tools/market.d.ts +11 -0
  23. package/dist/tools/market.d.ts.map +1 -0
  24. package/dist/tools/market.js +314 -0
  25. package/dist/tools/market.js.map +1 -0
  26. package/dist/tools/order.d.ts +10 -0
  27. package/dist/tools/order.d.ts.map +1 -0
  28. package/dist/tools/order.js +258 -0
  29. package/dist/tools/order.js.map +1 -0
  30. package/dist/tools/trade.d.ts +38 -0
  31. package/dist/tools/trade.d.ts.map +1 -0
  32. package/dist/tools/trade.js +313 -0
  33. package/dist/tools/trade.js.map +1 -0
  34. package/dist/tools/trader.d.ts +11 -0
  35. package/dist/tools/trader.d.ts.map +1 -0
  36. package/dist/tools/trader.js +277 -0
  37. package/dist/tools/trader.js.map +1 -0
  38. package/dist/tools/wallet.d.ts +274 -0
  39. package/dist/tools/wallet.d.ts.map +1 -0
  40. package/dist/tools/wallet.js +579 -0
  41. package/dist/tools/wallet.js.map +1 -0
  42. package/dist/types.d.ts +413 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +5 -0
  45. package/dist/types.js.map +1 -0
  46. package/docs/01-mcp.md +2075 -0
  47. package/package.json +55 -0
  48. package/src/errors.ts +124 -0
  49. package/src/index.ts +309 -0
  50. package/src/server.ts +183 -0
  51. package/src/tools/guide.ts +821 -0
  52. package/src/tools/index.ts +73 -0
  53. package/src/tools/market.ts +363 -0
  54. package/src/tools/order.ts +326 -0
  55. package/src/tools/trade.ts +417 -0
  56. package/src/tools/trader.ts +322 -0
  57. package/src/tools/wallet.ts +683 -0
  58. package/src/types.ts +472 -0
  59. package/tsconfig.json +20 -0
package/src/types.ts ADDED
@@ -0,0 +1,472 @@
1
+ /**
2
+ * MCP Tool Types for Polymarket
3
+ */
4
+
5
+ // Tool Input Types
6
+ export interface GetTraderPositionsInput {
7
+ address: string;
8
+ }
9
+
10
+ export interface GetTraderTradesInput {
11
+ address: string;
12
+ limit?: number;
13
+ side?: 'BUY' | 'SELL';
14
+ }
15
+
16
+ export interface GetTraderProfileInput {
17
+ address: string;
18
+ }
19
+
20
+ export interface GetLeaderboardInput {
21
+ limit?: number;
22
+ offset?: number;
23
+ }
24
+
25
+ export interface GetMarketInput {
26
+ identifier: string;
27
+ }
28
+
29
+ export interface SearchMarketsInput {
30
+ query: string;
31
+ active?: boolean;
32
+ limit?: number;
33
+ }
34
+
35
+ export interface GetTrendingMarketsInput {
36
+ limit?: number;
37
+ sortBy?: 'volume' | 'liquidity' | 'newest';
38
+ }
39
+
40
+ export interface GetMarketTradesInput {
41
+ conditionId: string;
42
+ limit?: number;
43
+ }
44
+
45
+ export interface GetOrderbookInput {
46
+ conditionId: string;
47
+ outcome: 'Yes' | 'No';
48
+ depth?: number;
49
+ }
50
+
51
+ export interface GetBestPricesInput {
52
+ conditionId: string;
53
+ }
54
+
55
+ export interface EstimateExecutionInput {
56
+ conditionId: string;
57
+ outcome: 'Yes' | 'No';
58
+ side: 'BUY' | 'SELL';
59
+ amount: number;
60
+ }
61
+
62
+ export interface PlaceLimitOrderInput {
63
+ conditionId: string;
64
+ outcome: 'Yes' | 'No';
65
+ side: 'BUY' | 'SELL';
66
+ price: number;
67
+ size: number;
68
+ orderType?: 'GTC' | 'GTD';
69
+ }
70
+
71
+ export interface PlaceMarketOrderInput {
72
+ conditionId: string;
73
+ outcome: 'Yes' | 'No';
74
+ side: 'BUY' | 'SELL';
75
+ amount: number;
76
+ maxSlippage?: number;
77
+ }
78
+
79
+ export interface CancelOrderInput {
80
+ orderId: string;
81
+ }
82
+
83
+ export interface GetMyOrdersInput {
84
+ status?: 'LIVE' | 'FILLED' | 'CANCELLED';
85
+ }
86
+
87
+ // Tool Output Types
88
+ export interface TraderInfo {
89
+ address: string;
90
+ displayName: string | null;
91
+ }
92
+
93
+ export interface MarketInfo {
94
+ conditionId: string;
95
+ title: string;
96
+ slug?: string;
97
+ }
98
+
99
+ export interface PositionHolding {
100
+ outcome: string;
101
+ size: number;
102
+ avgPrice: number;
103
+ curPrice?: number;
104
+ }
105
+
106
+ export interface PositionPnL {
107
+ unrealized?: number;
108
+ unrealizedPercent?: number;
109
+ realized?: number;
110
+ }
111
+
112
+ export interface PositionStatus {
113
+ redeemable?: boolean;
114
+ endDate?: string;
115
+ }
116
+
117
+ export interface PositionOutput {
118
+ market: MarketInfo;
119
+ holding: PositionHolding;
120
+ pnl: PositionPnL;
121
+ status: PositionStatus;
122
+ }
123
+
124
+ export interface GetTraderPositionsOutput {
125
+ trader: TraderInfo;
126
+ positions: PositionOutput[];
127
+ summary: {
128
+ totalPositions: number;
129
+ totalUnrealizedPnl: number;
130
+ totalRealizedPnl: number;
131
+ winningPositions: number;
132
+ losingPositions: number;
133
+ };
134
+ }
135
+
136
+ export interface TradeExecution {
137
+ size: number;
138
+ price: number;
139
+ usdcValue: number;
140
+ }
141
+
142
+ export interface TradeOutput {
143
+ type: string;
144
+ side: 'BUY' | 'SELL';
145
+ market: MarketInfo;
146
+ outcome: string;
147
+ execution: TradeExecution;
148
+ timestamp: string;
149
+ txHash: string;
150
+ }
151
+
152
+ export interface GetTraderTradesOutput {
153
+ trader: TraderInfo;
154
+ trades: TradeOutput[];
155
+ summary: {
156
+ totalTrades: number;
157
+ buyCount: number;
158
+ sellCount: number;
159
+ buyVolume: number;
160
+ sellVolume: number;
161
+ };
162
+ }
163
+
164
+ export interface GetTraderProfileOutput {
165
+ trader: {
166
+ address: string;
167
+ displayName: string | null;
168
+ xUsername: string | null;
169
+ verified: boolean;
170
+ profileImage: string | null;
171
+ };
172
+ ranking: {
173
+ rank: number | null;
174
+ totalTraders: number;
175
+ };
176
+ performance: {
177
+ officialPnl: number | null;
178
+ totalVolume: number;
179
+ unrealizedPnl: number;
180
+ realizedPnl: number;
181
+ };
182
+ stats: {
183
+ positionCount: number;
184
+ winRate: number;
185
+ avgPercentPnl: number;
186
+ smartScore: number;
187
+ };
188
+ activity: {
189
+ lastTradeAt: string | null;
190
+ isActive: boolean;
191
+ };
192
+ /** Explanation when PnL values differ between sources */
193
+ notes?: string;
194
+ }
195
+
196
+ export interface LeaderboardTrader {
197
+ rank: number;
198
+ address: string;
199
+ displayName: string | null;
200
+ pnl: number;
201
+ volume: number;
202
+ verified: boolean;
203
+ }
204
+
205
+ export interface GetLeaderboardOutput {
206
+ traders: LeaderboardTrader[];
207
+ pagination: {
208
+ total: number;
209
+ offset: number;
210
+ limit: number;
211
+ };
212
+ }
213
+
214
+ export interface TokenInfo {
215
+ tokenId: string;
216
+ price: number;
217
+ }
218
+
219
+ export interface GetMarketOutput {
220
+ market: {
221
+ conditionId: string;
222
+ question: string;
223
+ slug: string;
224
+ description?: string;
225
+ };
226
+ prices: {
227
+ yes: number;
228
+ no: number;
229
+ spread?: number;
230
+ };
231
+ tokens: {
232
+ yes: TokenInfo;
233
+ no: TokenInfo;
234
+ };
235
+ stats: {
236
+ volume: number;
237
+ liquidity: number;
238
+ };
239
+ status: {
240
+ active: boolean;
241
+ closed: boolean;
242
+ acceptingOrders: boolean;
243
+ endDate?: string;
244
+ };
245
+ trading: {
246
+ minTickSize?: number;
247
+ minOrderSize?: number;
248
+ };
249
+ }
250
+
251
+ export interface SearchMarketResult {
252
+ conditionId: string;
253
+ question: string;
254
+ slug: string;
255
+ prices: { yes: number; no: number };
256
+ volume: number;
257
+ volume24h?: number;
258
+ endDate?: string;
259
+ }
260
+
261
+ export interface SearchMarketsOutput {
262
+ markets: SearchMarketResult[];
263
+ total: number;
264
+ }
265
+
266
+ export interface TrendingMarket {
267
+ conditionId: string;
268
+ question: string;
269
+ slug: string;
270
+ volume24h?: number;
271
+ priceChange24h?: number;
272
+ prices: { yes: number; no: number };
273
+ status?: {
274
+ active: boolean;
275
+ closed: boolean;
276
+ endDate?: string;
277
+ };
278
+ }
279
+
280
+ export interface GetTrendingMarketsOutput {
281
+ markets: TrendingMarket[];
282
+ }
283
+
284
+ export interface MarketTradeOutput {
285
+ trader: string;
286
+ traderName?: string;
287
+ side: 'BUY' | 'SELL';
288
+ outcome: string;
289
+ size: number;
290
+ price: number;
291
+ timestamp: string;
292
+ }
293
+
294
+ export interface GetMarketTradesOutput {
295
+ market: MarketInfo;
296
+ trades: MarketTradeOutput[];
297
+ summary: {
298
+ buyVolume24h: number;
299
+ sellVolume24h: number;
300
+ netFlow: number;
301
+ };
302
+ }
303
+
304
+ export interface OrderbookLevel {
305
+ price: number;
306
+ size: number;
307
+ total: number;
308
+ }
309
+
310
+ export interface GetOrderbookOutput {
311
+ market: MarketInfo;
312
+ outcome: string;
313
+ tokenId: string;
314
+ orderbook: {
315
+ bids: OrderbookLevel[];
316
+ asks: OrderbookLevel[];
317
+ };
318
+ summary: {
319
+ bestBid: number;
320
+ bestAsk: number;
321
+ spread: number;
322
+ spreadPercent: number;
323
+ bidDepth: number;
324
+ askDepth: number;
325
+ };
326
+ }
327
+
328
+ export interface PriceInfo {
329
+ bestBid: number;
330
+ bestAsk: number;
331
+ midPrice: number;
332
+ spread: number;
333
+ }
334
+
335
+ export interface GetBestPricesOutput {
336
+ market: string;
337
+ yes: PriceInfo;
338
+ no: PriceInfo;
339
+ }
340
+
341
+ export interface EstimateExecutionOutput {
342
+ market: string;
343
+ order: {
344
+ side: 'BUY' | 'SELL';
345
+ outcome: string;
346
+ usdcAmount: number;
347
+ };
348
+ estimate: {
349
+ avgPrice: number;
350
+ sharesReceived: number;
351
+ priceImpact: number;
352
+ worstPrice: number;
353
+ };
354
+ warning: string | null;
355
+ }
356
+
357
+ // ===== Wallet Tool Types =====
358
+
359
+ // Deposit Input/Output
360
+ export interface GetSupportedAssetsInput {
361
+ chainId?: number;
362
+ }
363
+
364
+ export interface SupportedAsset {
365
+ chainId: number;
366
+ chainName: string;
367
+ tokenSymbol: string;
368
+ tokenName: string;
369
+ tokenAddress: string;
370
+ decimals: number;
371
+ minDeposit: string;
372
+ minDepositUsd: number;
373
+ }
374
+
375
+ export interface GetSupportedAssetsOutput {
376
+ assets: SupportedAsset[];
377
+ summary: {
378
+ totalChains: number;
379
+ totalAssets: number;
380
+ chains: string[];
381
+ };
382
+ }
383
+
384
+ export interface GetDepositAddressesInput {
385
+ // Uses wallet from SDK
386
+ }
387
+
388
+ export interface GetDepositAddressesOutput {
389
+ wallet: string;
390
+ addresses: {
391
+ evm: string;
392
+ solana: string;
393
+ bitcoin: string;
394
+ };
395
+ evmChains: string[];
396
+ instructions: string;
397
+ }
398
+
399
+ // Allowance Input/Output
400
+ export interface CheckAllowancesInput {
401
+ // Uses wallet from SDK
402
+ }
403
+
404
+ export interface AllowanceStatus {
405
+ contract: string;
406
+ address: string;
407
+ approved: boolean;
408
+ allowance?: string;
409
+ }
410
+
411
+ export interface CheckAllowancesOutput {
412
+ wallet: string;
413
+ erc20: {
414
+ usdc: {
415
+ balance: string;
416
+ allowances: AllowanceStatus[];
417
+ };
418
+ };
419
+ erc1155: {
420
+ conditionalTokens: {
421
+ approvals: AllowanceStatus[];
422
+ };
423
+ };
424
+ tradingReady: boolean;
425
+ issues: string[];
426
+ }
427
+
428
+ export interface ApproveTradingInput {
429
+ // Uses wallet from SDK
430
+ }
431
+
432
+ export interface ApprovalResult {
433
+ contract: string;
434
+ txHash?: string;
435
+ success: boolean;
436
+ error?: string;
437
+ }
438
+
439
+ export interface ApproveTradingOutput {
440
+ wallet: string;
441
+ erc20Approvals: ApprovalResult[];
442
+ erc1155Approvals: ApprovalResult[];
443
+ allApproved: boolean;
444
+ summary: string;
445
+ }
446
+
447
+ // Error Types
448
+ export interface McpErrorResponse {
449
+ error: {
450
+ code: string;
451
+ message: string;
452
+ details?: Record<string, unknown>;
453
+ };
454
+ }
455
+
456
+ export type McpToolResult<T> = T | McpErrorResponse;
457
+
458
+ // Tool Definition Type
459
+ export interface ToolDefinition {
460
+ name: string;
461
+ description: string;
462
+ inputSchema: {
463
+ type: 'object';
464
+ properties: Record<string, {
465
+ type: string;
466
+ description?: string;
467
+ enum?: string[];
468
+ default?: unknown;
469
+ }>;
470
+ required?: string[];
471
+ };
472
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2022"],
7
+ "outDir": "./dist",
8
+ "rootDir": "./src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "declaration": true,
14
+ "declarationMap": true,
15
+ "sourceMap": true,
16
+ "resolveJsonModule": true
17
+ },
18
+ "include": ["src/**/*"],
19
+ "exclude": ["node_modules", "dist"]
20
+ }