football-docs
Ships with nutmeg: A Claude Code plugin that makes Claude an expert at football data analytics. Who it's for: Anyone who works with football data — analysts, developers, journalists, researchers,…
Claude Code
> /plugin marketplace add withqwerty/nutmeg> /plugin install nutmeg@nutmeg
Codex
$ codex mcp add football-docs -- npx -y football-docs@0.17.7
Cursor
{ "mcpServers": { "football-docs": { "command": "npx", "args": [ "-y", "football-docs@0.17.7" ] } } }
Add it to mcp.json.
Gemini CLI
{ "mcpServers": { "football-docs": { "command": "npx", "args": [ "-y", "football-docs@0.17.7" ] } } }
Add it to settings.json.
GitHub Copilot
$ copilot mcp add football-docs -- npx -y football-docs@0.17.7
OpenCode
{ "mcp": { "football-docs": { "type": "local", "command": [ "npx", "-y", "football-docs@0.17.7" ] } } }
Add it to opencode.json.
Windsurf
{ "mcpServers": { "football-docs": { "command": "npx", "args": [ "-y", "football-docs@0.17.7" ] } } }
Add it to mcp_config.json.
Security report
Low risk
Known flaws
None known
Signed build
Yes
Build provenance published
Maintained
Nov 3, 2026
Last push
Licence
Not published
Runs as
npx
On your machine
Deprecated
No
Signals from public registries, not an audit. Checked Nov 13, 2026.
football-docs README
football-docs
Searchable football data provider and tooling documentation for AI coding agents. Like Context7 for football data.
Who it's for: Developers and analysts who use AI coding tools (Claude Code, Cursor, VS Code Copilot) to work with football data. Works with any tool that supports MCP.
What it does: Gives your AI agent a searchable index of documentation for 31 football data providers and tools — event types, qualifier IDs, coordinate systems, API endpoints, data models, identity surfaces, and cross-provider comparisons for the data providers (StatsBomb, Opta, Wyscout, Impect, SkillCorner, Sportradar, TheSportsDB, FMDB Pro, TransferRoom, and more), the open-source libraries people build with (kloppy, mplsoccer, socceraction, soccerdata, floodlight, fast-forward, unravelsports, and more), and the APIs of wearable and sports-science vendors (STATSports, Firstbeat, Hawkin Dynamics, VALD). Your agent looks up the real docs instead of guessing from training data.
Why not just let the AI figure it out? LLMs get football data specifics wrong constantly — Opta qualifier IDs, StatsBomb coordinate ranges, API endpoint URLs, library method signatures. These are mutable facts that change across versions. football-docs gives the agent verified, sourced documentation with provenance tracking so you know where every answer came from.
Strategy
football-docs is intended to be a community-owned, source-transparent Context7 for football data. The public operating contract is in STRATEGY.md: what belongs here, what must stay out, how we handle public-safe provider facts, and how contributors should prove retrieval quality.
Provider identity facts
football-docs is the public source for provider identity-surface facts: access shape, ID schemes, matching fields, provider quirks, and provenance rules. Curated provider identity notes belong here when they can be stated as public facts about the provider. They should say whether a fact comes from public docs, public page evidence, licensed feed shape, or a reviewed public-safe observation, and must not include credentials, local paths, internal tooling details, or restricted payloads from any private project.
MCP (Model Context Protocol) is a standard for connecting AI coding tools to external data sources.
Quick start
The server needs Node.js 22.13 or newer. It uses Node's built-in SQLite, so no native module is compiled at install time.
Claude Code
claude mcp add football-docs -- npx -y football-docs
Cursor
Settings → MCP → Add server. Use this config:
{
"mcpServers": {
"football-docs": {
"command": "npx",
"args": ["-y", "football-docs"]
}
}
}
VS Code / Copilot
Add to .vscode/mcp.json:
{
"servers": {
"football-docs": {
"command": "npx",
"args": ["-y", "football-docs"]
}
}
}
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"football-docs": {
"command": "npx",
"args": ["-y", "football-docs"]
}
}
}
After an update
npx updates its cached copy of football-docs in place. A server that was
already running keeps the old version until it restarts, and its replies then
start with a note: "football-docs on disk is now vX, but this server is still
running vY". Reconnect the server to fix it (in Claude Code: /mcp, then
reconnect football-docs).
Tools
| Tool | Description |
|---|---|
search_docs | Full-text search across all provider docs. Filter by provider. Results include provenance (source URL, version), mark partial matches, name query terms that no indexed doc mentions, and say when a query names a provider that is not indexed (the not_indexed list in providers.json gives the reason). |
resolve_provider_id | Resolve provider names and aliases to canonical indexed provider keys before searching. |
get_provider_docs | Retrieve docs for a resolved provider, optionally filtered by topic or category. |
list_providers | List all indexed providers and their doc coverage. |
compare_providers | Compare how different providers handle the same concept. |
request_update | Request a new provider, flag outdated docs, or suggest a better doc source. Queues locally and points to the matching public GitHub issue template. |
resolve_entity | Map a player, coach, referee, team, competition, season, stage or match to its IDs at every provider through the Reep register. Uses a local copy of the free register (REEP_DUCKDB_PATH), else the Reep API (REEP_API_KEY; keys are issued by hand on request to getintouch+nutmeg@withqwerty.com, with no self-service sign-up), else returns setup steps and a DuckDB query. See Reep through football-docs. |
get_metric | Read a metric card: one checked definition of a football metric with each published variant under its own ID, its formula, source and a checked quote, reference code with test values on open data, and caveats. See Metric cards. |
list_metrics | List the metric cards and their variant IDs. |
search_papers | Search scholarly papers on football analytics and sport science in OpenAlex (title, abstract and full text), arXiv and SportRxiv, and, when asked, your Zotero library. See Papers and web sources. |
get_paper | Look up one paper by DOI, arXiv ID, OpenAlex ID or Zotero item: authors, date, venue, all IDs, licence, open copies with their licences, abstract and a citation line. |
get_web_source | Read a public web page or PDF (a blog post, newsletter, club or vendor article, or an author's copy of a paper) as text, with its author, date, licence and Wayback Machine snapshots. Long pages come back by section. |
read_paper | Read a paper: the full text of an open copy, by section, with its licence; or the outline and short passages of a paper you supplied. Kept in your library, so a second read sends no request. |
match_quote | Check that a quote appears in a paper or web page: exact, normalised, close (with a score) or none, with the section, page and a W3C text quote selector. |
add_local_paper | Add a PDF you have to your library, for papers with no open copy. |
forget_paper | Remove one paper from your library. |
purge_cache | Delete your whole paper library (needs confirm: true). |
Provider filters use the indexed provider keys shown by list_providers, but common aliases are accepted. Examples: fbref, understat, ClubElo, football-data.co.uk, and engsoccerdata search free-sources; Sofascore searches soccerdata; ESPN, ESPN FC, and espn-soccer search espn; FMDB searches fmdb-pro; Transfer Room searches transferroom; Hudl Wyscout searches wyscout; Stats Perform / Opta F24 / WhoScored search opta; Metrica, Sportec / DFL, and TRACAB search databallpy; Second Spectrum searches kloppy; Hawk-Eye, SciSports, Signality, Respovision, GradientSports and OptaVision search fast-forward; unravel searches unravelsports; SportRadar API / Soccer Extended search sportradar; Sonra / Apex search statsports; Hawkin searches hawkin-dynamics; ForceDecks / NordBord / ForceFrame search vald; The Sports DB / TSDB search thesportsdb; StatsBomb Open Data searches statsbomb.
How the index stays current
The package ships a docs index, but doc fixes do not wait for a new package
version. Once a day at most, the server checks the
data-latest
release of this repository for a newer index built from main:
- It reads a small signed manifest (
manifest-v1-signed.json) and, only when that names a newer build, downloads the index (about 6 MB). - It accepts the manifest only if its ed25519 signature verifies against a public
key shipped in the package (
src/data-signing.ts). The manifest carries the index's size and SHA-256, so the signature covers the index too. - It checks the download's size and SHA-256, its SQLite integrity, its exact schema and its metadata before using it, and keeps the one it had on any failure.
- It stores downloads in
$XDG_DATA_HOME/football-docs/data/(by default~/.local/share/football-docs/data/). The next tool call uses the new file; no restart is needed. - It runs in the background after start-up and never delays a tool call.
list_providersends with the build time of the index in use and whether it is bundled or downloaded.
Privacy: the check is one HTTPS request a day to GitHub, plus the download when there is one. No search queries or other usage data are sent.
Settings, as environment variables in the server's MCP configuration:
FOOTBALL_DOCS_DATA=bundled: use only the index inside the package. No update check, no downloads. (This does not turn off the paper tools; seeFOOTBALL_DOCS_PAPERSunder Papers and web sources.)FOOTBALL_DOCS_DATA=auto: the default for an installed package. Check daily and use the newest valid index.FOOTBALL_DOCS_DB_PATH=<file>: use exactly this index file.FOOTBALL_DOCS_DATA_BASE_URL=<url>: read the manifest and index from a mirror (HTTPS only).
Offline, or behind a proxy that Node's built-in fetch does not use, the check
fails quietly and the server keeps the index it has. Under CI (CI set) the check
does not run. A server running from a git checkout defaults to bundled, so
development and tests always use the working tree's docs.
Papers and web sources
Many football methods come from papers, and some from blog posts: Karun Singh
introduced expected threat (xT) in a blog post, not a paper. search_papers
finds papers and the works that cite an idea; a web search finds the original
post, and get_web_source reads it. get_paper checks that a reference exists,
read_paper reads it, and match_quote checks that a quote is in the source.
Open and paid papers
| Paper | How it gets in | What the tools return |
|---|---|---|
| Open copy: arXiv, an open repository, an open-access publisher, SportRxiv, a public web page | read_paper or get_web_source finds and reads it | The full text, by section, with its licence |
| A paper you have through a subscription or purchase | You download the PDF and call add_local_paper, or keep it in Zotero and use its zotero: ID | The outline and passages of at most 200 characters (FOOTBALL_DOCS_PAPERS_PASSAGE_CHARS, 50 to 1000) |
football-docs never logs in to a publisher or a library, never holds your credentials or cookies, and does not use publisher text-mining APIs (their terms exclude tools like this). When a site answers with a bot check, the tool stops; download the paper yourself instead.
Zotero: search_papers with sources: ["zotero"] searches your library, and
read_paper reads an item's PDF. Two ways to connect, tried in this order:
- Zotero on this computer. In Zotero 7, open Settings > Advanced and turn on "Allow other applications on this computer to communicate with Zotero". The tools then use its local API on port 23119; nothing leaves the machine.
- The Zotero web API, for when Zotero is not running here (another machine, a
cloud session). Create a read-only key at
zotero.org/settings/keys with access
to your library and its files, and set
ZOTERO_API_KEY(and optionallyZOTERO_USER_ID; without it the tools ask the key). It reads only files kept in Zotero's own storage, not linked files; for those it uses Zotero's full-text index. The key is sent only to api.zotero.org, never to the file storage host.
More MCP servers from other plugins.
agentmemory
MCPShips with agentmemory: #1 Persistent memory for AI coding agents based on real-world benchmarks
skill-seekers
MCPShips with skill-seekers: 🧠 The data layer for AI systems. Skill Seekers turns documentation sites, GitHub repos, PDFs, videos,…
Questions about football-docs.
- Which coding agents can use football-docs?
- football-docs works in any agent that reads an MCP config file: Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf. Each agent reads it from its own file; this page names the file for each one.
- How do I add football-docs to Claude Code?
- Run these in order, one at a time. 1. In Claude Code: /plugin marketplace add withqwerty/nutmeg 2. In Claude Code: /plugin install nutmeg@nutmeg
- Is football-docs safe to install?
- Low risk. Signals from public registries, not an audit.

