Skip to main content
Glama
McNews11

euroleague-open-data

by McNews11

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
EUROLEAGUE_DBYesPath to the DuckDB database file containing the EuroLeague data warehouse.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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".

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
schemaDDL for every table in the warehouse. Read this before writing SQL with run_sql.
coverageWhich seasons and competitions are loaded, and how complete each game is.
data_qualityThe most recent validation report: which reconciliation checks passed and failed.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/McNews11/euroleague-open-data'

If you have feedback or need assistance with the MCP directory API, please join our Discord server