Lets an AI client track smart-money traders on Polymarket by accessing leaderboards and real-time trade fills.
Also known as polymarketwallets/pmwallets-node, pmwallets-node
- Stars
- 0
- Tools
- —
- Downloads, 30 days
- 655
- Latest version
- 0.6.6
- Last commit
- Nov 6, 2026
- License
- MIT
What is PMWallets MCP?
PMWallets lets an AI client track smart-money traders on Polymarket by accessing leaderboards and real-time trade fills.
Summary generated from the project's README
About PMWallets MCP server
PMWallets provides a specialized interface for monitoring profitable traders on Polymarket by analyzing data from the Polygon blockchain. This server allows developers and AI agents to access smart-money leaderboards and receive real-time trade fills. It is designed for users who want to track specific wallet activities or discover high-performing traders across categories like politics, sports, and crypto.
To use this server, you must provide a PMW_API_KEY obtained from the PMWallets website. The MCP implementation allows AI clients such as Claude Desktop, Cursor, or Windsurf to interact with the platform directly. Users can query leaderboards with specific win-rate thresholds, subscribe to individual wallet entities, and stream live trade data. The system ensures reliability by replaying missed fills and using a persisted cursor to prevent data gaps during restarts.
What you can do with it
- 1Identify profitable tradersAn AI agent can scan the leaderboard for traders with a minimum win rate in specific categories.
- 2Monitor specific wallet activityYou can instruct an AI to follow a specific trader and alert you when they execute a trade.
- 3Stream real-time trade fillsDevelopers can set up a live feed of market fills to trigger automated responses or analysis.
- 4Export historical trade dataThe service allows for the retrieval of comprehensive trade histories via compressed CSV files.
Written from the project's README. Every use case is checked against a quote from it.
How to install PMWallets MCP
Formats verified 10 Nov 2026Add to CursorAdd to GooseInstall PMWallets MCP in Claude Code
$ claude mcp add --env 'PMW_API_KEY=<YOUR_PMW_API_KEY>' pmwallets-node -- npx -y pmwalletsInstall PMWallets MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"pmwallets-node": {
"command": "npx",
"args": [
"-y",
"pmwallets"
],
"env": {
"PMW_API_KEY": "<YOUR_PMW_API_KEY>"
}
}
}
}Install PMWallets MCP in VS Code
.vscode/mcp.json
{
"servers": {
"pmwallets-node": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"pmwallets"
],
"env": {
"PMW_API_KEY": "<YOUR_PMW_API_KEY>"
}
}
}
}Install PMWallets MCP in VS Code CLI
$ code --add-mcp '{"name":"pmwallets-node","type":"stdio","command":"npx","args":["-y","pmwallets"],"env":{"PMW_API_KEY":"<YOUR_PMW_API_KEY>"}}'Install PMWallets MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"pmwallets-node": {
"command": "npx",
"args": [
"-y",
"pmwallets"
],
"env": {
"PMW_API_KEY": "<YOUR_PMW_API_KEY>"
}
}
}
}Install PMWallets MCP in Codex
$ codex mcp add pmwallets-node --env 'PMW_API_KEY=<YOUR_PMW_API_KEY>' --env 'PMW_API_KEY=<YOUR_PMW_API_KEY>' -- npx -y pmwalletsInstall PMWallets MCP in Codex config.toml
~/.codex/config.toml
[mcp_servers.pmwallets-node] command = "npx" args = ["-y", "pmwallets"] [mcp_servers.pmwallets-node.env] PMW_API_KEY = "<YOUR_PMW_API_KEY>"
Install PMWallets MCP in Gemini CLI
$ gemini mcp add -s user -e 'PMW_API_KEY=<YOUR_PMW_API_KEY>' -e 'PMW_API_KEY=<YOUR_PMW_API_KEY>' pmwallets-node npx -- -y pmwalletsInstall PMWallets MCP in Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"pmwallets-node": {
"command": "npx",
"args": [
"-y",
"pmwallets"
],
"env": {
"PMW_API_KEY": "<YOUR_PMW_API_KEY>"
}
}
}
}Configuration
PMW_API_KEYRequiredSecretPMWallets API key (pmw_...), from https://pmwallets.com/keys
PMW_API_KEYRequiredSecretPMWallets API key (pmw_...), from https://pmwallets.com/keys
| Name | Description | |
|---|---|---|
| PMW_API_KEY | PMWallets API key (pmw_...), from https://pmwallets.com/keys | RequiredSecret |
| PMW_API_KEY | PMWallets API key (pmw_...), from https://pmwallets.com/keys | RequiredSecret |
Automated checks
Ran Nov 14, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work · What to fix for more points
- Source repository linked and reachablepolymarketwallets/pmwallets-node is public and reachablegithub.com/polymarketwallets/pmwallets-node ↗Pass
- Package names this repository as its sourcepmwallets names https://github.com/polymarketwallets/pmwallets-python/issues as its sourcepypi.org/project/pmwallets/ ↗Finding
- Build provenance (Sigstore attestation)No build attestation published for this releaseNot checked
- Open source license (OSI)MITspdx.org/licenses/MIT.html ↗Pass
- Commit or release in the last yearLast commit or release 2026-11-06github.com/polymarketwallets/pmwallets-node ↗Pass
- OpenSSF ScorecardNot checked
- Package name not close to a popular packageNo popular package one edit away from pmwallets, pmwalletsPass
- No critical advisory in the package or its dependencies7 resolved dependencies checked; no critical advisoryosv.dev ↗Pass
- No hidden instructions to the model0 tool descriptions and the README read; no override phrases, credential paths or hidden charactersPass
- Destructive tools are labelledNot checked
- Remote endpoint answers the MCP handshakeHTTPS endpoint answered 401 (sign-in required)Pass
README
View on GitHubpmwallets — Node.js SDK for PMWallets
Official Node.js / TypeScript client for PMWallets: the Polymarket smart-money leaderboard computed from the Polygon chain, and the real-time fills of the Polymarket wallets you follow — delivered in order, exactly once, with every gap replayed.
中文说明 · Python SDK: pmwallets-python · Ready-to-run copy-trading bot built on it: polymarket-copy-trading-bot
Install
npm install pmwallets # Node.js ≥ 20
Create an API key on pmwallets.com/keys.
Signals and radar (Pro and Max)
const { entries } = await pmw.signals({ category: 'sports' });
const big = await pmw.radar({ minUsd: 25000, smart: true });
await pmw.saveSignalRule('signal', { enabled: true, scope: 'official', minWallets: 3, windowMin: 30, minUsd: 5000, channels: ['ws', 'webhook'] });
For live alerts use new SignalStream({ client: pmw, onAlert: (a) => … }).start(), or pmwallets alerts on the command line. Amounts keep two significant figures, times the minute, and traders are named by handle.
Usage
import { PmwClient, FillStream, FileStateStore, verifyWebhook } from 'pmwallets';
const pmw = new PmwClient({ apiKey: process.env.PMW_API_KEY! });
// who is making money on Polymarket, and how
const board = await pmw.leaderboard({ minWinLo: 0.55, minEligible: 30, style: 'taker', status: 'active', limit: 50 });
// only wallets whose address unlocks for free or for the $1 band (0 = free … 5; the ladder is board.pricing.bands)
const cheap = await pmw.leaderboard({ bands: [0, 1], minWinLo: 0.55 });
// follow one (billed per entity per hour; 402 = balance too low, 409 = dormant)
await pmw.subscribe({ entityId: board.rows[0].entityId, channels: ['ws'] });
// every fill of every entity you follow
const stream = new FillStream({
client: pmw,
store: new FileStateStore('./stream.json'), // a restart resumes exactly where it stopped
onFill: async (fill, { source }) => console.log(source, fill.side, fill.price, fill.tokenId),
onEvent: (e) => e.type === 'fatal' && console.error(e.error.message), // e.g. another bot already holds the stream
// takeover: true, // replace whichever API client holds this account's stream (it stops with `replaced`)
});
await stream.start();
What is in it
PmwClient |
leaderboard, entities, address unlocks (balance or plan), your unlocked addresses (myAddresses), plans (quote, buyPlan from the balance) and balance, invites, subscriptions, webhook status and deliveries, fills replay (fills, fillsSince), trade-history exports |
FillStream |
WebSocket with reconnect and keep-alive; detects missed frames by session/seq and replays them from the last fill delivered; de-duplicates by eventId; anchors behind the chain head on first start; persisted cursor |
verifyWebhook(rawBody, signature, secret) |
checks x-pmw-signature (HMAC-SHA256 of the raw body) |
One stream per account:
- An API-key connection takes priority over the pmwallets.com feed page (the page never takes the stream from it).
- Between two API connections the first one keeps the stream. A second one — another key of the same account, or the same bot started twice — is refused:
blocked, thenfatal, and the stream stops. Passtakeover: trueto replace the holder instead; the holder getsreplaced, thenfatal, and stops (it does not fight back). - A
FillStreamidentifies itself with a randomclientId, so its own reconnects after a network drop replace its own dead connection without needingtakeover. - When the server restarts it closes the socket with
1012; the stream reconnects at once (eventrestarting) and replays anything it missed.HTTPS_PROXY: passwsOptions: { agent }for the WebSocket and set a global fetch dispatcher.
PMWallets' servers are in the United Kingdom. A consumer that also trades on Polymarket should run from Ireland (AWS eu-west-1): Polymarket does not accept API orders from the UK, the US and several EU countries.
AI agents: command line and MCP
The package installs a pmwallets command that prints JSON — for scripts, and for AI agents (Claude Code, Codex,
Gemini CLI, Cursor, WorkBuddy, …) that act on the fills of the traders you follow.
export PMW_API_KEY=pmw_…
npx pmwallets leaderboard --minWinLo 0.55 --category politics --limit 20
npx pmwallets subscribe <handle> # billed per hour
npx pmwallets new-fills # fills since the previous call, each once (poll it)
npx pmwallets watch # live: one JSON line per fill, with its market and decimal amounts
npx pmwallets watch --batch-sec 30 --exec 'claude -p "Fills from traders I follow are on stdin. …"'
npx pmwallets mcp # the same as MCP tools
npx pmwallets skill # the guide to give your agent (SKILL.md)
watch --execruns the command once per batch, the fills on its stdin as JSON lines (and in$PMW_BATCH_FILE); fills that arrive while it runs make the next batch. A batch is handed over at most once: one whose command fails, times out or is interrupted is kept inpmw-watch/failed/and never re-run — the agent may already have placed an order. Restarts resume from where the stream stopped.- To trade, give the agent pmwallets-copytrade:
order buy <tokenId> --usdc 5 --key <eventId>(the same key never orders twice),market,balance,positions. - Platforms without a shell (Dify, Coze, n8n, GPT Actions): import openapi.json.
HTTPS_PROXY/NO_PROXYare honoured by the command line.
MCP config (Claude Desktop, Cursor, Windsurf, WorkBuddy, …):
{
"mcpServers": {
"pmwallets": {
"command": "npx",
"args": ["-y", "pmwallets", "mcp"],
"env": { "PMW_API_KEY": "pmw_..." }
}
}
}
Trade-history exports
A purchase is access to files: one zstd-compressed CSV per wallet per UTC day, downloadable at once and again later.
const order = await client.createExport({ entityIds: ['0x…'], from: '2026-09-01', to: '2026-09-30' });
const { files } = await client.exportFiles(String(order.id));
for (const f of files) {
const bytes = await client.downloadExportFile(f.wallet, f.day); // .csv.zst
}
exportFileUrl(wallet, day) returns the short-lived link instead; the API key is never sent to the storage host.
Resources
- Polymarket smart-money leaderboard — profitable Polymarket traders scored from the Polygon chain, with win-rate confidence intervals
- Polymarket copy trading guide — which wallets are worth following and how to get their fills in time
- How to learn from Polymarket smart money — reading a trader's record: confidence intervals, maker vs taker, market specialism
- PMWallets API documentation — WebSocket and webhook fill push, fills replay, trade-history exports
- Measured fill-push latency — block-to-push p50 / p95, published live
- Ways to follow Polymarket wallets, compared — official leaderboard, free trackers, SQL dashboards
- FAQ · 中文站
Guides
- PMWallets SDKs — Node.js and Python clients, side by side
- How to get a Polymarket wallet's trades in real time — polling the Data API, reading OrderFilled events on Polygon, or a pushed fill stream with replay
- Polymarket WebSocket API — what the market and user channels give you, and what they don't
- Polymarket trade alerts by webhook — verify the HMAC-SHA256 signature, answer fast, deduplicate on eventId
- How to export a Polymarket wallet's full trade history — past the Data API's 10,000-trade cap: every fill from the chain, one CSV per wallet per day
- Polymarket token IDs, condition IDs and slugs — how they connect
- How to calculate a Polymarket wallet's PnL — and why sites disagree
- Polymarket leaderboards by category — sports, crypto, politics, esports and more, ranked from on-chain PnL
- Busiest Polymarket markets — the 1,000 most-traded markets of the last 30 days and how their traders did
- All guides · llms.txt
License
MIT
PMWallets MCP questions
How do I add PMWallets MCP to Claude Code?
Run claude mcp add --env 'PMW_API_KEY=<YOUR_PMW_API_KEY>' pmwallets-node -- npx -y pmwallets in your terminal. Add --scope user to make it available in every project.
How do I add PMWallets MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
Can I get real-time trade updates?
Yes, the FillStream provides a WebSocket connection that delivers real-time fills and includes a replay mechanism to ensure no data is missed during disconnects.
How do I access the Polymarket smart-money leaderboard?
You can access the leaderboard through the PmwClient to rank traders by on-chain PnL and filter by categories like sports or politics.