Skip to main content
Glama
jjaquezito

Football Intelligence MCP

by jjaquezito

Football Intelligence MCP

Ein lokaler Model Context Protocol-Server, der jedem MCP-Host – Claude Desktop, Claude Code oder einem eigenen Chatbot – Zugriff auf eine kuratierte historische Fußballdatenbank mit 36.982 Spielen aus den sieben besten europäischen Wettbewerben von 2010 bis 2025 bietet.

Das Protokoll ist direkt über JSON-RPC 2.0 implementiert, ohne ein MCP-SDK zu verwenden: Jede Nachricht wird manuell gemäß der 2025-06-18-Spezifikation erstellt und geparst.

Was in der Datenbank enthalten ist

Die Daten stammen ursprünglich von API-Football und wurden in PostgreSQL normalisiert.

Wettbewerb

Liga-ID

Saisons

Premier League

39

2010–2025

La Liga

140

2010–2025

Serie A

135

2010–2025

Bundesliga

78

2010–2025

Ligue 1

61

2010–2025

Primeira Liga

94

2010–2025

UEFA Champions League

2

2011–2025

Tabelle

Zeilen

fixtures

36.982

fixture_events

476.186

fixture_player_statistics

881.739

lineup_players

1.436.165

fixture_team_statistics

51.822

players

26.996

standings

2.329

Bekannte Abdeckungsgrenzen

Der Server meldet diese, anstatt zu raten, und Sie sollten es auch tun:

  • Spielstatistiken beginnen 2015. Die Saisons 2010–2014 enthalten Ergebnisse, Tore, Ereignisse und Aufstellungen, aber keine Schüsse, Ballbesitz- oder Passdaten.

  • Expected Goals (xG) gibt es erst ab 2023 und nie für die Champions League.

  • Aufstellungs- und Trainerdaten beginnen 2015.

  • Bei 58 Spielen (0,16 %) fehlt ein Tor in der Ereignisliste – eine Lücke in API-Football. Die Endergebnisse sind davon nicht betroffen; sie stammen aus dem Spielbericht, nicht aus der Summierung von Ereignissen.

Rufen Sie das Tool data_coverage auf, um zu prüfen, was für eine beliebige Liga und Saison vorhanden ist.

Installation

Erfordert Python 3.10+ und PostgreSQL 14+.

git clone https://github.com/jaq23369/football-intelligence-mcp.git
cd football-intelligence-mcp

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

createdb football
pg_restore -d football data/football.dump

cp .env.example .env      # edit DATABASE_URL if your setup differs

Überprüfen Sie die Wiederherstellung:

psql -d football -c "SELECT count(*) FROM fixtures;"
#  count
# -------
#  36982

Den Server ausführen

python server.py

Der Server spricht JSON-RPC über stdio. Er wird normalerweise von einem MCP-Host gestartet und nicht von Hand, aber Sie können ihn direkt steuern:

printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"manual","version":"1.0"}}}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
  | python server.py

Claude Desktop

Fügen Sie Folgendes zu claude_desktop_config.json hinzu:

{
  "mcpServers": {
    "football": {
      "command": "/absolute/path/to/football-intelligence-mcp/.venv/bin/python",
      "args": ["/absolute/path/to/football-intelligence-mcp/server.py"]
    }
  }
}

Claude Code

claude mcp add football -- /absolute/path/to/.venv/bin/python /absolute/path/to/server.py

Protokoll

Transport: stdio, zeilenumbruchgetrenntes JSON. Protokollversion 2025-06-18.

Methode

Hinweise

initialize

Handshake. Gibt serverInfo und Fähigkeiten zurück.

notifications/initialized

Client-Benachrichtigung. Keine id, keine Antwort.

ping

Lebenszeichenprüfung. Gibt {} zurück.

tools/list

Gibt die elf Tool-Definitionen zurück.

tools/call

Führt ein Tool aus.

Fehler folgen JSON-RPC 2.0: -32700 Parse-Fehler, -32600 ungültige Anfrage, -32601 Methode nicht gefunden, -32602 ungültige Parameter, -32603 interner Fehler.

Fehler auf Tool-Ebene sind keine JSON-RPC-Fehler – sie geben ein normales Ergebnis mit isError: true zurück, damit das Modell die Nachricht lesen und sich erholen kann.

stdout überträgt nur JSON-RPC. Alle Diagnosen gehen an stderr.

Tools

search_team

Findet Teams anhand von Teilnamen, sortiert nach der Anzahl der gespeicherten Spiele. Rufen Sie dies zuerst auf – jedes andere Team-Tool benötigt eine team_id.

Parameter

Typ

Erforderlich

Standard

query

string

ja

limit

integer

nein

10

{"name": "search_team", "arguments": {"query": "Liverpool", "limit": 1}}
[{"team_id": 40, "name": "Liverpool", "country": "England",
  "founded": 1892, "partidos": 762,
  "primera_temporada": 2010, "ultima_temporada": 2025}]

search_player

Findet Spieler anhand des Namens, sortiert nach gespielten Minuten.

Parameter

Typ

Erforderlich

Standard

query

string

ja

limit

integer

nein

10

get_match

Vollständiger Spielbericht: Ergebnis, Austragungsort, Schiedsrichter, Statistiken pro Team und jedes Tor mit Minute und Vorlage. Spiele vor 2015 geben einen expliziten Hinweis zurück, anstatt leerer Statistiken.

Parameter

Typ

Erforderlich

fixture_id

integer

ja

get_team_form

Aktuelle Form: Serie, Punkte, Tore für und gegen.

before beschränkt die Berechnung auf Spiele, die strikt vor diesem Datum liegen, sodass Sie den Zustand eines Teams zu jedem vergangenen Zeitpunkt rekonstruieren können. Dies ist der Schutz gegen Look-Ahead-Bias beim Erstellen von Vorhersagemerkmalen.

Parameter

Typ

Erforderlich

Standard

team_id

integer

ja

last

integer

nein

5

before

string (YYYY-MM-DD)

nein

{"name": "get_team_form",
 "arguments": {"team_id": 40, "last": 5, "before": "2020-01-01"}}

get_head_to_head

Bilanz aus Siegen/Unentschieden/Niederlagen zwischen zwei Teams, ihre letzten Begegnungen und Durchschnittswerte pro Team (Tore pro Spiel, Gelbe/Rote Karten, Fouls, Ecken) über ihre gesamte Geschichte – nützlicher Kontext für eine Wettentscheidung, nicht nur eine Vorhersagezahl. Karten/Fouls/Ecken sind nur für Spiele ab 2015 verfügbar; Spiele ohne Statistiken werden aus diesen Durchschnittswerten ausgeschlossen, nicht als Null gezählt.

Parameter

Typ

Erforderlich

Standard

team_a

integer

ja

team_b

integer

ja

limit

integer

nein

10

get_team_season

Endplatzierung in der Liga, Punkte und Tore, zusammen mit Durchschnittswerten pro Spiel für Schüsse, Ballbesitz, Ecken und Passgenauigkeit.

Parameter

Typ

Erforderlich

team_id

integer

ja

league_id

integer

ja

season

integer

ja

Saisons werden nach ihrem Startjahr benannt: 2024 bedeutet die Saison 2024-25.

get_player_season

Saisonweise Spielerwerte, aggregiert aus Spielprotokollen: Tore, Vorlagen, Minuten, Schüsse, Torschussvorlagen, Karten und durchschnittliche Bewertung.

Parameter

Typ

Erforderlich

player_id

integer

ja

season

integer

ja

compare_teams

Aktuelle Form für zwei Teams plus ihre direkte Bilanz in einem Aufruf.

Parameter

Typ

Erforderlich

Standard

team_a

integer

ja

team_b

integer

ja

last

integer

nein

10

compare_players

Die Gesamtwerte zweier Spieler für dieselbe Saison, nebeneinander.

Parameter

Typ

Erforderlich

player_a

integer

ja

player_b

integer

ja

season

integer

ja

data_coverage

Was tatsächlich in der Datenbank vorhanden ist, pro Liga und Saison. Verwenden Sie es, bevor Sie behaupten, ein Datenpunkt fehle.

Parameter

Typ

Erforderlich

league_id

integer

nein

season

integer

nein

predict_match

Wahrscheinlichkeit für Sieg/Unentschieden/Niederlage eines Spiels, basierend auf einem Modell, das mit 23.168 Spielen (2015–2025, sechs nationale Ligen – Champions League ausgenommen, da ihr K.o.-Format nicht mit einer Ligatabelle vergleichbar ist) trainiert wurde. Zwei Kandidaten wurden in einer zurückgehaltenen Validierungssaison direkt verglichen (logistische Regression vs. ein Gradient-Boosted-Trees-Klassifikator); derjenige mit dem besseren Validierungs-Log-Loss wurde behalten. Siehe model.metricas_prueba_2025 in der Antwort des Tools selbst für den ehrlichen, während der Auswahl nie berührten Testwert.

Das Spiel muss nicht bereits in der Datenbank vorhanden sein. Das aktuelle Elo, die aktuelle Form und die Ruhetage jedes Teams werden in einem team_current_form-Snapshot gespeichert, der unabhängig von einem einzelnen Spiel aktualisiert wird – das funktioniert also für ein für nächste Woche geplantes Spiel genauso gut wie für ein vor fünf Jahren ausgetragenes.

Parameter

Typ

Erforderlich

home_team_id

integer

ja

away_team_id

integer

ja

{"name": "predict_match", "arguments": {"home_team_id": 529, "away_team_id": 531}}
{
  "local": "Barcelona", "visitante": "Athletic Club",
  "probabilidad_local": 0.779, "probabilidad_empate": 0.145, "probabilidad_visitante": 0.076,
  "modelo": "logistic_regression",
  "advertencia": "Probabilidad estadistica basada en historial, no una garantia..."
}

Das trainierte Modell wird in data/predict_model.joblib ausgeliefert (ein paar KB – eine angepasste scikit-learn-Pipeline, keine rohen Gewichte). Ein erneutes Training erfordert die vollständige Feature-Pipeline (conocimiento/ml/), die sich im privaten Projekt-Repository befindet, nicht hier – dasselbe Verhältnis wie data/football.dump zur Extraktions-Pipeline, die es erstellt hat.

Beispielsitzung

Welches Team hat 2015 die Premier League gewonnen?

→ search_team {"query": "Leicester"}
→ get_team_season {"team_id": 46, "league_id": 39, "season": 2015}

Leicester City, mit 81 Punkten aus 23 Siegen, 12 Unentschieden und 3 Niederlagen – und nur 42,7 % durchschnittlichem Ballbesitz, ungewöhnlich für einen Meister.

Architektur

MCP host  ──JSON-RPC/stdio──>  server.py  ──>  knowledge/engine.py  ──>  PostgreSQL

server.py besitzt das Protokoll und sonst nichts. Die gesamte Abfragelogik befindet sich in knowledge/engine.py, das einfache Wörterbücher zurückgibt und keine Kenntnis von MCP hat – es kann also vollständig eigenständig getestet oder wiederverwendet werden.

Lizenz

MIT. Die Fußballdaten stammen von API-Football und werden hier für akademische Zwecke weitergegeben.


Erstellt für CC3067 Redes, Universidad del Valle de Guatemala.

-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • API-Football MCP — comprehensive soccer/football data

  • Grounded sports predictions plus European soccer and tennis arbitrage data for AI agents.

  • Football-Data.org MCP — soccer competitions, matches, standings

View all MCP Connectors

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jjaquezito/MCP_local'

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