pdata Prediction Markets

Polymarket, Kalshi + 6 more prediction markets: live odds, volume, movers. Read-only, no auth.

Should I use this

Quality & Safety

B
Description quality
98%
Schema completeness
79%
Naming quality
93%
Poisoning risk
60%
Permission match
100%
Protocol compliance
100%

Findings (4)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains suspicious base64-like encoded stringin list_events
  • MEDIUMTool description contains URL to non-standard domainin get_event
  • LOWTool 'get_market' description lacks action verbin get_market

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~11,202Tokens (tool definitions)
~8.1 KBTypical response size
Significant attention impact (8.75% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "mcp": {
      "url": "https://api.pdata.world/mcp"
    }
  }
}

Remote endpoints

https://api.pdata.world/mcpstreamable-http

What it can do

Tool inventory

Tools (14)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
🟒list_events(page, page_size, source, active, closed, ...)

Use when an agent wants to browse, filter, or search prediction-market events across all 8 platforms. Returns paginated events with their child markets, prices, and platform metadata. Filterable by source (polymarket/kalshi/manifold/myriad/limitless/predict/opinion/gemini), category, country, status (open/closed), and full-text search via `search`. Sortable by `volume_24hr`, `normalized_vol_24hr`, `liquidity`, `end_date`, or `closed_time` (prefix `-` for descending). Cap `page_size` ≀ 50 to keep responses small enough for LLM context windows.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "type": "integer",
      "minimum": 1,
      "title": "Page",
      "description": "Page number (1-indexed).",
      "default": 1
    },
    "page_size": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "title": "Page Size",
      "description": "Items per page (1-200; default 50). Pass page_size=5 for chat-style summaries.",
      "default": 50
    },
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Source name(s); single value or comma-separated list. Allowed: polymarket, kalshi, manifold, myriad, limitless, predict, opinion, gemini."
    },
    "active": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Active",
      "description": "Filter by `active` flag (true/false)."
    },
    "closed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Closed",
      "description": "Filter by `closed` flag (true/false). Open markets are `closed=false`."
    },
    "volume_24hr_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Min",
      "description": "Minimum 24h notional volume (USD). Excludes low-activity markets."
    },
    "volume_24hr_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Max",
      "description": "Maximum 24h notional volume (USD)."
    },
    "volume_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Min",
      "description": "Minimum cumulative volume (USD). Excludes low-activity markets across full history."
    },
    "volume_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Max",
      "description": "Maximum cumulative volume (USD)."
    },
    "rank_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Min",
      "description": "Minimum rank score (numeric). Higher = more prominent."
    },
    "rank_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Max",
      "description": "Maximum rank score (numeric)."
    },
    "ends_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends After",
      "description": "Filter to events whose end_date >= this ISO 8601 datetime (e.g. `2026-06-01T00:00:00Z`)."
    },
    "ends_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends Before",
      "description": "Filter to events whose end_date <= this ISO 8601 datetime."
    },
    "hide_ended": {
      "type": "boolean",
      "title": "Hide Ended",
      "description": "If true, hide markets/events whose end_date is in the past (end_date <= now()); rows with no end_date are kept.",
      "default": false
    },
    "created_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created After",
      "description": "Filter to rows whose created_at >= this ISO 8601 datetime (first appearance in pdata's database)."
    },
    "created_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created Before",
      "description": "Filter to rows whose created_at <= this ISO 8601 datetime."
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Status",
      "description": "Comma-separated status list; any of {open, closing-soon, resolved}"
    },
    "search": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ],
      "title": "Search",
      "description": "Full-text search across title, description, slug. Case-insensitive substring match."
    },
    "sort": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Sort",
      "description": "Field name; prefix '-' for descending order (e.g. `-volume_24hr`). Common allowed values: `volume_24hr`, `normalized_vol_24hr`, `liquidity`, `end_date`, `closed_time`, `updated_at`. Markets endpoints additionally accept `probability`, `prob_24h_change`, `spread`. Invalid values return 400."
    },
    "categories": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories",
      "description": "Comma-separated category labels to include (OR)"
    },
    "categories_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories Exclude",
      "description": "Comma-separated category labels to exclude"
    },
    "hide_price_derivatives": {
      "type": "boolean",
      "title": "Hide Price Derivatives",
      "description": "If true, exclude events with is_price_derivative=TRUE",
      "default": false
    },
    "include_uncategorized": {
      "type": "boolean",
      "title": "Include Uncategorized",
      "description": "If true, the include clause also matches rows whose categories array is empty/NULL or contains only labels outside the canonical set (synthetic 'Other' bucket).",
      "default": false
    },
    "countries": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries",
      "description": "Comma-separated country names to include (OR). Full English names per the AI categorizer's prompt β€” e.g. 'United States', 'United Kingdom', 'European Union'. No allow-list β€” misspelled values silently yield zero matches."
    },
    "countries_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries Exclude",
      "description": "Comma-separated country names to exclude."
    },
    "include_uncountried": {
      "type": "boolean",
      "title": "Include Uncountried",
      "description": "If true, the include clause also matches rows whose countries array is empty/NULL β€” country-agnostic markets (synthetic 'No country' bucket).",
      "default": false
    },
    "country_match": {
      "type": "string",
      "pattern": "^(any|all)$",
      "title": "Country Match",
      "description": "How multiple `countries` combine: 'any' (default, OR β€” tagged with any selected country) or 'all' (AND β€” tagged with all of them, e.g. both Iran and Israel). Markets carry ≀3 country tags.",
      "default": "any"
    }
  },
  "required": []
}
🟒get_event(source, event_id, markets_limit)

Use when an agent needs the full detail of a single prediction-market event by its composite key (source + event_id). Returns the event with all of its child markets, latest probabilities, and metadata. The canonical URL `https://pdata.world/events/{source}/{event_id}` is stable for the lifetime of the underlying market. Events that closed more than 10 days ago are removed from the live tables; the same URL then returns a `kind: "tombstone"` object holding the title, close date and final outcome of each top market instead of the live `kind: "live"` object. Check `kind` before reading any other field. Large events carry hundreds of markets (a 311-market event is ~520 KB); pass `markets_limit` to take only the first N.

Input Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string",
      "title": "Source",
      "description": "Platform ID: polymarket / kalshi / manifold / myriad / limitless / predict / opinion / gemini."
    },
    "event_id": {
      "type": "string",
      "title": "Event Id",
      "description": "Event ID native to the source. URL-encoded if it contains special chars."
    },
    "markets_limit": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 500,
          "minimum": 1
        },
        {
          "type": "null"
        }
      ],
      "title": "Markets Limit",
      "description": "Return only the first N markets, in the order described under `markets`; `markets_total` still counts all of them. Omit to get every market. Ignored for a tombstone."
    }
  },
  "required": [
    "source",
    "event_id"
  ]
}
🟒get_event_similar(source, event_id, limit)

Use when an agent needs events similar to a given event β€” cross-platform equivalents and topically-related markets, precomputed nightly from title embeddings. Best-first; empty list (never an error) when no similarities are known yet.

Input Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string",
      "title": "Source",
      "description": "Platform id, e.g. kalshi."
    },
    "event_id": {
      "type": "string",
      "title": "Event Id",
      "description": "Event id native to the source."
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "description": "Max similar events to return.",
      "default": 8
    }
  },
  "required": [
    "source",
    "event_id"
  ]
}
🟒list_markets(page, page_size, spread_min, spread_max, probability_min, ...)

Use when the user wants to browse, filter, or sort individual markets (not events). Returns paginated markets with their probability, volume, source, parent event ID, and 24h delta. Filterable by source, country, category, status, and full-text `search`. Sortable by `volume_24hr` or `probability`. Cap `page_size` ≀ 50 for chat-friendly responses.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "type": "integer",
      "minimum": 1,
      "title": "Page",
      "description": "Page number (1-indexed).",
      "default": 1
    },
    "page_size": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "title": "Page Size",
      "description": "Items per page (1-200; default 50). Pass page_size=5 for chat-style summaries.",
      "default": 50
    },
    "spread_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Spread Min",
      "description": "Minimum bid-ask spread (0-1). Higher = less liquid."
    },
    "spread_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Spread Max",
      "description": "Maximum bid-ask spread (0-1). Lower = more liquid."
    },
    "probability_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Probability Min",
      "description": "Minimum probability (0-1). Filters to markets above this implied probability."
    },
    "probability_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Probability Max",
      "description": "Maximum probability (0-1)."
    },
    "prob_24h_change_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": -1
        },
        {
          "type": "null"
        }
      ],
      "title": "Prob 24H Change Min",
      "description": "Minimum 24h probability change (-1 to 1, signed). Use 0.15 for >=15pp positive moves."
    },
    "prob_24h_change_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": -1
        },
        {
          "type": "null"
        }
      ],
      "title": "Prob 24H Change Max",
      "description": "Maximum 24h probability change (-1 to 1, signed)."
    },
    "volume_24h_change_min": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24H Change Min",
      "description": "Minimum 24h notional volume change (signed USD; e.g. 1000 means +$1k vs prior 24h)."
    },
    "volume_24h_change_max": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24H Change Max",
      "description": "Maximum 24h notional volume change (signed USD)."
    },
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Source name(s); single value or comma-separated list. Allowed: polymarket, kalshi, manifold, myriad, limitless, predict, opinion, gemini."
    },
    "active": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Active",
      "description": "Filter by `active` flag (true/false)."
    },
    "closed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Closed",
      "description": "Filter by `closed` flag (true/false). Open markets are `closed=false`."
    },
    "volume_24hr_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Min",
      "description": "Minimum 24h notional volume (USD). Excludes low-activity markets."
    },
    "volume_24hr_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Max",
      "description": "Maximum 24h notional volume (USD)."
    },
    "volume_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Min",
      "description": "Minimum cumulative volume (USD). Excludes low-activity markets across full history."
    },
    "volume_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Max",
      "description": "Maximum cumulative volume (USD)."
    },
    "rank_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Min",
      "description": "Minimum rank score (numeric). Higher = more prominent."
    },
    "rank_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Max",
      "description": "Maximum rank score (numeric)."
    },
    "ends_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends After",
      "description": "Filter to events whose end_date >= this ISO 8601 datetime (e.g. `2026-06-01T00:00:00Z`)."
    },
    "ends_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends Before",
      "description": "Filter to events whose end_date <= this ISO 8601 datetime."
    },
    "hide_ended": {
      "type": "boolean",
      "title": "Hide Ended",
      "description": "If true, hide markets/events whose end_date is in the past (end_date <= now()); rows with no end_date are kept.",
      "default": false
    },
    "created_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created After",
      "description": "Filter to rows whose created_at >= this ISO 8601 datetime (first appearance in pdata's database)."
    },
    "created_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created Before",
      "description": "Filter to rows whose created_at <= this ISO 8601 datetime."
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Status",
      "description": "Comma-separated status list; any of {open, closing-soon, resolved}"
    },
    "search": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ],
      "title": "Search",
      "description": "Full-text search across title, description, slug. Case-insensitive substring match."
    },
    "sort": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Sort",
      "description": "Field name; prefix '-' for descending order (e.g. `-volume_24hr`). Common allowed values: `volume_24hr`, `normalized_vol_24hr`, `liquidity`, `end_date`, `closed_time`, `updated_at`. Markets endpoints additionally accept `probability`, `prob_24h_change`, `spread`. Invalid values return 400."
    },
    "categories": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories",
      "description": "Comma-separated category labels to include (OR)"
    },
    "categories_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories Exclude",
      "description": "Comma-separated category labels to exclude"
    },
    "hide_price_derivatives": {
      "type": "boolean",
      "title": "Hide Price Derivatives",
      "description": "If true, exclude events with is_price_derivative=TRUE",
      "default": false
    },
    "include_uncategorized": {
      "type": "boolean",
      "title": "Include Uncategorized",
      "description": "If true, the include clause also matches rows whose categories array is empty/NULL or contains only labels outside the canonical set (synthetic 'Other' bucket).",
      "default": false
    },
    "countries": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries",
      "description": "Comma-separated country names to include (OR). Full English names per the AI categorizer's prompt β€” e.g. 'United States', 'United Kingdom', 'European Union'. No allow-list β€” misspelled values silently yield zero matches."
    },
    "countries_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries Exclude",
      "description": "Comma-separated country names to exclude."
    },
    "include_uncountried": {
      "type": "boolean",
      "title": "Include Uncountried",
      "description": "If true, the include clause also matches rows whose countries array is empty/NULL β€” country-agnostic markets (synthetic 'No country' bucket).",
      "default": false
    },
    "country_match": {
      "type": "string",
      "pattern": "^(any|all)$",
      "title": "Country Match",
      "description": "How multiple `countries` combine: 'any' (default, OR β€” tagged with any selected country) or 'all' (AND β€” tagged with all of them, e.g. both Iran and Israel). Markets carry ≀3 country tags.",
      "default": "any"
    }
  },
  "required": []
}
🟒get_market(source, market_id)

Use when an agent needs the full detail of a single market by its composite key (source + market_id). Returns the market with its parent event reference, current probability, volume, 24h delta, and historical chart points. Includes a `_meta.cite_as` field that the agent can drop directly into its reply.

Input Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string",
      "title": "Source",
      "description": "Platform ID: polymarket / kalshi / manifold / myriad / limitless / predict / opinion / gemini."
    },
    "market_id": {
      "type": "string",
      "title": "Market Id",
      "description": "Market ID native to the source. Composite key with `source`."
    }
  },
  "required": [
    "source",
    "market_id"
  ]
}
🟒top_movers(limit, spread_min, spread_max, probability_min, probability_max, ...)

Use when the user wants to see markets with the largest 24h probability swings. Returns the top N movers (default 5, max 20) ranked by absolute `prob_24h_change`, among open markets that moved more than 2 points on over 1,000 units of 24h volume, one per event. Takes the /markets filters; Climate and Weather and Mentions are always left out. Price-derivative markets are included unless `hide_price_derivatives=true`. Useful for 'what changed today?' style queries.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "title": "Limit",
      "description": "Number of results to return (1-20; default 5).",
      "default": 5
    },
    "spread_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Spread Min",
      "description": "Minimum bid-ask spread (0-1). Higher = less liquid."
    },
    "spread_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Spread Max",
      "description": "Maximum bid-ask spread (0-1). Lower = more liquid."
    },
    "probability_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Probability Min",
      "description": "Minimum probability (0-1). Filters to markets above this implied probability."
    },
    "probability_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Probability Max",
      "description": "Maximum probability (0-1)."
    },
    "prob_24h_change_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": -1
        },
        {
          "type": "null"
        }
      ],
      "title": "Prob 24H Change Min",
      "description": "Minimum 24h probability change (-1 to 1, signed). Use 0.15 for >=15pp positive moves."
    },
    "prob_24h_change_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": -1
        },
        {
          "type": "null"
        }
      ],
      "title": "Prob 24H Change Max",
      "description": "Maximum 24h probability change (-1 to 1, signed)."
    },
    "volume_24h_change_min": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24H Change Min",
      "description": "Minimum 24h notional volume change (signed USD; e.g. 1000 means +$1k vs prior 24h)."
    },
    "volume_24h_change_max": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24H Change Max",
      "description": "Maximum 24h notional volume change (signed USD)."
    },
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Source name(s); single value or comma-separated list. Allowed: polymarket, kalshi, manifold, myriad, limitless, predict, opinion, gemini."
    },
    "active": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Active",
      "description": "Filter by `active` flag (true/false)."
    },
    "closed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Closed",
      "description": "Filter by `closed` flag (true/false). Open markets are `closed=false`."
    },
    "volume_24hr_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Min",
      "description": "Minimum 24h notional volume (USD). Excludes low-activity markets."
    },
    "volume_24hr_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Max",
      "description": "Maximum 24h notional volume (USD)."
    },
    "volume_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Min",
      "description": "Minimum cumulative volume (USD). Excludes low-activity markets across full history."
    },
    "volume_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Max",
      "description": "Maximum cumulative volume (USD)."
    },
    "rank_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Min",
      "description": "Minimum rank score (numeric). Higher = more prominent."
    },
    "rank_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Max",
      "description": "Maximum rank score (numeric)."
    },
    "ends_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends After",
      "description": "Filter to events whose end_date >= this ISO 8601 datetime (e.g. `2026-06-01T00:00:00Z`)."
    },
    "ends_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends Before",
      "description": "Filter to events whose end_date <= this ISO 8601 datetime."
    },
    "hide_ended": {
      "type": "boolean",
      "title": "Hide Ended",
      "description": "If true, hide markets/events whose end_date is in the past (end_date <= now()); rows with no end_date are kept.",
      "default": false
    },
    "created_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created After",
      "description": "Filter to rows whose created_at >= this ISO 8601 datetime (first appearance in pdata's database)."
    },
    "created_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created Before",
      "description": "Filter to rows whose created_at <= this ISO 8601 datetime."
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Status",
      "description": "Comma-separated status list; any of {open, closing-soon, resolved}"
    },
    "search": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ],
      "title": "Search",
      "description": "Full-text search across title, description, slug. Case-insensitive substring match."
    },
    "sort": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Sort",
      "description": "Field name; prefix '-' for descending order (e.g. `-volume_24hr`). Common allowed values: `volume_24hr`, `normalized_vol_24hr`, `liquidity`, `end_date`, `closed_time`, `updated_at`. Markets endpoints additionally accept `probability`, `prob_24h_change`, `spread`. Invalid values return 400."
    },
    "categories": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories",
      "description": "Comma-separated category labels to include (OR)"
    },
    "categories_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories Exclude",
      "description": "Comma-separated category labels to exclude"
    },
    "hide_price_derivatives": {
      "type": "boolean",
      "title": "Hide Price Derivatives",
      "description": "If true, exclude events with is_price_derivative=TRUE",
      "default": false
    },
    "include_uncategorized": {
      "type": "boolean",
      "title": "Include Uncategorized",
      "description": "If true, the include clause also matches rows whose categories array is empty/NULL or contains only labels outside the canonical set (synthetic 'Other' bucket).",
      "default": false
    },
    "countries": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries",
      "description": "Comma-separated country names to include (OR). Full English names per the AI categorizer's prompt β€” e.g. 'United States', 'United Kingdom', 'European Union'. No allow-list β€” misspelled values silently yield zero matches."
    },
    "countries_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries Exclude",
      "description": "Comma-separated country names to exclude."
    },
    "include_uncountried": {
      "type": "boolean",
      "title": "Include Uncountried",
      "description": "If true, the include clause also matches rows whose countries array is empty/NULL β€” country-agnostic markets (synthetic 'No country' bucket).",
      "default": false
    },
    "country_match": {
      "type": "string",
      "pattern": "^(any|all)$",
      "title": "Country Match",
      "description": "How multiple `countries` combine: 'any' (default, OR β€” tagged with any selected country) or 'all' (AND β€” tagged with all of them, e.g. both Iran and Israel). Markets carry ≀3 country tags.",
      "default": "any"
    }
  },
  "required": []
}
🟒closing_soon(limit, spread_min, spread_max, probability_min, probability_max, ...)

Use when the user wants to see markets that will resolve within the next 36 hours. Returns markets sorted by close timestamp ascending. Takes the /markets filters, e.g. `source=` and `categories=` (CSV); price-derivative markets are included unless `hide_price_derivatives=true`.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "title": "Limit",
      "description": "Number of results to return (1-20; default 5).",
      "default": 5
    },
    "spread_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Spread Min",
      "description": "Minimum bid-ask spread (0-1). Higher = less liquid."
    },
    "spread_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Spread Max",
      "description": "Maximum bid-ask spread (0-1). Lower = more liquid."
    },
    "probability_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Probability Min",
      "description": "Minimum probability (0-1). Filters to markets above this implied probability."
    },
    "probability_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Probability Max",
      "description": "Maximum probability (0-1)."
    },
    "prob_24h_change_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": -1
        },
        {
          "type": "null"
        }
      ],
      "title": "Prob 24H Change Min",
      "description": "Minimum 24h probability change (-1 to 1, signed). Use 0.15 for >=15pp positive moves."
    },
    "prob_24h_change_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": -1
        },
        {
          "type": "null"
        }
      ],
      "title": "Prob 24H Change Max",
      "description": "Maximum 24h probability change (-1 to 1, signed)."
    },
    "volume_24h_change_min": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24H Change Min",
      "description": "Minimum 24h notional volume change (signed USD; e.g. 1000 means +$1k vs prior 24h)."
    },
    "volume_24h_change_max": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24H Change Max",
      "description": "Maximum 24h notional volume change (signed USD)."
    },
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Source name(s); single value or comma-separated list. Allowed: polymarket, kalshi, manifold, myriad, limitless, predict, opinion, gemini."
    },
    "active": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Active",
      "description": "Filter by `active` flag (true/false)."
    },
    "closed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Closed",
      "description": "Filter by `closed` flag (true/false). Open markets are `closed=false`."
    },
    "volume_24hr_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Min",
      "description": "Minimum 24h notional volume (USD). Excludes low-activity markets."
    },
    "volume_24hr_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Max",
      "description": "Maximum 24h notional volume (USD)."
    },
    "volume_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Min",
      "description": "Minimum cumulative volume (USD). Excludes low-activity markets across full history."
    },
    "volume_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Max",
      "description": "Maximum cumulative volume (USD)."
    },
    "rank_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Min",
      "description": "Minimum rank score (numeric). Higher = more prominent."
    },
    "rank_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Max",
      "description": "Maximum rank score (numeric)."
    },
    "ends_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends After",
      "description": "Filter to events whose end_date >= this ISO 8601 datetime (e.g. `2026-06-01T00:00:00Z`)."
    },
    "ends_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends Before",
      "description": "Filter to events whose end_date <= this ISO 8601 datetime."
    },
    "hide_ended": {
      "type": "boolean",
      "title": "Hide Ended",
      "description": "If true, hide markets/events whose end_date is in the past (end_date <= now()); rows with no end_date are kept.",
      "default": false
    },
    "created_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created After",
      "description": "Filter to rows whose created_at >= this ISO 8601 datetime (first appearance in pdata's database)."
    },
    "created_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created Before",
      "description": "Filter to rows whose created_at <= this ISO 8601 datetime."
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Status",
      "description": "Comma-separated status list; any of {open, closing-soon, resolved}"
    },
    "search": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ],
      "title": "Search",
      "description": "Full-text search across title, description, slug. Case-insensitive substring match."
    },
    "sort": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Sort",
      "description": "Field name; prefix '-' for descending order (e.g. `-volume_24hr`). Common allowed values: `volume_24hr`, `normalized_vol_24hr`, `liquidity`, `end_date`, `closed_time`, `updated_at`. Markets endpoints additionally accept `probability`, `prob_24h_change`, `spread`. Invalid values return 400."
    },
    "categories": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories",
      "description": "Comma-separated category labels to include (OR)"
    },
    "categories_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories Exclude",
      "description": "Comma-separated category labels to exclude"
    },
    "hide_price_derivatives": {
      "type": "boolean",
      "title": "Hide Price Derivatives",
      "description": "If true, exclude events with is_price_derivative=TRUE",
      "default": false
    },
    "include_uncategorized": {
      "type": "boolean",
      "title": "Include Uncategorized",
      "description": "If true, the include clause also matches rows whose categories array is empty/NULL or contains only labels outside the canonical set (synthetic 'Other' bucket).",
      "default": false
    },
    "countries": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries",
      "description": "Comma-separated country names to include (OR). Full English names per the AI categorizer's prompt β€” e.g. 'United States', 'United Kingdom', 'European Union'. No allow-list β€” misspelled values silently yield zero matches."
    },
    "countries_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries Exclude",
      "description": "Comma-separated country names to exclude."
    },
    "include_uncountried": {
      "type": "boolean",
      "title": "Include Uncountried",
      "description": "If true, the include clause also matches rows whose countries array is empty/NULL β€” country-agnostic markets (synthetic 'No country' bucket).",
      "default": false
    },
    "country_match": {
      "type": "string",
      "pattern": "^(any|all)$",
      "title": "Country Match",
      "description": "How multiple `countries` combine: 'any' (default, OR β€” tagged with any selected country) or 'all' (AND β€” tagged with all of them, e.g. both Iran and Israel). Markets carry ≀3 country tags.",
      "default": "any"
    }
  },
  "required": []
}
🟒search_suggest(q, limit)

Use when an agent has a name or phrase and needs the `(source, id)` of the matching event or market before calling another tool. Resolves free text against events AND markets in one call, best-first, and reports `total_events` / `total_markets` so the agent can tell a precise hit from an ambiguous one. Every row carries `event_path`, the internal link to use for follow-up lookups. Prefer this over running `list_events?search=` and `list_markets?search=` separately when the goal is identification rather than a filtered listing. Note: `headline` carries literal `<b>` highlight markup β€” quote `title` instead, or strip the tags.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "title": "Q",
      "description": "Free-text query, matched against event titles and market questions. Queries shorter than 2 characters deliberately return an empty result set rather than half the dataset."
    },
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "title": "Limit",
      "description": "Maximum number of coalesced results to return (1-20, default 8). `total_events` / `total_markets` in the envelope are uncapped and reflect the full match count, not this limit.",
      "default": 8
    }
  },
  "required": [
    "q"
  ]
}
🟒get_summary

Use when an agent needs platform-level context before drilling into individual markets: one row per platform (Polymarket, Kalshi, Manifold, Myriad, Limitless, Predict, Opinion, Gemini) carrying 24h notional volume, active event and market counts, and that platform's category mix. Takes no parameters and returns the whole picture in one small response, which makes it the cheapest way to answer 'how big is X relative to Y' or 'which platform covers this topic'. Volumes are in each platform's native units β€” Manifold reports play-money mana, not USD β€” so do not sum across platforms without saying so.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟒list_countries(spread_min, spread_max, probability_min, probability_max, prob_24h_change_min, ...)

Use when an agent needs the list of country tags that markets have been tagged with. Returns the canonical country vocabulary with per-country market counts. Accepts the same filter params as `list_markets` (source, category, status, volume/probability ranges, search, …): the counts then reflect that filtered population, so this doubles as a facet endpoint. The country dimension itself is ignored when computing counts, so passing `country=` does not collapse the menu. Useful as the menu source for the `country=` filter on `list_events` / `list_markets` / `top_movers`.

Input Schema

{
  "type": "object",
  "properties": {
    "spread_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Spread Min",
      "description": "Minimum bid-ask spread (0-1). Higher = less liquid."
    },
    "spread_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Spread Max",
      "description": "Maximum bid-ask spread (0-1). Lower = more liquid."
    },
    "probability_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Probability Min",
      "description": "Minimum probability (0-1). Filters to markets above this implied probability."
    },
    "probability_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Probability Max",
      "description": "Maximum probability (0-1)."
    },
    "prob_24h_change_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": -1
        },
        {
          "type": "null"
        }
      ],
      "title": "Prob 24H Change Min",
      "description": "Minimum 24h probability change (-1 to 1, signed). Use 0.15 for >=15pp positive moves."
    },
    "prob_24h_change_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 1,
          "minimum": -1
        },
        {
          "type": "null"
        }
      ],
      "title": "Prob 24H Change Max",
      "description": "Maximum 24h probability change (-1 to 1, signed)."
    },
    "volume_24h_change_min": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24H Change Min",
      "description": "Minimum 24h notional volume change (signed USD; e.g. 1000 means +$1k vs prior 24h)."
    },
    "volume_24h_change_max": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24H Change Max",
      "description": "Maximum 24h notional volume change (signed USD)."
    },
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Source name(s); single value or comma-separated list. Allowed: polymarket, kalshi, manifold, myriad, limitless, predict, opinion, gemini."
    },
    "active": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Active",
      "description": "Filter by `active` flag (true/false)."
    },
    "closed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Closed",
      "description": "Filter by `closed` flag (true/false). Open markets are `closed=false`."
    },
    "volume_24hr_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Min",
      "description": "Minimum 24h notional volume (USD). Excludes low-activity markets."
    },
    "volume_24hr_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume 24Hr Max",
      "description": "Maximum 24h notional volume (USD)."
    },
    "volume_min": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Min",
      "description": "Minimum cumulative volume (USD). Excludes low-activity markets across full history."
    },
    "volume_max": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Volume Max",
      "description": "Maximum cumulative volume (USD)."
    },
    "rank_min": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Min",
      "description": "Minimum rank score (numeric). Higher = more prominent."
    },
    "rank_max": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Rank Max",
      "description": "Maximum rank score (numeric)."
    },
    "ends_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends After",
      "description": "Filter to events whose end_date >= this ISO 8601 datetime (e.g. `2026-06-01T00:00:00Z`)."
    },
    "ends_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Ends Before",
      "description": "Filter to events whose end_date <= this ISO 8601 datetime."
    },
    "hide_ended": {
      "type": "boolean",
      "title": "Hide Ended",
      "description": "If true, hide markets/events whose end_date is in the past (end_date <= now()); rows with no end_date are kept.",
      "default": false
    },
    "created_after": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created After",
      "description": "Filter to rows whose created_at >= this ISO 8601 datetime (first appearance in pdata's database)."
    },
    "created_before": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created Before",
      "description": "Filter to rows whose created_at <= this ISO 8601 datetime."
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Status",
      "description": "Comma-separated status list; any of {open, closing-soon, resolved}"
    },
    "search": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ],
      "title": "Search",
      "description": "Full-text search across title, description, slug. Case-insensitive substring match."
    },
    "sort": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Sort",
      "description": "Field name; prefix '-' for descending order (e.g. `-volume_24hr`). Common allowed values: `volume_24hr`, `normalized_vol_24hr`, `liquidity`, `end_date`, `closed_time`, `updated_at`. Markets endpoints additionally accept `probability`, `prob_24h_change`, `spread`. Invalid values return 400."
    },
    "categories": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories",
      "description": "Comma-separated category labels to include (OR)"
    },
    "categories_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories Exclude",
      "description": "Comma-separated category labels to exclude"
    },
    "hide_price_derivatives": {
      "type": "boolean",
      "title": "Hide Price Derivatives",
      "description": "If true, exclude events with is_price_derivative=TRUE",
      "default": false
    },
    "include_uncategorized": {
      "type": "boolean",
      "title": "Include Uncategorized",
      "description": "If true, the include clause also matches rows whose categories array is empty/NULL or contains only labels outside the canonical set (synthetic 'Other' bucket).",
      "default": false
    },
    "countries": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries",
      "description": "Comma-separated country names to include (OR). Full English names per the AI categorizer's prompt β€” e.g. 'United States', 'United Kingdom', 'European Union'. No allow-list β€” misspelled values silently yield zero matches."
    },
    "countries_exclude": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Countries Exclude",
      "description": "Comma-separated country names to exclude."
    },
    "include_uncountried": {
      "type": "boolean",
      "title": "Include Uncountried",
      "description": "If true, the include clause also matches rows whose countries array is empty/NULL β€” country-agnostic markets (synthetic 'No country' bucket).",
      "default": false
    },
    "country_match": {
      "type": "string",
      "pattern": "^(any|all)$",
      "title": "Country Match",
      "description": "How multiple `countries` combine: 'any' (default, OR β€” tagged with any selected country) or 'all' (AND β€” tagged with all of them, e.g. both Iran and Israel). Markets carry ≀3 country tags.",
      "default": "any"
    }
  },
  "required": []
}
🟒list_news_movers(source, categories, q, min_score, include_entertainment, ...)

Use when the user wants to see the news-feed view: markets that exhibited a probability spike in the chosen lookback window, scored by `|Ξ”prob_pp| Γ— log10(1+USD-equivalent volume)`. Refreshed after each Polymarket ingest cycle, typically every 15-20 min. The `window=` param selects the lookback: 24 (default, β‰₯15pp), 12 (β‰₯12pp), or 2 (β‰₯2h, β‰₯10pp); `prob_change` is measured over that window. Includes a `prob_history` array (24h bucketed trajectory) per row regardless of window. Filterable by `source=` and `categories=` (CSV). Soft flags (`is_entertainment`/`is_microprediction`/`is_crypto`/`is_sports`/`is_weather`) default OFF; opt in with `include_*=true`.

Input Schema

{
  "type": "object",
  "properties": {
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Platform ID(s); single value or comma-separated list. Allowed: polymarket, kalshi, manifold, myriad, limitless, predict, opinion, gemini."
    },
    "categories": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Categories",
      "description": "Category filter (CSV). Examples: 'Politics', 'Sports', 'Crypto', 'Weather'. Maps to events.categories assignments."
    },
    "q": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Q",
      "description": "Full-text search across market title and event title. Case-insensitive substring match."
    },
    "min_score": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Min Score",
      "description": "Minimum spike score. Higher = more notable spikes only."
    },
    "include_entertainment": {
      "type": "boolean",
      "title": "Include Entertainment",
      "description": "Include entertainment markets (default: excluded for signal-to-noise).",
      "default": false
    },
    "include_microprediction": {
      "type": "boolean",
      "title": "Include Microprediction",
      "description": "Include microprediction / hyperlocal markets (default: excluded).",
      "default": false
    },
    "include_crypto": {
      "type": "boolean",
      "title": "Include Crypto",
      "description": "Include crypto price-derivative markets (default: excluded).",
      "default": false
    },
    "include_sports": {
      "type": "boolean",
      "title": "Include Sports",
      "description": "Include sports markets (default: excluded).",
      "default": false
    },
    "include_weather": {
      "type": "boolean",
      "title": "Include Weather",
      "description": "Include weather markets (default: excluded).",
      "default": false
    },
    "include_resolved": {
      "type": "boolean",
      "title": "Include Resolved",
      "description": "Include resolved (closed) markets (default: excluded β€” news movers focus on live markets).",
      "default": false
    },
    "ordering": {
      "type": "string",
      "title": "Ordering",
      "description": "Sort order. Allowed values: `vol` (volume-weighted score; default), `score` (raw spike score), `prob` (probability change magnitude).",
      "default": "vol"
    },
    "window": {
      "type": "integer",
      "enum": [
        2,
        12,
        24
      ],
      "title": "SpikeWindow",
      "description": "Lookback windows the carousel selector exposes (hours). An IntEnum\n(not Literal[2,12,24]) because FastAPI coerces a query STRING to an\nIntEnum member but NOT to an int literal β€” `?window=24` would 422\nagainst a Literal even though the Python default 24 validates."
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "title": "Page",
      "description": "Page number (1-indexed).",
      "default": 1
    },
    "page_size": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "title": "Page Size",
      "description": "Items per page (1-200; default 50).",
      "default": 50
    }
  },
  "required": []
}
🟒news_movers_by_category(source, q, min_score, include_entertainment, include_microprediction, ...)

Use when the user wants the news feed bucketed by category. Returns the same data shape as `list_news_movers` but pre-grouped into the canonical 14-category vocabulary, with cluster grouping inside each bucket. Useful for 'what's moving in politics?' style queries.

Input Schema

{
  "type": "object",
  "properties": {
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Platform ID(s); single value or comma-separated list. Allowed: polymarket, kalshi, manifold, myriad, limitless, predict, opinion, gemini."
    },
    "q": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Q",
      "description": "Full-text search across market title and event title. Case-insensitive substring match."
    },
    "min_score": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Min Score",
      "description": "Minimum spike score. Higher = more notable spikes only."
    },
    "include_entertainment": {
      "type": "boolean",
      "title": "Include Entertainment",
      "description": "Include entertainment markets (default: excluded for signal-to-noise).",
      "default": false
    },
    "include_microprediction": {
      "type": "boolean",
      "title": "Include Microprediction",
      "description": "Include microprediction / hyperlocal markets (default: excluded).",
      "default": false
    },
    "include_crypto": {
      "type": "boolean",
      "title": "Include Crypto",
      "description": "Include crypto price-derivative markets (default: excluded).",
      "default": false
    },
    "include_sports": {
      "type": "boolean",
      "title": "Include Sports",
      "description": "Include sports markets (default: excluded).",
      "default": false
    },
    "include_weather": {
      "type": "boolean",
      "title": "Include Weather",
      "description": "Include weather markets (default: excluded).",
      "default": false
    },
    "include_resolved": {
      "type": "boolean",
      "title": "Include Resolved",
      "description": "Include resolved (closed) markets (default: excluded β€” news movers focus on live markets).",
      "default": false
    },
    "per_category": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "title": "Per Category",
      "description": "Max items per category bucket (1-50; default 11).",
      "default": 11
    }
  },
  "required": []
}
🟒map_heat(at, source)

Use when you need a geographic snapshot of where prediction-market attention is concentrated. Returns per-country heat (capped news score, summed) for the current moment (`at=now`) or a past hour (`at=<ISO8601>`).

Input Schema

{
  "type": "object",
  "properties": {
    "at": {
      "type": "string",
      "title": "At",
      "description": "'now' (live cache) or an ISO-8601 timestamp for a past hourly frame.",
      "default": "now"
    },
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Restrict to one source (only honored when at=now): polymarket, kalshi, manifold, myriad, limitless, predict, opinion, gemini."
    }
  },
  "required": []
}
🟒map_timeline(source)

Use when you need the hourly total-heat time series that drives the /map playback scrubber. History accretes from launch (no backfill).

Input Schema

{
  "type": "object",
  "properties": {
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "description": "Reserved; playback history is source_scope='all' in v1."
    }
  },
  "required": []
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
failed observationversion not recordedβ€”
failed observationversion not recordedβ€”