Schedules, scores, odds, splits & explainable AI bet confidence — 8+ sports, free instant key.
ai.lumify/sports-intelligence MCP Server
This MCP server provides Model Context Protocol integration for Lumify, an agent-ready sports-intelligence API. It supports real-time sports data including schedules, live scores, odds, line movement, public betting splits, and explainable AI bet confidence. Coverage is listed as 8+ sports. The server reports 18 tools and includes related topics such as MCP and odds APIs.
🛠️ Key Features
Real-time schedules
Live scores
Odds and line movement
Public betting splits
Explainable AI bet confidence
Supports 8+ sports
🚀 Use Cases
Fetch schedules and live scores
Retrieve odds and observe line movement
Use betting splits and explainable confidence outputs in applications
⚡ Developer Benefits
MCP integration for Lumify
18 tools available through the server
Topics indicate support for sports-api and odds-api workflows
⚠️ Limitations
Documented scope is “8+ sports” (no further breakdown provided)
Topics
mcpmodel-context-protocolsports-apiodds-api
Captured live from the server via tools/list.
list_sports
List supported sports with their leagues and current season. Returns each sport's id, slug, name, team-sport flag, and its leagues (each with its current_season). Use list_seasons with current_only=false for historical seasons.
Parameters1
active_only
boolean
optional
When true (default), omit sports with no active coverage.
Raw schema
{
"type": "object",
"properties": {
"active_only": {
"type": "boolean",
"default": true,
"description": "When true (default), omit sports with no active coverage."
}
}
}
list_events
List events (schedules and live scores), paginated by id (after_id). Filter by sport, league, status, date range, season, or team_id (resolve teams via list_teams / get_team). Returns event id, name, sport/league, start time, status, and venue for each; pass include_scores to also inline participants + scores (intended for small result sets — use get_event for one event's full detail, or query_events for free-text/natural-language filters instead of structured params).
Parameters13
sport
string
optional
Sport slug, e.g. mlb, nfl, tennis, soccer.
league
string
optional
League slug, e.g. nfl, atp, fifa_world_cup.
status
string
optional
Filter to events in this status.
date
string
optional
UTC date YYYY-MM-DD (single day).
from
string
optional
UTC start date YYYY-MM-DD.
to
string
optional
UTC end date YYYY-MM-DD (inclusive).
season_id
integer
optional
Filter by season ID (from list_seasons).
team_id
integer
optional
Filter to events where this team participates. Resolve ids via list_teams.
limit
integer
optional
Max events to return per page.
after_id
integer
optional
Cursor: return events with id > after_id (from the previous page's next_after_id).
include_scores
boolean
optional
Inline participants + scores in each event (intended for small result sets).
has_recommend
boolean
optional
When true, only events with at least one recommended bet.
sort
string
optional
Sort order. sort=status is incompatible with after_id.
Raw schema
{
"type": "object",
"properties": {
"sport": {
"type": "string",
"description": "Sport slug, e.g. mlb, nfl, tennis, soccer."
},
"league": {
"type": "string",
"description": "League slug, e.g. nfl, atp, fifa_world_cup."
},
"status": {
"type": "string",
"enum": [
"scheduled",
"inprogress",
"final",
"postponed",
"cancelled",
"suspended",
"delayed",
"walkover"
],
"description": "Filter to events in this status."
},
"date": {
"type": "string",
"description": "UTC date YYYY-MM-DD (single day)."
},
"from": {
"type": "string",
"description": "UTC start date YYYY-MM-DD."
},
"to": {
"type": "string",
"description": "UTC end date YYYY-MM-DD (inclusive)."
},
"season_id": {
"type": "integer",
"description": "Filter by season ID (from list_seasons)."
},
"team_id": {
"type": "integer",
"description": "Filter to events where this team participates. Resolve ids via list_teams."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Max events to return per page."
},
"after_id": {
"type": "integer",
"description": "Cursor: return events with id > after_id (from the previous page's next_after_id)."
},
"include_scores": {
"type": "boolean",
"default": false,
"description": "Inline participants + scores in each event (intended for small result sets)."
},
"has_recommend": {
"type": "boolean",
"description": "When true, only events with at least one recommended bet."
},
"sort": {
"type": "string",
"enum": [
"time",
"status"
],
"default": "time",
"description": "Sort order. sort=status is incompatible with after_id."
}
}
}
get_event
Get a single event with participants and venue. Optionally inline current odds and/or bet intelligence (+1 credit each, only charged when that data is actually available). Raises a not-found error if event_id doesn't exist. Use list_events / query_events to discover ids first, or batch_get_events to fetch several ids in one call.
Parameters4
event_id
integer
required
Event id, from list_events, query_events, or search results.
include_odds
boolean
optional
Inline current odds scoped by bookmaker (default: pinnacle). +1 credit for a single book when available; +2 for bookmaker=all or a comma-separated list.
include_intelligence
boolean
optional
Inline bet intelligence (+1 credit when available).
bookmaker
string
optional
Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all.
Raw schema
{
"type": "object",
"properties": {
"event_id": {
"type": "integer",
"description": "Event id, from list_events, query_events, or search results."
},
"include_odds": {
"type": "boolean",
"default": false,
"description": "Inline current odds scoped by bookmaker (default: pinnacle). +1 credit for a single book when available; +2 for bookmaker=all or a comma-separated list."
},
"include_intelligence": {
"type": "boolean",
"default": false,
"description": "Inline bet intelligence (+1 credit when available)."
},
"bookmaker": {
"type": "string",
"description": "Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all."
}
},
"required": [
"event_id"
]
}
batch_get_events
Get multiple events by id in one call — for agents that already have a list of ids and want full detail for each without one call per event. Max 25 ids. Returns full detail for every id that exists plus a not_found list for any that don't (never billed). Use get_event for a single id, or list_events / query_events to discover ids first.
Parameters4
event_ids
array
required
Event ids to fetch (max 25); duplicates are billed once.
include_odds
boolean
optional
Inline current odds scoped by bookmaker (default: pinnacle). +1 credit per event for a single book when available; +2 for bookmaker=all or a comma-separated list.
include_intelligence
boolean
optional
Inline bet intelligence on each event (+1 credit per event when available).
bookmaker
string
optional
Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all.
Raw schema
{
"type": "object",
"properties": {
"event_ids": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 25,
"description": "Event ids to fetch (max 25); duplicates are billed once."
},
"include_odds": {
"type": "boolean",
"default": false,
"description": "Inline current odds scoped by bookmaker (default: pinnacle). +1 credit per event for a single book when available; +2 for bookmaker=all or a comma-separated list."
},
"include_intelligence": {
"type": "boolean",
"default": false,
"description": "Inline bet intelligence on each event (+1 credit per event when available)."
},
"bookmaker": {
"type": "string",
"description": "Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all."
}
},
"required": [
"event_ids"
]
}
query_events
Search events with a natural-language query instead of structured filters — e.g. 'live nfl games today' or 'college basketball this week'. Rule-based (not an LLM): recognizes sport (nfl/nba/mlb/nhl/tennis/soccer/ncaaf/ncaab + aliases like hockey, american football, college basketball), status (live/final/upcoming/…), dates (today/tomorrow, this week, next N days, YYYY-MM-DD ranges). Bare 'football' is ambiguous and left unrecognized. Response includes interpreted filters, equivalent REST call, and unrecognized_terms. Prefer list_events when you already know the structured filters you want.
Parameters2
query
string
required
Free text, e.g. 'live nfl games today'.
limit
integer
optional
Overrides any limit parsed from the query text. Max 100.
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Free text, e.g. 'live nfl games today'."
},
"limit": {
"type": "integer",
"description": "Overrides any limit parsed from the query text. Max 100."
}
},
"required": [
"query"
]
}
get_live_score
Get a lightweight live score snapshot for an event: status, period, clock, per-participant score and period-by-period scores, and last-updated time. Cheaper and faster than get_event when you only need the score, not participants or venue. Raises a not-found error if event_id doesn't exist.
Parameters1
event_id
integer
required
Event id, from list_events, query_events, or search results.
Get current betting odds for an event: per-bookmaker lines and last-updated time. bookmaker defaults to pinnacle (1 credit). Use 'all' or a comma-separated list for multiple books (2 credits). Returns available:false with no charge if odds aren't posted for this event yet. Use get_odds_history for line movement over time.
Parameters2
event_id
integer
required
Event id, from list_events, query_events, or search results.
bookmaker
string
optional
Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all, or a comma-separated list.
Raw schema
{
"type": "object",
"properties": {
"event_id": {
"type": "integer",
"description": "Event id, from list_events, query_events, or search results."
},
"bookmaker": {
"type": "string",
"description": "Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all, or a comma-separated list."
}
},
"required": [
"event_id"
]
}
get_odds_history
Get line-movement history for an event: a list of past odds snapshots (movements), each with its own timestamp, up to limit entries. bookmaker defaults to pinnacle. Use get_odds instead if you only need the current line.
Parameters3
event_id
integer
required
Event id, from list_events, query_events, or search results.
bookmaker
string
optional
Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all, or a comma-separated list.
limit
integer
optional
Max line-movement entries to return. Default 50.
Raw schema
{
"type": "object",
"properties": {
"event_id": {
"type": "integer",
"description": "Event id, from list_events, query_events, or search results."
},
"bookmaker": {
"type": "string",
"description": "Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all, or a comma-separated list."
},
"limit": {
"type": "integer",
"default": 50,
"description": "Max line-movement entries to return. Default 50."
}
},
"required": [
"event_id"
]
}
get_stats
Get raw, deterministic team/player and match statistics for a soccer, MLB, or tennis event — no market/odds data (use get_odds for that) and no scoring, weighting, confidence, or narrative attached; use get_intelligence for Lumify's judgment layer. The payload shape is sport-specific — soccer/MLB use teams.home/away; tennis uses players.player_1/player_2 + match.scoreboard; never share field names across sports. Soccer: team strength (league-table PPG or FIFA rank), recent form, head-to-head history, rest days, home/away splits, and boxscore rates (shots/SoT for & against, possession, corners, cards, save rate) over explicit windows rates_l5/rates_season. MLB: season-to-date W/L record + run differential, recent form (runs scored/allowed), H2H, rest days, team batting/pitching rates (rates_l5/rates_season), starting pitcher's own season ERA/WHIP/K9/BB9, and lineup from completed-game box scores. Tennis (singles only, Stage-1 DB-only): match context (surface/tier/round/court), rankings, set scoreboard, rest days, recent/surface form and tour lookback record from FlashLive history, and H2H — no serve/return career rates yet. Returns available:false with no charge if participants haven't resolved (or tennis draw_type is not singles).
Parameters1
event_id
integer
required
Event id, from list_events, query_events, or search results.
Get public betting splits (bets% and handle%) for an event: a consensus split plus a per-book breakdown, with a captured_at timestamp. Available for MLB, NBA, NHL, and NFL. Not available for tennis, soccer, or NCAAF (upstream does not expose splits). Returns available:false with no charge if splits haven't been captured for this event yet or the sport is unsupported.
Parameters1
event_id
integer
required
Event id, from list_events, query_events, or search results.
Get AI bet intelligence for an event. bets[] comes in two shapes — branch on the presence of probability (probability model) vs. confidence_score (points model). Probability model (MLS soccer and MLB): bets carry probability/interval/p_model/p_market/blend_w/fair_price/edge/sufficiency/phase/model_version/drivers plus Price surface fair/edges_by_book/best — and no confidence_score, coverage, signals, or validator. probability is calibrated and sums to 1 across a market's outcomes; p_market is the de-vigged market price. Where no fitted model has cleared out-of-sample validation, blend_w is 0, probability equals p_market, and p_model/edge/tier are null — treat as fair-price reference, not picks. Read edges_by_book/best for cross-book line-shopping against sharp fair (MLS: Pinnacle + FanDuel/Hard Rock; MLB: Pinnacle/Circa + Owls retail soft books). Price gap ≠ EV; on MLB best_* is Tier C informational (Edge allowlist remains DK/FD). Points model (other sports/leagues): confidence scores, signal breakdowns, rationale, and narratives per bet. Signal keys are shared across sports but mean different things per sport — for NFL, NCAAF, and points-model soccer, bets[].signals._labels maps each present signal_* key to its sport-specific label. Both shapes include event-level analyst_take and match_overview. Match-level tokens (OVER, UNDER, ML_DRAW) have null player_role/player_id/team_id/player_name. bookmaker defaults to pinnacle and is a no-op for probability-model sports. Returns available:false with no charge if intelligence hasn't been computed yet for this event/bookmaker.
Parameters2
event_id
integer
required
Event id, from list_events, query_events, or search results.
bookmaker
string
optional
Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for probability-model sports (MLS soccer and MLB), which report the book their assessment was priced against.
Raw schema
{
"type": "object",
"properties": {
"event_id": {
"type": "integer",
"description": "Event id, from list_events, query_events, or search results."
},
"bookmaker": {
"type": "string",
"description": "Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for probability-model sports (MLS soccer and MLB), which report the book their assessment was priced against."
}
},
"required": [
"event_id"
]
}
list_teams
List teams, paginated by id (after_id). Filter by sport, league, conference, division, country, active status, or name (q, partial match). Returns each team's id, slug, name, city, conference/division, and venue. Use get_team for full detail on one id once resolved here.
Parameters9
sport
string
optional
Sport slug, e.g. nfl, nba, soccer.
league
string
optional
League slug, e.g. nfl, mls.
conference
string
optional
Conference name, e.g. AFC, Eastern.
division
string
optional
Division name, e.g. AFC East.
country
string
optional
ISO country code, e.g. USA.
active
boolean
optional
Filter by active status.
q
string
optional
Team name search (partial match).
limit
integer
optional
Max teams to return per page.
after_id
integer
optional
Cursor: last team id from the previous page's next_after_id.
Raw schema
{
"type": "object",
"properties": {
"sport": {
"type": "string",
"description": "Sport slug, e.g. nfl, nba, soccer."
},
"league": {
"type": "string",
"description": "League slug, e.g. nfl, mls."
},
"conference": {
"type": "string",
"description": "Conference name, e.g. AFC, Eastern."
},
"division": {
"type": "string",
"description": "Division name, e.g. AFC East."
},
"country": {
"type": "string",
"description": "ISO country code, e.g. USA."
},
"active": {
"type": "boolean",
"description": "Filter by active status."
},
"q": {
"type": "string",
"description": "Team name search (partial match)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Max teams to return per page."
},
"after_id": {
"type": "integer",
"description": "Cursor: last team id from the previous page's next_after_id."
}
}
}
search_players
Search players by name, sport, country, ranking, or active status, paginated by id (after_id). Returns each player's id, name, position, current team, and tennis ranking if applicable. Use get_player for full detail on one id, or get_player_events for a player's schedule/results.
Parameters7
q
string
optional
Name search (partial match).
sport
string
optional
Sport slug, e.g. tennis, nba.
country
string
optional
ISO 3166-1 alpha-3 country code, e.g. USA.
active
boolean
optional
Filter by active status.
ranked
boolean
optional
If true, only players with a tennis ranking.
limit
integer
optional
Max players to return per page.
after_id
integer
optional
Cursor: last player id from the previous page's next_after_id.
Raw schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Name search (partial match)."
},
"sport": {
"type": "string",
"description": "Sport slug, e.g. tennis, nba."
},
"country": {
"type": "string",
"description": "ISO 3166-1 alpha-3 country code, e.g. USA."
},
"active": {
"type": "boolean",
"description": "Filter by active status."
},
"ranked": {
"type": "boolean",
"description": "If true, only players with a tennis ranking."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Max players to return per page."
},
"after_id": {
"type": "integer",
"description": "Cursor: last player id from the previous page's next_after_id."
}
}
}
get_team
Get a single team profile with its home venue. Raises a not-found error if team_id doesn't exist. Resolve ids via list_teams.
Get a single player profile: name, sport, country, position/handedness, physical stats, current team, and tennis ranking if applicable. Raises a not-found error if player_id doesn't exist. Resolve ids via search_players.
List a player's events (schedule/results), paginated by id (after_id). Defaults to ±30 days around today when no date filter is given. Resolve player_id via search_players first.
Parameters6
player_id
integer
required
Player id, from search_players.
status
string
optional
Filter to events in this status.
from
string
optional
Start date YYYY-MM-DD.
to
string
optional
End date YYYY-MM-DD.
limit
integer
optional
Max events to return per page.
after_id
integer
optional
Cursor: last event id from the previous page's next_after_id.
Raw schema
{
"type": "object",
"properties": {
"player_id": {
"type": "integer",
"description": "Player id, from search_players."
},
"status": {
"type": "string",
"enum": [
"scheduled",
"inprogress",
"final",
"postponed",
"cancelled",
"suspended",
"delayed",
"walkover"
],
"description": "Filter to events in this status."
},
"from": {
"type": "string",
"description": "Start date YYYY-MM-DD."
},
"to": {
"type": "string",
"description": "End date YYYY-MM-DD."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Max events to return per page."
},
"after_id": {
"type": "integer",
"description": "Cursor: last event id from the previous page's next_after_id."
}
},
"required": [
"player_id"
]
}
list_seasons
List seasons per sport/league. By default returns only currently active seasons; pass current_only=false to include historical seasons. Optionally filter by sport. Returns each season's id, year, phase, start/end dates, and whether it is_current. Use list_sports for just each sport's current season.
Parameters2
sport
string
optional
Filter by sport slug, e.g. nhl, nba, soccer.
current_only
boolean
optional
Return only currently active seasons (default true). Pass false for historical seasons.
Raw schema
{
"type": "object",
"properties": {
"sport": {
"type": "string",
"description": "Filter by sport slug, e.g. nhl, nba, soccer."
},
"current_only": {
"type": "boolean",
"default": true,
"description": "Return only currently active seasons (default true). Pass false for historical seasons."
}
}
}
estimate_cost
Estimate the credit cost of one or more planned tool calls before making them — no credits are spent. Costs are data-dependent (e.g. odds/intelligence/splits not yet ingested for an event are free, and batch_get_events ids that don't exist cost nothing), so this returns a [min_credits, max_credits] range per call rather than a single number. Pass the exact tool name and arguments you're considering, e.g. {"tool": "get_event", "arguments": {"event_id": 123, "include_odds": true}}.
Official client libraries and Model Context Protocol
(MCP) integration for Lumify, the agent-ready
sports-intelligence API: real-time schedules, live scores, odds, line movement,
public betting splits, and explainable AI bet confidence across MLB, NFL,
NCAAF, NCAAB, NBA, NHL, tennis, and soccer (MLS, EPL, La Liga,
Serie A, Bundesliga, Ligue 1, and UEFA Champions League).
This repository is the public home for the client SDKs, the MCP stdio
bridge, and developer docs/examples. Lumify itself is a hosted API at
https://lumify.ai — you don't run a server yourself.
Get an API key
Everything here authenticates with a Lumify API key (lmfy-...).
Fastest — no signup: grab a free instant trial key at
https://lumify.ai/docs/ai (click "Get instant trial key"). No account,
email, or credit card — 100 credits, 14-day expiry. Paste it and start calling.
Persistent account: create a key at https://lumify.ai/api-keys —
free trial with 1,000 credits, no credit card required.