euroleague-open-data
This server provides natural-language access to a EuroLeague/EuroCup basketball data warehouse, enabling player/team search, advanced stats, fantasy draft tools, game/shot analysis, and ad‑hoc SQL queries.
Player Lookup & Stats
search_players– fuzzy name search to get canonical IDs.get_player_stats– season/career totals, per-game, per‑36, true shooting%, eFG%, usage%.get_player_fantasy_log– game‑by‑game fantasy points to assess form and role changes.get_shot_chart– shot‑zone aggregates, with optional raw x/y coordinates (from 2007 on).
Team Stats & Game Data
search_teams– partial name/sponsor-rename search for team IDs.get_team_stats– offensive/defensive ratings and Four Factors.get_game_boxscore– full boxscore with completeness flags.
Coaching & Roster Analysis
get_coach_rotation– minute distribution and rotation depth.get_role_outlook– vacated minutes/production by position.get_transfers– announced squad changes.get_squad_outlook– club’s coming‑season view with minutes freed/claimed.
Fantasy Draft Tools
get_draft_board– ranks by value over replacement, tailored to league settings.plan_snake_draft– plans picks based on your slot and draft order.compare_draft_candidates– head‑to‑head comparison for a pick decision.
Advanced & Escape Hatch
run_sql– read‑only SELECT queries against the DuckDB warehouse for any unanticipated question.Resources (
euroleague://schema,coverage,data-quality) – understand data completeness and known limitations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@euroleague-open-dataWho had the best true shooting percentage in EuroLeague last season, minimum 20 games?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
euroleague-open-data
An open EuroLeague / EuroCup basketball data warehouse, and an MCP server that lets an LLM query it in natural language.
Unofficial. Not affiliated with, endorsed by, or approved by Euroleague Basketball. Data originates from Euroleague Basketball and is retrieved from publicly accessible endpoints. For research and educational use. See DISCLAIMER.md.
Why this exists
The upstream EuroLeague API is undocumented, unversioned, and rate-limited at roughly 10 requests per minute by Cloudflare. That makes it unusable for interactive analysis: three questions in a row from one user would black out everyone else for five minutes.
So this project inverts the problem. A slow, polite, resumable crawler pulls the data into a local DuckDB warehouse once. Everything else — the MCP server, the Parquet exports — reads that snapshot.
The MCP server never contacts upstream. It holds no HTTP client. No amount of traffic to this project can generate load on Euroleague Basketball's infrastructure.
Related MCP server: College Basketball Stats MCP Server
Status
Four seasons loaded: EuroLeague E2024 and E2025, EuroCup U2024 and U2025. Plus the announced 2026-27 EuroLeague squads, so the draft tools work before a game has been played.
Component | State |
Throttled crawler with permanent cache | working |
DuckDB warehouse, 8 base tables | working |
Validation suite, 8 reconciliation checks | working |
Derived analytics (TS%, eFG%, usage, Four Factors, shot zones) | working |
MCP server, stdio transport, 15 tools + 3 resources | working |
HTTP transport + landing page, Docker image build-tested | working |
Public deployment on Render (free instance, sleeps when idle) | live |
Full backfill (52 seasons, 12 122 games) | not started, ~50h of crawling |
Dataset publishing to GitHub Releases / HuggingFace | not started |
Quick start
Requires uv and Python 3.12+.
git clone https://github.com/McNews11/euroleague-open-data && cd euroleague-open-data
uv sync --extra etl--extra etl pulls in the crawler's dependencies. Plain uv sync installs only what is
needed to serve an existing warehouse, which is what the deployed image does — it keeps
polars, pyarrow and httpx out of the container and halves its size.
Build the warehouse. The crawl is deliberately slow — about two hours for one season — and it is safe to interrupt and rerun, because every response is cached permanently.
uv run euroleague-etl --season E2025Already have the cache and only changed the schema? Skip the network entirely:
uv run euroleague-etl --season E2025 --skip-crawlConnect it to Claude
Claude Code
claude mcp add euroleague --env EUROLEAGUE_DB=$PWD/data/euroleague.duckdb -- $PWD/.venv/bin/python -m euroleague_open_data.mcp_serverRemote, for sharing with other people
A hosted deployment serves the same tools over HTTPS, so anyone can connect by URL with nothing installed — and it is the only way to use this from ChatGPT, which cannot run local MCP servers.
claude mcp add --transport http euroleague https://euroleague-open-data.onrender.com/mcpIt runs on a free instance that sleeps after 15 minutes idle, so the first request after a
quiet spell takes about a minute. Everything after it is fast. To host your own, see
docs/DEPLOY.md — the landing page at / fills in whatever hostname it
is served from, so a fork needs no edit.
Note that ChatGPT custom connectors require a paid plan (Plus, Pro, Business, Enterprise or Edu) with Developer mode enabled. Claude Code and Claude Desktop work on any plan.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"euroleague": {
"command": "/absolute/path/to/euroleague-open-data/.venv/bin/python",
"args": ["-m", "euroleague_open_data.mcp_server"],
"env": {
"EUROLEAGUE_DB": "/absolute/path/to/euroleague-open-data/data/euroleague.duckdb"
}
}
}
}Things to ask it
Who had the best true shooting percentage in EuroLeague last season, minimum 20 games?
Compare Vezenkov and Nwora on efficiency and usage.
Which team had the best defensive rating, and which Four Factor drove it?
Show me Micic's shot chart by zone.
Which games are unreliable for lineup analysis?
Who changed clubs this summer, and which of them scored well last season?That last one matters. The warehouse tracks its own completeness, so the model can say "this game has no shot data" instead of inventing a number.
Fantasy drafting
Built for BasketNews Fantasy draft mode: private leagues of 3–12 managers, 13-player rosters, unique squads, snake or reverse-snake order.
Fantasy points are recomputed exactly from boxscores, not estimated. Every term in the modern scoring system maps onto a stored field, so a player's score here is the score the game would award.
Ranking is by value over replacement, not by average. In a draft each manager gets a unique roster, so what decides a pick is how much better a player is than the next one available at the same position — and that depends on league size. An 8-team league and a 12-team league produce different boards from the same data.
uv run python -m euroleague_open_data.fantasy --teams 8 --scoring classicTwo things about scoring are worth knowing before you trust a late-round pick:
The "classic" formula is not published for draft mode, so it was reverse-checked against the live site. Vezenkov, E2025 round 1: PIR 27 in a win scores 29.7 there, and 27 × 1.1 = 29.7 here. The PIR base and the win multiplier are confirmed. The loss multiplier is still inferred — and measured to be immaterial: rebuilding the board with 1.0 instead of 0.9 gives rank correlation 0.9996, an unchanged top 7, and an average move of 1.4 places.
It matters less than it looks. Rank correlation between classic and modern is 0.99 and seven of the top eight are the same players. The disagreement shows up in the middle: one player moves 94th to 61st, which in an 8×13 draft is a different round.
Tools
Tool | Purpose |
| fuzzy name → canonical |
| fuzzy name → canonical |
| season or career, totals / per-game / per-36, plus TS%, eFG%, usage |
| ratings and Four Factors, team and opponent |
| full game detail with completeness flags |
| zone aggregates, optionally raw x/y coordinates |
| read-only DuckDB SELECT — the escape hatch for unanticipated questions |
| draft ranking by value over replacement, sized to your league, adjusted for minute pressure, with EuroCup and NBA arrivals converted and labelled |
| your picks in snake order, and who should survive until each |
| head to head for a specific pick decision |
| game-by-game fantasy points, for form and role changes |
| how deep a coach's rotation runs — the ceiling on minutes |
| minutes and production a club vacated, by position |
| announced 2026-27 squads: who moved, who stayed, who is unsigned |
| a club's coming season: minutes freed, minutes claimed, who has no history |
Resources: euroleague://schema, euroleague://coverage, euroleague://data-quality.
run_sql runs on a read-only connection, permits a single SELECT/WITH, caps rows, and
cancels after 15 seconds.
Correcting what the data cannot know
The API lists who is on a roster. It never says why someone is absent, so a player who
signed in the NBA looks identical to one still negotiating — and the first should not
appear on a draft board at all. data/overrides.csv is where a
human records the difference:
player,status,note
"DIALLO, ALPHA",left_league,signed in the NBA after Monaco left the EuroLeagueuv run euroleague-overridesRows that match no player, or match two, raise rather than being skipped — a correction that silently fails to apply is worse than none, because it looks like it worked.
Data quality
Validation runs as part of every ETL run and writes
docs/data-quality-report.json, which is committed so
regressions show up in git log.
Three findings worth knowing about, all documented in
docs/api-notes.md:
Shot coordinates and play-by-play begin at the 2007 season. Earlier seasons have boxscores only. This is a property of the source, not of this project.
Period buckets and event sequence numbers disagree in roughly 40% of games.
NUMBEROFPLAYis unique and reliable; the per-quarter arrays upstream returns are not. Affected games are flaggedlineup_safe = false.Player identifiers differ across endpoints. Boxscores use
TGB, the live feed usesPTGB. Normalisation is source-aware, and there is a regression test for it.
Coverage
Measured across all 52 seasons on 2026-08-10 (docs/coverage.json):
Segment | Seasons | Games | Boxscore | PBP + shots |
EuroLeague | E2000–E2006 | 1 563 | yes | no |
EuroCup | U2002–U2006 | 896 | yes | no |
Both | 2007–2025 | 9 059 | yes | yes |
Total | 52 | 12 122 |
Development
uv run pytest
uv run ruff check src tests
uv run mypy srcLicence and contact
Code is MIT — see LICENSE. The licence covers the code only. It grants no rights in the underlying match data, which belongs to Euroleague Basketball and its data partners. Commercial use of the data may require a licence from them.
Takedown: if you represent a rights holder and want this changed or removed, open a
GitHub issue titled TAKEDOWN. We will respond within 7 days and will take published
datasets down on request while any disagreement is discussed. No formal legal process is
needed to get our attention.
Prior art
giasemidis/euroleague_api— Python wrapper. The shot-coordinate endpoint used here was reverse-engineered there first.FlavioLeccese92/euroleaguer— R wrapper, useful for cross-checking endpoint coverage.bsamot10/EuroleagueDataETL— existing ETL patterns for this data.vtzimpl/euroleague-api-mcp— an earlier MCP server that proxies the API directly. Given the rate limit measured here, proxying is the thing this project deliberately avoids.
Available Tools
13 toolscompare_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.
| Name | Required | Description | Default |
|---|---|---|---|
| teams | No | ||
| season | No | E2025 | |
| scoring | No | classic | |
| person_codes | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It explains the role of the 'teams' parameter (setting replacement level) and notes that person_codes should be 'two or more,' providing some behavioral detail. However, it does not disclose what the comparison output contains (despite an output schema existing), how it handles missing or invalid codes, or any other side effects. The information given is helpful but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and front-loaded: a one-sentence purpose, a one-sentence usage guideline, and a concise args list. Every sentence adds value with no redundancy. The structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description need not explain return values. It covers the primary purpose, usage context, required parameter, and key optional parameters. The missing explanation of 'scoring' is a minor gap, but overall the description gives an agent enough context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains person_codes, season, and teams: person_codes are 'canonical ids' (two or more), season has an example code, and teams is 'managers in the league, used to set replacement level.' It omits the 'scoring' parameter entirely, leaving it undocumented. Thus, partial semantic coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Compare named players side by side for a draft pick decision.' It specifies the resource (players) and the context (draft pick decision), distinguishing it from siblings like get_player_fantasy_log or plan_snake_draft. The example 'Vezenkov or Milutinov?' further clarifies the intended use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use when the user is choosing between specific players' and provides an example query. It also gives a clear prerequisite: 'Resolve names to person_codes with search_players first.' This directly informs the agent when and how to invoke the tool, including the need to pre-process names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| season | No | E2025 | |
| team_code | No | ||
| coach_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does an excellent job: it explains rotation_style is a relative tercile, coaches with <10 games get insufficient_data, minute_concentration is a Herfindahl index, and data is keyed to the coach. This fully discloses return semantics and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with a clear lead sentence, justification paragraph, and an Args list. It is somewhat verbose but every sentence earns its place by conveying important context or semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description goes beyond by explaining the meaning of key output fields and edge cases. It covers use case, interpretation, and parameter details, making it fully complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description compensates fully with an Args section explaining season format, team_code as an optional club code from search_teams, and coach_name as an optional partial name. This adds meaning far beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool reports how a coach distributes minutes, and frames it as a way to judge a player's minutes ceiling. This distinguishes it from sibling stats tools by focusing on coach-level rotation patterns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the user to use it to judge a player's minutes ceiling and explains why rotation depth matters. It does not explicitly name alternative tools for team-based stats, but the coach-vs-team distinction is clearly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| teams | No | ||
| season | No | E2025 | |
| scoring | No | classic | |
| position | No | ||
| min_games | No | ||
| roster_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It discloses the ranking methodology, the fact that scoring is recomputed from boxscores, and how teams affect replacement level. However, it does not explicitly state that this is a read-only operation, and there is a slight inconsistency regarding the scoring parameter (schema default 'classic' vs. description's 'modern system'), though this may reflect different aspects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for usage, fields, and arguments. It front-loads the core purpose and keeps explanations relevant. Slightly verbose, but each sentence provides useful context for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 7 parameters and an output schema. The description explains the ranking logic and key fields, making it complete enough for most draft-related tasks. It could be improved by explicitly mentioning the scoring parameter's effect and clarifying read-only behavior, but overall it covers the complex domain well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful context for all schema parameters except 'scoring'. It explains the impact of 'teams' on replacement level, what 'roster_size' means, and the fields returned. The omission of the 'scoring' parameter is a gap, especially since the description claims a specific scoring system while the schema allows a different default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Rank players for a BasketNews Fantasy DRAFT by value over replacement.' It clearly distinguishes the tool from siblings like search_players or compare_draft_candidates by focusing on draft ordering, not generic stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use this for...', 'Do NOT rank by points per game for a draft', and explains why via the unique-roster rationale. It also advises asking the user if the teams count is unknown, making the usage boundaries clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| season | Yes | ||
| game_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the output contents (final score, team totals, player lines) and parameter format, which gives a clear picture of the tool's behavior as a read-only retrieval. It does not mention rate limits or authentication, but the nature of a boxscore query makes these less critical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact with a clear front-loaded purpose statement followed by a structured argument list. Every sentence adds value: the first sentence defines the tool's output, and the arguments section clarifies both parameters. No unnecessary verbiage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter tool and the presence of an output schema, the description covers all necessary context: what the tool returns, what each parameter means, and the intended scope ('one game'). The description is complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters. It does so effectively: 'season' is explained with an example format ('E2025'), and 'game_code' is described as 'the game's numeric code within that season.' This adds meaning beyond the schema's bare type definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a 'Full boxscore for one game' and lists specific contents: 'final score, both team totals, and every player line.' This distinguishes it from sibling tools like get_player_stats or get_team_stats, which focus on individual or team aggregates rather than a single game's complete boxscore.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by specifying this is for 'one game,' implying it should be used when a full boxscore for a specific game is needed. It does not explicitly name alternatives or exclusions, but the specificity of the purpose makes usage obvious in context of the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| last_n | No | ||
| season | No | E2025 | |
| person_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the game-by-game granularity, the per-player scope, and the behavior of the last_n parameter. It lacks details like error handling or data source caveats, but for a read-only data retrieval tool, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise front-loaded summary, illustrative example, and clear Args section. The example paragraph, while slightly verbose, effectively reinforces the tool's value, so the length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description appropriately focuses on purpose, usage context, and parameter semantics. It covers the essential decision-making context (season averages hide role changes) and parameter details. It falls slightly short of a 5 by not mentioning potential edge cases like invalid player codes or season formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining every parameter: person_code is the canonical ID from search_players, season uses a format example, and last_n describes both the recent-N behavior and the special case of 0. This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns game-by-game fantasy points for a single player, explicitly distinguished from season averages and sibling tools like get_player_stats. The phrase 'for judging form and reliability' further clarifies the use case, making the purpose specific and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong contextual guidance by contrasting with season averages, implying when this tool is needed over aggregate stats. However, it does not explicitly name an alternative tool or state when not to use it, which would justify a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| season | No | ||
| per_mode | No | total | |
| person_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses key behavior: returns one row per season, season omission yields career view, and rate stats are identical across per_mode values. This gives the agent important operational expectations. It could add error handling or auth notes, but for a stats read tool these are less critical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence summary, followed by concise usage notes and a clean Args list. Every sentence adds value; no fluff or repetition. It is compact yet information-dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema (which covers return format), the description provides essential usage context: data granularity, parameter combinations, and rate-stat behavior. This is sufficient for an agent to correctly select and invoke the tool for a player-stats query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully compensates by explaining every parameter with concrete examples: person_code ('006590'), season format ('E2025'), and per_mode enumerated values with a behavioral note about rate stats. This is more informative than the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Season stats for one player'. It clearly distinguishes this from siblings by emphasizing 'one player' vs team stats, and lists specific stats (traditional totals, true shooting, eFG, usage). This unambiguously states what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the prerequisite 'Requires a person_code from search_players' and gives usage guidance for the optional season (omit for career view) and per_mode values. It doesn't explicitly list when not to use it versus alternative tools, but the 'one player' scope implies differentiation from team-level tools, offering clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| season | No | E2025 | |
| team_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full responsibility for disclosure. It openly states that the warehouse holds zero rows for players from the NBA or domestic leagues, and explicitly warns 'Do not invent a projection.' It also details exactly what the tool returns (vacated minutes and fantasy points per position, remaining players' minute stability), which is transparent about the tool's behavior and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat longer than two sentences, but every sentence is purposeful. It flows logically from an overview, to usage cases, to limitations, to return structure, to parameter definitions. No fluff or repetition exists, and the structure makes it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is complete. It explains the core purpose, anticipated use cases, limitations, output details, and parameters. An output schema exists to further clarify the return structure, so the description need not repeat that. The combination of description, schema, and sibling-context makes this a fully-specified tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions for team_code or season, and schema coverage is 0%. The description compensates fully by providing 'team_code: club code from search_teams' and 'season: season code, e.g. "E2025"'. This adds cross-referencing to a sibling tool and an example format, making both parameters clear and actionable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of what the tool provides: 'What minutes and production a club has vacated, by position, plus who remains.' This clearly identifies the resource (role outlook for a club) and distinguishes it from sibling tools like get_team_stats or get_player_stats by focusing on vacated roles and remaining player stability. The purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool: 'This is the tool for "how will player X do at his new club" and for drafting anyone without history in this competition.' It also provides a clear when-not scenario: if a player comes from the NBA or a domestic league, no projection is possible. It further instructs the agent to state the vacated role and let the user supply the player's level, which is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| season | Yes | ||
| team_code | No | ||
| include_raw | No | ||
| person_code | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral caveats: data availability starting in 2007, provisional zone labels, and the 500-row cap on raw coordinates. It also warns that zone coding is upstream's own and points to a data-quality resource. This goes well beyond basic descriptions and provides essential context for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but information-dense. The first sentence states the core purpose, the second provides a key data caveat, and the Args subsection cleanly maps to parameters. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters and an output schema, the description covers all necessary context: purpose, data limitations, parameter semantics, and response behavior. The output schema handles return-value details, so the description completes the picture without redundancy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates with a dedicated Args section that explains every parameter. It gives a concrete example for season ('E2025'), tells the agent to source person_code from search_players and team_code from search_teams, and explains include_raw's effect and its 500-row cap. This fully resolves any ambiguity in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Shot-zone breakdown, optionally with raw x/y coordinates,' which clearly identifies the tool's output as shot-zone data with an optional raw coordinate mode. It distinguishes itself from sibling tools like get_player_stats and get_team_stats by focusing specifically on shot zones. The purpose is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it notes that shot data exists only from 2007 onward and that earlier seasons have boxscores but no coordinates, guiding when not to use the tool. It also explains how to obtain person_code and team_code from search_players and search_teams, which aids integration. However, it does not explicitly name alternative tools or provide a direct when-to-use versus alternatives comparison, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| season | No | ||
| team_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the burden. It discloses that Four Factors are returned for both the team and opponents, and explains how to interpret them (e.g., low tov_pct is good). However, it does not explicitly state that the operation is read-only, nor mention any permissions, rate limits, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: the main purpose is in the first sentence, followed by concise additional detail about the Four Factors interpretation and parameter examples. No redundant or irrelevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not detail return structure. It covers parameter semantics, the source of team_code, and interpretability of results. It lacks explicit mention of the read-only safety profile and any prerequisites beyond using search_teams, but these are minor given the nature of a stats retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by explaining team_code as 'canonical code from search_teams' with examples, and season as optional with an example. This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns 'Team season statistics including offensive/defensive rating and the Four Factors', using a specific verb and resource. It distinguishes itself from sibling tools like get_player_stats by focusing on team-level statistics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for team-level analysis and provides interpretation guidance for the Four Factors, but it does not explicitly state when to use this tool versus alternatives like get_player_stats or search_teams. There are no explicit exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| teams | No | ||
| rounds | No | ||
| season | No | E2025 | |
| scoring | No | classic | |
| pick_slot | Yes | ||
| reverse_snake | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it explains snake-order mechanics, the reverse_snake option, and critically warns that likely_available is a distribution, not a prediction. This goes beyond the schema to set accurate expectations about output reliability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence contributes—purpose, usage, snake-order explanation, caveat, and parameter list. It is well-structured with an intro paragraph and an Args list, though the 'Work out' phrasing is slightly redundant with 'plan.'
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does, when to use it, how the snake logic works, what each parameter means, and the key caveat about likely_available. Since an output schema exists, there is no need to describe return values, making the description essentially complete for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The Args section defines all six parameters with practical meanings (e.g., 'roster size',
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete outcome ('which overall picks you own and who should be there') that clearly defines a draft-planning resource. It distinguishes this tool from siblings like get_draft_board or compare_draft_candidates by focusing on the user's own pick schedule and turn-by-turn targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear invocation condition: 'Use this when the user knows their draft slot and wants a plan.' It does not explicitly name alternatives or say when not to use it, but the context is strong enough to signal the intended scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discharges it well. It discloses that the connection is read-only, only a single SELECT/WITH is permitted, results are capped, and queries are cancelled after 15 seconds. These are critical behavioral traits for a SQL tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: purpose, usage, prerequisite, constraints, and parameters are presented in a clear, efficient order. Every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite being a complex SQL tool with an output schema, the description covers all necessary context: when to use, safety constraints, the schema prerequisite, and parameter semantics. The output schema exists, so return values need not be described here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the Args section compensates fully. It clarifies that sql must be a single SELECT (or WITH ... SELECT) statement, and that limit is capped at 500 rows. This adds essential meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run a read-only SQL SELECT against the warehouse.' It clearly positions this as a generic fallback for questions the other tools cannot answer, distinguishing it from the specialized sibling tools like search_players and get_team_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool: 'Use this for any question the other tools cannot answer.' This implies specialized siblings should be preferred, and also instructs the agent to read the euroleague://schema resource first. Constraints like single SELECT/WITH, read-only, cap, and 15-second timeout further guide usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| limit | No | ||
| season | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behavioral traits: case-insensitive and substring-based matching, season restriction, and limit default. It also notes the output is a canonical person_code. It doesn't mention empty-result behavior, but output schema covers return structure, making this acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly written with three clear sections: purpose, usage guidance, and parameter definitions. Every sentence adds value, including concrete examples ('doncic', 'Luka') that clarify matching behavior without unnecessary length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple lookup with three parameters and an output schema. The description covers purpose, usage, parameter meanings, and key matching behavior. Since output schema exists, explaining return structure is unnecessary, so the description is complete for this context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description provides detailed semantics for all three parameters: name is 'any part of the player's name', season has an example format, and limit states its default. This fully compensates for the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds a player's canonical person_code from a partial or misspelled name. It distinguishes itself from other player tools by emphasizing that every other tool requires a person_code, not a name, making the unique purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to 'Call this FIRST whenever the user names a player' and explains that all other player tools take a person_code, not a name. This provides clear when-to-use guidance and implicitly contrasts with alternative tools like get_player_stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| season | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must convey behavioral expectations. It does so by revealing the dual-name matching strategy and the optional season parameter, which helps the agent understand how search results are produced. It does not cover error cases or case sensitivity, but the core search behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-organized: a summary sentence, a brief contextual note, and a clean Args list. Every sentence provides necessary value, with no redundancy or irrelevant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (two parameters, one required, output schema provided), the description covers the essential behavior and parameters adequately. Minor gaps include not clarifying how the season parameter narrows results or the behavior when no match is found, but these are not critical for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description's Args section is critical. It explains 'name' as 'any part of the club name' with concrete examples and describes 'season' as an optional season code with a format example. This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Find a club's canonical team_code from a partial name.' This clearly defines the tool's objective and distinguishes it from siblings like search_players, which searches for players. The note about seasonal renames adds domain-specific specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by explaining that clubs are renamed between seasons and that the tool matches both seasonal and permanent names. This implies when the tool should be used but does not explicitly mention alternatives or when-not-to-use scenarios, stopping short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.1.0- First observed
compare_draft_candidates - First observed
get_coach_rotation - First observed
get_draft_board - First observed
get_game_boxscore - First observed
get_player_fantasy_log - First observed
get_player_stats - First observed
get_role_outlook - First observed
get_shot_chart - First observed
get_team_stats - First observed
plan_snake_draft - First observed
run_sql - First observed
search_players - First observed
search_teams
TDQS
Scored across 13 tools
Most tools have clearly distinct purposes (search_players vs search_teams, get_player_stats vs get_player_fantasy_log). The fantasy draft tools (get_draft_board, compare_draft_candidates, plan_snake_draft) could be confused at a glance, but their descriptions provide clear triggers for when each should be used.
Names follow a consistent verb_noun pattern with lowercase and underscores. There is a mix of verbs (search_, get_, run_, compare_, plan_) but each verb is semantically appropriate for its action, so the variation is minor and not chaotic.
13 tools is well within the ideal 3-15 range and covers both general data retrieval (stats, boxscores, shot charts) and specialized fantasy draft features. Each tool adds distinct value without redundancy.
The domain of Euroleague basketball data and fantasy drafting is well covered: search, player/team stats, boxscores, shot charts, coach rotations, and fantasy draft tools. Minor gaps like a game schedule or standings list exist, but the run_sql tool can address these ad hoc.
Maintenance
Related MCP Connectors
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
MCP server for AI dialogue using various LLM models via AceDataCloud
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP-Server from your Database optimized for LLMs and AI-Agents. Supports PostgreSQL, MySQL, ClickHouse, Snowflake, MSSQL, BigQuery, Oracle Database, SQLite, ElasticSearch, DuckDB548Apache 2.0
- FlicenseNot gradedqualityDmaintenanceAn MCP server for accessing college basketball statistics through the SportsData.io CBB v3 Stats API, enabling AI agents to retrieve and analyze college basketball data through natural language interactions.-
- FlicenseNot gradedqualityBmaintenanceAn MCP server that enables natural language querying of over 10 million ball-by-ball cricket deliveries stored in a local DuckDB database. It provides 26 tools for analyzing player matchups, situational stats, and historical records across all major cricket formats and tournaments.2-
- AlicenseNot gradedqualityBmaintenanceAn MCP server that provides access to over 12 years of NFL play-by-play data through a local DuckDB database. It enables users to query player performance, team statistics, and situational efficiency metrics like EPA and WPA using natural language.8MIT