@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
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Polymarket MCP Tools
3
+ *
4
+ * This module provides MCP (Model Context Protocol) tools for interacting with Polymarket.
5
+ * It can be used to build an MCP server that exposes Polymarket functionality to AI agents.
6
+ *
7
+ * Tool Categories:
8
+ * - Trader Tools: Analyze traders/wallets (positions, trades, profiles, leaderboard)
9
+ * - Market Tools: Discover and analyze markets (get, search, trending, trades)
10
+ * - Order Tools: Analyze orderbooks (depth, best prices, execution estimates)
11
+ * - Trade Tools: Execute trades (limit orders, market orders) - requires API credentials
12
+ * - Wallet Tools: Deposits and authorization management
13
+ *
14
+ * Usage:
15
+ * ```typescript
16
+ * import { PolymarketSDK } from '@prediction-router/poly-sdk';
17
+ * import { createMcpHandler, allToolDefinitions } from '@prediction-router/poly-sdk/mcp';
18
+ *
19
+ * const sdk = new PolymarketSDK();
20
+ * const handler = createMcpHandler(sdk);
21
+ *
22
+ * // Use with MCP server
23
+ * const result = await handler('get_trader_positions', { address: '0x...' });
24
+ * ```
25
+ */
26
+ import { McpToolError, wrapError } from './errors.js';
27
+ import { allToolDefinitions,
28
+ // Guide handlers
29
+ createGuideHandlers,
30
+ // Trader handlers
31
+ handleGetTraderPositions, handleGetTraderTrades, handleGetTraderProfile, handleGetLeaderboard,
32
+ // Market handlers
33
+ handleGetMarket, handleSearchMarkets, handleGetTrendingMarkets, handleGetMarketTrades,
34
+ // Order handlers
35
+ handleGetOrderbook, handleGetBestPrices, handleEstimateExecution,
36
+ // Trade handlers
37
+ handlePlaceLimitOrder, handlePlaceMarketOrder, handleCancelOrder, handleGetMyOrders,
38
+ // Wallet handlers
39
+ handleGetSupportedAssets, handleGetDepositAddresses, handleDepositUsdc, handleCheckAllowances, handleApproveTrading, handleSwap, handleSwapAndDeposit, handleGetTokenBalances, handleGetWalletBalances, handleGetSwapQuote, handleGetAvailablePools, } from './tools/index.js';
40
+ // Re-export types
41
+ export * from './types.js';
42
+ export * from './errors.js';
43
+ export { allToolDefinitions } from './tools/index.js';
44
+ /**
45
+ * Create an MCP tool handler for the given SDK instance
46
+ */
47
+ export function createMcpHandler(sdk) {
48
+ // Create guide handlers (no SDK dependency)
49
+ const guideHandlers = createGuideHandlers();
50
+ return async (toolName, args) => {
51
+ try {
52
+ switch (toolName) {
53
+ // Guide Tool - should be called FIRST
54
+ case 'get_usage_guide':
55
+ return await guideHandlers.get_usage_guide(args);
56
+ // Trader Tools
57
+ case 'get_trader_positions':
58
+ return await handleGetTraderPositions(sdk, args);
59
+ case 'get_trader_trades':
60
+ return await handleGetTraderTrades(sdk, args);
61
+ case 'get_trader_profile':
62
+ return await handleGetTraderProfile(sdk, args);
63
+ case 'get_leaderboard':
64
+ return await handleGetLeaderboard(sdk, args);
65
+ // Market Tools
66
+ case 'get_market':
67
+ return await handleGetMarket(sdk, args);
68
+ case 'search_markets':
69
+ return await handleSearchMarkets(sdk, args);
70
+ case 'get_trending_markets':
71
+ return await handleGetTrendingMarkets(sdk, args);
72
+ case 'get_market_trades':
73
+ return await handleGetMarketTrades(sdk, args);
74
+ // Order Tools
75
+ case 'get_orderbook':
76
+ return await handleGetOrderbook(sdk, args);
77
+ case 'get_best_prices':
78
+ return await handleGetBestPrices(sdk, args);
79
+ case 'estimate_execution':
80
+ return await handleEstimateExecution(sdk, args);
81
+ // Trade Tools
82
+ case 'place_limit_order':
83
+ return await handlePlaceLimitOrder(sdk, args);
84
+ case 'place_market_order':
85
+ return await handlePlaceMarketOrder(sdk, args);
86
+ case 'cancel_order':
87
+ return await handleCancelOrder(sdk, args);
88
+ case 'get_my_orders':
89
+ return await handleGetMyOrders(sdk, args);
90
+ // Wallet Tools
91
+ case 'get_supported_deposit_assets':
92
+ return await handleGetSupportedAssets(sdk, args);
93
+ case 'get_deposit_addresses':
94
+ return await handleGetDepositAddresses(sdk);
95
+ case 'deposit_usdc':
96
+ return await handleDepositUsdc(sdk, args);
97
+ case 'check_allowances':
98
+ return await handleCheckAllowances(sdk);
99
+ case 'approve_trading':
100
+ return await handleApproveTrading(sdk);
101
+ case 'swap':
102
+ return await handleSwap(sdk, args);
103
+ case 'swap_and_deposit':
104
+ return await handleSwapAndDeposit(sdk, args);
105
+ case 'get_token_balances':
106
+ return await handleGetTokenBalances(sdk);
107
+ case 'get_wallet_balances':
108
+ return await handleGetWalletBalances(sdk, args);
109
+ case 'get_swap_quote':
110
+ return await handleGetSwapQuote(sdk, args);
111
+ case 'get_available_pools':
112
+ return await handleGetAvailablePools(sdk);
113
+ default:
114
+ throw new McpToolError('INVALID_INPUT', `Unknown tool: ${toolName}`);
115
+ }
116
+ }
117
+ catch (err) {
118
+ if (err instanceof McpToolError) {
119
+ return err.toResponse();
120
+ }
121
+ return wrapError(err).toResponse();
122
+ }
123
+ };
124
+ }
125
+ /**
126
+ * Get all tool definitions for MCP registration
127
+ */
128
+ export function getToolDefinitions() {
129
+ return allToolDefinitions;
130
+ }
131
+ /**
132
+ * MCP Server factory (for use with @modelcontextprotocol/sdk)
133
+ *
134
+ * Example usage with MCP SDK:
135
+ * ```typescript
136
+ * import { Server } from '@modelcontextprotocol/sdk/server/index.js';
137
+ * import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
138
+ * import { PolymarketSDK } from '@prediction-router/poly-sdk';
139
+ * import { registerMcpTools } from '@prediction-router/poly-sdk/mcp';
140
+ *
141
+ * const server = new Server(
142
+ * { name: 'poly-mcp', version: '1.0.0' },
143
+ * { capabilities: { tools: {} } }
144
+ * );
145
+ *
146
+ * const sdk = new PolymarketSDK();
147
+ * registerMcpTools(server, sdk);
148
+ *
149
+ * const transport = new StdioServerTransport();
150
+ * await server.connect(transport);
151
+ * ```
152
+ */
153
+ export function registerMcpTools(
154
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
155
+ server, sdk) {
156
+ const handler = createMcpHandler(sdk);
157
+ // Register list tools handler
158
+ server.setRequestHandler({ method: 'tools/list' }, async () => ({ tools: allToolDefinitions }));
159
+ // Register call tool handler
160
+ server.setRequestHandler({ method: 'tools/call' }, async (request) => {
161
+ const { name, arguments: args = {} } = request.params;
162
+ const result = await handler(name, args);
163
+ return {
164
+ content: [
165
+ {
166
+ type: 'text',
167
+ text: JSON.stringify(result, null, 2),
168
+ },
169
+ ],
170
+ };
171
+ });
172
+ }
173
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Polymarket MCP Server
4
+ *
5
+ * A standalone MCP server that exposes Polymarket functionality to AI agents.
6
+ *
7
+ * Usage:
8
+ * npx @prediction-router/poly-sdk-mcp
9
+ * # or
10
+ * node dist/mcp/server.js
11
+ *
12
+ * Configuration via environment variables:
13
+ * - POLY_PRIVATE_KEY: Wallet private key (required for trading, API credentials are derived automatically)
14
+ * - POLY_CHAIN_ID: Chain ID (137 for mainnet, 80002 for testnet, default: 137)
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Polymarket MCP Server
4
+ *
5
+ * A standalone MCP server that exposes Polymarket functionality to AI agents.
6
+ *
7
+ * Usage:
8
+ * npx @prediction-router/poly-sdk-mcp
9
+ * # or
10
+ * node dist/mcp/server.js
11
+ *
12
+ * Configuration via environment variables:
13
+ * - POLY_PRIVATE_KEY: Wallet private key (required for trading, API credentials are derived automatically)
14
+ * - POLY_CHAIN_ID: Chain ID (137 for mainnet, 80002 for testnet, default: 137)
15
+ */
16
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
17
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
18
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
19
+ import { Wallet } from 'ethers';
20
+ import { PolymarketSDK } from '../index.js';
21
+ import { allToolDefinitions } from './tools/index.js';
22
+ import { createMcpHandler } from './index.js';
23
+ /**
24
+ * Create a wallet signer from private key if available
25
+ */
26
+ function createSigner() {
27
+ const privateKey = process.env.POLY_PRIVATE_KEY;
28
+ if (!privateKey) {
29
+ return undefined;
30
+ }
31
+ try {
32
+ // Ensure private key has 0x prefix
33
+ const formattedKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;
34
+ return new Wallet(formattedKey);
35
+ }
36
+ catch (error) {
37
+ console.error('Failed to create wallet from POLY_PRIVATE_KEY:', error);
38
+ return undefined;
39
+ }
40
+ }
41
+ // Server metadata
42
+ const SERVER_NAME = 'polymarket-mcp';
43
+ const SERVER_VERSION = '0.1.0';
44
+ /**
45
+ * Create and configure the MCP server
46
+ */
47
+ function createServer() {
48
+ const server = new Server({
49
+ name: SERVER_NAME,
50
+ version: SERVER_VERSION,
51
+ }, {
52
+ capabilities: {
53
+ tools: {},
54
+ },
55
+ });
56
+ // Create signer from private key if available
57
+ const signer = createSigner();
58
+ // Initialize SDK with environment configuration
59
+ // API credentials are derived automatically from private key via createOrDeriveApiKey()
60
+ const sdk = new PolymarketSDK({
61
+ chainId: process.env.POLY_CHAIN_ID ? parseInt(process.env.POLY_CHAIN_ID) : 137,
62
+ signer,
63
+ });
64
+ // Log trading status
65
+ if (signer) {
66
+ console.error(`Trading enabled for wallet: ${signer.address}`);
67
+ }
68
+ else {
69
+ console.error('Trading disabled (set POLY_PRIVATE_KEY to enable)');
70
+ }
71
+ // Create the tool handler
72
+ const handler = createMcpHandler(sdk);
73
+ // Register list tools handler
74
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
75
+ return {
76
+ tools: allToolDefinitions.map((tool) => ({
77
+ name: tool.name,
78
+ description: tool.description,
79
+ inputSchema: tool.inputSchema,
80
+ })),
81
+ };
82
+ });
83
+ // Register call tool handler
84
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
85
+ const { name, arguments: args = {} } = request.params;
86
+ try {
87
+ const result = await handler(name, args);
88
+ // Check if result is an error response
89
+ if (result && typeof result === 'object' && 'error' in result) {
90
+ return {
91
+ content: [
92
+ {
93
+ type: 'text',
94
+ text: JSON.stringify(result, null, 2),
95
+ },
96
+ ],
97
+ isError: true,
98
+ };
99
+ }
100
+ return {
101
+ content: [
102
+ {
103
+ type: 'text',
104
+ text: JSON.stringify(result, null, 2),
105
+ },
106
+ ],
107
+ };
108
+ }
109
+ catch (error) {
110
+ const errorMessage = error instanceof Error ? error.message : String(error);
111
+ return {
112
+ content: [
113
+ {
114
+ type: 'text',
115
+ text: JSON.stringify({
116
+ error: {
117
+ code: 'INTERNAL_ERROR',
118
+ message: errorMessage,
119
+ },
120
+ }, null, 2),
121
+ },
122
+ ],
123
+ isError: true,
124
+ };
125
+ }
126
+ });
127
+ return server;
128
+ }
129
+ /**
130
+ * Main entry point
131
+ */
132
+ async function main() {
133
+ const server = createServer();
134
+ const transport = new StdioServerTransport();
135
+ // Handle shutdown gracefully
136
+ process.on('SIGINT', async () => {
137
+ await server.close();
138
+ process.exit(0);
139
+ });
140
+ process.on('SIGTERM', async () => {
141
+ await server.close();
142
+ process.exit(0);
143
+ });
144
+ // Connect and run
145
+ await server.connect(transport);
146
+ // Log to stderr (stdout is reserved for MCP protocol)
147
+ console.error(`${SERVER_NAME} v${SERVER_VERSION} started`);
148
+ console.error(`Available tools: ${allToolDefinitions.length}`);
149
+ }
150
+ // Run the server
151
+ main().catch((error) => {
152
+ console.error('Failed to start MCP server:', error);
153
+ process.exit(1);
154
+ });
155
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Usage Guide Tool
3
+ *
4
+ * AI agents should call this tool FIRST to understand how to use Polymarket MCP.
5
+ * Returns common use cases and recommended tool combinations.
6
+ */
7
+ import type { ToolDefinition } from '../types.js';
8
+ type GuideHandler = (args: Record<string, unknown>) => Promise<unknown>;
9
+ export declare const guideToolDefinitions: ToolDefinition[];
10
+ export declare function createGuideHandlers(): Record<string, GuideHandler>;
11
+ export {};
12
+ //# sourceMappingURL=guide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/guide.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAExE,eAAO,MAAM,oBAAoB,EAAE,cAAc,EA2BhD,CAAC;AAkvBF,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CA2BlE"}