# Football Database and Results

> Historical football results, draws and no-draw streaks. 11 read-only tools, 6 need no API key.

- name: io.fdb4/football-database-and-results
- version: 1.1.0
- connection class: R0 (autonomous)
- trust: 82/100 flags: no-repository
- quality: 86/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.fdb4%2Ffootball-database-and-results
- tools: https://api.protogrid.dev/v1/servers/io.fdb4%2Ffootball-database-and-results/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "football-database-and-results": {
      "type": "http",
      "url": "https://fdb4.io/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  }
}
```

Placeholders to fill: `${api_key}`.

## Trust

- hygiene: 80
- liveness: 99
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-97% +updated-28d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 86/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 1 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 11 of 11 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: get_draw_model (destructiveHint, openWorldHint); top_streaks (destructiveHint, openWorldHint); predict_draws (destructiveHint, openWorldHint); …
- pass `tools.token_cost`: about 3,479 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 5 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 11, about 3,479 tokens to load them all
- tool set hash: cfc196d9c07e6b1826ba7560e212e0e2
- tools last changed: 2026-09-30T13:56:21.088Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.fdb4/football-database-and-results.svg)](https://protogrid.dev/servers/io.fdb4/football-database-and-results)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-09-30 `head_to_head` changed (outputSchema)
- 2026-09-30 `search_results` changed (outputSchema)
- 2026-09-30 `get_team_streaks` changed (outputSchema)
- 2026-09-30 `get_draw_model` changed (outputSchema)
- 2026-09-30 `get_team_prediction` changed (outputSchema)

Full history: https://api.protogrid.dev/v1/servers/io.fdb4%2Ffootball-database-and-results/changes

## Remotes

- https://fdb4.io/mcp (streamable-http, auth none, reachable true, uptime30d 0.96638656)

## Packages

_none_

## Tools (11)

- `get_draw_model`: [PAID] Every draw reading FDB4 holds for ONE match — use it when someone asks how likely a
specific fixture is to end level, rather than which teams are overdue a draw
(`predict_draws` answers that).

Five readings come back side by side, because they are not interchangeable: the
Dixon-Coles goals model's own probability with the expected goals behind it; the
historical draw rate at this fixture's Elo rating gap; the one-parameter blend of
those two the site has published since September 2026; the five-feature logistic
model that now sits beside it with a 95% band around it; and the bookmaker's draw
price where one is recorded. Also returned: when the logistic model was last fitted,
over how many matches, and its coefficients — so an answer can explain itself.

Identify the match by `match_id`, or by `team` (id or slug) plus an optional `date`;
with no date you get that team's next fixture. `is_forecast` says whether the
logistic figure is a real forecast (a fixture) or an in-sample description of a
match the model was fitted on. Historical pattern, not a betting tip.

Costs 1 point per call (1 point = 1 cent); paginated calls cost 1 point per page.
- `get_team`: [FREE] One team's profile and its all-time draw statistics.

Returns the team's name, country and type alongside the numbers this database is built
on: matches played, draws, draw percentage, the no-draw streak currently running, the
longest one ever, the average of its longest runs, its draw debt and its rank in the
draw-likelihood field. Use it to answer "how often does this team draw?" or "how long
since they last drew?".

Takes a numeric id or a slug, whichever you already hold; both come from list_teams.

Free: no key needed, and it costs a key holder nothing either.
- `get_team_prediction`: [PAID] How overdue a draw one named team is, plus the results that made it so.

Returns the team's draw-likelihood rank and score among all ranked teams, the signals
behind it (draw rate, current no-draw streak, longest ever, draw debt), and its recent
form — every match in the current no-draw run, with opponent, score and side. Use this
when the question is about a specific team ("is Brazil due a draw?"); use predict_draws
when the question is about the field.

The prediction comes back null when the team exists but is not currently ranked (no
played matches, or excluded by the `recent` filter). Historical pattern, not a betting tip.

Costs 1 point per call (1 point = 1 cent); paginated calls cost 1 point per page.
- `get_team_streaks`: [FREE] Every no-draw run one team has ever had, plus the one it is on now.

A no-draw run is a sequence of matches that ended in a win or a loss. This returns the
run currently in progress with each match in it — date, competition, opponent, score —
so you can say exactly when the team last drew and what has happened since, together
with every recorded run in the team's history, longest first, each with its start and
end dates.

Runs span all competitions; per-competition runs are not split out.

Free: no key needed, and it costs a key holder nothing either.
- `head_to_head`: [PAID] The complete record between two teams, and every match they have ever played.

Answers "who wins more between these two, and how often do they draw?" — matches
played, wins each way, draws, goals each way and the draw percentage, all from team A's
perspective, followed by every meeting with its date, competition and score. Optionally
narrow to one competition type or a single edition to compare only their league games,
or only one season.

Both teams are given as numeric ids, which list_teams returns.

Costs 1 point per call (1 point = 1 cent); paginated calls cost 1 point per page.
- `list_countries`: [FREE] Every country in the database, with its FIFA code and id.

Use it to turn a country name into the id and FIFA code the rest of the data is keyed
by, or to check which countries are covered at all. Search with `q`, which matches a
name prefix or an exact FIFA code ("ENG"). Countries that no longer exist are included
and flagged, because the match archive still holds their games.

Free: no key needed, and it costs a key holder nothing either.
- `list_teams`: [FREE] Find a team and its id — the lookup every other team tool depends on.

Search by name prefix with `q` ("arse" finds Arsenal), or browse by first letter, or
list one kind of team. Each row carries the numeric id and the slug that get_team,
get_team_streaks, get_team_prediction, head_to_head and search_results take.

The database holds thousands of teams, so an unfiltered call returns the first 25 with
the full total beside them. Always pass `q` when you know the name.

Free: no key needed, and it costs a key holder nothing either.
- `list_tournaments`: [FREE] Every competition covered — leagues, domestic cups, continental cups, World Cups — with
how many matches and how many draws each one holds.

Two uses. Without `tournament` it answers "what is in this database, and how draw-heavy
is each competition?", returning each competition's id, slug, country, match count, draw
count and draw percentage. With `tournament` (an id or slug) it returns that one
competition in full: the years it covers, every edition newest first with its champion
where one was decided, and the all-time winners ranking with title counts and years.

The competition ids here are what search_results and head_to_head filter by.

Free: no key needed, and it costs a key holder nothing either.
- `predict_draws`: [PAID] Rank teams by how overdue a draw is — the question this database exists to answer.

Every team has a historical draw rate and a run of matches since its last draw. When
the run is long relative to how often that team normally draws, the team is carrying
"draw debt", and this tool ranks the whole field by it, most overdue first. Ask it
"which national teams are most due a draw?" or "who is overdue a draw in the World
Cup 2026 field?" and it answers directly; nothing else here needs to be queried first.

Each entry returns the rank, the score, and the signals behind it: matches played,
draws, draw percentage, the current no-draw streak, the longest ever, and the debt
figure. Filters subset which teams are listed — a team's score and rank are global and
never change with them. Historical pattern, not a betting tip.

Costs 1 point per call (1 point = 1 cent); paginated calls cost 1 point per page.
- `search_results`: [FREE for the last 7 days · PAID for the archive] Search the match archive: finished matches, newest first, with scores.

This is the raw history behind every other tool — decades of results across national
team football, domestic leagues and cups. Filter by team, competition, single season,
outcome (home win, away win or draw) and date range, in any combination: "Arsenal's
draws since 2020", "every match in the 2025/26 Premier League", "all draws in the World
Cup". Each match returns its date, competition and edition, both teams, the score and
whether it was a draw.

Results are paginated, 50 per page by default; `page` walks through them and
`meta.total` tells you how many matches matched before you start.

Free, no key needed, for recent results: the first page of 50, and any `from` date
inside the last 7 days. Reaching further back — an older `from`, a bigger `limit`, or
page 2 onward — is the archive and costs 1 point per call (1 point = 1 cent), one point
per page.
- `top_streaks`: [PAID] The all-time leaderboard of no-draw runs — the longest any team has gone without drawing.

Answers "what is the longest run of matches without a draw on record?" and "who else has
done it?". Each entry is one run: its length, the dates it started and ended, and the
team. A team can appear more than once, since a great side may have several long runs.
Filter to one team, to national teams or clubs, or to runs above a minimum length.

Paginated, 25 per page by default; `page` walks the leaderboard and each page costs its
own point.

Costs 1 point per call (1 point = 1 cent); paginated calls cost 1 point per page.
