| search_playersA | Find a player's canonical person_code from a partial or misspelled name. Call this FIRST whenever the user names a player. Every other player tool takes a
person_code, not a name. Matching is case-insensitive and substring-based, so
"doncic", "Luka", and "DONCIC, LUKA" all work.
Args:
name: any part of the player's name.
season: optional season code such as "E2025" to restrict to players active then.
limit: maximum results, default 10.
|
| search_teamsA | Find a club's canonical team_code from a partial name. Clubs are renamed by sponsors between seasons ("Kosner Baskonia" vs "Baskonia"), so
match against both the seasonal name and the permanent club name.
Args:
name: any part of the club name, e.g. "zalgiris", "real", "efes".
season: optional season code such as "E2025".
|
| get_player_statsA | Season stats for one player: traditional totals plus true shooting, eFG and usage. Requires a person_code from search_players. Returns one row per season the player
appears in, so omit `season` to get a career view.
Args:
person_code: canonical id from search_players, e.g. "006590".
season: optional season code such as "E2025".
per_mode: "total", "per_game", or "per_36". Rate stats (true_shooting_pct,
efg_pct, usage_pct) are identical in all three modes.
|
| get_team_statsA | Team season statistics including offensive/defensive rating and the Four Factors. Four Factors are returned for the team and for its opponents, which is what makes them
interpretable: a good `tov_pct` is low, a good `opp_tov_pct` is high.
Args:
team_code: canonical code from search_teams, e.g. "MAD", "ZAL".
season: optional season code such as "E2025".
|
| get_game_boxscoreA | Full boxscore for one game: final score, both team totals, and every player line. Args:
season: season code such as "E2025".
game_code: the game's numeric code within that season.
|
| get_shot_chartA | Shot-zone breakdown, optionally with raw x/y coordinates. Shot data exists from the 2007 season onward only; earlier seasons have boxscores but
no coordinates. Zone letters are upstream's own coding and the human-readable names
are provisional -- see the data-quality resource.
Args:
season: season code such as "E2025".
person_code: optional player id from search_players.
team_code: optional club code from search_teams.
include_raw: also return individual shots with coordinates. Capped at 500 rows.
|
| run_sqlA | Run a read-only SQL SELECT against the warehouse. Use this for any question the other tools cannot answer.
Read the `euroleague://schema` resource first to see table and column names.
Only a single SELECT or WITH statement is permitted. The connection is read-only,
results are capped, and queries are cancelled after 15 seconds.
Args:
sql: a single SELECT (or WITH ... SELECT) statement.
limit: maximum rows to return, capped at 500.
|
| get_draft_boardA | Rank players for a BasketNews Fantasy DRAFT by value over replacement. Use this for "who should I pick", "best available guard", or any draft ordering
question. Do NOT rank by points per game for a draft: every manager gets a unique
roster, so what matters is how much better a player is than the next player at the
SAME position who will still be available. That is `vorp_per_game`, and it is the
correct sort order.
Scoring is the BasketNews modern system, recomputed exactly from boxscores.
Fields worth reasoning about:
vorp_per_game - value over replacement. The draft ranking.
modern_per_game - raw fantasy average.
modern_floor_p25 - bad-night floor. Matters more in a draft than in a budget
league, because you keep the pick all season.
consistency_ratio - mean divided by standard deviation. Higher is steadier.
replacement_level - what is still gettable at this position late in the draft.
Args:
season: season code, e.g. "E2025".
teams: managers in the league, 3-12. This changes replacement level and therefore
the ranking, so ask the user if it is unknown. BasketNews recommends 7-8.
roster_size: players per roster. BasketNews draft mode is 13.
position: optional filter, "Guard", "Forward" or "Center".
min_games: exclude players below this many appearances.
limit: rows to return.
|
| get_player_fantasy_logA | Game-by-game fantasy points for one player, for judging form and reliability. A season average hides the thing that decides drafts: whether a player's role changed.
Someone averaging 20 who went 8, 9, 10, then 35, 38, 40 is a different asset from
someone who scored 20 every night. Read the sequence, not only the mean.
Args:
person_code: canonical id from search_players.
season: season code, e.g. "E2025".
last_n: return only the most recent N games. 0 returns the whole season.
|
| compare_draft_candidatesA | Compare named players side by side for a draft pick decision. Use when the user is choosing between specific players ("Vezenkov or Milutinov?").
Resolve names to person_codes with search_players first.
Args:
person_codes: two or more canonical ids.
season: season code, e.g. "E2025".
teams: managers in the league, used to set replacement level.
|
| plan_snake_draftA | Work out which overall picks you own and who should be there when your turn comes. Use this when the user knows their draft slot and wants a plan ("I pick 3rd of 8,
what should I target?").
Snake order: odd rounds run 1..N, even rounds run N..1, so a late slot gets a fast
turnaround between picks and an early slot waits. BasketNews also offers a reverse
snake, where rounds 1 and 2 are the normal snake and the direction then repeats in
pairs; set reverse_snake for that.
`likely_available` assumes every manager drafts strictly off this board, which nobody
does. Treat it as the centre of a distribution, not a prediction. Its real use is
spotting where a positional tier runs out between two of your picks -- that is the
signal worth acting on.
Args:
pick_slot: your position in round one, 1 to `teams`.
season: season code, e.g. "E2025".
teams: managers in the league.
rounds: roster size. BasketNews draft mode is 13.
reverse_snake: use BasketNews reverse-snake order instead of standard snake.
scoring: "classic" or "modern". BasketNews leagues choose one; ask the user.
|
| get_coach_rotationA | How a coach distributes minutes. Use this to judge a player's minutes ceiling. Rotation depth is the strongest lever on fantasy output that is not the player
himself: the same player scores more under a coach who plays nine men heavy minutes
than under one who rides seven. Rotation habits travel with the coach between clubs,
so this is keyed on the coach, not the team.
`rotation_style` is a tercile RELATIVE TO THIS COMPETITION, not an absolute standard.
Coaches with fewer than 10 games are labelled `insufficient_data` rather than guessed
at. `minute_concentration` is a Herfindahl index of minute shares: higher means
minutes are concentrated in fewer players.
Args:
season: season code, e.g. "E2025".
team_code: optional club code from search_teams.
coach_name: optional partial coach name.
|
| get_role_outlookA | What minutes and production a club has vacated, by position, plus who remains. This is the tool for "how will player X do at his new club" and for drafting anyone
without history in this competition.
Be honest about what this can and cannot do. If a player arrives from the NBA or a
domestic league, this warehouse holds ZERO rows for him and no projection is possible
from it. What IS knowable is the role he is walking into: the minutes and fantasy
production the club lost at his position, and how stable the surviving players' minutes
are. State the vacated role, state that the player's own level is an input you do not
have, and let the user supply it. Do not invent a projection.
Returned per position: vacated minutes and fantasy points per game from players whose
roster spell has ended, alongside the remaining players' minute stability.
Args:
team_code: club code from search_teams.
season: season code, e.g. "E2025".
|