Polymarket trader analytics for AI agents: rank wallets, read trader metrics, backtest strategies.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional. Your Polyrank API key as a bearer token (pk_live_…, from https://polyrank.app/api-keys). Without it the 17 free read-only tools work; the Ranking Builder, per-window trader metrics and the Strategy Lab tools need it (the Lab tools need a paid plan with the Lab; results are simulated).
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Save a strategy to your Lab: a name plus a strategy spec (wallet source — any Builder ranking, a history ranking, a static wallet list or a copy-engine sleeve — and market, entry, sizing and exit rules), or a template_id to copy a template. The server validates the spec and answers with the reason when it refuses. Needs POLYRANK_API_KEY.
A strategy spec (see polyrank_list_lab_templates).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http polyrank-mcp https://mcp.polyrank.app/mcp
Headers
Authorization (optional, not in the config above): Optional. Your Polyrank API key as a bearer token (pk_live_…, from https://polyrank.app/api-keys). Without it the 17 free read-only tools work; the Ranking Builder, per-window trader metrics and the Strategy Lab tools need it (the Lab tools need a paid plan with the Lab; results are simulated).Save a strategy to your Lab: a name plus a strategy spec (wallet source — any Builder ranking, a history ranking, a static wallet list or a copy-engine sleeve — and market, entry, sizing and exit rules), or a template_id to copy a template. The server validates the spec and answers with the reason when it refuses. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| spec | object | A strategy spec (see polyrank_list_lab_templates). |
| template_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"spec": {
"type": "object",
"description": "A strategy spec (see polyrank_list_lab_templates).",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"template_id": {
"type": "string"
}
}
}A backtest by id: its status (queued / running / done / failed) and, when done, the full SIMULATED report (per-$10 P&L, copies, the no-selection control, without-best-wallet, capacity, funnel, per wallet, daily). Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}A published Polyrank Builder ranking: masked top-25 + the weight/filter definition. Builder rankings are custom skill leaderboards (a weighting over the metric catalog plus filters) that users publish and share by slug. Returns the masked top-25 rows and the ranking’s weight/filter definition. Pass the slug from a shared /r/<slug> link.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Published ranking slug from a /r/<slug> share link. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "Published ranking slug from a /r/<slug> share link."
}
}
}Your plan's Strategy Lab limits and what is used now: backtests a day and today's, backtests waiting, paper runs at once, saved strategies, and the assistant chats answering at once (lab_agent_concurrent) against those answering now. Needs POLYRANK_API_KEY.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Top Polymarket traders ranked by genuine SKILL (calibration/Brier, alpha-vs-mid, risk-adjusted return) — not vanity P&L or win rate. Returns rank, composite score, identity, P&L, win-rate, volume. Use it to find traders to study.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows to return (max 25). |
| preset | string | Ranking preset id (default "polyrank-default", the calibration-heavy headline ranking). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Rows to return (max 25)."
},
"preset": {
"type": "string",
"description": "Ranking preset id (default \"polyrank-default\", the calibration-heavy headline ranking)."
}
}
}Skill-weighted holder consensus on a Polymarket market vs the market mid (the Polyrank-vs-mid delta), plus 24h volume/fills, positioner counts, and top holders. Accepts a conditionId (0x + 64 hex) or a market slug.
| Argument | Type | Description |
|---|---|---|
| market* | string | conditionId (0x + 64 hex) or market slug. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"market"
],
"properties": {
"market": {
"type": "string",
"description": "conditionId (0x + 64 hex) or market slug."
}
}
}Which metric exists at which window (lifetime / 90d / 30d / 7d / 24h), whether it can be weighted, gated or filtered, the copy-engine and entry-timing ids (lifetime-pinned), and what a back-dated board (as_of) can answer: its metrics, the filters it honours and the reason for each it refuses. The reference for ranking at a window or as_of. Free, no key.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}The full catalog of displayable Polyrank metrics (84): id, name, description, category, direction (higher/lower is better), the windows each is available at, and whether it is advanced. This is the vocabulary for polyrank_rank_wallets weights, skill_gates and metric_filters. Free, no key.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Traders whose skill rank climbed or fell the most recently (leaderboard momentum). Returns top climbers and fallers for a ranking preset over a lookback window.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per direction (max 10, default 5). |
| preset | string | Ranking preset id (default "polyrank-default"). |
| lookback_days | integer | Lookback window in days (max 30, default 7). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Rows per direction (max 10, default 5)."
},
"preset": {
"type": "string",
"description": "Ranking preset id (default \"polyrank-default\")."
},
"lookback_days": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Lookback window in days (max 30, default 7)."
}
}
}A paper run by id with the grader's stats (copies, resolved, P&L per $10, entry vs the leader, the paper gate) and its copies, each with its fate (copied / no_fill / leader_sold / capped / skipped + reason). Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| limit | integer | |
| offset | integer | |
| outcome | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"outcome": {
"enum": [
"copied",
"no_fill",
"leader_sold",
"capped",
"skipped"
],
"type": "string"
}
}
}Live Polyrank coverage and the canonical skill-metric count: wallets scored (`wallets`), raw fill events indexed (`trades`), markets covered, the number of skill metrics in the catalog, and the earliest market year in the data (`since_year`; on-chain order-book fills start 2022-11-21): the live source for "N wallets / N metrics" figures.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Live Polymarket activity: big wins just banked (realized profit), sharp-money moves, the biggest recent trades, trending markets by volume, and markets where Polyrank consensus diverges most from the market mid. Good for "what is smart money doing right now".
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}One Polyrank weekly Skill Report in full: big wins, skill-rank movers, new entrants, the calibration leader, consensus divergence, and the editorial intro. Pass the week/report id from polyrank_get_smart_money_reports.
| Argument | Type | Description |
|---|---|---|
| week* | string | Report/week id from the archive, e.g. "2026-w26". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"week"
],
"properties": {
"week": {
"type": "string",
"description": "Report/week id from the archive, e.g. \"2026-w26\"."
}
}
}The archive of Polyrank weekly Skill Reports (published each week): a list of report ids/weeks with summaries. Fetch one in full with polyrank_get_smart_money_report.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many recent reports to list (max 104, default 52). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 104,
"minimum": 1,
"description": "How many recent reports to list (max 104, default 52)."
}
}
}One of your strategies by id: its name, state and full strategy spec (wallet source, market, entry, sizing, exit). Edit it with polyrank_update_strategy. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}The biggest return-on-cost RESOLVED Polymarket bets (won positions with a real cost floor) — a hall-of-fame of single trades by ROI multiple. Optionally filter by market category (e.g. "Sports", "Politics", "Crypto"). Identities are masked (pseudonym only).
| Argument | Type | Description |
|---|---|---|
| dir | string | Sort direction (default "desc"). |
| sort | string | Sort key (default "roi"). |
| limit | integer | Rows to return (max 100, default 50). |
| category | string | Market category filter, e.g. "Sports", "Politics", "Crypto". |
| since_days | integer | Only trades resolved within the last N days. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"dir": {
"enum": [
"desc",
"asc"
],
"type": "string",
"description": "Sort direction (default \"desc\")."
},
"sort": {
"enum": [
"roi",
"profit",
"cost",
"entry",
"recency"
],
"type": "string",
"description": "Sort key (default \"roi\")."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Rows to return (max 100, default 50)."
},
"category": {
"type": "string",
"description": "Market category filter, e.g. \"Sports\", \"Politics\", \"Crypto\"."
},
"since_days": {
"type": "integer",
"maximum": 3650,
"minimum": 1,
"description": "Only trades resolved within the last N days."
}
}
}Look up a trader by the opaque masked id (tid) returned in leaderboard / pulse / movers / top-ROI rows — those masked surfaces omit the raw wallet, so use the tid to follow a trader. Returns the same masked skill teaser as the wallet lookup. Full wallet/identity resolution requires signing in on polyrank.app.
| Argument | Type | Description |
|---|---|---|
| tid* | string | Opaque trader id (tid) from a masked row. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"tid"
],
"properties": {
"tid": {
"type": "string",
"description": "Opaque trader id (tid) from a masked row."
}
}
}A wallet’s 10-bin reliability diagram (predicted probability vs observed outcome rate). Calibration is the core skill signal — whether the trader’s probabilities match reality. Returns bins + total resolved count.
| Argument | Type | Description |
|---|---|---|
| address* | string | Proxy wallet address (0x + 40 hex). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "Proxy wallet address (0x + 40 hex)."
}
}
}A trader’s 10-bin reliability diagram (predicted probability vs observed outcome rate) keyed by the opaque masked id (tid) from a leaderboard / pulse / movers / top-ROI row. Calibration is the core skill signal — whether the trader’s probabilities match reality. Completes the discovery → tid → calibration loop without needing the raw wallet. Returns bins + total resolved count.
| Argument | Type | Description |
|---|---|---|
| tid* | string | Opaque trader id (tid) from a masked row. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"tid"
],
"properties": {
"tid": {
"type": "string",
"description": "Opaque trader id (tid) from a masked row."
}
}
}One trader's every metric displayable at a window (lifetime / 90d / 30d / 7d / 24h): the raw value and its percentile in that window's cohort — the cells a board ranked at that window scores. Give a wallet address or a masked tid. scope=combined (default) reads the multi-wallet user row as boards do. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| tid | string | Masked trader id from a public board (resolved with your key). |
| scope | string | |
| window | string | Default lifetime. |
| address | string | Proxy wallet address (0x + 40 hex). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"tid": {
"type": "string",
"description": "Masked trader id from a public board (resolved with your key)."
},
"scope": {
"enum": [
"combined",
"wallet"
],
"type": "string"
},
"window": {
"enum": [
"lifetime",
"90d",
"30d",
"7d",
"24h"
],
"type": "string",
"description": "Default lifetime."
},
"address": {
"type": "string",
"description": "Proxy wallet address (0x + 40 hex)."
}
}
}A single Polymarket wallet’s skill profile: composite rank, P&L, win-rate, volume, trades/markets, and commodity percentiles. The deep skill grid — full Brier decomposition, alpha-vs-mid, information coefficient, Sharpe, copyability & max copyable clip, true slippage, realized volatility, the hold-time split, peak/avg capital-at-risk, copier-realized return, and the copy verdict — is gated to the paid x402 agent tier (/v1/agent/*).
| Argument | Type | Description |
|---|---|---|
| address* | string | Proxy wallet address (0x + 40 hex). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "Proxy wallet address (0x + 40 hex)."
}
}
}Fetch the free masked skill teaser for several traders at once by their opaque masked ids (tids). Same per-trader payload as polyrank_get_trader_by_tid, capped at 10 tids per call. No API key needed. Each result is tagged with its tid, and per-tid failures are returned inline (as an error field) rather than failing the whole batch.
| Argument | Type | Description |
|---|---|---|
| tids* | array | Opaque trader ids (tids) from masked rows (max 10). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"tids"
],
"properties": {
"tids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"description": "Opaque trader ids (tids) from masked rows (max 10)."
}
}
}Start a Lab assistant chat with a question (research only: it finds traders, saves, backtests and paper-trades strategies in YOUR account, never places orders). Spends your plan's AI credits (a question needs 25 to start; a typical one costs about 13; `deep: true` runs the slower, more thorough mode, about twice the credits, Lab Pro and up). Your plan answers a number of chats at once (Pro Trader 2 … Enterprise 8; one more is refused 429 lab_agent_busy). Waits up to `wait_seconds` (default 45, max 55) for the answer; if it is still working, poll polyrank_lab_get_chat with the returned id. A long backtest it starts answers at once and its result is posted to the chat later. Results are SIMULATED. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| deep | boolean | |
| message* | string | |
| wait_seconds | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"message"
],
"properties": {
"deep": {
"type": "boolean"
},
"message": {
"type": "string",
"maxLength": 8000,
"minLength": 1
},
"wait_seconds": {
"type": "integer",
"maximum": 55,
"minimum": 0
}
}
}One of your Lab assistant chats: its status, the questions and the assistant's answers with their notices and result cards (backtests, shortlists, strategies, tables). While a question waits, `queue_position` says how many are ahead; `awaiting_backtests` counts backtests the assistant started whose result will be posted to the chat by itself. Backtest and paper figures are SIMULATED. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| last | integer | Only the last N messages (default all). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"last": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Only the last N messages (default all)."
}
}
}Your Lab assistant chats, most recent first (at most 100): id, title, status (idle / queued / working / failed). Read one with polyrank_lab_get_chat. Needs POLYRANK_API_KEY (a paid plan; the assistant is part of every paid plan).
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Send the next message in one of your Lab assistant chats (409 while it is still answering). Spends AI credits like polyrank_lab_ask and waits the same way for the answer. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| message* | string | |
| wait_seconds | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"message"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"message": {
"type": "string",
"maxLength": 8000,
"minLength": 1
},
"wait_seconds": {
"type": "integer",
"maximum": 55,
"minimum": 0
}
}
}Stop the Lab assistant answering in one of your chats: a question still queued is withdrawn; a running answer stops within about a second and keeps what it finished. A backtest it started keeps running. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}Your recent backtests (all, or one strategy's), newest first, with status and headline (SIMULATED). Read one in full with polyrank_get_backtest. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| strategy_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1
},
"strategy_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}The Strategy Lab's templates: research strategy families as editable strategy specs, each with its as-of evidence (SIMULATED, per $10 copied) and caveats. Copy one's `spec` (or its id) into polyrank_create_strategy / polyrank_run_backtest. Needs POLYRANK_API_KEY.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}The Ranking Builder's goals (e.g. "Copy entries", "Copy engine") as the exact request the Builder runs for each, and the site's preset boards with their configs. Pass a goal's `request` (or a preset's config) to polyrank_rank_wallets to reproduce that board, or edit it. A goal `banner` is a measured caveat to show with the board. Free, no key.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Your saved strategies, newest first, each with its state and its latest backtest's headline (per $10 copied, copies; SIMULATED). `status` lists only one state: draft, backtested (tested), paper (paper trading), promotable (passed the paper gate), live, archived. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| status | string | |
| include_archived | boolean |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"status": {
"enum": [
"draft",
"backtested",
"paper",
"promotable",
"live",
"archived"
],
"type": "string"
},
"include_archived": {
"type": "boolean"
}
}
}Rank every Polymarket wallet with your own composite — exactly what the Ranking Builder runs (POST /v1/rankings/custom). weights: metric id → weight (or {weight, window}); any of the 84 catalog metrics at any window it exists at (polyrank_get_metric_windows), plus copy-engine (sk_score_14d) and entry-timing ids at lifetime. filters: min_trades, min_resolved, min_volume_usdc, min_realized_pnl(_net_fees), min_win_rate_pct, max_roi_pct, active_within_days/hours, categories, exclude_bonders, skill_gates [{metric,min_pctile,window}], metric_filters [{metric,min,max,window}], copy_engine {sleeve}, timing {sub,bucket,window,min_n}, cluster_policy, copy_placeable, smart_money_tags_any_of, follower_count_max … (the server rejects anything it cannot apply, with the reason). as_of=YYYY-MM-DD ranks the board as it stood that day (lifetime snapshot metrics only — refused with the reason otherwise, never answered live). To reproduce a Builder goal, pass its `request` from polyrank_list_ranking_templates as `request`. Needs POLYRANK_API_KEY (a plan with the Builder).
| Argument | Type | Description |
|---|---|---|
| as_of | string | Rank the board as it stood on this day (ISO date). Lifetime snapshot metrics only. |
| limit | integer | Rows (default 100, max 500). |
| offset | integer | |
| window | string | Default window for every weight given as a bare number (default lifetime). |
| explain | boolean | How many wallets each filter dropped. |
Resolve an opaque masked id (tid) to the underlying proxy wallet address. Requires a Polyrank API key (pk_live_… / pk_test_…): set POLYRANK_API_KEY. The MCP sends it as a Bearer token and the API key-auth accepts it — no browser session needed. Then use the resolved wallet with polyrank_get_trader_skill / polyrank_get_trader_calibration.
| Argument | Type | Description |
|---|---|---|
| tid* | string | Opaque trader id (tid) from a masked row. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"tid"
],
"properties": {
"tid": {
"type": "string",
"description": "Opaque trader id (tid) from a masked row."
}
}
}Queue a backtest of a saved strategy (strategy_id) or an unsaved spec over [from, to) (ISO dates, at most 366 days), optionally with explicit re-rank cuts. Answers with the queued run; poll polyrank_get_backtest. Results are SIMULATED (each report names its fill model and measured optimism). Counts against your plan's daily backtests. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| to* | string | |
| cuts | array | |
| from* | string | |
| spec | object | |
| strategy_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"cuts": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"maxItems": 60
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"spec": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"strategy_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}Start paper trading a saved strategy: from now on every signal of its wallets is scored against the real order book (no orders, no keys, no money). One active run per strategy. Needs POLYRANK_API_KEY (plan feature paper_trading).
| Argument | Type | Description |
|---|---|---|
| strategy_id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"strategy_id"
],
"properties": {
"strategy_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}Rename a saved strategy and/or replace its strategy spec (a changed spec makes it a draft again: its earlier backtests stay, tested on the old rules). The server validates the spec and answers with the reason when it refuses. Needs POLYRANK_API_KEY.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| name | string | |
| spec | object |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"spec": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.
| filters | object | Ranking filters (see description). |
| request | object | A complete POST /v1/rankings/custom body (e.g. a goal's `request`). When given, the other arguments override its fields. |
| sort_by | string | composite (default), metric:<id>, pctile:<id>, engine:<id>, timing:<id>, or a board column. |
| weights | object | metric id → weight, or → {weight, window}. Weights are auto-normalized. |
| sort_dir | string |
| na_policy | string |
| include_raw | boolean | Raw values beside the percentiles (dollars, hours). |
| extra_metrics | array | More metric columns to project. |
| dedupe_clusters | boolean | Keep one wallet per wallet-farm cluster. |
| include_verdict | boolean | The copy verdict the trader page shows. |
| include_breakdown | boolean | Per-metric percentile cells per row. |
| extra_engine_metrics | array | Copy-engine columns to project. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"as_of": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Rank the board as it stood on this day (ISO date). Lifetime snapshot metrics only."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Rows (default 100, max 500)."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"window": {
"enum": [
"lifetime",
"90d",
"30d",
"7d",
"24h"
],
"type": "string",
"description": "Default window for every weight given as a bare number (default lifetime)."
},
"explain": {
"type": "boolean",
"description": "How many wallets each filter dropped."
},
"filters": {
"type": "object",
"description": "Ranking filters (see description).",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"request": {
"type": "object",
"description": "A complete POST /v1/rankings/custom body (e.g. a goal's `request`). When given, the other arguments override its fields.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"sort_by": {
"type": "string",
"description": "composite (default), metric:<id>, pctile:<id>, engine:<id>, timing:<id>, or a board column."
},
"weights": {
"type": "object",
"description": "metric id → weight, or → {weight, window}. Weights are auto-normalized.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "number",
"exclusiveMinimum": 0
},
{
"type": "object",
"required": [
"weight"
],
"properties": {
"weight": {
"type": "number",
"exclusiveMinimum": 0
},
"window": {
"enum": [
"lifetime",
"90d",
"30d",
"7d",
"24h"
],
"type": "string"
}
}
}
]
}
},
"sort_dir": {
"enum": [
"desc",
"asc"
],
"type": "string"
},
"na_policy": {
"enum": [
"exclude",
"neutral_50"
],
"type": "string"
},
"include_raw": {
"type": "boolean",
"description": "Raw values beside the percentiles (dollars, hours)."
},
"extra_metrics": {
"type": "array",
"items": {
"type": "string"
},
"description": "More metric columns to project."
},
"dedupe_clusters": {
"type": "boolean",
"description": "Keep one wallet per wallet-farm cluster."
},
"include_verdict": {
"type": "boolean",
"description": "The copy verdict the trader page shows."
},
"include_breakdown": {
"type": "boolean",
"description": "Per-metric percentile cells per row."
},
"extra_engine_metrics": {
"type": "array",
"items": {
"type": "string"
},
"description": "Copy-engine columns to project."
}
}
}