30.0 / 30
What changed in the harness
Selection accuracy 98→98, token cost up 6%, unconfirmed writes 100%→100%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
24.7 / 30
03Economics
17.4 / 20
04Discoverability
11.2 / 20
Highest-impact fix
Estimated gain +9 pointsMake target tools discoverable on the first call
Clarify tool names, decision boundaries, and required argument schemas so an agent can choose and construct the target call without exploratory steps.
Description evidence
Defects and rewrites.
13 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
propline_list_event_markets |
params_unexplained no_return_description |
Returns the list of market keys (e.g. h2h, spreads, totals, player_points, pitcher_strikeouts) available for a specific event. Requires sport_key (from propline_list_sports, e.g. baseball_mlb) and event_id (from propline_list_events). Useful when you don't know which prop markets a given event carries. |
propline_get_odds |
params_unexplained |
Get live odds. Requires sport_key (from propline_list_sports, e.g. baseball_mlb, basketball_nba). If event_id is supplied, returns full per-event props for that event; otherwise returns bulk game-line odds for the whole sport. Pass markets as a comma-separated list (e.g. 'h2h,spreads,totals' or 'player_points,player_rebounds'). Response includes a bookmakers[] array across every book that carries the requested markets (currently up to 13: Bovada, DraftKings, FanDuel, Pinnacle, BetMGM, BetRivers, Unibet, Underdog, PrizePicks, Kalshi, Polymarket, Matchbook, Smarkets — coverage varies by sport). Underdog Fantasy outcomes carry a payout_multiplier (DFS boost/discount factor; null = standard pick, e.g. 1.5 = boost, 0.75 = discount) — skip non-null values when comparing DFS lines to sportsbook consensus. |
propline_get_odds_history |
params_unexplained |
Hobby+ endpoint. Requires sport_key (from propline_list_sports) and event_id (from propline_list_events); optional markets is a comma-separated list of market keys to scope the history (defaults to full-game markets). Returns the historical line-movement snapshot series for that event (every recorded price/point change per outcome over the event's lifetime). Free tier returns market structure with redacted snapshots and an upgrade pointer. Supports period-historical filters: from/to (absolute ISO), relative_from/relative_to (offsets to commence_time like '-3h' or '0'), interval downsample ('30s'/'1m'/'5m'/'15m'/'30m'/'1h'), and changes_only=true to drop unchanged adjacent snapshots. |
propline_get_odds_closing |
params_unexplained |
Hobby+ endpoint. Requires sport_key (from propline_list_sports) and event_id (from propline_list_events); optional markets is a comma-separated list of market keys to scope the result (defaults to full-game markets). Returns the closing line per (book, market, outcome) for that event — the last snapshot at or before commence_time. Canonical CLV-tracking helper; one call returns the data point your bet should be measured against, instead of fetching full history and post-processing. Each outcome carries a closing_at field with the snapshot's recorded_at. Free tier returns redacted structure with upgrade pointer. |
propline_get_scores |
params_unexplained |
Free-tier endpoint. Requires sport_key (from propline_list_sports, e.g. baseball_mlb). Returns recent and live game scores plus status (scheduled, live, final) for that sport. Useful for: 'is this game over yet, what was the final score'. |
propline_get_event_stats |
params_unexplained |
Book-agnostic raw box-score stats for a completed event. Requires sport_key (from propline_list_sports) and event_id (from propline_list_events, must be a completed event). Returns per-player stats (e.g. strikeouts, hits, points, rebounds, shots-on-goal) decoupled from any sportsbook's lines. Free tier. |
propline_get_event_results |
params_unexplained |
Pro-tier endpoint. Requires sport_key (from propline_list_sports) and event_id (from propline_list_events, must be a completed event). Returns graded prop outcomes for that event — every Over/Under marked won, lost, push, or void with the actual stat value next to the line. The single most distinctive feature vs the-odds-api: they don't grade props at any tier. Free tier returns the same structure with resolution and actual_value redacted plus an upgrade pointer. |
propline_get_event_context |
params_unexplained |
Game context for an event, given sport_key (from propline_list_sports) and event_id (from propline_list_events) — the conditions a prop settles under. MLB: probable starting pitchers and their throwing hand (L/R/S — platoon-split context for every batter prop), a confirmed-lineup flag, the home-plate umpire, and first-pitch weather (temperature, wind, precipitation) at outdoor / open-roof venues (indoor venues return weather=null). NFL & NCAAF: the venue and kickoff weather. The same block is embedded in get_event_results, so every graded prop carries its conditions — unique to PropLine. Free tier. 404 when no context is on file for the event yet. |
propline_get_event_movement |
params_unexplained |
Line movement + steam detection from the snapshot tick history for an event. Requires sport_key (from propline_list_sports) and event_id (from propline_list_events). Per (book, market, outcome): opening line, latest line, signed implied-probability shift, point shift, direction. The steam[] array flags outcomes that multiple books moved the same direction — the classic sharp-money signal, computed across all 16 books PropLine polls. When a book moves the line itself, that outcome's prob_shift is null and direction is 'line_moved' (excluded from the steam signal). No pull-only odds API can produce this. Hobby+ full; free tier redacted. |
propline_get_player_history |
params_unexplained |
Player prop history across recent games. Requires sport_key (from propline_list_sports) and player_name. Returns each prior prop this player took with line, prices, resolution, and actual value. Pro tier returns full data; free tier returns redacted resolution/actual_value with an upgrade pointer. |
propline_get_player_trends |
params_unexplained |
Hit-rate trends / last-N-games over rate for a player, given sport_key (from propline_list_sports) and player_name — unique to PropLine's prop-resolution data. For each market the player has graded history in, returns over/under/push splits across the last 5/10/20/50 graded games, current streak, average actual stat, and the recent line. This is the 'did X go over in N of his last M games?' surface. Omit `market` for all markets, or pass one to scope (e.g. 'player_points', 'batter_hits'). |
propline_get_event_ev |
params_unexplained |
Pro-tier endpoint. Requires sport_key (from propline_list_sports) and event_id (from propline_list_events); optional markets is a comma-separated list of market keys to scope the result. Returns cross-book +EV per outcome for that event. We anchor on Pinnacle's sharp line, remove vig, derive a no-vig fair line, and compute EV% per book at the same line. Outcomes are sorted with +EV plays floated to the top of each line group. PrizePicks is excluded from EV math (DFS payouts aren't comparable to per-book prices). |
propline_get_best_line |
params_unexplained |
Cross-book line shopping (Hobby+ for prices; free tier gets the full structure with book identities + best-first ranking but prices nulled and redacted:true). Requires sport_key (from propline_list_sports) and event_id (from propline_list_events). For every (market, player, line) tuple on the event, returns the single best American price across all comparable books, plus an all_prices array sorted best-first (one row per book, each with last_update). Companion to propline_get_event_ev: /ev says whether a price beats the no-vig fair line; best-line says which book pays the most. DFS pick'em books (PrizePicks, Sleeper, Dabble) are excluded; Underdog only at clean two-way lines. Optional bookmakers filter to shop only the books the user holds accounts at. |
Selection evidence
Confusable tool pairs.
7 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
propline_get_odds_history |
propline_get_odds_closing |
medium | Both are Hobby+ per-event line-movement endpoints taking identical params; a task like 'what was the closing/last line for this game' could plausibly be routed to the full history tool instead of the dedicated closing-line tool, or vice versa. |
propline_get_odds_history |
propline_export_odds_history |
medium | Both return historical odds snapshots for a sport/event; a request like 'get me all the historical odds data for this sport' could be misrouted to the per-event tool instead of the bulk CSV export, especially since both share 'history' and overlapping filter concepts. |
propline_get_event_stats |
propline_get_event_results |
medium | Both return post-game per-player data for a completed event; a vague task like 'how did this player do in the game' could be routed to raw box-score stats instead of graded prop outcomes (or vice versa) since both are keyed by sport_key/event_id with no other params. |
propline_get_player_history |
propline_get_player_trends |
medium | Both take sport_key/player_name/markets and describe a player's past prop performance; a task like 'has this player been hitting the over lately' could go to either the raw game-by-game history or the aggregated hit-rate trends tool. |
propline_get_event_context |
propline_get_event_movement |
low | Share only 'event/get' tokens with very different purposes (game conditions vs line movement), but a loosely worded 'what's going on with this event' could nudge an agent toward the wrong one. |
propline_get_futures |
propline_get_resolution_summary |
low | Both are free-tier aggregate endpoints, but their subject matter (futures odds vs grading-volume stats) is distinct enough that confusion is unlikely except for very vague 'give me an overview' requests. |
propline_get_odds |
propline_get_best_line |
low | Both fetch pricing for an event/sport; a request like 'get me the best odds for this game' could plausibly be sent to get_odds instead of the dedicated best-line shopping tool. |
Compare the field