@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.
- package/README.md +317 -0
- package/dist/errors.d.ts +33 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +86 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +173 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +155 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/guide.d.ts +12 -0
- package/dist/tools/guide.d.ts.map +1 -0
- package/dist/tools/guide.js +801 -0
- package/dist/tools/guide.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/market.d.ts +11 -0
- package/dist/tools/market.d.ts.map +1 -0
- package/dist/tools/market.js +314 -0
- package/dist/tools/market.js.map +1 -0
- package/dist/tools/order.d.ts +10 -0
- package/dist/tools/order.d.ts.map +1 -0
- package/dist/tools/order.js +258 -0
- package/dist/tools/order.js.map +1 -0
- package/dist/tools/trade.d.ts +38 -0
- package/dist/tools/trade.d.ts.map +1 -0
- package/dist/tools/trade.js +313 -0
- package/dist/tools/trade.js.map +1 -0
- package/dist/tools/trader.d.ts +11 -0
- package/dist/tools/trader.d.ts.map +1 -0
- package/dist/tools/trader.js +277 -0
- package/dist/tools/trader.js.map +1 -0
- package/dist/tools/wallet.d.ts +274 -0
- package/dist/tools/wallet.d.ts.map +1 -0
- package/dist/tools/wallet.js +579 -0
- package/dist/tools/wallet.js.map +1 -0
- package/dist/types.d.ts +413 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/docs/01-mcp.md +2075 -0
- package/package.json +55 -0
- package/src/errors.ts +124 -0
- package/src/index.ts +309 -0
- package/src/server.ts +183 -0
- package/src/tools/guide.ts +821 -0
- package/src/tools/index.ts +73 -0
- package/src/tools/market.ts +363 -0
- package/src/tools/order.ts +326 -0
- package/src/tools/trade.ts +417 -0
- package/src/tools/trader.ts +322 -0
- package/src/tools/wallet.ts +683 -0
- package/src/types.ts +472 -0
- 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
|
package/dist/errors.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|