footballcharts-mcp
Server Details
Tables, results, fixtures, goal timing, season projections: 93 football leagues incl. lower tiers
- Status
- Healthy
- Uptime
- 100.0% over 42 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- ddevetak/footballcharts-mcp
- GitHub Stars
- 6
- Server Listing
- footballcharts-mcp
TDQS
Scored across 10 tools
Each tool targets a distinct resource (fixtures, results, one match, league table, team, projection, etc.), so boundaries are mostly clear. Minor overlap exists between get_goal_timing (league-wide goal periods) and get_team (which also includes a team's goal timing), and between get_fixtures/get_results/get_match, but descriptions differentiate them well.
Eight of ten tools use a clear get_ verb_noun pattern (get_fixtures, get_match, get_team), with list_leagues and about_football_charts as sensible deviations. All names are snake_case and readable, so consistency is high with only minor stylistic variation.
Ten tools is well-scoped for a football data/model API, with each tool covering a distinct slice of the domain (leagues, fixtures, results, match, team, table, projection, timing, track record, metadata). No tool feels redundant or missing by count.
The surface covers the full lifecycle of the model's outputs: discovering leagues, viewing upcoming and finished matches, inspecting single matches and teams, standings, goal-timing breakdowns, season projections, and the public calibration record. Known exclusions (live scores, player data, odds) are explicitly stated rather than missing gaps.
Available Tools
10 toolsabout_football_chartsAbout this sourceARead-onlyIdempotentInspect
Returns a summary of the football-charts.com source: the leagues and data it covers (93 leagues, including lower divisions), what it does not hold (live scores, player data, bookmaker odds), the league-key and season-string formats, how the model probabilities are produced, and the free-tier limits. No parameters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| what | Yes | |
| notes | Yes | |
| tools | Yes | |
| covers | Yes | |
| not_held | Yes | |
| free_tier | Yes | |
| get_a_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld, so the safety profile is covered. The description adds useful behavioral context beyond that: it discloses what data is absent (live scores, player data, bookmaker odds) and that free-tier limits exist, which helps set expectations. It does not discuss return structure, though an output schema exists.
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 a single dense sentence that front-loads the core purpose before enumerating covered topics. Every listed item is substantive, though the long enumeration makes it slightly heavy for a zero-parameter meta tool.
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 is a read-only informational endpoint with zero parameters and an existing output schema, the description is complete: it tells the agent what topics the summary covers, what is explicitly excluded, and that free-tier limits are addressed. Nothing needed to select or invoke the tool is missing.
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 tool takes zero parameters, and the description explicitly states 'No parameters.' With an empty schema and 100% schema coverage, this baseline score is appropriate; no additional parameter meaning is needed or expected.
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?
States a specific verb (returns a summary) and resource (the football-charts.com source), then enumerates the exact content covered: leagues, exclusions, key/season formats, model probabilities, and free-tier limits. This clearly differentiates it from data-returning siblings like get_fixtures and list_leagues, which fetch records rather than source metadata.
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 makes the tool's purpose clear enough that an agent can infer it should be called to learn about the source, but it never states when to use this versus alternatives or any prerequisites. There is no explicit guidance such as calling it before list_leagues or when coverage questions arise.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fixturesUpcoming fixturesARead-onlyIdempotentInspect
Returns the upcoming matches of one league, earliest first: kick-off date and time, teams, a match slug, and the model's calibrated probabilities (home and away win, over/under goal lines, both teams to score, half-time lines; the draw probability is 1 - home - away) with team attack and defence ratings. The probabilities come from a baseline statistical model of past results (no injuries, motivation or weather) and are not bookmaker prices.
| Name | Required | Description | Default |
|---|---|---|---|
| league | Yes | League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| league | No | |
| matches | No | |
| attribution | No | Cite as "Data by football-charts.com" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent profile, but the description goes well beyond them: it discloses the data provenance (baseline statistical model of past results), the exclusions (no injuries, motivation or weather), that values are not bookmaker prices, and the draw-probability derivation (1 - home - away). This is exactly the behavioral context an agent needs to interpret the numbers correctly.
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?
Two sentences, front-loaded with the primary return value before the caveats. Dense but every clause carries information (ordering, fields, probability caveats); the probability enumeration is slightly list-heavy but justified for a data-return tool.
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?
With a rich output schema, an existing schema-documented parameter, and full annotations covering the safety profile, the description needs only to add interpretation context, which it does via the model provenance and draw-probability rule. Nothing required to invoke or interpret the tool is missing.
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 100%, so the league parameter is fully documented in the schema (key format, examples, 'not the display name'). The description adds only the constraint that fixtures are scoped to 'one league', so the schema does the heavy lifting.
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?
States a specific verb and resource ('Returns the upcoming matches of one league, earliest first') plus the exact payload contents. The scope ('upcoming', single league, chronological ordering) cleanly separates it from siblings like get_results and get_league_table without needing to name them.
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?
Usage is implied rather than stated: 'upcoming matches' and the fact that it takes a single league key suggest when it applies, but there is no explicit when-to-use guidance or named alternative (e.g. get_results for past matches, list_leagues for discovering keys). An agent can infer the right context but nothing routes it definitively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_goal_timingGoal timingARead-onlyIdempotentInspect
Returns goals per 15-minute period (0-15 to 90+) for every team in one league season, with each team's peak period or periods (ties are listed together), share of late goals and share of first-half goals, plus league totals and the league's most active period. team limits the result to teams whose name contains the given text.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Team name substring, e.g. 'Flamengo' — returns that team's row only | |
| league | Yes | League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name. | |
| season | No | Season string as listed by list_leagues: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues (Brazil, Sweden, Norway, Japan…). Omit for the current season. The free tier serves the current and previous season. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| note | No | |
| stats | No | |
| league | No | |
| season | No | |
| time_bins | No | |
| attribution | No | Cite as "Data by football-charts.com" |
| team_filter | No | |
| team_not_found | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint). The description goes beyond them by disclosing output semantics: the 0-15 to 90+ bucketing, that ties for peak period are listed together, and that the team filter is a substring match on name. It does not address rate limits or tier constraints (those live in the schema), but the added behavioral context is genuine.
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?
Two sentences, front-loaded with the primary output description before the filter clause. It is dense and runs long but every clause contributes information about the returned shape. Minor loss of structure from packing many output facets into a single sentence.
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?
An output schema exists, so return values need not be spelled out, and annotations carry the safety profile. The description covers scope, granularity, tie handling and the filter, which is enough for correct invocation. It omits any pointer to list_leagues for obtaining league/season keys, though the schema supplies that reference.
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 100%, so the schema already documents league keys, season formats and the team substring filter in detail. The description restates the team filter behavior ('limits the result to teams whose name contains the given text') but adds no syntax or format detail beyond the schema. Baseline 3 applies.
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?
States a specific verb (Returns) and a precisely scoped resource: goals bucketed per 15-minute period, per team, across one league season, including peak periods, late-goal share, first-half share and league totals. This is clearly differentiable from siblings like get_league_table or get_season_projection without opening any schema.
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?
There is no explicit when-to-use or when-not-to-use guidance and no named alternative (e.g. versus get_league_table or get_results). Usage is only implicit in the described output, so an agent must infer the scenario rather than being routed to it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_league_tableLeague tableARead-onlyIdempotentInspect
Returns the standings of one league season: one row per team with position, played, wins, draws, losses, goals, points and last-five form, plus expected points and a luck category (how far results run ahead of or behind the underlying performance). view='luck' orders the same rows by over- or under-performance and view='goals' by goals scored; the default orders by points. Without a season, returns the current season.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Row order; default 'classic' (by points) | |
| league | Yes | League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name. | |
| season | No | Season string as listed by list_leagues: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues (Brazil, Sweden, Norway, Japan…). Omit for the current season. The free tier serves the current and previous season. |
Output Schema
| Name | Required | Description |
|---|---|---|
| view | No | |
| table | No | |
| league | No | |
| season | No | |
| attribution | No | Cite as "Data by football-charts.com" |
| season_state | No | 'in_season' or 'finished' |
| current_season | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered. The description adds genuinely new behavioral context beyond the annotations: the exact column set returned, what the luck category means (results running ahead of/behind underlying performance), and the free-tier constraint ('serves the current and previous season'). It stops short of describing pagination or result-size 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?
Two sentences, front-loaded with the primary return shape before the view and season modifiers. Every clause carries information: the row schema, the two non-default orderings, the default, and the season fallback. 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?
An output schema exists, so return-value documentation is not required, and annotations cover the safety profile. Given that, the description supplies everything else an agent needs: what a row contains, the meaning of the luck metric, how each view reorders rows, and the free-tier season limit.
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 100% and the schema itself defines all three parameters well, so the baseline is 3. The description goes further by explaining what each view ordering actually means ('luck' orders by over-/under-performance, 'goals' by goals scored, default by points) and by clarifying the season-omission behavior, adding semantics beyond the schema's terse field 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?
States a specific verb and resource ('Returns the standings of one league season') and enumerates the row shape (position, played, wins, draws, losses, goals, points, form, expected points, luck category). This makes it immediately distinguishable from siblings like get_results, get_fixtures, and get_season_projection, which cover different slices of data.
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?
Explains the decision between the three view values (luck, goals, default by points) and states that omitting season yields the current season, plus points the agent at list_leagues for valid league and season keys. It stops short of explicitly saying when to reach for this tool over sibling tools such as get_season_projection or get_track_record, so no exclusion guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_matchMatch detailARead-onlyIdempotentInspect
Returns one match in full, identified by its slug ('country/league-slug/YYYY-MM-DD-home-vs-away', as listed in the slug field of upcoming fixtures): the complete model probability block (calibrated and raw), team ratings, first-goal-time histograms for both sides, recent form and, once played, the score, half-time score and status.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Match slug as listed in upcoming fixtures, e.g. 'england/premier-league/2026-09-05-brentford-vs-sunderland' |
Output Schema
| Name | Required | Description |
|---|---|---|
| match | Yes | |
| attribution | No | Cite as "Data by football-charts.com" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description usefully notes conditional behavior ('once played, the score, half-time score and status'), implying a pre-match vs post-match return shape, but adds little on error handling or what happens for an invalid slug.
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?
One front-loaded sentence with verb+resource first, then the payload enumeration. Dense but every clause carries information; the trailing list of returned fields is long but not padded.
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?
An output schema exists, so the return list is bonus rather than a necessity, and annotations cover the safety profile. For a one-param read tool this is sufficient; only explicit routing guidance against the sibling detail/listing tools is missing.
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?
With a single required parameter and 100% schema coverage the baseline is 3, but the description goes beyond the schema's example by spelling out the slug composition ('country/league-slug/YYYY-MM-DD-home-vs-away'), which clarifies field ordering and format that the bare example only illustrates.
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?
States a specific verb (Returns) and resource (one match), and enumerates the payload: probability block, team ratings, goal-time histograms, form, and post-match score/status. This clearly separates it from list-oriented siblings like get_fixtures and get_results.
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 implicitly tells the agent where the identifier comes from ('as listed in the slug field of upcoming fixtures'), which sketches a workflow, but never states when to prefer this over get_fixtures, get_results, or get_team, nor any exclusion. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resultsMatch resultsARead-onlyIdempotentInspect
Returns the finished matches of one league season in chronological order: date, teams, full-time and half-time score, first-goal minute and a goalless flag. team keeps the matches where either side's name contains the given text (case-insensitive); last=N keeps only the N most recent matches. Contains no odds.
| Name | Required | Description | Default |
|---|---|---|---|
| last | No | Keep only the N latest matches of the season, e.g. 5 for recent form (default: all) | |
| team | No | Team name substring, e.g. 'Liverpool' | |
| league | Yes | League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name. | |
| season | No | Season string as listed by list_leagues: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues (Brazil, Sweden, Norway, Japan…). Omit for the current season. The free tier serves the current and previous season. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| league | No | |
| season | No | |
| matches | No | |
| attribution | No | Cite as "Data by football-charts.com" |
| season_state | No | 'in_season' or 'finished' |
| current_season | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered. The description adds genuinely new behavioral facts: results are ordered chronologically, team matching is case-insensitive and applies to either side, and odds are absent from the payload.
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?
Three dense sentences with the primary purpose front-loaded, then filter semantics, then the exclusion. No filler or redundant restatement of the tool name.
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?
For a read-only list tool with a rich schema (100% coverage, output schema present) and full annotations, the description covers scope, ordering, filtering and content exclusions adequately. Data-availability limits (free tier, season default) live in the schema rather than the description, so nothing essential is missing, though the description could have surfaced the current/previous-season constraint.
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 100%, so the baseline is 3, but the description adds real semantics beyond the schema: 'team' matches either side's name (not just one) and the match is case-insensitive, which the schema's 'Team name substring' does not convey. It restates 'last=N' semantics already present in the schema, so it is not a 5.
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?
States a specific verb and resource with scope: 'Returns the finished matches of one league season in chronological order', then enumerates the returned fields. The 'finished matches' scope cleanly separates it from get_fixtures (scheduled) and get_match (single match) without needing to name them.
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?
Gives clear context for how the filters are meant to be used ('team keeps matches where either side's name contains the text', 'last=N keeps only the N most recent') and an explicit exclusion ('Contains no odds'), which steers the agent away from this tool for betting data. It stops short of naming an alternative tool or stating when-not-to-use beyond the odds exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_season_projectionSeason projectionARead-onlyIdempotentInspect
Returns how one league's current season is projected to finish, from 10,000 Monte Carlo simulations refreshed daily: for each team the probabilities of winning the title, finishing in the top four and finishing in the bottom three, current points, mean final points, a 10th-90th percentile points range, a finishing-position matrix, and the change since the previous run. Covers the current season only; returns a note when no projection exists for the league yet.
| Name | Required | Description | Default |
|---|---|---|---|
| league | Yes | League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Set when no projection exists for the league yet |
| projection | No | |
| attribution | No | Cite as "Data by football-charts.com" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description adds genuinely non-structured context: the 10,000-simulation Monte Carlo methodology, a daily refresh cadence, and the explicit no-data response. It does not mention latency, payload size, or rate limits, so it stops short of a 5.
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?
Purpose and data-freshness framing are front-loaded, and the scope caveat is placed last where it belongs. The middle run-on enumeration of every returned field is long and partly redundant with the output schema, which costs a point but does not obscure the core message.
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?
With an output schema present and 100% parameter coverage, the description only needed to add scope, freshness, and failure-mode context — and it does exactly that (current season only, daily refresh, note when no projection exists). Nothing an agent needs to call it correctly is missing.
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 100% and the single 'league' parameter is already documented with concrete examples ('premier', 'spain1', 'wgermany1') plus the warning that it is not the display name. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.
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?
States a specific verb and resource ('Returns how one league's current season is projected to finish') and immediately frames it as a forward-looking simulation, which separates it from siblings like get_league_table (actual standings) and get_results. An agent can tell what this produces without opening the schema.
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 gives scope boundaries ('Covers the current season only') and an edge-case behavior ('returns a note when no projection exists'), which implies when the tool is applicable. However, it never states when to prefer this over get_league_table, get_track_record, or any other sibling, so the routing decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_teamTeam pageARead-onlyIdempotentInspect
Returns one team's season in one league: its table row (with expected points and luck category), the full match log (date, opponent, home or away, score, half-time score, first-goal minute, outcome), goals per 15-minute period, the first-goal distribution, and season averages of match statistics (shots, shots on target, possession, corners, xG) where the league has them. team is a lower-case slug with hyphens, e.g. 'arsenal' or 'manchester-city'.
| Name | Required | Description | Default |
|---|---|---|---|
| team | Yes | Team slug, e.g. 'arsenal', 'manchester-city' (from the table's team names, lower-case, spaces as hyphens) | |
| league | Yes | League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name. | |
| season | No | Season string as listed by list_leagues: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues (Brazil, Sweden, Norway, Japan…). Omit for the current season. The free tier serves the current and previous season. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | No | |
| team | No | |
| stats | No | Per-match averages over this season, computed from stored match statistics; null where the league has none |
| league | No | |
| season | No | |
| matches | No | |
| ranking | No | The team's table row |
| seasons | No | |
| attribution | No | Cite as "Data by football-charts.com" |
| first_goal_bins | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: some season statistics only exist "where the league has them", and it clarifies the slug format the caller must supply. It stops short of stating rate limits or pagination (presumably not applicable).
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?
Purpose is front-loaded in the first clause, and the long enumeration is a single sentence that each element of which maps to real returned data. The trailing slug-format sentence is somewhat redundant with the schema, slightly lowering efficiency.
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?
With an output schema present, the description need not explain return values, and annotations cover the safety profile, so the remaining burden is light. The detailed payload summary plus the league-dependent data caveat make it complete for a read tool; only explicit sibling routing is absent.
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 100%, so team, league, and season semantics are already fully documented there, including the slug convention and season defaults. The description's slug example ('arsenal' or 'manchester-city') merely restates the schema, adding no new meaning, so the baseline 3 applies.
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?
States a specific verb and resource scoped precisely: "Returns one team's season in one league". It then enumerates the payload (table row, match log, 15-minute goal periods, first-goal distribution, season stat averages), which cleanly separates it from get_league_table (whole table), get_match (single match), and get_results (scorelines).
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?
There is no explicit when-to-use statement or exclusion relative to get_league_table, get_match, or get_results. Usage is only implied by the enumerated contents — an agent can infer this is the per-team deep-dive, but the description never says so or names an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_track_recordModel calibration recordARead-onlyIdempotentInspect
Returns the public calibration record of the model: every probability published before kick-off and scored after the result, with count, hit rate, Brier score and reliability buckets (predicted probability against observed frequency), overall and by question type (match result, total goals over 2.5 and 3.5, half-time goals over 1.5, both teams to score), plus the 50 most recent scored predictions. Misses are included. days sets the lookback window (default 90).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days (default 90) |
Output Schema
| Name | Required | Description |
|---|---|---|
| attribution | No | Cite as "Data by football-charts.com" |
| track_record | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint). The description adds meaningful behavior beyond them: 'Misses are included' signals there is no survivorship bias in the sample, the reliability-bucket definition is spelled out, and the 50-prediction cap on recent entries is disclosed. No auth or rate-limit context, so not a 5.
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?
One dense sentence, front-loading the returned artifact before the breakdown and the parameter. The enumeration of question types (match result, over 2.5/3.5, HT over 1.5, BTTS) is borderline verbose since an output schema exists, but each item earns its place as scope definition.
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?
An output schema exists, so return values need not be detailed — yet the description goes further and explains what the numbers mean (Brier score, reliability buckets) and that misses are retained, which is exactly the interpretive context an agent needs. The only gap is that it never frames the purpose for which an agent should call it.
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 100% and the single 'days' parameter's schema text ('Lookback window in days (default 90)') is identical to the description's wording. The description adds no semantics — no format hints, no effect of the window on results — so baseline 3 applies.
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?
States a specific verb and resource — returns the model's public calibration record — and enumerates the exact contents (count, hit rate, Brier score, reliability buckets, by question type). This is unmistakably different from every sibling tool, which serve football fixtures/results/tables rather than model-scoring metadata.
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?
Usage is implied rather than stated: an agent can infer this is for auditing model accuracy, but the description never says when to reach for it (e.g. before trusting a prediction) or whether any sibling overlaps. No alternatives or exclusions are named, leaving the agent to infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leaguesList leaguesARead-onlyIdempotentInspect
Returns every league covered (93 across 42 countries) with its league key, display name, country and the seasons available, newest first. Other tools take these league keys and season strings. Season format depends on the competition: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues. No parameters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| leagues | Yes | |
| attribution | No | Cite as "Data by football-charts.com" |
| season_window | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior, so the safety and side-effect profile is covered. The description adds real behavioral context beyond that: the result set is exhaustive (93 leagues / 42 countries), ordered newest-first, and takes no parameters. It stops short of describing pagination or output shape, but that is minor given the output schema.
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?
Three tight sentences, front-loaded with what is returned and how many, followed by the downstream-key relationship and the season-format detail. Every sentence carries distinct information with no redundancy.
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?
For a no-parameter enumeration tool with an output schema already defining the return shape, the description covers scope, ordering, and the cross-tool contract for keys and season strings. An agent has everything needed to call it and to use its output 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?
With zero parameters, the baseline is 4. The description goes further by documenting the season string format used by consuming tools ('2026-2027' for winter-calendar, '2026' for summer-calendar), which adds meaning an agent would otherwise have to guess.
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?
States a specific verb and resource ('Returns every league covered') and enumerates exactly what each entry contains: league key, display name, country, and available seasons. This is clearly distinguishable from siblings like get_league_table or get_fixtures, which operate on a single league rather than enumerating all of them.
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 situates the tool in a workflow: 'Other tools take these league keys and season strings,' making it clear this is a discovery/lookup call that feeds downstream tools. It does not state explicit exclusions or when-not-to-use conditions, so it falls 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.
9 tool updates
- Changed
get_fixtures1 field changed- changed
Output schema / properties / matches / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "properties": { - "away_team": { - "type": "string" - }, - "country": { - "$ref": "#/properties/league" - }, - "home_team": { - "type": "string" - }, - "league": { - "$ref": "#/properties/league" - }, - "match_date": { - "$ref": "#/properties/league" - }, - "model_predictions": { - "anyOf": [ - { - "additionalProperties": true, - "properties": { - "dc_v2": { - "anyOf": [ - { - "additionalProperties": true, - "properties": { - "calibrated": { - "anyOf": [ - { - "additionalProperties": true, - "description": "Probabilities 0–1. The draw is NOT a field: draw = 1 − home − away.", - "properties": { - "away": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "btts_yes": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "expected_away_goals": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "expected_home_goals": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "expected_ht_goals": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "home": {}, - "ht_over_0.5": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "ht_over_1.5": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_0.5": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_1.5": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_2.5": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_3.5": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_4.5": { - "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Use these. Calibrated on settled matches." - }, - "computed_at": { - "$ref": "#/properties/league" - }, - "data_through": { - "$ref": "#/properties/league", - "description": "Last match date the model has seen" - }, - "model": { - "$ref": "#/properties/league" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "real_league_name": { - "$ref": "#/properties/league" - }, - "slug": { - "description": "Input to get_match", - "type": "string" - }, - "status": { - "$ref": "#/properties/league" - }, - "time": { - "$ref": "#/properties/league" - } - }, - "required": [ - "slug", - "home_team", - "away_team" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "away_team": { + "type": "string" + }, + "country": {}, + "home_team": { + "type": "string" + }, + "league": {}, + "match_date": {}, + "model_predictions": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "dc_v2": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "calibrated": { + "anyOf": [ + { + "additionalProperties": true, + "description": "Probabilities 0–1. The draw is NOT a field: draw = 1 − home − away.", + "properties": { + "away": {}, + "btts_yes": {}, + "expected_away_goals": {}, + "expected_home_goals": {}, + "expected_ht_goals": {}, + "home": {}, + "ht_over_0.5": {}, + "ht_over_1.5": {}, + "over_0.5": {}, + "over_1.5": {}, + "over_2.5": {}, + "over_3.5": {}, + "over_4.5": {} + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Use these. Calibrated on settled matches." + }, + "computed_at": {}, + "data_through": { + "description": "Last match date the model has seen" + }, + "model": {} + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "real_league_name": {}, + "slug": { + "description": "Input to get_match", + "type": "string" + }, + "status": {}, + "time": {} + }, + "required": [ + "slug", + "home_team", + "away_team" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
get_goal_timing6 fields changed- changed
Output schema / properties / data / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "properties": { - "bins": { - "anyOf": [ - { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Goals per bin: '0-15','15-30','30-45','45+','46-60','60-75','75-90','90+'" - }, - "first_half_pct": { - "$ref": "#/properties/data/anyOf/0/items/properties/late_share_pct" - }, - "late_share_pct": { - "description": "% of goals from 75′ on" - }, - "peak_bins": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "description": "Bin(s) with most goals — ties are listed; report a tie as a tie" - }, - "peak_goals": { - "$ref": "#/properties/stats/anyOf/0/properties/total_goals" - }, - "team": { - "type": "string" - }, - "total": { - "$ref": "#/properties/stats/anyOf/0/properties/total_goals" - } - }, - "required": [ - "team" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "bins": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Goals per bin: '0-15','15-30','30-45','45+','46-60','60-75','75-90','90+'" + }, + "first_half_pct": {}, + "late_share_pct": { + "description": "% of goals from 75′ on" + }, + "peak_bins": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Bin(s) with most goals — ties are listed; report a tie as a tie" + }, + "peak_goals": {}, + "team": { + "type": "string" + }, + "total": {} + }, + "required": [ + "team" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / note / $refRemoved value: -"#/properties/league" - removed
Output schema / properties / season / $refRemoved value: -"#/properties/league" - changed
Output schema / properties / stats / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "late_goals": { - "$ref": "#/properties/stats/anyOf/0/properties/total_goals" - }, - "match_count": { - "$ref": "#/properties/stats/anyOf/0/properties/total_goals" - }, - "most_active_period": { - "$ref": "#/properties/league" - }, - "total_goals": {} - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "late_goals": {}, + "match_count": {}, + "most_active_period": {}, + "total_goals": {} + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / team_filter / $refRemoved value: -"#/properties/league" - removed
Output schema / properties / team_not_found / $refRemoved value: -"#/properties/league"
- Changed
get_league_table5 fields changed- removed
Output schema / properties / current_season / $refRemoved value: -"#/properties/league" - removed
Output schema / properties / season / $refRemoved value: -"#/properties/league" - removed
Output schema / properties / season_state / $refRemoved value: -"#/properties/league" - changed
Output schema / properties / table / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "properties": { - "avg_goals_conceded": { - "$ref": "#/properties/table/anyOf/0/items/properties/avg_goals_scored" - }, - "avg_goals_scored": { - "$ref": "#/properties/table/anyOf/0/items/properties/expected_points" - }, - "clean_sheets": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "drawn": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "expected_points": { - "description": "Points the underlying numbers say the team should have" - }, - "expected_position": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "goal_difference": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "goals_against": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "goals_for": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "last_5_form": { - "$ref": "#/properties/league", - "description": "Latest results as letters, e.g. 'WWDLW'" - }, - "last_5_points": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "lost": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "luck_category": { - "$ref": "#/properties/league", - "description": "'lucky' | 'fair' | 'unlucky'" - }, - "luck_difference": { - "$ref": "#/properties/table/anyOf/0/items/properties/expected_points", - "description": "points − expected_points; positive = ahead of the numbers" - }, - "over_25_percentage": { - "$ref": "#/properties/table/anyOf/0/items/properties/avg_goals_scored" - }, - "played": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "points": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - }, - "position": {}, - "team": { - "type": "string" - }, - "won": { - "$ref": "#/properties/table/anyOf/0/items/properties/position" - } - }, - "required": [ - "team" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "avg_goals_conceded": {}, + "avg_goals_scored": {}, + "clean_sheets": {}, + "drawn": {}, + "expected_points": { + "description": "Points the underlying numbers say the team should have" + }, + "expected_position": {}, + "goal_difference": {}, + "goals_against": {}, + "goals_for": {}, + "last_5_form": { + "description": "Latest results as letters, e.g. 'WWDLW'" + }, + "last_5_points": {}, + "lost": {}, + "luck_category": { + "description": "'lucky' | 'fair' | 'unlucky'" + }, + "luck_difference": { + "description": "points − expected_points; positive = ahead of the numbers" + }, + "over_25_percentage": {}, + "played": {}, + "points": {}, + "position": {}, + "team": { + "type": "string" + }, + "won": {} + }, + "required": [ + "team" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / view / $refRemoved value: -"#/properties/league"
- Changed
get_match13 fields changed- removed
Output schema / properties / match / properties / away_score / $refRemoved value: -"#/properties/match/properties/home_score" - removed
Output schema / properties / match / properties / away_team / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / country / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / home_team / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / ht_result / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / label / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / league / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / match_date / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / match_status / $refRemoved value: -"#/properties/match/properties/slug" - changed
Output schema / properties / match / properties / model_predictions / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "dc_v2": { - "anyOf": [ - { - "additionalProperties": true, - "properties": { - "calibrated": { - "anyOf": [ - { - "additionalProperties": true, - "description": "Probabilities 0–1. The draw is NOT a field: draw = 1 − home − away.", - "properties": { - "away": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "btts_yes": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "expected_away_goals": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "expected_home_goals": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "expected_ht_goals": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "home": {}, - "ht_over_0.5": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "ht_over_1.5": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_0.5": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_1.5": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_2.5": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_3.5": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - }, - "over_4.5": { - "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" - } - }, - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Use these. Calibrated on settled matches." - }, - "computed_at": { - "$ref": "#/properties/match/properties/slug" - }, - "data_through": { - "$ref": "#/properties/match/properties/slug", - "description": "Last match date the model has seen" - }, - "model": { - "$ref": "#/properties/match/properties/slug" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "dc_v2": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "calibrated": { + "anyOf": [ + { + "additionalProperties": true, + "description": "Probabilities 0–1. The draw is NOT a field: draw = 1 − home − away.", + "properties": { + "away": {}, + "btts_yes": {}, + "expected_away_goals": {}, + "expected_home_goals": {}, + "expected_ht_goals": {}, + "home": {}, + "ht_over_0.5": {}, + "ht_over_1.5": {}, + "over_0.5": {}, + "over_1.5": {}, + "over_2.5": {}, + "over_3.5": {}, + "over_4.5": {} + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Use these. Calibrated on settled matches." + }, + "computed_at": {}, + "data_through": { + "description": "Last match date the model has seen" + }, + "model": {} + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / match / properties / real_league_name / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / season / $refRemoved value: -"#/properties/match/properties/slug" - removed
Output schema / properties / match / properties / time / $refRemoved value: -"#/properties/match/properties/slug"
- Changed
get_results5 fields changed- removed
Output schema / properties / current_season / $refRemoved value: -"#/properties/league" - changed
Output schema / properties / matches / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "properties": { - "awayTeam": { - "type": "string" - }, - "date": { - "$ref": "#/properties/league" - }, - "first_goal_time": { - "$ref": "#/properties/count", - "description": "Minute of the first goal; null when goalless" - }, - "first_goal_time_extra": { - "$ref": "#/properties/count", - "description": "Stoppage-time minutes added to first_goal_time" - }, - "goalless": { - "type": [ - "boolean", - "null" - ] - }, - "homeTeam": { - "type": "string" - }, - "ht_result": { - "$ref": "#/properties/league", - "description": "Half-time 'home:away'" - }, - "score": { - "$ref": "#/properties/league", - "description": "Full-time 'home:away', e.g. '3:0'" - }, - "time": { - "$ref": "#/properties/league" - } - }, - "required": [ - "homeTeam", - "awayTeam" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "awayTeam": { + "type": "string" + }, + "date": {}, + "first_goal_time": { + "description": "Minute of the first goal; null when goalless" + }, + "first_goal_time_extra": { + "description": "Stoppage-time minutes added to first_goal_time" + }, + "goalless": { + "type": [ + "boolean", + "null" + ] + }, + "homeTeam": { + "type": "string" + }, + "ht_result": { + "description": "Half-time 'home:away'" + }, + "score": { + "description": "Full-time 'home:away', e.g. '3:0'" + }, + "time": {} + }, + "required": [ + "homeTeam", + "awayTeam" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / note / $refRemoved value: -"#/properties/league" - removed
Output schema / properties / season / $refRemoved value: -"#/properties/league" - removed
Output schema / properties / season_state / $refRemoved value: -"#/properties/league"
- Changed
get_season_projection2 fields changed- removed
Output schema / properties / note / $refRemoved value: -"#/properties/projection/anyOf/0/properties/league" - changed
Output schema / properties / projection / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "deltas_vs_prev": { - "anyOf": [ - { - "additionalProperties": { - "additionalProperties": true, - "properties": { - "bottom3": { - "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" - }, - "title": { - "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" - }, - "top4": { - "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" - } - }, - "type": "object" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Change since the previous run" - }, - "expected_remaining": { - "$ref": "#/properties/projection/anyOf/0/properties/n_sims" - }, - "league": {}, - "n_sims": {}, - "partial_schedule": { - "type": [ - "boolean", - "null" - ] - }, - "run_date": { - "$ref": "#/properties/projection/anyOf/0/properties/league" - }, - "scheduled_remaining": { - "$ref": "#/properties/projection/anyOf/0/properties/n_sims" - }, - "season": { - "$ref": "#/properties/projection/anyOf/0/properties/league" - }, - "teams": { - "additionalProperties": { - "additionalProperties": true, - "properties": { - "bottom1": { - "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" - }, - "bottom2": { - "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" - }, - "bottom3": { - "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title", - "description": "Relegation-zone probability (bottom three)" - }, - "gd_now": { - "$ref": "#/properties/projection/anyOf/0/properties/n_sims" - }, - "mean_pts": { - "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" - }, - "p10_pts": { - "$ref": "#/properties/projection/anyOf/0/properties/n_sims" - }, - "p90_pts": { - "$ref": "#/properties/projection/anyOf/0/properties/n_sims" - }, - "played": { - "$ref": "#/properties/projection/anyOf/0/properties/n_sims" - }, - "position_matrix": { - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "description": "Probability of finishing 1st…last" - }, - "pts_now": { - "$ref": "#/properties/projection/anyOf/0/properties/n_sims" - }, - "title": {}, - "top4": { - "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" - } - }, - "type": "object" - }, - "description": "Keyed by team name", - "type": "object" - } - }, - "required": [ - "teams" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "deltas_vs_prev": { + "anyOf": [ + { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "bottom3": {}, + "title": {}, + "top4": {} + }, + "type": "object" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Change since the previous run" + }, + "expected_remaining": {}, + "league": {}, + "n_sims": {}, + "partial_schedule": { + "type": [ + "boolean", + "null" + ] + }, + "run_date": {}, + "scheduled_remaining": {}, + "season": {}, + "teams": { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "bottom1": {}, + "bottom2": {}, + "bottom3": { + "description": "Relegation-zone probability (bottom three)" + }, + "gd_now": {}, + "mean_pts": {}, + "p10_pts": {}, + "p90_pts": {}, + "played": {}, + "position_matrix": { + "anyOf": [ + { + "items": { + "type": "number" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Probability of finishing 1st…last" + }, + "pts_now": {}, + "title": {}, + "top4": {} + }, + "type": "object" + }, + "description": "Keyed by team name", + "type": "object" + } + }, + "required": [ + "teams" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_team7 fields changed- changed
Output schema / properties / first_goal_bins / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "properties": { - "count": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "time": { - "$ref": "#/properties/team" - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "count": {}, + "time": {} + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / league / $refRemoved value: -"#/properties/team" - changed
Output schema / properties / matches / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "properties": { - "away": { - "$ref": "#/properties/team" - }, - "date": { - "$ref": "#/properties/team" - }, - "first_goal_time": { - "$ref": "#/properties/team" - }, - "home": { - "$ref": "#/properties/team" - }, - "ht": { - "$ref": "#/properties/team" - }, - "outcome": { - "$ref": "#/properties/team", - "description": "'W' | 'D' | 'L'" - }, - "score": { - "$ref": "#/properties/team" - }, - "time": { - "$ref": "#/properties/team" - }, - "venue": { - "$ref": "#/properties/team", - "description": "'H' or 'A'" - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "away": {}, + "date": {}, + "first_goal_time": {}, + "home": {}, + "ht": {}, + "outcome": { + "description": "'W' | 'D' | 'L'" + }, + "score": {}, + "time": {}, + "venue": { + "description": "'H' or 'A'" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / properties / ranking / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "avg_goals_conceded": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - }, - "avg_goals_scored": { - "$ref": "#/properties/ranking/anyOf/0/properties/expected_points" - }, - "clean_sheets": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "drawn": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "expected_points": { - "description": "Points the underlying numbers say the team should have" - }, - "expected_position": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "goal_difference": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "goals_against": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "goals_for": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "last_5_form": { - "$ref": "#/properties/team", - "description": "Latest results as letters, e.g. 'WWDLW'" - }, - "last_5_points": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "lost": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "luck_category": { - "$ref": "#/properties/team", - "description": "'lucky' | 'fair' | 'unlucky'" - }, - "luck_difference": { - "$ref": "#/properties/ranking/anyOf/0/properties/expected_points", - "description": "points − expected_points; positive = ahead of the numbers" - }, - "over_25_percentage": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - }, - "played": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "points": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "position": {}, - "team": { - "type": "string" - }, - "won": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - } - }, - "required": [ - "team" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "avg_goals_conceded": {}, + "avg_goals_scored": {}, + "clean_sheets": {}, + "drawn": {}, + "expected_points": { + "description": "Points the underlying numbers say the team should have" + }, + "expected_position": {}, + "goal_difference": {}, + "goals_against": {}, + "goals_for": {}, + "last_5_form": { + "description": "Latest results as letters, e.g. 'WWDLW'" + }, + "last_5_points": {}, + "lost": {}, + "luck_category": { + "description": "'lucky' | 'fair' | 'unlucky'" + }, + "luck_difference": { + "description": "points − expected_points; positive = ahead of the numbers" + }, + "over_25_percentage": {}, + "played": {}, + "points": {}, + "position": {}, + "team": { + "type": "string" + }, + "won": {} + }, + "required": [ + "team" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / season / $refRemoved value: -"#/properties/team" - removed
Output schema / properties / slug / $refRemoved value: -"#/properties/team" - changed
Output schema / properties / stats / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "corners_avg": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - }, - "matches_with_stats": { - "$ref": "#/properties/ranking/anyOf/0/properties/position" - }, - "possession_avg": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - }, - "shots_against_avg": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - }, - "shots_avg": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - }, - "shots_on_target_avg": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - }, - "xg_against_avg": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - }, - "xg_avg": { - "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "corners_avg": {}, + "matches_with_stats": {}, + "possession_avg": {}, + "shots_against_avg": {}, + "shots_avg": {}, + "shots_on_target_avg": {}, + "xg_against_avg": {}, + "xg_avg": {} + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_track_record5 fields changed- changed
Output schema / properties / track_record / properties / accuracy / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "brier": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate", - "description": "Brier score over scored probabilities; lower is better, 0.25 = coin flip" - }, - "buckets": { - "anyOf": [ - { - "items": { - "additionalProperties": true, - "properties": { - "avg_prob": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" - }, - "hi": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" - }, - "hit_rate": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" - }, - "lo": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" - }, - "n": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/correct" - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "n": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/correct" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "brier": { + "description": "Brier score over scored probabilities; lower is better, 0.25 = coin flip" + }, + "buckets": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "avg_prob": {}, + "hi": {}, + "hit_rate": {}, + "lo": {}, + "n": {} + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "n": {} + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / track_record / properties / by_question / anyOfPrevious value: -[ - { - "additionalProperties": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0" - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "correct": {}, + "hit_rate": { + "description": "correct / (correct + incorrect)" + }, + "incorrect": {}, + "n": { + "description": "Scored predictions" + }, + "void": { + "description": "Postponed or abandoned; not scored" + } + }, + "type": "object" + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / track_record / properties / pending / $refRemoved value: -"#/properties/track_record/properties/summary/anyOf/0/properties/n" - changed
Output schema / properties / track_record / properties / recent / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "properties": { - "away_team": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "home_team": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "league": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "line": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" - }, - "match_date": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "model_prob": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" - }, - "outcome": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug", - "description": "'correct' | 'incorrect' | 'void'" - }, - "question": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "result_score": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "side": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "slug": {} - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "away_team": {}, + "home_team": {}, + "league": {}, + "line": {}, + "match_date": {}, + "model_prob": {}, + "outcome": { + "description": "'correct' | 'incorrect' | 'void'" + }, + "question": {}, + "result_score": {}, + "side": {}, + "slug": {} + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / properties / track_record / properties / summary / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "correct": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" - }, - "hit_rate": { - "description": "correct / (correct + incorrect)" - }, - "incorrect": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/correct" - }, - "n": { - "description": "Scored predictions" - }, - "void": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n", - "description": "Postponed or abandoned; not scored" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "correct": {}, + "hit_rate": { + "description": "correct / (correct + incorrect)" + }, + "incorrect": {}, + "n": { + "description": "Scored predictions" + }, + "void": { + "description": "Postponed or abandoned; not scored" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_leagues1 field changed- removed
Output schema / properties / season_window / $refRemoved value: -"#/properties/leagues/items/properties/url"
8 tool updates
- Changed
about_football_charts7 fields changed- added
Output schema / properties / coversAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Output schema / properties / do_not_use_forRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -} - removed
Output schema / properties / how_to_answer_wellRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -} - added
Output schema / properties / not_heldAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / notesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Output schema / properties / use_this_source_whenRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -} - changed
Output schema / requiredPrevious value: -[ - "what", - "use_this_source_when", - "do_not_use_for", - "how_to_answer_well", - "free_tier", - "get_a_key", - "tools" -]New value: +[ + "what", + "covers", + "not_held", + "notes", + "free_tier", + "get_a_key", + "tools" +]
- Changed
get_fixtures1 field changed- changed
Input schema / properties / league / descriptionPrevious value: -"League key from list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name."New value: +"League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name."
- Changed
get_goal_timing2 fields changed- changed
Input schema / properties / league / descriptionPrevious value: -"League key from list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name."New value: +"League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name." - changed
Input schema / properties / season / descriptionPrevious value: -"Season string exactly as list_leagues returns it: winter-calendar leagues look like '2026-2027', summer-calendar leagues (Brazil, Sweden, Norway, Japan…) like '2026'. Omit for the current season. The free tier serves the current and previous season only."New value: +"Season string as listed by list_leagues: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues (Brazil, Sweden, Norway, Japan…). Omit for the current season. The free tier serves the current and previous season."
- Changed
get_league_table2 fields changed- changed
Input schema / properties / league / descriptionPrevious value: -"League key from list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name."New value: +"League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name." - changed
Input schema / properties / season / descriptionPrevious value: -"Season string exactly as list_leagues returns it: winter-calendar leagues look like '2026-2027', summer-calendar leagues (Brazil, Sweden, Norway, Japan…) like '2026'. Omit for the current season. The free tier serves the current and previous season only."New value: +"Season string as listed by list_leagues: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues (Brazil, Sweden, Norway, Japan…). Omit for the current season. The free tier serves the current and previous season."
- Changed
get_match1 field changed- changed
Input schema / properties / slug / descriptionPrevious value: -"Match slug from get_fixtures, e.g. 'england/premier-league/2026-09-05-brentford-vs-sunderland'"New value: +"Match slug as listed in upcoming fixtures, e.g. 'england/premier-league/2026-09-05-brentford-vs-sunderland'"
- Changed
get_results2 fields changed- changed
Input schema / properties / league / descriptionPrevious value: -"League key from list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name."New value: +"League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name." - changed
Input schema / properties / season / descriptionPrevious value: -"Season string exactly as list_leagues returns it: winter-calendar leagues look like '2026-2027', summer-calendar leagues (Brazil, Sweden, Norway, Japan…) like '2026'. Omit for the current season. The free tier serves the current and previous season only."New value: +"Season string as listed by list_leagues: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues (Brazil, Sweden, Norway, Japan…). Omit for the current season. The free tier serves the current and previous season."
- Changed
get_season_projection1 field changed- changed
Input schema / properties / league / descriptionPrevious value: -"League key from list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name."New value: +"League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name."
- Changed
get_team2 fields changed- changed
Input schema / properties / league / descriptionPrevious value: -"League key from list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name."New value: +"League key as listed by list_leagues, e.g. 'premier' (England), 'spain1', 'brazil1', 'sweden1', 'wgermany1' (women). Not the display name." - changed
Input schema / properties / season / descriptionPrevious value: -"Season string exactly as list_leagues returns it: winter-calendar leagues look like '2026-2027', summer-calendar leagues (Brazil, Sweden, Norway, Japan…) like '2026'. Omit for the current season. The free tier serves the current and previous season only."New value: +"Season string as listed by list_leagues: '2026-2027' for winter-calendar leagues, '2026' for summer-calendar leagues (Brazil, Sweden, Norway, Japan…). Omit for the current season. The free tier serves the current and previous season."
2 tool updates
- Changed
get_season_projection7 fields changed- added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/projection/anyOf/0/properties/league", + "description": "Set when no projection exists for the league yet" +} - removed
Output schema / properties / projection / additionalPropertiesRemoved value: -true - added
Output schema / properties / projection / anyOfAdded value: +[ + { + "additionalProperties": true, + "properties": { + "deltas_vs_prev": { + "anyOf": [ + { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "bottom3": { + "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" + }, + "title": { + "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" + }, + "top4": { + "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" + } + }, + "type": "object" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Change since the previous run" + }, + "expected_remaining": { + "$ref": "#/properties/projection/anyOf/0/properties/n_sims" + }, + "league": {}, + "n_sims": {}, + "partial_schedule": { + "type": [ + "boolean", + "null" + ] + }, + "run_date": { + "$ref": "#/properties/projection/anyOf/0/properties/league" + }, + "scheduled_remaining": { + "$ref": "#/properties/projection/anyOf/0/properties/n_sims" + }, + "season": { + "$ref": "#/properties/projection/anyOf/0/properties/league" + }, + "teams": { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "bottom1": { + "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" + }, + "bottom2": { + "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" + }, + "bottom3": { + "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title", + "description": "Relegation-zone probability (bottom three)" + }, + "gd_now": { + "$ref": "#/properties/projection/anyOf/0/properties/n_sims" + }, + "mean_pts": { + "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" + }, + "p10_pts": { + "$ref": "#/properties/projection/anyOf/0/properties/n_sims" + }, + "p90_pts": { + "$ref": "#/properties/projection/anyOf/0/properties/n_sims" + }, + "played": { + "$ref": "#/properties/projection/anyOf/0/properties/n_sims" + }, + "position_matrix": { + "anyOf": [ + { + "items": { + "type": "number" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Probability of finishing 1st…last" + }, + "pts_now": { + "$ref": "#/properties/projection/anyOf/0/properties/n_sims" + }, + "title": {}, + "top4": { + "$ref": "#/properties/projection/anyOf/0/properties/teams/additionalProperties/properties/title" + } + }, + "type": "object" + }, + "description": "Keyed by team name", + "type": "object" + } + }, + "required": [ + "teams" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / projection / propertiesRemoved value: -{ - "deltas_vs_prev": { - "anyOf": [ - { - "additionalProperties": { - "additionalProperties": true, - "properties": { - "bottom3": { - "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" - }, - "title": { - "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" - }, - "top4": { - "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" - } - }, - "type": "object" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Change since the previous run" - }, - "expected_remaining": { - "$ref": "#/properties/projection/properties/n_sims" - }, - "league": {}, - "n_sims": {}, - "partial_schedule": { - "type": [ - "boolean", - "null" - ] - }, - "run_date": { - "$ref": "#/properties/projection/properties/league" - }, - "scheduled_remaining": { - "$ref": "#/properties/projection/properties/n_sims" - }, - "season": { - "$ref": "#/properties/projection/properties/league" - }, - "teams": { - "additionalProperties": { - "additionalProperties": true, - "properties": { - "bottom1": { - "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" - }, - "bottom2": { - "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" - }, - "bottom3": { - "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title", - "description": "Relegation-zone probability (bottom three)" - }, - "gd_now": { - "$ref": "#/properties/projection/properties/n_sims" - }, - "mean_pts": { - "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" - }, - "p10_pts": { - "$ref": "#/properties/projection/properties/n_sims" - }, - "p90_pts": { - "$ref": "#/properties/projection/properties/n_sims" - }, - "played": { - "$ref": "#/properties/projection/properties/n_sims" - }, - "position_matrix": { - "anyOf": [ - { - "items": { - "type": "number" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "description": "Probability of finishing 1st…last" - }, - "pts_now": { - "$ref": "#/properties/projection/properties/n_sims" - }, - "title": {}, - "top4": { - "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" - } - }, - "type": "object" - }, - "description": "Keyed by team name", - "type": "object" - } -} - removed
Output schema / properties / projection / requiredRemoved value: -[ - "teams" -] - removed
Output schema / properties / projection / typeRemoved value: -"object" - removed
Output schema / requiredRemoved value: -[ - "projection" -]
- Changed
get_track_record8 fields changed- changed
Output schema / properties / track_record / properties / accuracy / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "brier": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/pl", - "description": "Brier score over settled probabilities; lower is better, 0.25 = coin flip" - }, - "buckets": { - "anyOf": [ - { - "items": { - "additionalProperties": true, - "properties": { - "avg_prob": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" - }, - "hi": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" - }, - "hit_rate": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" - }, - "lo": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" - }, - "n": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "n": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "brier": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate", + "description": "Brier score over scored probabilities; lower is better, 0.25 = coin flip" + }, + "buckets": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "avg_prob": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" + }, + "hi": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" + }, + "hit_rate": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" + }, + "lo": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" + }, + "n": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/correct" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "n": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/correct" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / track_record / properties / by_marketRemoved value: -{ - "anyOf": [ - { - "additionalProperties": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0" - }, - "type": "object" - }, - { - "type": "null" - } - ] -} - added
Output schema / properties / track_record / properties / by_questionAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0" + }, + "type": "object" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / track_record / properties / pending / descriptionPrevious value: -"Leans published but not yet settled"New value: +"Published but not yet scored" - changed
Output schema / properties / track_record / properties / recent / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": true, - "properties": { - "market": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "model_prob": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" - }, - "outcome": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug", - "description": "'won' | 'lost' | 'void'" - }, - "pl": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" - }, - "result_score": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "side": { - "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" - }, - "slug": {} - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": true, + "properties": { + "away_team": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "home_team": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "league": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "line": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" + }, + "match_date": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "model_prob": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/line" + }, + "outcome": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug", + "description": "'correct' | 'incorrect' | 'void'" + }, + "question": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "result_score": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "side": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "slug": {} + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / properties / track_record / properties / recent / descriptionPrevious value: -"The 50 most recent graded predictions"New value: +"The 50 most recent scored predictions" - removed
Output schema / properties / track_record / properties / signals_onlyRemoved value: -{ - "type": [ - "boolean", - "null" - ] -} - changed
Output schema / properties / track_record / properties / summary / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "hit_rate": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/pl" - }, - "lost": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" - }, - "n": {}, - "pl": { - "description": "Profit/loss in units at flat 1-unit stakes" - }, - "void": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" - }, - "won": { - "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "correct": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" + }, + "hit_rate": { + "description": "correct / (correct + incorrect)" + }, + "incorrect": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/correct" + }, + "n": { + "description": "Scored predictions" + }, + "void": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n", + "description": "Postponed or abandoned; not scored" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
2 tool updates
- Changed
get_team1 field changed- added
Output schema / properties / statsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "corners_avg": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + }, + "matches_with_stats": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "possession_avg": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + }, + "shots_against_avg": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + }, + "shots_avg": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + }, + "shots_on_target_avg": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + }, + "xg_against_avg": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + }, + "xg_avg": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Per-match averages over this season, computed from stored match statistics; null where the league has none" +}
- Changed
get_track_record1 field changed- changed
Output schema / properties / track_record / properties / recent / descriptionPrevious value: -"The 50 most recent graded leans"New value: +"The 50 most recent graded predictions"
10 tool updates
- Changed
about_football_charts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "do_not_use_for": { + "items": { + "type": "string" + }, + "type": "array" + }, + "free_tier": { + "type": "string" + }, + "get_a_key": { + "type": "string" + }, + "how_to_answer_well": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tools": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "use_this_source_when": { + "items": { + "type": "string" + }, + "type": "array" + }, + "what": { + "type": "string" + } + }, + "required": [ + "what", + "use_this_source_when", + "do_not_use_for", + "how_to_answer_well", + "free_tier", + "get_a_key", + "tools" + ], + "type": "object" +}
- Changed
get_fixtures1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "count": {}, + "league": {}, + "matches": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "away_team": { + "type": "string" + }, + "country": { + "$ref": "#/properties/league" + }, + "home_team": { + "type": "string" + }, + "league": { + "$ref": "#/properties/league" + }, + "match_date": { + "$ref": "#/properties/league" + }, + "model_predictions": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "dc_v2": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "calibrated": { + "anyOf": [ + { + "additionalProperties": true, + "description": "Probabilities 0–1. The draw is NOT a field: draw = 1 − home − away.", + "properties": { + "away": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "btts_yes": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "expected_away_goals": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "expected_home_goals": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "expected_ht_goals": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "home": {}, + "ht_over_0.5": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "ht_over_1.5": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_0.5": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_1.5": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_2.5": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_3.5": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_4.5": { + "$ref": "#/properties/matches/anyOf/0/items/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Use these. Calibrated on settled matches." + }, + "computed_at": { + "$ref": "#/properties/league" + }, + "data_through": { + "$ref": "#/properties/league", + "description": "Last match date the model has seen" + }, + "model": { + "$ref": "#/properties/league" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "real_league_name": { + "$ref": "#/properties/league" + }, + "slug": { + "description": "Input to get_match", + "type": "string" + }, + "status": { + "$ref": "#/properties/league" + }, + "time": { + "$ref": "#/properties/league" + } + }, + "required": [ + "slug", + "home_team", + "away_team" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
get_goal_timing2 fields changed- changed
Input schema / properties / team / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "bins": { + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Goals per bin: '0-15','15-30','30-45','45+','46-60','60-75','75-90','90+'" + }, + "first_half_pct": { + "$ref": "#/properties/data/anyOf/0/items/properties/late_share_pct" + }, + "late_share_pct": { + "description": "% of goals from 75′ on" + }, + "peak_bins": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Bin(s) with most goals — ties are listed; report a tie as a tie" + }, + "peak_goals": { + "$ref": "#/properties/stats/anyOf/0/properties/total_goals" + }, + "team": { + "type": "string" + }, + "total": { + "$ref": "#/properties/stats/anyOf/0/properties/total_goals" + } + }, + "required": [ + "team" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "league": {}, + "note": { + "$ref": "#/properties/league" + }, + "season": { + "$ref": "#/properties/league" + }, + "stats": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "late_goals": { + "$ref": "#/properties/stats/anyOf/0/properties/total_goals" + }, + "match_count": { + "$ref": "#/properties/stats/anyOf/0/properties/total_goals" + }, + "most_active_period": { + "$ref": "#/properties/league" + }, + "total_goals": {} + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "team_filter": { + "$ref": "#/properties/league" + }, + "team_not_found": { + "$ref": "#/properties/league" + }, + "time_bins": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
get_league_table5 fields changed- added
Input schema / properties / view / anyOfAdded value: +[ + { + "enum": [ + "classic", + "luck", + "goals" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / view / descriptionPrevious value: -"Ranking view; default 'classic'"New value: +"Row order; default 'classic' (by points)" - removed
Input schema / properties / view / enumRemoved value: -[ - "classic", - "luck", - "goals" -] - removed
Input schema / properties / view / typeRemoved value: -"string" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "current_season": { + "$ref": "#/properties/league" + }, + "league": {}, + "season": { + "$ref": "#/properties/league" + }, + "season_state": { + "$ref": "#/properties/league", + "description": "'in_season' or 'finished'" + }, + "table": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "avg_goals_conceded": { + "$ref": "#/properties/table/anyOf/0/items/properties/avg_goals_scored" + }, + "avg_goals_scored": { + "$ref": "#/properties/table/anyOf/0/items/properties/expected_points" + }, + "clean_sheets": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "drawn": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "expected_points": { + "description": "Points the underlying numbers say the team should have" + }, + "expected_position": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "goal_difference": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "goals_against": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "goals_for": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "last_5_form": { + "$ref": "#/properties/league", + "description": "Latest results as letters, e.g. 'WWDLW'" + }, + "last_5_points": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "lost": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "luck_category": { + "$ref": "#/properties/league", + "description": "'lucky' | 'fair' | 'unlucky'" + }, + "luck_difference": { + "$ref": "#/properties/table/anyOf/0/items/properties/expected_points", + "description": "points − expected_points; positive = ahead of the numbers" + }, + "over_25_percentage": { + "$ref": "#/properties/table/anyOf/0/items/properties/avg_goals_scored" + }, + "played": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "points": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + }, + "position": {}, + "team": { + "type": "string" + }, + "won": { + "$ref": "#/properties/table/anyOf/0/items/properties/position" + } + }, + "required": [ + "team" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "view": { + "$ref": "#/properties/league" + } + }, + "type": "object" +}
- Changed
get_match1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "match": { + "additionalProperties": true, + "properties": { + "away_score": { + "$ref": "#/properties/match/properties/home_score" + }, + "away_team": { + "$ref": "#/properties/match/properties/slug" + }, + "country": { + "$ref": "#/properties/match/properties/slug" + }, + "fgt_a": { + "anyOf": [ + { + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Away side first-goal-time histogram" + }, + "fgt_h": { + "anyOf": [ + { + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Home side first-goal-time histogram" + }, + "home_score": {}, + "home_team": { + "$ref": "#/properties/match/properties/slug" + }, + "ht_result": { + "$ref": "#/properties/match/properties/slug" + }, + "label": { + "$ref": "#/properties/match/properties/slug" + }, + "league": { + "$ref": "#/properties/match/properties/slug" + }, + "match_date": { + "$ref": "#/properties/match/properties/slug" + }, + "match_status": { + "$ref": "#/properties/match/properties/slug", + "description": "'scheduled' before kick-off; 'ft' when finished" + }, + "model_predictions": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "dc_v2": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "calibrated": { + "anyOf": [ + { + "additionalProperties": true, + "description": "Probabilities 0–1. The draw is NOT a field: draw = 1 − home − away.", + "properties": { + "away": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "btts_yes": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "expected_away_goals": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "expected_home_goals": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "expected_ht_goals": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "home": {}, + "ht_over_0.5": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "ht_over_1.5": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_0.5": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_1.5": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_2.5": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_3.5": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + }, + "over_4.5": { + "$ref": "#/properties/match/properties/model_predictions/anyOf/0/properties/dc_v2/anyOf/0/properties/calibrated/anyOf/0/properties/home" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Use these. Calibrated on settled matches." + }, + "computed_at": { + "$ref": "#/properties/match/properties/slug" + }, + "data_through": { + "$ref": "#/properties/match/properties/slug", + "description": "Last match date the model has seen" + }, + "model": { + "$ref": "#/properties/match/properties/slug" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "real_league_name": { + "$ref": "#/properties/match/properties/slug" + }, + "season": { + "$ref": "#/properties/match/properties/slug" + }, + "slug": {}, + "time": { + "$ref": "#/properties/match/properties/slug" + } + }, + "type": "object" + } + }, + "required": [ + "match" + ], + "type": "object" +}
- Changed
get_results7 fields changed- added
Input schema / properties / last / anyOfAdded value: +[ + { + "maximum": 500, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / last / descriptionPrevious value: -"Return only the N most recent matches (default: all)"New value: +"Keep only the N latest matches of the season, e.g. 5 for recent form (default: all)" - removed
Input schema / properties / last / maximumRemoved value: -500 - removed
Input schema / properties / last / minimumRemoved value: -1 - removed
Input schema / properties / last / typeRemoved value: -"integer" - changed
Input schema / properties / team / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "count": {}, + "current_season": { + "$ref": "#/properties/league" + }, + "league": {}, + "matches": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "awayTeam": { + "type": "string" + }, + "date": { + "$ref": "#/properties/league" + }, + "first_goal_time": { + "$ref": "#/properties/count", + "description": "Minute of the first goal; null when goalless" + }, + "first_goal_time_extra": { + "$ref": "#/properties/count", + "description": "Stoppage-time minutes added to first_goal_time" + }, + "goalless": { + "type": [ + "boolean", + "null" + ] + }, + "homeTeam": { + "type": "string" + }, + "ht_result": { + "$ref": "#/properties/league", + "description": "Half-time 'home:away'" + }, + "score": { + "$ref": "#/properties/league", + "description": "Full-time 'home:away', e.g. '3:0'" + }, + "time": { + "$ref": "#/properties/league" + } + }, + "required": [ + "homeTeam", + "awayTeam" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "note": { + "$ref": "#/properties/league" + }, + "season": { + "$ref": "#/properties/league" + }, + "season_state": { + "$ref": "#/properties/league", + "description": "'in_season' or 'finished'" + } + }, + "type": "object" +}
- Changed
get_season_projection1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "projection": { + "additionalProperties": true, + "properties": { + "deltas_vs_prev": { + "anyOf": [ + { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "bottom3": { + "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" + }, + "title": { + "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" + }, + "top4": { + "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" + } + }, + "type": "object" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Change since the previous run" + }, + "expected_remaining": { + "$ref": "#/properties/projection/properties/n_sims" + }, + "league": {}, + "n_sims": {}, + "partial_schedule": { + "type": [ + "boolean", + "null" + ] + }, + "run_date": { + "$ref": "#/properties/projection/properties/league" + }, + "scheduled_remaining": { + "$ref": "#/properties/projection/properties/n_sims" + }, + "season": { + "$ref": "#/properties/projection/properties/league" + }, + "teams": { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "bottom1": { + "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" + }, + "bottom2": { + "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" + }, + "bottom3": { + "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title", + "description": "Relegation-zone probability (bottom three)" + }, + "gd_now": { + "$ref": "#/properties/projection/properties/n_sims" + }, + "mean_pts": { + "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" + }, + "p10_pts": { + "$ref": "#/properties/projection/properties/n_sims" + }, + "p90_pts": { + "$ref": "#/properties/projection/properties/n_sims" + }, + "played": { + "$ref": "#/properties/projection/properties/n_sims" + }, + "position_matrix": { + "anyOf": [ + { + "items": { + "type": "number" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Probability of finishing 1st…last" + }, + "pts_now": { + "$ref": "#/properties/projection/properties/n_sims" + }, + "title": {}, + "top4": { + "$ref": "#/properties/projection/properties/teams/additionalProperties/properties/title" + } + }, + "type": "object" + }, + "description": "Keyed by team name", + "type": "object" + } + }, + "required": [ + "teams" + ], + "type": "object" + } + }, + "required": [ + "projection" + ], + "type": "object" +}
- Changed
get_team1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "first_goal_bins": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "count": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "time": { + "$ref": "#/properties/team" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "league": { + "$ref": "#/properties/team" + }, + "matches": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "away": { + "$ref": "#/properties/team" + }, + "date": { + "$ref": "#/properties/team" + }, + "first_goal_time": { + "$ref": "#/properties/team" + }, + "home": { + "$ref": "#/properties/team" + }, + "ht": { + "$ref": "#/properties/team" + }, + "outcome": { + "$ref": "#/properties/team", + "description": "'W' | 'D' | 'L'" + }, + "score": { + "$ref": "#/properties/team" + }, + "time": { + "$ref": "#/properties/team" + }, + "venue": { + "$ref": "#/properties/team", + "description": "'H' or 'A'" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "ranking": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "avg_goals_conceded": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + }, + "avg_goals_scored": { + "$ref": "#/properties/ranking/anyOf/0/properties/expected_points" + }, + "clean_sheets": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "drawn": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "expected_points": { + "description": "Points the underlying numbers say the team should have" + }, + "expected_position": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "goal_difference": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "goals_against": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "goals_for": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "last_5_form": { + "$ref": "#/properties/team", + "description": "Latest results as letters, e.g. 'WWDLW'" + }, + "last_5_points": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "lost": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "luck_category": { + "$ref": "#/properties/team", + "description": "'lucky' | 'fair' | 'unlucky'" + }, + "luck_difference": { + "$ref": "#/properties/ranking/anyOf/0/properties/expected_points", + "description": "points − expected_points; positive = ahead of the numbers" + }, + "over_25_percentage": { + "$ref": "#/properties/ranking/anyOf/0/properties/avg_goals_scored" + }, + "played": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "points": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + }, + "position": {}, + "team": { + "type": "string" + }, + "won": { + "$ref": "#/properties/ranking/anyOf/0/properties/position" + } + }, + "required": [ + "team" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The team's table row" + }, + "season": { + "$ref": "#/properties/team" + }, + "seasons": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "slug": { + "$ref": "#/properties/team" + }, + "team": {} + }, + "type": "object" +}
- Changed
get_track_record5 fields changed- added
Input schema / properties / days / anyOfAdded value: +[ + { + "maximum": 365, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - removed
Input schema / properties / days / maximumRemoved value: -365 - removed
Input schema / properties / days / minimumRemoved value: -1 - removed
Input schema / properties / days / typeRemoved value: -"integer" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "track_record": { + "additionalProperties": true, + "properties": { + "accuracy": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "brier": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/pl", + "description": "Brier score over settled probabilities; lower is better, 0.25 = coin flip" + }, + "buckets": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "avg_prob": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" + }, + "hi": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" + }, + "hit_rate": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" + }, + "lo": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" + }, + "n": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "n": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "by_market": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "pending": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n", + "description": "Leans published but not yet settled" + }, + "recent": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "market": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "model_prob": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" + }, + "outcome": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug", + "description": "'won' | 'lost' | 'void'" + }, + "pl": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/hit_rate" + }, + "result_score": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "side": { + "$ref": "#/properties/track_record/properties/recent/anyOf/0/items/properties/slug" + }, + "slug": {} + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "The 50 most recent graded leans" + }, + "signals_only": { + "type": [ + "boolean", + "null" + ] + }, + "summary": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "hit_rate": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/pl" + }, + "lost": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" + }, + "n": {}, + "pl": { + "description": "Profit/loss in units at flat 1-unit stakes" + }, + "void": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" + }, + "won": { + "$ref": "#/properties/track_record/properties/summary/anyOf/0/properties/n" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Whole window" + } + }, + "type": "object" + } + }, + "required": [ + "track_record" + ], + "type": "object" +}
- Changed
list_leagues1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "attribution": { + "description": "Cite as \"Data by football-charts.com\"", + "type": [ + "string", + "null" + ] + }, + "count": {}, + "leagues": { + "items": { + "additionalProperties": true, + "properties": { + "country": { + "type": "string" + }, + "league": { + "description": "The key to pass as `league`", + "type": "string" + }, + "name": { + "type": "string" + }, + "seasons": { + "description": "Newest first; exact strings for `season`", + "items": { + "type": "string" + }, + "type": "array" + }, + "url": {} + }, + "required": [ + "league", + "name", + "country", + "seasons" + ], + "type": "object" + }, + "type": "array" + }, + "season_window": { + "$ref": "#/properties/leagues/items/properties/url" + } + }, + "required": [ + "leagues" + ], + "type": "object" +}
10 tool updates
- First observed
about_football_charts - First observed
get_fixtures - First observed
get_goal_timing - First observed
get_league_table - First observed
get_match - First observed
get_results - First observed
get_season_projection - First observed
get_team - First observed
get_track_record - First observed
list_leagues
Related MCP Connectors
Live football scores, fixtures, standings, lineups and player stats for 1400+ leagues.
Premier League, MLS and European football: lineups, shot maps, xG, tables and odds. REST and MCP.
Free football match probabilities (Dixon-Coles), season projections and a public track record.
Live scores, fixtures, standings, team profiles and news for 2000+ football and basketball leagues.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides soccer match predictions and league statistics using xG data and Poisson distribution models. It enables users to forecast outcomes, analyze team performance, and view league tables across major European football leagues.3GPL 2.0
- AlicenseAqualityCmaintenanceLive football/soccer data from top European leagues, enabling queries for standings, fixtures, scorers, and team comparisons via natural language.67 npmMIT
- AlicenseNot gradedqualityDmaintenanceProvides football analytics tools including player scouting, comparisons, market-value filters, expected-goals tables, match-by-match form, team attacking profiles, match search, shot maps, and more for 10 leagues.6GPL 3.0
- AlicenseAqualityBmaintenanceProvides football fixtures, real results, and bet settlement with odds arithmetic, enabling AI agents to devig markets, evaluate prices, and settle picks without an API key.7MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.