Polymarket Intel
@aemery13
An MCP server and REST API that classifies Polymarket wallets as human or bot, scores their trading edge from 0–10, and streams their current open positions. Built for AI agents on copy-trading and signal-following stacks.
# Use it from any MCP client (Claude Desktop, Cursor, etc.)
pip install polymarket-intel-mcp
polymarket-intel-mcp
# Or call the hosted REST API directly
curl https://polymarket-intel-production.up.railway.app/wallet/0xf1528f12e645462c344799b62b1b421a6a4c64aa
How this fits with other Polymarket MCP servers
There are several MCP servers covering Polymarket, each at a different layer:
Server What it does When to use it
polymarket-intel (this) Wallet intelligence — classify human vs bot, score trading edge, read open positions Deciding whose signals to follow
graph-polymarket-mcp Market data via The Graph subgraphs (20 tools, 8 subgraphs) Reading raw on-chain market data
whitmorelabs/polymarket-mcp Slippage, liquidity, arbitrage, price feeds Pricing your own trades
joinQuantish/polymarket Self-hosted trading agent Running an autonomous bot
These complement each other. A copy-trading agent would use polymarket-intel to filter wallets worth following, then graph-polymarket-mcp to read the markets those wallets are betting on, then whitmorelabs/polymarket-mcp to size its own entries.
What it answers
"Is this trader a human or a bot?" — score_polymarket_wallet(wallet_address) → returns classification ∈ {human, bot, insufficient_data} plus a confidence score and reason codes.
"Do they actually have an edge?" — edge_score from 0–10, gated on net realised PnL so distributed-but-losing wallets don't get false positives.
"What are they betting on right now?" — get_open_positions(wallet_address) returns live positions sorted by size, refreshed every 30s.
"How has their edge changed over time?" — /wallet/{address}/history returns the score time series from the daily snapshots.
Why this exists
The Polymarket leaderboard is misleading. It includes unrealised PnL marked-to-current-price, so the names at the top are dominated by bots running structural arb plus a few wallets sitting on huge open positions that may never resolve in their favour. Agents that copy-trade naively from the leaderboard get burned.
This service runs every leaderboard wallet through behavioural fingerprinting (focus ratio, holding period, timing regularity, category concentration) plus PnL reconstruction from raw activity, and only surfaces traders that look like genuine humans with a real edge.
The dataset grows more valuable over time — every day the snapshot job runs, historical signals accumulate. Wallets that have been consistently above edge 7 for 90 days are a stronger signal than any single point-in-time score.
Distributed as both a REST API and an MCP server
Surface Use case Setup
MCP server Agent that needs tool-style access pip install polymarket-intel-mcp
REST API Custom HTTP integration, dashboards curl https://polymarket-intel-production.up.railway.app/...
Hosted MCP Agent on any MCP-compatible client Add https://polymarket-intel-production.up.railway.app/mcp to client config
Architecture
┌──────────────────────────────────────────────┐
│ core/ │
│ client.py — Polymarket data API client │
│ signals.py — pure signal calculators │
│ scorer.py — classifier + edge score │
│ models.py — Pydantic response schemas │
├──────────────────────────────────────────────┤
│ db/ │
│ schema.sql — Postgres tables + indexes │
│ repository.py — Repository protocol + │
│ InMemoryRepository │
│ supabase_repo.py — Supabase impl │
│ converters.py — ScoreResult ↔ records │
├──────────────────────────────────────────────┤
│ api/main.py — FastAPI HTTP server │
│ mcp_server/ — MCP server (stdio) │
│ scripts/ │
│ analyze_wallet.py — CLI │
│ snapshot_job.py — daily cron entry │
│ tests/ │
└──────────────────────────────────────────────┘
Core has no idea persistence exists. The API and snapshot job depend on the Repository protocol — Supabase in production, in-memory in tests and when env vars are unset. This is what makes the suite run without a database and what lets you swap Supabase for Neon, RDS, or anything else later by adding one file.