Skip to main content
Glama
jjaquezito

Football Intelligence MCP

by jjaquezito

Football Intelligence MCP

Локальный сервер Model Context Protocol, который даёт любому MCP-хосту — Claude Desktop, Claude Code или собственному чат-боту — доступ к курируемой исторической футбольной базе данных, охватывающей 36 982 матча в семи ведущих европейских соревнованиях с 2010 по 2025 год.

Протокол реализован напрямую поверх JSON-RPC 2.0, без использования какого-либо MCP SDK: каждое сообщение собирается и разбирается вручную в соответствии со спецификацией 2025-06-18.

Что в базе данных

Данные изначально извлечены из API-Football и нормализованы в PostgreSQL.

Соревнование

id лиги

Сезоны

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

Таблица

Строк

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

Известные ограничения покрытия

Сервер сообщает о них вместо того, чтобы гадать, и вам тоже следует так делать:

  • Статистика матчей начинается с 2015 года. Сезоны 2010–2014 содержат результаты, голы, события и составы, но без ударов, владения мячом или данных о передачах.

  • Ожидаемые голы (xG) существуют только с 2023 года и никогда для Лиги чемпионов.

  • Данные о тактической схеме и тренере начинаются с 2015 года.

  • У 58 матчей (0.16%) в списке событий отсутствует один гол — пробел на стороне API-Football. Счёт это не затрагивает; он берётся из записи матча, а не суммированием событий.

Вызовите инструмент data_coverage, чтобы проверить, что есть для любой лиги и сезона.

Related MCP server: api-football-mcp-server

Установка

Требуются Python 3.10+ и 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

Проверьте восстановление:

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

Запуск сервера

python server.py

Сервер общается по JSON-RPC через stdio. Обычно его запускает MCP-хост, а не вручную, но вы можете управлять им напрямую:

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

Добавьте в claude_desktop_config.json:

{
  "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

Протокол

Транспорт: stdio, JSON с разделителями строк. Версия протокола 2025-06-18.

Метод

Примечания

initialize

Рукопожатие. Возвращает serverInfo и capabilities.

notifications/initialized

Уведомление клиента. Без id, без ответа.

ping

Проверка работоспособности. Возвращает {}.

tools/list

Возвращает одиннадцать определений инструментов.

tools/call

Выполняет инструмент.

Ошибки соответствуют JSON-RPC 2.0: -32700 ошибка разбора, -32600 недопустимый запрос, -32601 метод не найден, -32602 недопустимые параметры, -32603 внутренняя ошибка.

Сбои на уровне инструментов — не ошибки JSON-RPC: они возвращают обычный результат с isError: true, чтобы модель могла прочитать сообщение и восстановиться.

stdout несёт только JSON-RPC. Все диагностические сообщения идут в stderr.

Инструменты

search_team

Находит команды по части имени, ранжируя по количеству матчей в базе. Вызовите его первым — каждому другому инструменту для команд нужен team_id.

Параметр

Тип

Обязателен

По умолчанию

query

строка

да

—

limit

целое число

нет

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

Находит игроков по имени, ранжируя по сыгранным минутам.

Параметр

Тип

Обязателен

По умолчанию

query

строка

да

—

limit

целое число

нет

10

get_match

Полная запись матча: счёт, стадион, судья, статистика по каждой команде и каждый гол с минутой и голевой передачей. Матчи до 2015 года возвращают явное примечание вместо пустой статистики.

Параметр

Тип

Обязателен

fixture_id

целое число

да

get_team_form

Текущая форма: серия, очки, забитые и пропущенные голы.

before ограничивает расчёт матчами, которые строго раньше этой даты, что позволяет восстановить состояние команды в любой прошлый момент. Это защита от смещения заглядывания вперёд при построении прогнозных признаков.

Параметр

Тип

Обязателен

По умолчанию

team_id

целое число

да

—

last

целое число

нет

5

before

строка (YYYY-MM-DD)

нет

—

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

get_head_to_head

Баланс побед/ничьих/поражений между двумя командами, их последние встречи и средние показатели по каждой команде (голы за матч, жёлтые/красные карточки, фолы, угловые) за всю историю — полезный контекст для решения о ставке, а не просто число-прогноз. Карточки/фолы/угловые доступны только для матчей с 2015 года; матчи без статистики исключаются из этих средних, а не считаются нулевыми.

Параметр

Тип

Обязателен

По умолчанию

team_a

целое число

да

—

team_b

целое число

да

—

limit

целое число

нет

10

get_team_season

Итоговая позиция в лиге, очки и голы, а также средние за матч показатели ударов, владения мячом, угловых и точности передач.

Параметр

Тип

Обязателен

team_id

целое число

да

league_id

целое число

да

season

целое число

да

Сезоны называются по стартовому году: 2024 означает сезон 2024-25.

get_player_season

Суммарные показатели игрока за сезон, агрегированные из записей матчей: голы, голевые передачи, минуты, удары, точность передач.

Параметр

Тип

Обязателен

player_id

целое число

да

season

целое число

да

compare_teams

Текущая форма двух команд плюс их очные встречи — одним вызовом.

Параметр

Тип

Обязателен

По умолчанию

team_a

целое число

да

—

team_b

целое число

да

—

last

целое число

нет

10

compare_players

Суммарные показатели двух игроков за один сезон бок о бок.

Параметр

Тип

Обязателен

player_a

целое число

да

player_b

целое число

да

season

целое число

да

data_coverage

Что именно есть в базе данных для каждой лиги и сезона. Используйте его, прежде чем утверждать, что какого-то показателя нет.

Параметр

Тип

Обязателен

league_id

целое число

нет

season

целое число

нет

predict_match

Вероятность победы/ничьей/поражения для матча по модели, обученной на 23 168 матчах (2015–2025, шесть национальных лиг — Лига чемпионов исключена: её плей-офф формат несопоставим с круговой таблицей). Два кандидата сравнивались лицом к лицу на отложенном валидационном сезоне (логистическая регрессия против классификатора на градиентном бустинге); оставлен тот, у кого лучше валидационный log loss. Честный, не тронутый при выборе модели тестовый результат смотрите в model.metricas_prueba_2025 в ответе самого инструмента.

Матч не обязан уже существовать в базе данных. Текущее Elo каждой команды, недавняя форма и дни отдыха хранятся в снимке team_current_form, который обновляется независимо от любого отдельного матча, — так что это работает как для матча, запланированного на следующую неделю, так и для сыгранного пять лет назад.

Параметр

Тип

Обязателен

home_team_id

целое число

да

away_team_id

целое число

да

{"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..."
}

Обученная модель поставляется в data/predict_model.joblib (несколько КБ — подобранный пайплайн scikit-learn, а не сырые веса). Для переобучения требуется полный пайплайн признаков (conocimiento/ml/), который находится в приватном репозитории проекта, а не здесь, — та же связь, что у data/football.dump с пайплайном извлечения, который его создал.

Пример сеанса

Какая команда выиграла Премьер-лигу в 2015 году?

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

«Лестер Сити», с 81 очком: 23 победы, 12 ничьих и 3 поражения — и лишь 42.7% среднего владения мячом, необычно для чемпиона.

Архитектура

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

server.py владеет протоколом и ничем больше. Вся логика запросов живёт в knowledge/engine.py, который возвращает обычные словари и ничего не знает об MCP, — поэтому его можно тестировать или переиспользовать полностью самостоятельно.

Лицензия

MIT. Футбольные данные происходят из API-Football и перераспространяются здесь в академических целях.


Создано для CC3067 Redes, Universidad del Valle de Guatemala.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides programmatic access to comprehensive football statistics and live match data via API-Football, enabling applications to retrieve league standings, team fixtures, player statistics, and real-time match events.
    6
    -
  • 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
    Not graded
    quality
    B
    maintenance
    Access football (soccer) data including competitions, matches, standings, and team details via the Football-Data.org API.
    105 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides comprehensive soccer/football data including standings, team search, league search, match predictions, and head-to-head records via the API-Football service.
    61 npm
    MIT