Skip to content
On this page

Premium CLI/MCP Research Demo

This page demonstrates how a Premium customer can use Scottfree Sports from a terminal or from an AI assistant to gather the information needed to make an informed betting decision.

The core idea is simple: customers can ask for picks, but the answer should explain what kind of pick it is.

  • ML model pick: the side selected by the model probability, blend probability, or model-vs-market comparison.
  • Research context: odds, line movement, model history, public consensus, injuries, weather, live scores, and prediction-market prices.
  • Not promised: a guaranteed edge, a lock, Kelly sizing, or a separately validated betting system.

Validation Snapshot

Date validated: 2026-05-23

Release validated: v1.2.7

Environment: production API through the sfs CLI and sfs-mcp server

CLI package validated locally: scottfree-sports-cli==0.2.1

Core Scottfree MCP path verified:

  • 16 public MCP tools registered.
  • Premium account lookup succeeded.
  • Premium usage lookup showed a 200,000 monthly request limit.
  • get_daily_brief(mlb) returned 16 games and 31 model-market entries.
  • get_predictions(mlb, won_on_points) returned 16 games.
  • get_results(mlb, won_on_points, limit=10) returned 10 rows.
  • get_summary(mlb, won_on_points) returned 8 summary rows.
  • Current odds, public consensus, weather, live scores, rosters, Polymarket, Kalshi, and market comparison tools returned clean assistant-readable payloads.

Core CLI path verified:

  • sfs account info and sfs account usage showed Premium access and 200,000 monthly requests.
  • sfs predictions list-sports listed all 6 sports.
  • sfs brief get mlb -o json returned 16 games and 31 model-market entries.
  • sfs predictions get mlb over_under|spread|ml -o json returned 16 games for each market.
  • sfs summary get mlb ml, sfs results get mlb ml --limit 10, and sfs odds get mlb completed successfully.
  • Optional context commands for consensus, weather, live scores, rosters, Polymarket, Kalshi, and market comparison completed successfully.
  • sfs scores injuries <sport> now returns the same friendly BALLDONTLIE GOAT-tier requirement message as MCP instead of exposing a raw upstream 401.

Some optional context tools require external upstream availability or the customer's own third-party API key:

  • get_live_scores, get_injuries, and get_players require a BALLDONTLIE key.
  • get_injuries requires BALLDONTLIE's GOAT tier; lower BALLDONTLIE tiers now return a clear upgrade-required message in both CLI and MCP instead of a raw HTTP failure.
  • Prediction-market and public-consensus tools depend on their upstream sites being reachable.

The Scottfree Sports API key is never shown in a transcript.

Live Validation Transcript

This is the launch validation shape from the production v1.2.7 smoke. Counts will change as slates and upstream providers change, but the expected behavior is the same.

text
MCP registered_tools=16
get_account_info -> Premium account, 200,000 monthly request limit
get_usage -> 200,000 monthly limit
get_sports -> 6 sports
get_daily_brief(mlb) -> 16 games, 31 model-market entries
get_predictions(mlb, won_on_points) -> 16 games
get_results(mlb, won_on_points, limit=10) -> 10 rows
get_summary(mlb, won_on_points) -> 8 rows
get_odds(mlb) -> 17 games
get_betting_consensus(mlb) -> 13 entries
get_game_weather(mlb) -> 22 venue-weather entries
get_live_scores(mlb) -> 17 live-score rows
get_players(mlb, per_page=5) -> 5 players
get_injuries(mlb) -> clear BALLDONTLIE GOAT-tier requirement message
get_polymarket_odds(mlb) -> 10 compact events
get_kalshi_markets(mlb) -> clean empty-market response when no markets are live
compare_market_odds(mlb, won_on_points) -> 16 prediction games + compact markets

What Premium Gives You

Research areaCLI commandMCP toolWhat it helps answer
Account and quotasfs account info, sfs account usageget_account_info, get_usageIs my subscription active and how much quota remains?
Sports and marketssfs predictions list-sportsget_sportsWhich sports and model types are available?
Daily model pickssfs brief get mlbget_daily_briefWhat does the model slate like today?
Per-model predictionssfs predictions get mlb mlget_predictionsWhat does each model say for this game and market?
Line movementsfs predictions get mlb spread -o json; use REST for full results JSONget_predictions, get_resultsHow did the line move from opener to current or final?
Model performancesfs summary get mlb ml, sfs results get mlb mlget_summary, get_resultsWhich models have been accurate recently and historically?
Current oddssfs odds get mlbget_oddsWhat are the current lines and prices?
Public bettingsfs consensus get mlbget_betting_consensusWhere is the public leaning?
Weathersfs weather get mlbget_game_weatherAre outdoor conditions relevant?
Live scoressfs scores scores mlbget_live_scoresWhat is happening now or what happened today?
Injuries and rosterssfs scores injuries nba, sfs scores players nbaget_injuries, get_playersWho is out and who is available?
Prediction marketssfs markets kalshi nfl, sfs markets polymarket nba, sfs markets compare nbaget_kalshi_markets, get_polymarket_odds, compare_market_oddsDo external markets agree with the model?
Line movement is not a separate standalone tool. It is exposed through opener/current fields on predictions and results, the same data the app uses for the Predictions and Summary visualizations.

Assistant Demo

Customer prompt

text
Give me today's MLB betting research. Start with the model picks, then show the
line movement, model-vs-implied deltas, recent model performance, current odds,
public consensus, weather, and anything else that helps me decide what to bet.
Be clear when something is an ML model pick versus a guaranteed edge.

Tools the assistant can call

text
get_account_info
get_usage
get_daily_brief(sport="mlb")
get_predictions(sport="mlb", model_type="over_under")
get_predictions(sport="mlb", model_type="won_on_spread")
get_predictions(sport="mlb", model_type="won_on_points")
get_summary(sport="mlb", model_type="over_under")
get_summary(sport="mlb", model_type="won_on_spread")
get_summary(sport="mlb", model_type="won_on_points")
get_results(sport="mlb", model_type="over_under", limit=100)
get_odds(sport="mlb")
get_betting_consensus(sport="mlb")
get_game_weather(sport="mlb")
get_live_scores(sport="mlb")
get_kalshi_markets(sport="mlb")
get_polymarket_odds(sport="mlb")
compare_market_odds(sport="mlb", model_type="won_on_points")

The assistant does not need to call every tool every time. A good answer uses the right mix for the customer's question.

Example assistant response

text
Your Scottfree Sports account is Premium with a 200,000 request monthly limit.
You have 200,000 requests remaining in the current usage window.

Today's MLB slate has 16 games. I pulled the daily model brief, individual model
predictions, current odds, summary history, and line-movement fields.

Here are two model-pick examples.

St. Louis Cardinals at Cincinnati Reds, 12:10 PM ET
- Market: Over/Under 9.5
- ML model pick: Under 9.5
- Blend over probability: 44.7%
- Market-implied over probability: 50.0%
- Delta(Model - Implied): -5.3 percentage points
- Independent model count: 1 of 6 above implied, 5 of 6 below implied
- Line movement: compare open_over_under to over_under from the prediction row.

Interpretation: the model set is lower than the market on the over side, so the
model pick is under. Before betting it, I would also check whether the total has
already moved, whether weather matters, and whether recent over/under model
performance supports this market.

Washington Nationals at Atlanta Braves, 3:10 PM ET
- Market: Over/Under 9.0
- ML model pick: Over 9.0
- Blend over probability: 53.2%
- Market-implied over probability: 48.7%
- Delta(Model - Implied): +4.5 percentage points
- Independent model count: 4 of 6 above implied, 2 of 6 below implied
- Line movement: compare open_over_under to over_under from the prediction row.

Interpretation: the model set is higher than the market on the over side, so the
model pick is over. I would pair this with current odds, public consensus,
weather, and recent model-summary results before deciding whether to bet it.

The important distinction: these are ML model picks and research signals. They
are not guaranteed profitable bets or Kelly-sized recommendations.

CLI Equivalent

A terminal user can run the same workflow directly:

bash
sfs account info
sfs account usage

sfs brief get mlb
sfs predictions get mlb over_under
sfs predictions get mlb spread
sfs predictions get mlb ml

sfs summary get mlb over_under
sfs results get mlb over_under --limit 100
sfs odds get mlb
sfs consensus get mlb
sfs weather get mlb
sfs markets compare mlb

For line movement, use JSON output and inspect opener/current fields:

bash
sfs predictions get mlb over_under -o json
sfs predictions get mlb spread -o json
sfs predictions get mlb ml -o json

For full results JSON with opener/current fields, call the REST endpoint directly:

bash
curl -H "X-API-Key: $SFS_API_KEY" \
  "https://sports-api.scottfreellc.com/api/v1/results/mlb/won_on_spread?limit=100"

Relevant fields include:

  • open_over_under and over_under
  • open_home_point_spread and home_point_spread
  • open_home_money_line and home_money_line
  • open_away_money_line and away_money_line

Good Premium Questions

text
What are today's MLB model picks ranked by Delta(Model - Implied), and which
ones also have favorable line movement?
text
For Yankees/Red Sox, gather the model pick, current odds, opener-to-current line
movement, public consensus, weather, injuries, and recent model performance.
text
Which NBA spread games have the strongest model disagreement with the market,
and how has that model performed over the last 4 weeks?
text
Compare the moneyline model to Kalshi and Polymarket for tonight's biggest NHL
games.
text
How much of my monthly API quota have I used?

Guardrails

The assistant can say:

  • "The ML model pick is over, under, home, or away."
  • "The pick comes from the selected model, blend probability, or model-vs-implied delta."
  • "The model probability is above or below the market-implied probability."
  • "The line moved from opener to current in this direction."
  • "The public consensus, weather, injuries, and model summary support or weaken the case."
  • "This is the information I would review before deciding whether to bet."

The assistant should not say:

  • "This is a lock."
  • "This is guaranteed value."
  • "Scottfree guarantees this play."
  • "Kelly size is..."
  • "This is a validated positive-EV bet."
  • "This system is proven profitable."

Sports model data and research tools