Polymarket MCP Bot Analyst
by DzimaSh
README.md
# š¤ Polymarket MCP Bot Analyst
> **MCP server for analyzing successful trading bots on Polymarket** ā discover top traders, classify their strategies with AI, and detect bots on the world's largest prediction market.
[](https://www.typescriptlang.org/)
[](https://modelcontextprotocol.io/)
[](https://nodejs.org/)
[](https://github.com/DzimaSh/polymarket-mcp-bot-analyst/actions/workflows/ci.yml)
[](https://github.com/DzimaSh/polymarket-mcp-bot-analyst/actions/workflows/release.yml)
---
## š Table of Contents
- [Overview](#overview)
- [Architecture](#architecture)
- [Tools](#tools)
- [Getting Started](#getting-started)
- [Connect to Claude Desktop](#connect-to-claude-desktop)
- [Run the Test Suite](#run-the-test-suite)
- [Project Structure](#project-structure)
- [Configuration](#configuration)
---
## Overview
This project implements a **Model Context Protocol (MCP) server** that exposes three powerful tools for analyzing trading activity on [Polymarket](https://polymarket.com). It combines real-time leaderboard data from Polymarket's Data API with LLM-powered strategy classification via OpenAI.
### Key Features
- š **Top Trader Discovery** ā Fetch leaderboard rankings by timeframe
- š§ **AI Strategy Analysis** ā Classify strategies (arbitrage, market-making, etc.) using GPT-4o-mini
- š¤ **Bot Detection** ā Heuristic + LLM-based identification of automated traders
- š **Batch Reporting** ā Concurrent analysis of multiple profiles
- š **Resilient API Layer** ā Exponential backoff, rate-limit handling (429 + Retry-After), graceful fallbacks
---
```mermaid
graph TD
subgraph Client ["Client Layer"]
MCP_Client["MCP Client (e.g., Claude Desktop)"]
end
subgraph Server ["MCP Server Layer"]
index["index.ts (McpServer)"]
Validation["Zod Validation"]
end
subgraph Tools ["Tool Handlers"]
Traders["traders.ts (find_top_traders)"]
Analysis["analysis.ts (analyze_trader_strategy)"]
Reports["reports.ts (generate_batch_report)"]
end
subgraph Services ["External Services & Utils"]
PAPI["api/polymarket.ts (Polymarket Data API)"]
LLM["utils/llm.ts (OpenAI GPT-4o-mini)"]
end
MCP_Client -- "stdio (JSON-RPC)" --> index
index --> Validation
Validation --> Traders
Validation --> Analysis
Validation --> Reports
Traders --> PAPI
Analysis --> PAPI
Analysis --> LLM
Reports --> Analysis
Reports --> PAPI
style Client fill:#f9f,stroke:#333,stroke-width:2px
style Server fill:#bbf,stroke:#333,stroke-width:2px
style Tools fill:#dfd,stroke:#333,stroke-width:2px
style Services fill:#ffd,stroke:#333,stroke-width:2px
```
### Tool Execution Flow
```mermaid
sequenceDiagram
participant C as MCP Client
participant S as MCP Server
participant T as Tool Handler
participant P as Polymarket API
participant L as OpenAI LLM
C->>S: Call "analyze_trader_strategy"
S->>S: Validate Input (Zod)
S->>T: handleAnalyzeStrategy(profile_id)
T->>P: Fetch Profile Data & PnL
P-->>T: User Data
T->>P: Fetch Trade History
P-->>T: Trade History
T->>L: Classify strategy (history)
L-->>T: strategy_analysis (JSON)
T-->>S: strategy_result
S-->>C: Tool Response (JSON)
```
---
## Tools
### 1. `find_top_traders`
Fetch top-performing traders from the Polymarket leaderboard with bot detection.
| Parameter | Type | Description |
|-------------|---------|---------------------------------------|
| `limit` | integer | Number of traders (1ā50) |
| `timeframe` | string | `"7d"`, `"30d"`, or `"all_time"` |
**Output:** `Array<{ profile_id, pnl, is_bot }>`
### 2. `analyze_trader_strategy`
Deep-dive analysis of a single trader using trade history + LLM classification.
| Parameter | Type | Description |
|--------------|--------|------------------------------------------|
| `profile_id` | string | Wallet address (`0xā¦`) or username (`@name`) |
**Output:** `{ strategy_description, risk_level, risk_justification, success_score, is_bot }`
### 3. `generate_batch_report`
Concurrent analysis of multiple profiles with error-resilient execution.
| Parameter | Type | Description |
|---------------|----------|---------------------------------|
| `profile_ids` | string[] | Array of profile IDs (1ā50) |
**Output:** `Array<{ profile_id, pnl, strategy_description, risk_level, risk_justification, success_score, is_bot }>`
---
## Getting Started
### Prerequisites
- **Node.js** ā„ 22
- **npm** ā„ 10
- **OpenAI API key** (for strategy analysis)
### Installation
```bash
# Clone the repository
git clone <your-repo-url>
cd polymarket-mcp-bot-analyst
# Install dependencies
npm install
# Configure environment
cp .env.example .env
# Edit .env and add your OPENAI_API_KEY
```
### Build & Run
```bash
# Build TypeScript
npm run build
# Start the MCP server (stdio transport)
npm start
# Or run directly with tsx (development)
npm run dev
```
---
## Connect to Claude Desktop
Add this server to your Claude Desktop configuration:
### macOS
Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"polymarket-bot-analyst": {
"command": "node",
"args": ["/absolute/path/to/polymarket-mcp-bot-analyst/dist/index.js"],
"env": {
"OPENAI_API_KEY": "sk-..."
}
}
}
}
```
### Windows
Edit `%APPDATA%\Claude\claude_desktop_config.json`:
```json
{
"mcpServers": {
"polymarket-bot-analyst": {
"command": "node",
"args": ["C:\\path\\to\\polymarket-mcp-bot-analyst\\dist\\index.js"],
"env": {
"OPENAI_API_KEY": "sk-..."
}
}
}
}
```
After saving, **restart Claude Desktop**. The three tools will appear in the tools menu (šØ icon).
---
## Run the Test Suite
The test runner executes all three tools against the live Polymarket API and generates the required JSON artifacts:
```bash
npm run test:run
```
This produces:
| File | Description |
|----------------------------|-------------------------------------------------|
| `test_run.json` | Full execution log with data for 3+ traders |
| `performance_report.json` | Latency metrics for each endpoint |
| `my_report.json` | Architectural description of each endpoint |
---
## Project Structure
```
polymarket-mcp-bot-analyst/
āāā src/
ā āāā index.ts # MCP server entry point
ā āāā types.ts # Shared interfaces & config
ā āāā api/
ā ā āāā polymarket.ts # Polymarket Data API wrapper
ā āāā tools/
ā ā āāā traders.ts # find_top_traders handler
ā ā āāā analysis.ts # analyze_trader_strategy handler
ā ā āāā reports.ts # generate_batch_report handler
ā āāā utils/
ā ā āāā llm.ts # OpenAI LLM integration
ā āāā test-run.ts # Artifact generator script
āāā test_run.json # Generated test run log
āāā performance_report.json # Generated latency metrics
āāā my_report.json # Generated architecture report
āāā package.json
āāā tsconfig.json
āāā .env.example
āāā .gitignore
```
---
## Configuration
| Environment Variable | Required | Description |
|---------------------|----------|----------------------------------|
| `OPENAI_API_KEY` | Yes | OpenAI API key for GPT-4o-mini |
### Internal Constants (in `src/types.ts`)
| Constant | Default | Description |
|-------------------------------|-----------|--------------------------------------|
| `POLYMARKET_API_BASE` | `https://data-api.polymarket.com` | API base URL |
| `REQUEST_TIMEOUT_MS` | `15000` | HTTP request timeout |
| `MAX_RETRIES` | `3` | Max retry attempts per request |
| `RETRY_BASE_DELAY_MS` | `1000` | Base delay for exponential backoff |
| `BOT_TRADE_THRESHOLD` | `200` | Min trades to flag as bot |
| `BOT_TRADES_PER_HOUR_THRESHOLD` | `10` | Min trades/hour for bot flag |
---
## License
MIT
TDQS
A4.2/5.0
Scored across 3 tools
Disambiguation5/5
Each tool has a clearly distinct purpose: finding top traders, analyzing a single trader's strategy, and generating batch reports. No overlap in functionality.
Naming Consistency5/5
All tool names follow the verb_noun pattern (find_top_traders, analyze_trader_strategy, generate_batch_report), providing a predictable and consistent naming convention.
Tool Count5/5
Three tools are perfectly scoped for this niche domain of trader analysis and bot detection. Each tool earns its place, and the count is neither too thin nor excessive.
Completeness5/5
The tool set covers the full workflow: discovering traders via the leaderboard, deep-diving into individual strategies, and scaling to batch analysis. No critical gaps or dead ends.