Skip to main content
Glama

Prediction Calibration

prediction_calibration
Read-onlyIdempotent

REALIZED win rate by shown price and minutes elapsed for short-horizon crypto up/down markets, net of taker fee — read from our own settled-outcomes archive, not from live prices. Answers the one question no venue will: "a side shown at 82 with five minutes left, how often did it ACTUALLY win?" Returns a grid of (price bucket x minute elapsed) -> n, realized_win_rate_pp, mean_shown_price_pp, calibration_gap_pp (realized minus shown — zero means the book is calibrated), breakeven_win_rate_pp (the shown price plus the taker fee that was actually in force for that market), and net_edge_pp (realized minus breakeven, which is what a taker would have kept). WHY AN ARCHIVE EXISTS AT ALL: a settled 15-minute window is exactly what these venues stop serving. Measured 2026-10-22, a polymarket.com window drops out of the default market listing within minutes of closing (its trade tape and resolution stay retrievable by a closed-market lookup, which the collector now uses), and the other venues serve settled windows only briefly or thinly. So this tool reads a local archive collected window-by-window as they settle. THE THREE VENUES ARE NEVER POOLED. polymarket.com settles on a whole-window Chainlink BTC/USD 60s TWAP; polymarket-us and Kalshi settle on a CF Benchmarks BRTI endpoint average. A whole-window average and an endpoint average are different random variables, so venue:"all" returns one grid PER VENUE and venues_pooled is always false. EVERY RATE CARRIES ITS 95% INTERVAL, AND EVERY EDGE SAYS WHETHER IT SURVIVES IT. Each cell gives realized_win_rate_ci95_lo/hi_pp (Wilson, so it never reports an impossible win rate above 100), the same interval carried onto net_edge_ci95_lo/hi_pp, and net_edge_distinguishable_from_zero. READ THAT BOOLEAN BEFORE net_edge_pp: at these sample sizes most cells are false, meaning the interval straddles zero and a net_edge_pp of +4pp is NOT evidence of an edge. For scale, at a 90% win rate even n=300 gives a 95% half-width of ~3.4pp while net edges here run +2 to +4pp — so a comfortable-looking sample still cannot call a small edge real. verdict says it per cell in plain words, and the first note says how many cells survived. A THIN CELL WITHHOLDS ITS RATE ENTIRELY. Any bucket holding fewer than 30 settled windows reports status "thin" with realized_win_rate_pp and every interval null rather than printing a rate from a sample too small to mean anything — a 2-sample "100% win rate" is the most misleading thing this tool could say. ALWAYS READ coverage BEFORE THE GRID: it gives the first and last window held, windows_total vs windows_settled, every UTC day inside the span with no windows at all, and the longest run of consecutive missing windows. A grid over a store with a three-day hole looks entirely normal and is measuring a different population. mean_fill_price_pp and fill_vs_shown_pp are populated for polymarket.com only — it is the one venue of the three that publishes a trade tape for these markets, so it is the only place realized FILL can be compared with the shown price instead of assumed equal to it.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
assetNobtc (default) | eth | sol | xrp | bnb. Coverage differs by venue: polymarket and polymarket-us carry btc/eth/sol/xrp, Kalshi carries btc/eth/bnb.
venueNopolymarket | polymarket-us | kalshi | all (default polymarket). "all" returns one grid per venue, never a merged one.
minuteNoMinutes elapsed since window open, 0-based. Omit for the full grid; pass 5 for the "five minutes in" row only, which is also the cheapest query.
horizonNo15m (default). 5m | 1h | 1d are accepted but only 15m is collected today, so another value returns coverage.windows_total 0 rather than an error.
bucket_ppNoPrice-bucket width in percentage points: 5 | 10 (default) | 20 | 25 | 50. Must divide 100, so the last bucket is never narrower than the rest.
side_conventionNo"favorite" (default) folds each window onto whichever side was the favorite — the frame published claims about early favorites use. "yes" keeps the venue own YES/Up side.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial non-obvious behavior: thin buckets (<30 windows) withhold rates and intervals entirely, venues are never pooled and venues_pooled is always false, coverage fields reveal gaps in the store, and fill-price fields exist only for polymarket.com. It also warns that net_edge_distinguishable_from_zero is false for most cells, which prevents a serious misreading of the output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core definition in the first two sentences, then organized into clearly demarcated sections (why an archive, venue pooling, intervals, thin cells, coverage, fill price). It is long for a 6-parameter read tool, and the "WHY AN ARCHIVE EXISTS AT ALL" paragraph — including a dated measurement anecdote — is the most trimmable material, but nearly every remaining sentence carries behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must carry the return contract, and it does: it enumerates every grid field (n, realized_win_rate_pp, calibration_gap_pp, breakeven_win_rate_pp, net_edge_pp, CI bounds, verdict, coverage), explains their units and sign conventions, and flags per-venue field availability. An agent has everything needed to call it and to interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented with defaults and accepted values, establishing a baseline of 3. The description reinforces a few semantics (venue:"all" returns one grid per venue, minute=5 is the cheapest row, side_convention reflects the favorite frame), but these largely restate the schema rather than adding new syntax or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb + resource + scope: realized win rate by shown price bucket and minute elapsed for short-horizon crypto up/down markets, from a settled-outcomes archive rather than live prices. It explicitly distinguishes itself from the live-price siblings (polymarket_edges, polymarket_arbitrage) and from the archival siblings by naming the exact quantity it computes (calibration gap, net edge).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear about the situations it serves ("Answers the one question no venue will" — post-hoc calibration of a shown price) and implicitly excludes live-price use by stating it reads the archive, not live prices. It does not, however, name a specific alternative sibling or state an explicit "use X instead when..." condition, so the routing is contextual rather than prescriptive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.