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 infoandsfs account usageshowed Premium access and 200,000 monthly requests.sfs predictions list-sportslisted all 6 sports.sfs brief get mlb -o jsonreturned 16 games and 31 model-market entries.sfs predictions get mlb over_under|spread|ml -o jsonreturned 16 games for each market.sfs summary get mlb ml,sfs results get mlb ml --limit 10, andsfs odds get mlbcompleted 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, andget_playersrequire a BALLDONTLIE key.get_injuriesrequires 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.
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 area | CLI command | MCP tool | What it helps answer |
|---|---|---|---|
| Account and quota | sfs account info, sfs account usage | get_account_info, get_usage | Is my subscription active and how much quota remains? |
| Sports and markets | sfs predictions list-sports | get_sports | Which sports and model types are available? |
| Daily model picks | sfs brief get mlb | get_daily_brief | What does the model slate like today? |
| Per-model predictions | sfs predictions get mlb ml | get_predictions | What does each model say for this game and market? |
| Line movement | sfs predictions get mlb spread -o json; use REST for full results JSON | get_predictions, get_results | How did the line move from opener to current or final? |
| Model performance | sfs summary get mlb ml, sfs results get mlb ml | get_summary, get_results | Which models have been accurate recently and historically? |
| Current odds | sfs odds get mlb | get_odds | What are the current lines and prices? |
| Public betting | sfs consensus get mlb | get_betting_consensus | Where is the public leaning? |
| Weather | sfs weather get mlb | get_game_weather | Are outdoor conditions relevant? |
| Live scores | sfs scores scores mlb | get_live_scores | What is happening now or what happened today? |
| Injuries and rosters | sfs scores injuries nba, sfs scores players nba | get_injuries, get_players | Who is out and who is available? |
| Prediction markets | sfs markets kalshi nfl, sfs markets polymarket nba, sfs markets compare nba | get_kalshi_markets, get_polymarket_odds, compare_market_odds | Do 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
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
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
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:
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:
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:
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_underandover_underopen_home_point_spreadandhome_point_spreadopen_home_money_lineandhome_money_lineopen_away_money_lineandaway_money_line
Good Premium Questions
What are today's MLB model picks ranked by Delta(Model - Implied), and which
ones also have favorable line movement?
For Yankees/Red Sox, gather the model pick, current odds, opener-to-current line
movement, public consensus, weather, injuries, and recent model performance.
Which NBA spread games have the strongest model disagreement with the market,
and how has that model performed over the last 4 weeks?
Compare the moneyline model to Kalshi and Polymarket for tonight's biggest NHL
games.
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 Docs