Skip to main content
Glama
bundesliga-mcp

bundesliga-mcp

bundesliga-mcp ⚽

mcp-name: io.github.mohammad-abbasi-sh/bundesliga-mcp

Unofficial read-only MCP server for German football via the free OpenLigaDB API — Bundesliga fixtures, live scores, tables and top scorers. No key, no login.

Built by Mohammad Abbasi as part of the "Germany MCP factory" (Sepehr-style pipeline). Not affiliated with OpenLigaDB or the DFL.

For AI agents

Add to your MCP client config (stdio):

{
  "mcpServers": {
    "bundesliga": {
      "command": "uvx",
      "args": ["bundesliga-mcp"]
    }
  }
}

Or run locally: python -m bundesliga_mcp.server (needs mcp<2, httpx).

Related MCP server: matchday-mcp

Tools

Tool

Description

bundesliga_list_leagues

Leagues with their current season — bl1, bl2, bl3, dfb, del, bbl, hbl

bundesliga_get_fixtures

One matchday's fixtures/results — league (default bl1), season (default current, e.g. "2026"), matchday (default current, 1..34)

bundesliga_get_live_scores

Current matchday: score + status (finished/live/scheduled) per match — league

bundesliga_get_table

League table — league, season (default current)

bundesliga_get_top_scorers

Top scorers of a season — league, season (default current), limit 1..50

bundesliga_get_match_detail

Full detail of one match (score, goals with minutes/scorers, venue) — match_id, league, season

Example output (bundesliga_get_table / bl1, season 2026):

{"league": "bl1", "season": "2026", "count": 18, "table": [
  {"position": 1, "team": "FC Bayern München", "short": "Bayern",
   "played": 9, "won": 6, "drawn": 3, "lost": 0,
   "goals_for": 29, "goals_against": 9, "goal_diff": 20, "points": 21},
  ...]}

Notes:

  • A season defaults to the current one (resolved live from the league list); a matchday defaults to the current matchday.

  • Top scorers are aggregated from the per-match goal events (own goals excluded) — the API's own goalscorer endpoint returns 404, so the server counts the goals itself.

  • bbl/hbl have no league entry published yet — their tools return empty results until OpenLigaDB publishes them. DEL (ice hockey) works the same way as the football leagues.

  • Data: OpenLigaDB public API — no key, no login, read-only. Data under the Open Database License (ODbL).

Development

python3 -m venv .venv && .venv/bin/pip install "mcp<2" httpx pytest
.venv/bin/python -m pytest tests/ -q
  • tests/test_football.py — offline, parses real captured API fixtures (20 tests)

  • tests/test_live.py — cautious live requests against api.openligadb.de (7 tests)

Tests: 27/27 green (20 offline + 7 live, 2026-11-09).

License

MIT

Available Tools

6 tools
bundesliga_get_fixturesA

Fixtures/results of one matchday. league: bl1/bl2/bl3/dfb/del/bbl/hbl. season: e.g. "2026" (default: current). matchday: 1..34 (default: current).

NameRequiredDescriptionDefault
leagueNobl1
seasonNo
matchdayNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden, and it discloses almost nothing beyond parameters: no statement that this is a read-only operation, no pagination or response-size behavior, and no clarification of edge cases such as cup competitions (dfb/del) or non-football leagues (bbl/hbl) that do not follow the 1..34 matchday model. The "default: current" resolution is the only behavioral fact added, and it is thin for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence plus two clause fragments, front-loaded with the purpose and then parameter facts in a predictable order — nothing is wasted. The telegraphic style ("e.g. "2026"") is efficient but occasionally cryptic, e.g. it is unclear whether the season value is a start year or a label.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 describe return values, and its parameter documentation is excellent. What is missing for a 3-parameter, multi-league tool with no annotations is the selection context against five sibling tools and any note on how cup/other-sport leagues behave, leaving the definition adequate but incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the schema declares no enums, yet the description supplies the full value set for league (bl1/bl2/bl3/dfb/del/bbl/hbl), a season format example, the matchday range 1..34, and the default behavior for all three. Without it the league parameter would be an unconstrained free-form string, so this fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Fixtures/results of one matchday" names a specific resource and scope, and the matchday/season parameters make it clearly distinct from bundesliga_get_live_scores and bundesliga_get_match_detail without opening the schema. It stops short of explicitly naming the siblings it is not, so a 4 rather than a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied through defaults: "default: current" tells an agent that calling with no arguments yields the current matchday, which is genuine guidance. However, there is no statement of when to prefer this over bundesliga_get_live_scores (in-play) or bundesliga_get_match_detail (single match), and no prerequisites or exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bundesliga_get_live_scoresA

Current matchday: scores and status (finished/live/scheduled) for each match. league: bl1/bl2/bl3/dfb/del/bbl/hbl.

NameRequiredDescriptionDefault
leagueNobl1

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It discloses the current-matchday scope and the possible status categories, but does not mention permissions, rate limits, or other behavioral details; the existing output schema reduces the need to describe return values.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two compact sentences with no wasted wording. The core purpose is front-loaded, followed by the league-code clarification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with an output schema, the description provides enough context to call it correctly: it states the matchday scope, the status categories returned, and the allowed league values. Minor omissions like default behavior and sibling routing keep it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate for the undocumented league parameter. It does so by enumerating valid league codes (bl1/bl2/bl3/dfb/del/bbl/hbl), adding substantial meaning beyond the bare string schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and scope: scores and status for each match on the current matchday. It clarifies that results include finished, live, and scheduled matches, which helps distinguish it from a pure live-score feed, though it does not explicitly name sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'Current matchday' and the score/status focus, but there is no explicit guidance on when to use this instead of bundesliga_get_fixtures or bundesliga_get_match_detail. No exclusions or alternatives are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bundesliga_get_match_detailA

Full detail of one match: score, goals with minutes and scorers, venue. match_id: from get_fixtures / get_live_scores. league: bl1/bl2/bl3/dfb/del/bbl/hbl. season: e.g. "2026" (default: current).

NameRequiredDescriptionDefault
leagueNobl1
seasonNo
match_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses the return content and the 'default: current' season behavior, which is useful, but says nothing about read-only nature, error behavior for invalid match_id, or coverage of leagues beyond the listed codes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, front-loaded with the return payload followed by per-parameter notes. No filler sentences; every element adds information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 needn't be explained, and all three parameters receive some guidance including the default season. The only gap is the unexpanded league abbreviations and no failure-mode notes for a nonexistent match_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: it supplies the league code list (bl1/bl2/bl3/dfb/del/bbl/hbl) that the schema lacks as an enum, gives a season format example and default, and explains match_id provenance. It does not expand what each league code means, leaving some ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource and scope: full detail of one match, enumerating what is returned (score, goal minutes/scorers, venue). It is clearly distinct from sibling list tools like get_fixtures and get_live_scores, though it does not explicitly state the contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It tells the agent where match_id comes from (get_fixtures / get_live_scores), which is an actionable workflow hint linking it to siblings. It lacks explicit when-not-to-use guidance, but for a single-record detail lookup the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bundesliga_get_tableC

League table. league: bl1/bl2/bl3/dfb/del/bbl/hbl. season: e.g. "2026" (default: current).

NameRequiredDescriptionDefault
leagueNobl1
seasonNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden, yet it says nothing about read-only nature, data freshness, auth needs, rate limits or pagination. The presence of an output schema covers the return shape, but the operational behavior is entirely undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact fragments, front-loaded with the resource and then the parameters; nothing is padded or redundant. It is telegraphic to the point of omitting basic framing, but no sentence wastes space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 explained, and the zero-coverage parameters are largely rescued by the inline code list. Still missing are decoding of the league abbreviations and any signal about when to prefer this over scoring or fixture siblings, which leaves the definition merely adequate for a multi-competition lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description does real work: it enumerates the seven accepted league codes (bl1/bl2/bl3/dfb/del/bbl/hbl) that appear nowhere in the schema, and gives the season format example "2026" plus its current-season default. The gap is that the codes themselves are never expanded (bl1 vs del vs bbl), leaving the agent to guess which competition each represents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is a bare noun phrase, "League table." – it identifies the resource (standings) but supplies no verb or scope statement, so the agent must infer from the name that it returns a table of standings. It is distinguishable from fixtures/live scores/match detail by resource, but the overlap with bundesliga_get_top_scorers is not addressed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no mention of alternatives among the five sibling tools. The only contextual hint is the implicit default (current season), which is thin for a tool whose league scope spans football, cup, hockey, basketball and handball competitions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bundesliga_get_top_scorersA

Top scorers of a season, aggregated from match goal events (own goals excluded). league: bl1/bl2/bl3/dfb/del/bbl/hbl. season: e.g. "2026" (default: current). limit: 1..50.

NameRequiredDescriptionDefault
limitNo
leagueNobl1
seasonNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden. It does add genuinely useful behavior: the ranking is derived from match goal events with own goals excluded, which tells the agent what the numbers mean. It omits ordering direction, tie handling, and whether limit truncates, but the output schema covers return-shape concerns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource definition, then parameter facts in a compact list; every clause carries information. The density of unexplained abbreviations (bl1, dfb, del, bbl, hbl) slightly hurts readability, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter read tool with an output schema, this covers the essentials: what is counted, what is excluded, and the allowed values for each input. Only minor details (sort order, tie behavior at the limit boundary) are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and largely does: it enumerates all seven league codes, gives the season format with its default, and adds a 1..50 range for limit that the schema lacks. The gaps are that the league codes are not decoded (bl1 vs bbl vs hbl) and the schema's limit default of 10 is not restated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Top scorers of a season" names a specific resource and implicitly a ranked list, and the note about aggregation from match goal events makes the output's meaning unambiguous. It does not explicitly contrast with siblings like bundesliga_get_table, but the resource is distinct enough that confusion is unlikely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the purpose statement; there is no explicit "use this when..." clause, no mention of when to use get_table or get_match_detail instead. The defaults for season and league give enough context that an agent can call it correctly, but selection guidance 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.

bundesliga_list_leaguesA

Leagues this server knows, with their current season (bl1, bl2, bl3, dfb, del, bbl, hbl).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. Listing static reference data ('leagues this server knows') implies a safe, side-effect-free read, but it never states read-only behavior, whether results are cached, or that the set is fixed. For a trivial zero-parameter lookup the risk is low, so a 3 is fair rather than a 1-2.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the core content (the league codes) front-loaded, and zero filler. Nothing could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 needn't explain return values, and with zero parameters there is no input to document. What it does deliver — the exact league identifiers — is the key knowledge an agent needs to call sibling tools, though it could note the season string format to be fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so there is nothing to clarify; per the baseline, zero params scores 4. The description adds no parameter meaning because none exists, and it does not need to.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource ('Leagues this server knows') and enumerates the exact league codes returned (bl1, bl2, bl3, dfb, del, bbl, hbl), which lets an agent immediately distinguish it from siblings like get_fixtures or get_table. It lacks an explicit verb such as 'list' or 'returns', so it reads as a noun phrase rather than a stated action, which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use statement and no named alternative, but by presenting a set of short league identifiers alongside 'current season', the description strongly implies a discovery/lookup role for the other tools. Usage is inferable rather than stated, which matches a 3.

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.

  1. 6 tool updatesv0.1.0
    • First observedbundesliga_get_fixtures
    • First observedbundesliga_get_live_scores
    • First observedbundesliga_get_match_detail
    • First observedbundesliga_get_table
    • First observedbundesliga_get_top_scorers
    • First observedbundesliga_list_leagues

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation4/5

Each tool targets a distinct output: league listing, matchday fixtures, live scores/status, table, top scorers, and single-match detail. The main overlap is between get_fixtures and get_live_scores, since both concern the current matchday, but the descriptions differentiate schedule/results from live status reasonably well.

Naming Consistency5/5

All six tools use a uniform bundesliga_ prefix followed by a snake_case verb_noun pattern (list_leagues, get_fixtures, get_live_scores, get_table, get_top_scorers, get_match_detail). No deviations in style or casing.

Tool Count5/5

Six tools is well-scoped for a league-data server, with each tool covering a clear facet (leagues, fixtures, live scores, table, scorers, match detail). Nothing feels redundant or missing at the count level.

Completeness4/5

Core lifecycle coverage is solid: leagues, fixtures, live scores, standings, scorers, and per-match detail are all present. Minor gaps exist, such as team-level lookups or player/team profile queries, but agents can work around them via existing tools.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying community-run, keyless football/soccer match data from OpenLigaDB through natural language or direct tool calls.
    299 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Live football/soccer data from top European leagues, enabling queries for standings, fixtures, scorers, and team comparisons via natural language.
    6
    9 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables natural language querying of football/soccer data via the API-Football service, providing access to leagues, teams, players, fixtures, standings, and statistics.
    2
    -
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to query live football data, including fixtures, live scores, standings, statistics, betting odds, and full odds movement history for corner and card lines.
    11
    40 npm
    MIT