propline-mcp 0.35.4 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,7 +31,7 @@ The model uses these tools transparently:
31
31
  | `propline_get_odds_history` | Hobby+: snapshot history per outcome; supports `period` (q1/h1/…) plus time-window filters (from/to, relative_from/relative_to, interval, changes_only) |
32
32
  | `propline_get_odds_closing` | Hobby+: opening **and** closing line per (book, market, outcome) — CLV helper. Accepts `period` to scope to a specific game period. |
33
33
  | `propline_grade_clv` | Hobby+: grade **placed** bets against their closing lines. Returns closing price, de-vigged closing fair (`fair_source` = sharpest book at close, not yours), `clv_pct` (price-vs-price, vig-blind) **and** `ev_vs_close_pct` (the honest number), plus the graded result once the game settles. Fail-closed matching; unstarted events come back `closing_is_final: false` and are excluded from the averages. |
34
- | `propline_price_sgp` | Hobby+: price a same-game parlay at the **book's own** correlated odds (FanDuel, BetOnline, LowVig). Returns `sgp_price`, `independent_price` (product of the live single-leg prices) and `correlation_factor` (their ratio). Legs are named exactly as `/odds` names an outcome; matching is fail-closed. |
34
+ | `propline_price_sgp` | Hobby+: price a same-game parlay at the **book's own** correlated odds (FanDuel, DraftKings, BetOnline, LowVig — or `bookmaker: "all"` for every book side by side with `best_bookmaker`). Returns `sgp_price`, `independent_price` (product of the live single-leg prices) and `correlation_factor` (their ratio). Legs are named exactly as `/odds` names an outcome; matching is fail-closed. |
35
35
  | `propline_export_odds_history` | Backfill-pass / Enterprise: bulk line-movement tick history (every snapshot, per book) for a sport. Requires a `since`/`until` window; result capped to 200 rows (use the REST endpoint directly for the full file). |
36
36
  | `propline_get_futures` | Season-long futures — championship/division/conference winners, MVP + awards, season win totals — across Bovada/FanDuel/DraftKings/Pinnacle/Kalshi (free) |
37
37
  | `propline_get_scores` | Game scores + status (free) |
@@ -46,7 +46,7 @@ The model uses these tools transparently:
46
46
  | `propline_get_player_history` | Player prop history with resolution |
47
47
  | `propline_get_player_games` | Player game log — recent games with every raw box-score stat per game, one call instead of one per event; `opponent` gives head-to-head (last N *meetings*). Raw-stat archive, so it includes games no book priced |
48
48
  | `propline_get_player_trends` | Hit-rate trends — over/under/push splits over last 5/10/20/50 graded games, streak, avg actual (optional `dfs_odds_type` to scope to a PrizePicks flavor) |
49
- | `propline_get_event_ev` | Pro: cross-book +EV with no-vig fair lines |
49
+ | `propline_get_event_ev` | Pro: cross-book +EV with no-vig fair lines (`devig`: multiplicative or shin) |
50
50
  | `propline_get_event_projections` | Hobby+: market-implied consensus projection per (market, player) |
51
51
  | `propline_get_best_line` | Hobby+: cross-book line shopping — best price per (market, player, line) across all comparable books, `all_prices` sorted best-first; optional `bookmakers` filter |
52
52
  | `propline_list_webhooks` | Streaming Lite+: list webhook subscriptions (read-only, secrets masked) |
package/dist/http.js CHANGED
@@ -259,7 +259,8 @@ var PropLineClient = class {
259
259
  getEventEv(sportKey, eventId, opts = {}) {
260
260
  return this.request(`/v1/sports/${sportKey}/events/${eventId}/ev`, {
261
261
  markets: opts.markets,
262
- bookmakers: opts.bookmakers
262
+ bookmakers: opts.bookmakers,
263
+ devig: opts.devig
263
264
  });
264
265
  }
265
266
  getEventProjections(sportKey, eventId, opts = {}) {
@@ -299,7 +300,7 @@ var PropLineClient = class {
299
300
  };
300
301
 
301
302
  // src/server.ts
302
- var VERSION = "0.35.4";
303
+ var VERSION = "0.36.0";
303
304
  var DEMO_KEY = "be2b8487fcfacb1fbc292a8aa925a84c";
304
305
  var apiKey = process.env.PROPLINE_API_KEY;
305
306
  var baseUrl = process.env.PROPLINE_BASE_URL;
@@ -597,7 +598,7 @@ var tools = [
597
598
  {
598
599
  name: "propline_price_sgp",
599
600
  title: "Price a same-game parlay at the book's own odds",
600
- description: "Hobby+ endpoint. Prices a same-game parlay at the BOOK'S OWN correlated odds \u2014 the price a FanDuel customer would be offered for that exact slip right now, not a model of it. bookmaker is fanduel (default, its own pricer) or betonlineag / lowvig (the Sportcast engine both share, same builder price). Send 2-10 legs from ONE event, each named exactly as propline_get_odds names an outcome: market key, name (team / Over / Under / player for YES-only props), description (the player on a two-way prop, '' for game lines), point (omit for h2h and YES-only props), period (omit for full game) and team for a TEAM total (omit for the game total; a totals leg with no team matches the game total only) \u2014 or book_outcome_id from includeBookIds (on betonlineag / lowvig that is Sportcast's settlement id, e.g. MatchWinner_Home). The response carries sgp_price (the book's parlay price), independent_price (the product of the live single-leg prices) and correlation_factor = their ratio: below 1 the book is charging for correlation, above 1 it is paying for anti-correlation \u2014 say which when presenting it. Matching is fail-closed: a leg that does not pin to exactly one stored outcome is a 422 leg_unmatched naming the leg (an Over with no point on an event with two total lines is refused, not guessed) \u2014 fix the leg, do not retry blindly. quoted=false means the book will not offer that combination as an SGP; refused legs carry the book's own failure_code. Free tier returns the matched legs with every price nulled.",
601
+ description: "Hobby+ endpoint. Prices a same-game parlay at the BOOK'S OWN correlated odds \u2014 the price a FanDuel customer would be offered for that exact slip right now, not a model of it. bookmaker is fanduel (default, its own pricer), draftkings (its SGP widget's pricer), betonlineag / lowvig (the Sportcast engine both share, same builder price), or 'all' to quote every book on the same legs in one call \u2014 then the response is {quotes, errors, best_bookmaker}, and best_bookmaker is the book charging the smallest correlation reduction (use 'all' whenever the user asks which book to bet an SGP at). Send 2-10 legs from ONE event, each named exactly as propline_get_odds names an outcome: market key, name (team / Over / Under / player for YES-only props), description (the player on a two-way prop, '' for game lines), point (omit for h2h and YES-only props), period (omit for full game) and team for a TEAM total (omit for the game total; a totals leg with no team matches the game total only) \u2014 or book_outcome_id from includeBookIds (on betonlineag / lowvig that is Sportcast's settlement id, e.g. MatchWinner_Home). The response carries sgp_price (the book's parlay price), independent_price (the product of the live single-leg prices) and correlation_factor = their ratio: below 1 the book is charging for correlation, above 1 it is paying for anti-correlation \u2014 say which when presenting it. Matching is fail-closed: a leg that does not pin to exactly one stored outcome is a 422 leg_unmatched naming the leg (an Over with no point on an event with two total lines is refused, not guessed) \u2014 fix the leg, do not retry blindly. quoted=false means the book will not offer that combination as an SGP; refused legs carry the book's own failure_code. Free tier returns the matched legs with every price nulled.",
601
602
  inputSchema: {
602
603
  type: "object",
603
604
  properties: {
@@ -605,7 +606,7 @@ var tools = [
605
606
  event_id: { type: ["string", "number"] },
606
607
  bookmaker: {
607
608
  type: "string",
608
- description: "fanduel (default), betonlineag or lowvig."
609
+ description: "fanduel (default), draftkings, betonlineag, lowvig, or all (every book side by side)."
609
610
  },
610
611
  legs: {
611
612
  type: "array",
@@ -1001,6 +1002,11 @@ var tools = [
1001
1002
  min_ev_pct: {
1002
1003
  type: "number",
1003
1004
  description: "Filter to outcomes with EV \u2265 this percent (e.g. 2.0)."
1005
+ },
1006
+ devig: {
1007
+ type: "string",
1008
+ enum: ["multiplicative", "shin"],
1009
+ description: "How the anchor's vig is removed. 'multiplicative' (default) divides each implied probability by the booksum; 'shin' solves Shin's insider-trading model, which loads the overround onto the longshot and corrects the favourite-longshot bias \u2014 use it when the user asks about longshot props (anytime TD, first scorer). The response echoes devig_method; say which method the numbers came from."
1004
1010
  }
1005
1011
  },
1006
1012
  required: ["sport_key", "event_id"],
@@ -1012,7 +1018,8 @@ var tools = [
1012
1018
  args.event_id,
1013
1019
  {
1014
1020
  markets: args.markets,
1015
- bookmakers: args.bookmakers
1021
+ bookmakers: args.bookmakers,
1022
+ devig: args.devig
1016
1023
  }
1017
1024
  );
1018
1025
  return filterByMinEv(res, args.min_ev_pct);