Using the foot.io MCP with Claude.
This walkthrough explains the foot.io HTTP MCP endpoint and how to use it with an MCP-capable client. The surface evolves: call tools/list for the currently deployed tools and schemas rather than relying on an old count or package manifest — 31 tools are deployed as of 6 August 2026. Tool execution is invite-only during closed beta.
Why MCP, not REST
You can hit the closed-beta REST API directly using the base URL and both headers documented at foot.io/docs, but MCP can be a better fit for agent workflows:
- The LLM picks the tool based on the description. No URL-mapping logic to maintain.
- Task-shaped responses: deployed tools package common queries such as form or match lookup. Confirm the current tools with
tools/list. - Structured calls: tools package common football questions behind explicit input schemas.
Both surfaces read the same rows. Every tool answers from the licence-gated defensible set — the rows we hold an explicit right to redistribute — and there is no gating between tiers: the cheapest paid key reads exactly the same rows as the most expensive one.
Connect
The deployed transport is stateless HTTP JSON-RPC:
https://amidfjrgsztslrpeaiec.supabase.co/functions/v1/mcp
Add that remote MCP URL in a client that supports HTTP MCP and send the issued x-api-key header for tool execution. Client setup changes over time, so follow the current instructions for your Claude surface and the exact foot.io handshake in our docs. There is no supported public @footio/mcp npm installation contract at present.
One exception to the key requirement: resolve_entity — cross-provider id translation (Transfermarkt, FBref, Wikidata QIDs, and more, into foot.io ids and back) — returns identifiers only, is never billed, and can be called without an API key.
Illustrative session
Once connected, an agent can choose from the tools returned by tools/list. The values below illustrate the flow; they are not a live or verified answer.
You: "How is Bukayo Saka playing recently?"
Claude: Calls
search_players(query="Bukayo Saka")→ player_id 4427Calls
player_form(player_id=4427, last_n=5)→ returns 5 matches with goals/assists/minutesSaka has played all 5 of Arsenal's most recent fixtures, contributing 2 goals and 3 assists across 412 minutes. He scored against Spurs (1-1) and Liverpool (2-2), and assisted both goals in Arsenal's 3-1 win over Forest. He's picked up 1 yellow card in this run. Form trajectory is positive — directly involved in 5 of Arsenal's last 8 goals.
This is the difference between an LLM that can answer football questions and one that can't.
Three more example queries
"Who's suspended for the West Ham vs Arsenal match this weekend?"
→ Claude calls injuries_and_bans(team_id=...) and reads back the list, distinguishing players serving a one-match ban (red card last match) from players on the yellow-card watchlist (1 more booking = ban). Despite the tool's name, it covers suspensions computed from our own match events only — it does not return medical injuries, and the injury dataset itself was withdrawn from foot.io on 28 July 2026.
"What did newspapers say about the 1966 World Cup final?"
→ Claude calls search_archive, which searches match reports from BBC Sport (2024+), The Guardian (2024+), and the British Newspaper Archive (1860s–1990s), and returns excerpts with publication, date and source URL. Inspect the response and licence rather than assuming full text: every key gets the same rows, with title and excerpt — full report bodies are the one field-level exception to the tier parity above, available from Pro tier up.
"How do Tottenham and Leeds stack up before Saturday's match?"
→ Claude calls head_to_head(team_id_1=..., team_id_2=...) for the all-time W/D/L record and recent meetings, then team_form(team_id=..., last_n=5) for each side's current run, and composes both into a pre-match briefing.
What's behind every answer
Provenance is the commitment behind foot.io: facts are stored with the source they were ingested from (FBref, ESPN, BNA newspaper archive, etc.), and many tools return that per-row source alongside the data. search_archive results carry the publication, date, and source URL of every report — so when Claude cites an archive fact, you can ask "where did that come from?" and get the answer. For deeper checks, get_fact_evidence returns field-level candidates and publisher-independent verification status for a single entity, and get_data_quality_summary returns the live trust dashboard. See our public erratum log for the corrections trail.
Access
Paid plans and self-service trials are not live. Join the closed-beta waitlist; quotas are assigned per invitation. Proposed pricing on the API page is roadmap material and may change.
What's missing (roadmap)
predict_match— match-outcome probabilities from an ELO baseline. Planned, not yet shipped — nothing in the current tool surface does prediction.match_previewandmatch_recaptools that produce a 200-word natural-language summary directly (currently you have to compose it fromget_match+get_match_timeline+injuries_and_bans)- Push-based live-score delivery (no real-time SLA is currently offered;
get_live_scoresis poll-based)