@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/README.md ADDED
@@ -0,0 +1,317 @@
1
+ # @catalyst-team/poly-mcp
2
+
3
+ A Model Context Protocol (MCP) server that exposes Polymarket functionality to AI agents.
4
+
5
+ ## Installation
6
+
7
+ ### From npm (after publishing)
8
+
9
+ ```bash
10
+ npm install -g @catalyst-team/poly-mcp
11
+ # or
12
+ pnpm add -g @catalyst-team/poly-mcp
13
+ ```
14
+
15
+ ### From source
16
+
17
+ ```bash
18
+ # Build the packages
19
+ pnpm -F @catalyst-team/poly-sdk build
20
+ pnpm -F @catalyst-team/poly-mcp build
21
+ ```
22
+
23
+ ## Publishing
24
+
25
+ ```bash
26
+ # 1. Build both packages
27
+ pnpm -F @catalyst-team/poly-sdk build
28
+ pnpm -F @catalyst-team/poly-mcp build
29
+
30
+ # 2. Publish poly-sdk first (poly-mcp depends on it)
31
+ pnpm -F @catalyst-team/poly-sdk publish --access public
32
+
33
+ # 3. Publish poly-mcp
34
+ pnpm -F @catalyst-team/poly-mcp publish --access public
35
+ ```
36
+
37
+ **Note**: Publishing requires npm 2FA authentication.
38
+
39
+ ## MCP Configuration
40
+
41
+ ### After npm publish (recommended)
42
+
43
+ Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
44
+
45
+ #### Read-only mode (market data, orderbook, trader analysis)
46
+
47
+ ```json
48
+ {
49
+ "mcpServers": {
50
+ "polymarket": {
51
+ "command": "npx",
52
+ "args": ["@catalyst-team/poly-mcp"]
53
+ }
54
+ }
55
+ }
56
+ ```
57
+
58
+ #### Trading mode (with private key)
59
+
60
+ ```json
61
+ {
62
+ "mcpServers": {
63
+ "polymarket": {
64
+ "command": "npx",
65
+ "args": ["@catalyst-team/poly-mcp"],
66
+ "env": {
67
+ "POLY_PRIVATE_KEY": "your-wallet-private-key"
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
74
+ ### Local development
75
+
76
+ #### Read-only mode
77
+
78
+ ```json
79
+ {
80
+ "mcpServers": {
81
+ "polymarket": {
82
+ "command": "node",
83
+ "args": ["/path/to/PerdictionRouter/packages/poly-mcp/dist/server.js"]
84
+ }
85
+ }
86
+ }
87
+ ```
88
+
89
+ #### Trading mode
90
+
91
+ ```json
92
+ {
93
+ "mcpServers": {
94
+ "polymarket": {
95
+ "command": "node",
96
+ "args": ["/path/to/PerdictionRouter/packages/poly-mcp/dist/server.js"],
97
+ "env": {
98
+ "POLY_PRIVATE_KEY": "your-wallet-private-key"
99
+ }
100
+ }
101
+ }
102
+ }
103
+ ```
104
+
105
+ #### Development mode (with hot reload)
106
+
107
+ ```json
108
+ {
109
+ "mcpServers": {
110
+ "polymarket": {
111
+ "command": "npx",
112
+ "args": ["tsx", "/path/to/PerdictionRouter/packages/poly-mcp/src/server.ts"],
113
+ "env": {
114
+ "POLY_PRIVATE_KEY": "your-wallet-private-key"
115
+ }
116
+ }
117
+ }
118
+ }
119
+ ```
120
+
121
+ ## Environment Variables
122
+
123
+ | Variable | Description | Required |
124
+ |----------|-------------|----------|
125
+ | `POLY_PRIVATE_KEY` | Wallet private key (with or without 0x prefix) | For trading |
126
+ | `POLY_CHAIN_ID` | Chain ID (137=mainnet, 80002=testnet) | Optional (default: 137) |
127
+
128
+ **Note**: API credentials are automatically derived from the private key using Polymarket's `createOrDeriveApiKey()`. You only need to provide the wallet private key to enable trading.
129
+
130
+ ## Available Tools
131
+
132
+ ### Trader Tools (public data)
133
+
134
+ | Tool | Description |
135
+ |------|-------------|
136
+ | `get_trader_positions` | Get current positions for a wallet address |
137
+ | `get_trader_trades` | Get trade history for a wallet |
138
+ | `get_trader_profile` | Get trader profile with PnL and stats |
139
+ | `get_leaderboard` | Get top traders from leaderboard |
140
+
141
+ ### Market Tools (public data)
142
+
143
+ | Tool | Description |
144
+ |------|-------------|
145
+ | `get_market` | Get market details by slug or conditionId |
146
+ | `search_markets` | Search markets by keyword |
147
+ | `get_trending_markets` | Get trending markets by volume/liquidity |
148
+ | `get_market_trades` | Get recent trades for a market |
149
+
150
+ ### Order Tools (public data)
151
+
152
+ | Tool | Description |
153
+ |------|-------------|
154
+ | `get_orderbook` | Get orderbook depth for a market outcome |
155
+ | `get_best_prices` | Get best bid/ask prices for both outcomes |
156
+ | `estimate_execution` | Estimate execution price and slippage |
157
+
158
+ ### Trade Tools (requires private key)
159
+
160
+ | Tool | Description |
161
+ |------|-------------|
162
+ | `place_limit_order` | Place a limit order |
163
+ | `place_market_order` | Place a market order |
164
+ | `cancel_order` | Cancel an existing order |
165
+ | `get_my_orders` | Get your open orders |
166
+
167
+ ### Wallet Tools
168
+
169
+ | Tool | Description | Requires Key |
170
+ |------|-------------|--------------|
171
+ | `get_supported_deposit_assets` | Get all supported assets and chains for deposits | No |
172
+ | `get_deposit_addresses` | Get deposit addresses (EVM, Solana, Bitcoin) | Yes |
173
+ | `deposit_usdc` | Deposit USDC to Polymarket | Yes |
174
+ | `check_allowances` | Check ERC20 and ERC1155 allowances for trading | Yes |
175
+ | `approve_trading` | Set up all required approvals for trading | Yes |
176
+ | `swap` | Swap tokens on Polygon via QuickSwap V3 | Yes |
177
+ | `swap_and_deposit` | Swap to USDC and deposit in one operation | Yes |
178
+ | `get_token_balances` | Get your wallet token balances | Yes |
179
+ | `get_wallet_balances` | Get any wallet's token balances | No |
180
+ | `get_swap_quote` | Get a swap quote (check route availability) | No |
181
+ | `get_available_pools` | Get available QuickSwap V3 pools | No |
182
+
183
+ ## Tool Examples
184
+
185
+ ### Get Market
186
+
187
+ ```json
188
+ {
189
+ "name": "get_market",
190
+ "arguments": {
191
+ "identifier": "will-bitcoin-hit-100k-in-2024"
192
+ }
193
+ }
194
+ ```
195
+
196
+ Response:
197
+ ```json
198
+ {
199
+ "market": {
200
+ "conditionId": "0x...",
201
+ "question": "Will Bitcoin hit $100k in 2024?",
202
+ "slug": "will-bitcoin-hit-100k-in-2024"
203
+ },
204
+ "prices": {
205
+ "yes": 0.65,
206
+ "no": 0.35
207
+ },
208
+ "stats": {
209
+ "volume": 1500000,
210
+ "liquidity": 250000
211
+ }
212
+ }
213
+ ```
214
+
215
+ ### Get Trader Positions
216
+
217
+ ```json
218
+ {
219
+ "name": "get_trader_positions",
220
+ "arguments": {
221
+ "address": "0x1234..."
222
+ }
223
+ }
224
+ ```
225
+
226
+ ### Get Swap Quote
227
+
228
+ ```json
229
+ {
230
+ "name": "get_swap_quote",
231
+ "arguments": {
232
+ "tokenIn": "MATIC",
233
+ "tokenOut": "USDC",
234
+ "amount": "100"
235
+ }
236
+ }
237
+ ```
238
+
239
+ Response:
240
+ ```json
241
+ {
242
+ "tokenIn": "MATIC",
243
+ "tokenOut": "USDC",
244
+ "amountIn": "100",
245
+ "amountOut": "55.23",
246
+ "route": "MATIC → WETH → USDC (multi-hop)",
247
+ "priceImpact": "0.15%"
248
+ }
249
+ ```
250
+
251
+ ## Programmatic Usage
252
+
253
+ ```typescript
254
+ import { PolymarketSDK } from '@catalyst-team/poly-sdk';
255
+ import { createMcpHandler } from '@catalyst-team/poly-mcp';
256
+
257
+ const sdk = new PolymarketSDK();
258
+ const handler = createMcpHandler(sdk);
259
+
260
+ // Call any tool
261
+ const result = await handler('get_market', {
262
+ identifier: 'btc-100k',
263
+ });
264
+
265
+ console.log(result);
266
+ ```
267
+
268
+ Or register with an MCP server instance:
269
+
270
+ ```typescript
271
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
272
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
273
+ import { PolymarketSDK } from '@catalyst-team/poly-sdk';
274
+ import { registerMcpTools } from '@catalyst-team/poly-mcp';
275
+
276
+ const server = new Server(
277
+ { name: 'my-server', version: '1.0.0' },
278
+ { capabilities: { tools: {} } }
279
+ );
280
+
281
+ const sdk = new PolymarketSDK();
282
+ registerMcpTools(server, sdk);
283
+
284
+ const transport = new StdioServerTransport();
285
+ await server.connect(transport);
286
+ ```
287
+
288
+ ## Architecture
289
+
290
+ ```
291
+ packages/poly-mcp/
292
+ ├── src/
293
+ │ ├── index.ts # Main exports and handler factory
294
+ │ ├── server.ts # Standalone MCP server (CLI entry point)
295
+ │ ├── types.ts # TypeScript type definitions
296
+ │ ├── errors.ts # Error handling utilities
297
+ │ └── tools/
298
+ │ ├── index.ts # Tool exports
299
+ │ ├── trader.ts # Trader analysis tools
300
+ │ ├── market.ts # Market discovery tools
301
+ │ ├── order.ts # Orderbook analysis tools
302
+ │ ├── trade.ts # Trading execution tools
303
+ │ ├── wallet.ts # Deposit and authorization tools
304
+ │ └── guide.ts # Usage guide tool
305
+ ├── docs/
306
+ │ └── 01-mcp.md # Detailed MCP design document
307
+ ├── package.json
308
+ └── README.md
309
+ ```
310
+
311
+ ## Related Packages
312
+
313
+ - `@catalyst-team/poly-sdk` - Core SDK for Polymarket APIs (required dependency)
314
+
315
+ ## License
316
+
317
+ MIT
@@ -0,0 +1,33 @@
1
+ /**
2
+ * MCP Error Handling for Polymarket Tools
3
+ */
4
+ export declare enum ErrorCode {
5
+ INVALID_ADDRESS = "INVALID_ADDRESS",
6
+ MARKET_NOT_FOUND = "MARKET_NOT_FOUND",
7
+ INSUFFICIENT_BALANCE = "INSUFFICIENT_BALANCE",
8
+ ORDER_REJECTED = "ORDER_REJECTED",
9
+ RATE_LIMITED = "RATE_LIMITED",
10
+ AUTH_REQUIRED = "AUTH_REQUIRED",
11
+ INVALID_INPUT = "INVALID_INPUT",
12
+ INTERNAL_ERROR = "INTERNAL_ERROR"
13
+ }
14
+ export declare class McpToolError extends Error {
15
+ code: ErrorCode;
16
+ details?: Record<string, unknown> | undefined;
17
+ constructor(code: ErrorCode, message: string, details?: Record<string, unknown> | undefined);
18
+ toResponse(): {
19
+ error: {
20
+ code: ErrorCode;
21
+ message: string;
22
+ details: Record<string, unknown> | undefined;
23
+ };
24
+ };
25
+ }
26
+ export declare function validateAddress(address: string): void;
27
+ export declare function validateConditionId(conditionId: string): void;
28
+ export declare function validateOutcome(outcome: string): void;
29
+ export declare function validateSide(side: string): void;
30
+ export declare function validatePrice(price: number): void;
31
+ export declare function validatePositiveNumber(value: number, name: string): void;
32
+ export declare function wrapError(err: unknown): McpToolError;
33
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,SAAS;IACnB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,oBAAoB,yBAAyB;IAC7C,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;CAClC;AAED,qBAAa,YAAa,SAAQ,KAAK;IAE5B,IAAI,EAAE,SAAS;IAEf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;IAM1C,UAAU;;;;;;;CASX;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAcrD;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAc7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQrD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQ/C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAQjD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQxE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAepD"}
package/dist/errors.js ADDED
@@ -0,0 +1,86 @@
1
+ /**
2
+ * MCP Error Handling for Polymarket Tools
3
+ */
4
+ export var ErrorCode;
5
+ (function (ErrorCode) {
6
+ ErrorCode["INVALID_ADDRESS"] = "INVALID_ADDRESS";
7
+ ErrorCode["MARKET_NOT_FOUND"] = "MARKET_NOT_FOUND";
8
+ ErrorCode["INSUFFICIENT_BALANCE"] = "INSUFFICIENT_BALANCE";
9
+ ErrorCode["ORDER_REJECTED"] = "ORDER_REJECTED";
10
+ ErrorCode["RATE_LIMITED"] = "RATE_LIMITED";
11
+ ErrorCode["AUTH_REQUIRED"] = "AUTH_REQUIRED";
12
+ ErrorCode["INVALID_INPUT"] = "INVALID_INPUT";
13
+ ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
14
+ })(ErrorCode || (ErrorCode = {}));
15
+ export class McpToolError extends Error {
16
+ code;
17
+ details;
18
+ constructor(code, message, details) {
19
+ super(message);
20
+ this.code = code;
21
+ this.details = details;
22
+ this.name = 'McpToolError';
23
+ }
24
+ toResponse() {
25
+ return {
26
+ error: {
27
+ code: this.code,
28
+ message: this.message,
29
+ details: this.details,
30
+ },
31
+ };
32
+ }
33
+ }
34
+ export function validateAddress(address) {
35
+ if (!address || typeof address !== 'string') {
36
+ throw new McpToolError(ErrorCode.INVALID_ADDRESS, 'Address is required');
37
+ }
38
+ if (!address.startsWith('0x') || address.length !== 42) {
39
+ throw new McpToolError(ErrorCode.INVALID_ADDRESS, 'Address must be a valid Ethereum address (0x...)', { address });
40
+ }
41
+ }
42
+ export function validateConditionId(conditionId) {
43
+ if (!conditionId || typeof conditionId !== 'string') {
44
+ throw new McpToolError(ErrorCode.INVALID_INPUT, 'Condition ID is required');
45
+ }
46
+ if (!conditionId.startsWith('0x')) {
47
+ throw new McpToolError(ErrorCode.INVALID_INPUT, 'Condition ID must start with 0x', { conditionId });
48
+ }
49
+ }
50
+ export function validateOutcome(outcome) {
51
+ if (!['Yes', 'No'].includes(outcome)) {
52
+ throw new McpToolError(ErrorCode.INVALID_INPUT, 'Outcome must be "Yes" or "No"', { outcome });
53
+ }
54
+ }
55
+ export function validateSide(side) {
56
+ if (!['BUY', 'SELL'].includes(side)) {
57
+ throw new McpToolError(ErrorCode.INVALID_INPUT, 'Side must be "BUY" or "SELL"', { side });
58
+ }
59
+ }
60
+ export function validatePrice(price) {
61
+ if (typeof price !== 'number' || price < 0.001 || price > 0.999) {
62
+ throw new McpToolError(ErrorCode.INVALID_INPUT, 'Price must be between 0.001 and 0.999', { price });
63
+ }
64
+ }
65
+ export function validatePositiveNumber(value, name) {
66
+ if (typeof value !== 'number' || value <= 0) {
67
+ throw new McpToolError(ErrorCode.INVALID_INPUT, `${name} must be a positive number`, { [name]: value });
68
+ }
69
+ }
70
+ export function wrapError(err) {
71
+ if (err instanceof McpToolError) {
72
+ return err;
73
+ }
74
+ if (err instanceof Error) {
75
+ // Check for known error types
76
+ if (err.message.includes('rate limit')) {
77
+ return new McpToolError(ErrorCode.RATE_LIMITED, 'Rate limit exceeded');
78
+ }
79
+ if (err.message.includes('not found')) {
80
+ return new McpToolError(ErrorCode.MARKET_NOT_FOUND, err.message);
81
+ }
82
+ return new McpToolError(ErrorCode.INTERNAL_ERROR, err.message);
83
+ }
84
+ return new McpToolError(ErrorCode.INTERNAL_ERROR, 'An unexpected error occurred');
85
+ }
86
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Polymarket MCP Server
3
+ *
4
+ * This package 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 '@catalyst-team/poly-sdk';
17
+ * import { createMcpHandler, allToolDefinitions } from '@catalyst-team/poly-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 { PolymarketSDK } from '@catalyst-team/poly-sdk';
27
+ export * from './types.js';
28
+ export * from './errors.js';
29
+ export { allToolDefinitions } from './tools/index.js';
30
+ export type ToolHandler = (toolName: string, args: Record<string, unknown>) => Promise<unknown>;
31
+ /**
32
+ * Create an MCP tool handler for the given SDK instance
33
+ */
34
+ export declare function createMcpHandler(sdk: PolymarketSDK): ToolHandler;
35
+ /**
36
+ * Get all tool definitions for MCP registration
37
+ */
38
+ export declare function getToolDefinitions(): import("./types.js").ToolDefinition[];
39
+ /**
40
+ * MCP Server factory (for use with @modelcontextprotocol/sdk)
41
+ *
42
+ * Example usage with MCP SDK:
43
+ * ```typescript
44
+ * import { Server } from '@modelcontextprotocol/sdk/server/index.js';
45
+ * import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
46
+ * import { PolymarketSDK } from '@catalyst-team/poly-sdk';
47
+ * import { registerMcpTools } from '@catalyst-team/poly-mcp';
48
+ *
49
+ * const server = new Server(
50
+ * { name: 'poly-mcp', version: '1.0.0' },
51
+ * { capabilities: { tools: {} } }
52
+ * );
53
+ *
54
+ * const sdk = new PolymarketSDK();
55
+ * registerMcpTools(server, sdk);
56
+ *
57
+ * const transport = new StdioServerTransport();
58
+ * await server.connect(transport);
59
+ * ```
60
+ */
61
+ export declare function registerMcpTools(server: any, sdk: PolymarketSDK): void;
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAwCxD,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,MAAM,MAAM,WAAW,GAAG,CACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,WAAW,CAwKhE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,0CAEjC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAE9B,MAAM,EAAE,GAAG,EACX,GAAG,EAAE,aAAa,GACjB,IAAI,CA0BN"}
package/dist/index.js ADDED
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Polymarket MCP Server
3
+ *
4
+ * This package 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 '@catalyst-team/poly-sdk';
17
+ * import { createMcpHandler, allToolDefinitions } from '@catalyst-team/poly-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 '@catalyst-team/poly-sdk';
139
+ * import { registerMcpTools } from '@catalyst-team/poly-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