Skip to main content
Glama
ndrysdal-byte

prediction-friction-tracker

Prediction market friction tracker

Structured KYC, fee, and withdrawal data across 12 prediction-market venues, plus a change feed for when those terms move and a natural-language "which venue is best for X" recommendation tool. Built for AI agents that need to check execution friction before routing a trade — not for humans clicking around a dashboard.

Live now: https://prediction-friction-tracker-production.up.railway.app

For agents: three ways in

  1. Plain HTTPGET /friction/venues, GET /friction/venue/{slug}, GET /friction/changes?since=<ISO8601>. Full OpenAPI spec at /openapi.json, interactive docs at /docs, agent-readable summary at /llms.txt.

  2. MCP — a streamable-HTTP MCP server mounted at /mcp/, exposing list_venues, get_venue, recommend_venue, and get_changes_info as tools. Point any MCP-compatible client at the /mcp/ URL directly.

  3. x402/friction/changes (the time-sensitive change feed) is gated by the x402 protocol: unpaid requests get a real 402 with a payment challenge; pay $0.05 USDC on Base mainnet and retry to get the data. This is live, verified end-to-end with real money, not a demo — see api.py for the CDP-facilitator wiring.

Related MCP server: Parlay

Endpoints

Endpoint

Cost

What it returns

GET /friction/venues

Free

Current snapshot of every tracked venue. Optional ?confidence=verified|stale|unconfirmed filter.

GET /friction/venue/{slug}

Free

One venue's current fee/KYC/withdrawal/API-access data, e.g. /friction/venue/kalshi.

GET /friction/changes?since=<ISO8601>

$0.05 USDC (x402)

Append-only log of every detected change since a timestamp — the time-sensitive product.

Every record carries a confidence field: verified (spot-checked or high-confidence extraction), stale (source was unreachable, showing a cached value), or unconfirmed (LLM extraction was ambiguous). Treat unconfirmed as a lead to verify against the venue directly, not a fact to trade on.

MCP tools

  • list_venues(confidence) — browse/filter the current snapshot.

  • get_venue(slug) — one venue's full data.

  • recommend_venue(query) — free-text "which venue is best for lowest fees on high-frequency trading" / "I don't want to do KYC" / "API access without a wallet" style questions, reasoned over the current dataset. Says so explicitly rather than guessing when a query depends on data this tracker doesn't have (liquidity, volume, spread, uptime).

  • get_changes_info() — describes the paid change feed (URL, price) without reimplementing it for free.

What's here

File

What it does

schema.py

The data model — one VenueFriction record per venue, plus the VenueRecommendation response shape

venues.py

The 12 tracked venues and their policy-page source URLs

scrapers/base.py

Fetches and cleans raw policy-page text (requests + Playwright fallback for JS-rendered pages)

extract.py

Sends raw page text to Claude, gets back a structured VenueFriction matching the schema

recommend.py

Natural-language venue recommendation — reasons over the current dataset via Claude, structured-output constrained to real venue slugs

reference_check.py

Cross-checks scraped fees against a third-party source (TradeBlock), flags divergences for human review

storage.py

SQLite: current_state table (latest snapshot) + change_log table (append-only, the paid product)

diff.py

Compares a fresh extraction to the stored one, writes a ChangeEvent for anything that moved

run_pipeline.py

Orchestrates fetch → extract → diff → store, for all 12 venues

api.py

FastAPI server — the HTTP endpoints above, x402 payment gating, MCP mount

mcp_server.py

The MCP tool definitions, mounted into api.py at /mcp/

test_pipeline_logic.py, test_recommend_logic.py

Pure-logic tests, no API key needed

Running it locally

pip install -r requirements.txt
python test_pipeline_logic.py      # no API key needed, proves storage/diff logic
python test_recommend_logic.py     # no API key needed, proves recommendation logic
export ANTHROPIC_API_KEY=sk-ant-...
python run_pipeline.py             # real scrape -> extract -> store, all 12 venues
uvicorn api:app --reload           # boots the API on localhost:8000

Then in another terminal:

curl http://localhost:8000/friction/venues
curl http://localhost:8000/friction/venue/kalshi
curl "http://localhost:8000/friction/changes?since=2020-01-01T00:00:00Z"

See CLAUDE.md for environment quirks, Claude API usage notes, and the data-quality/confidence model in more depth.

Informational only — not financial or legal advice. Verify directly with the venue before acting on any figure returned here.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for Polymarket prediction markets, enabling search, market details, pricing, and bet analysis through 6 tools, with optional authenticated trading via API key.
    6
    22 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server for prediction markets — search and compare live odds across Polymarket, Kalshi, and Limitless from Claude, ChatGPT, or Gemini. Six read-only tools, free tier available.
    6
    MIT
  • A
    license
    C
    quality
    C
    maintenance
    MCP server that provides a unified prediction market API for multiple venues like Polymarket and Kalshi, allowing AI agents to discover markets, fetch order books, and execute trades through a single interface.
    32
    216 npm
    8
    MIT