# Prediction Market Friction Tracker [Health: Active]

**Category:** 💰 Finance & Fintech  
**Repository:** https://github.com/ndrysdal-byte/prediction-friction-tracker  
**GitHub Stars:** 0  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/prediction-market-friction-tracker

## Description
Prediction-market fee/KYC/withdrawal data, venue recommendations, and a paid x402 change feed.

## Claude Desktop Quick Installation
Heuristic fallback — verify the package name and runner against the repository README before running it. Uses `npx` (confidence: low):

```json
"mcpServers": {
  "prediction-market-friction-tracker": {
    "command": "npx",
    "args": ["-y","prediction-market-friction-tracker"]
  }
}
```

## Documentation & README

# 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 HTTP** — `GET /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`](https://prediction-friction-tracker-production.up.railway.app/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](https://x402.org): 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.

## 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

```bash
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:
```bash
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.

