# Football Database and Results (remote · fdb4.io)

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

- Trust score: 67/100 (medium)
- Change this week: +39
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-28

## Components

- remote · `fdb4.io`: 67/100 (this document), [markdown](https://verifymcp.io/servers/io-fdb4-football-database-and-results/fdb4.md), [page](https://verifymcp.io/servers/io-fdb4-football-database-and-results/fdb4)

## Channel facts

- Endpoint: `https://fdb4.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.1.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-28.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS enforcement could not be verified: the plaintext port answered with HTTP 404, which proves neither a plaintext path nor enforcement.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 62/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3963 tokens (~360/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 20/100
  - Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 12 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Football Database and Results MCP server?

Football Database and Results is a hosted endpoint at https://fdb4.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-fdb4-football-database-and-results 'https://fdb4.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-fdb4-football-database-and-results": {
      "url": "https://fdb4.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-fdb4-football-database-and-results": {
      "type": "http",
      "url": "https://fdb4.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-fdb4-football-database-and-results]
url = "https://fdb4.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-fdb4-football-database-and-results": {
      "type": "remote",
      "url": "https://fdb4.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-fdb4-football-database-and-results --url 'https://fdb4.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-fdb4-football-database-and-results:
    url: "https://fdb4.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-fdb4-football-database-and-results": {
      "Transport": "http",
      "Url": "https://fdb4.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-fdb4-football-database-and-results -t streamable-http -u 'https://fdb4.io/mcp'
```

### Other

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

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-28 (score 67, +7)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-27 (score 60, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-25 (score 59, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-24 (score 59, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “get_draw_model” rewrote its description, which is the text the model reads
- [security] Tool “get_team” rewrote its description, which is the text the model reads
- [security] Tool “get_team_prediction” rewrote its description, which is the text the model reads
- [security] Tool “get_team_streaks” rewrote its description, which is the text the model reads
- [security] Tool “head_to_head” rewrote its description, which is the text the model reads
- [security] Tool “list_countries” rewrote its description, which is the text the model reads
- [security] Tool “list_teams” rewrote its description, which is the text the model reads
- [security] Tool “list_tournaments” rewrote its description, which is the text the model reads
- [security] Tool “predict_draws” rewrote its description, which is the text the model reads
- [security] Tool “search_results” rewrote its description, which is the text the model reads
- [security] Tool “top_streaks” rewrote its description, which is the text the model reads
- [functional improvement] Tool “get_draw_model” now declares an output schema
- [functional improvement] Tool “get_team” now declares an output schema
- [functional improvement] Tool “get_team_prediction” now declares an output schema
- [functional improvement] Tool “get_team_streaks” now declares an output schema
- [functional improvement] Tool “head_to_head” now declares an output schema
- [functional improvement] Tool “list_countries” now declares an output schema
- [functional improvement] Tool “list_teams” now declares an output schema
- [functional improvement] Tool “list_tournaments” now declares an output schema
- [functional improvement] Tool “predict_draws” now declares an output schema
- [functional improvement] Tool “search_results” now declares an output schema
- [functional improvement] Tool “top_streaks” now declares an output schema
- [functional] First check of Tool coverage: 100
- [functional] Server version: 1.0.0 → 1.2.0
- [cosmetic] Tool “get_draw_model” changed its title: Get Draw Model Tool → Draw probability for one match
- [cosmetic] Tool “get_team” changed its title: Get Team Tool → Team profile and draw statistics
- [cosmetic] Tool “get_team_prediction” changed its title: Get Team Prediction Tool → Draw prediction for one team
- [cosmetic] Tool “get_team_streaks” changed its title: Get Team Streaks Tool → No-draw runs of one team
- [cosmetic] Tool “head_to_head” changed its title: Head To Head Tool → Head-to-head record
- [cosmetic] Tool “list_countries” changed its title: List Countries Tool → Countries
- [cosmetic] Tool “list_teams” changed its title: List Teams Tool → Find a team
- [cosmetic] Tool “list_tournaments” changed its title: List Tournaments Tool → Competitions and seasons
- [cosmetic] Tool “predict_draws” changed its title: Predict Draws Tool → Teams most overdue a draw
- [cosmetic] Tool “search_results” changed its title: Search Results Tool → Match results archive
- [cosmetic] Tool “top_streaks” changed its title: Top Streaks Tool → Longest no-draw runs of all time

### 2026-09-23 (score 58, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-09-22 (score 58, +30)

- [security regression] Authorization: fail → unverified
- [security improvement] Transport: unverified → pass
- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Destructive annotations: pass
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100

### 2026-08-31 (score 28)

First indexed and scored.

## MCP tools (11)

### `predict_draws` (~326 tokens)

Teams most overdue a draw

[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.

Input parameters:

- `limit` (integer): How many ranked teams to return. Default 25, max 500. One call, one point, whatever the limit.
- `recent` (boolean): Only teams with a recent match, so the answer is about teams currently playing. Default true.
- `type` (string): Restrict the ranking to national teams or to clubs. Omit to rank both together.
- `wc2026` (boolean): Restrict to the 2026 World Cup team group. Default false.

Output parameters:

- `data` (array): Teams ranked by how overdue a draw is, most overdue first.

### `get_team_prediction` (~251 tokens)

Draw prediction for one team

[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.

Input parameters:

- `recent` (boolean): Rank within teams that have played recently, matching predict_draws. Default true.
- `team` (string, required): Numeric team id or slug — 431 or "arsenal". Both come from list_teams.
- `wc2026` (boolean): Rank within the 2026 World Cup team group. Default false.

Output parameters:

- `data` (object)

### `get_draw_model` (~362 tokens)

Draw probability for one match

[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.

Input parameters:

- `date` (string): With `team`, the match date as YYYY-MM-DD. Omit for that team's next fixture.
- `match_id` (integer): The match id, from search_results or a fixture list. Give this or `team`.
- `team` (string): A team id or slug (431, arsenal), from list_teams. Give this or `match_id`.

Output parameters:

- `data` (object)

### `top_streaks` (~257 tokens)

Longest no-draw runs of all time

[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.

Input parameters:

- `limit` (integer): Page size. Default 25, max 500.
- `min` (integer): Minimum run length to list. Default 5.
- `page` (integer): Page number, from 1. Each page is a separate call and costs its own point.
- `team_id` (integer): Restrict to one team. Numeric id from list_teams.
- `type` (string): Restrict to national teams or to clubs.

Output parameters:

- `data` (array): The longest no-draw runs, longest first.
- `links` (object): first/last/prev/next page URLs on the REST API.
- `meta` (object): Pagination: which page this is and how many rows exist.

### `get_team_streaks` (~168 tokens)

No-draw runs of one team

[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.

Input parameters:

- `team` (string, required): Numeric team id or slug — 431 or "arsenal". Find either with list_teams.

Output parameters:

- `data` (object)

### `list_teams` (~229 tokens)

Find a team

[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.

Input parameters:

- `letter` (string): First letter A-Z to browse by, or "#" for names starting with a non-letter.
- `limit` (integer): How many teams to return. Default 25; the total number of matches is always reported.
- `q` (string): Name prefix, matched against both the short and the full name. The fastest way to find one team.
- `type` (string): Restrict to national teams or to clubs.

Output parameters:

- `data` (array): Teams matching the search.
- `hint` (string): Present only when rows were left out: how to narrow the call.
- `returned` (integer): How many rows are in data.
- `total` (integer): How many rows matched before the limit.

### `get_team` (~168 tokens)

Team profile and draw statistics

[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.

Input parameters:

- `team` (string, required): Numeric team id or slug — 431 or "arsenal". Find either with list_teams.

Output parameters:

- `data` (object)

### `list_tournaments` (~225 tokens)

Competitions and seasons

[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.

Input parameters:

- `limit` (integer): How many competitions to list. Default 25; the total is always reported.
- `tournament` (string): One competition, by numeric id or slug (53 or "norway-cup"). Returns its editions, champions and all-time winners instead of the list.

Output parameters:

- `data` (array): Competitions, or one competition's editions.
- `hint` (string): Present only when rows were left out: how to narrow the call.
- `returned` (integer): How many rows are in data.
- `total` (integer): How many rows matched before the limit.

### `list_countries` (~155 tokens)

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.

Input parameters:

- `limit` (integer): How many countries to return. Default 25; the total is always reported.
- `q` (string): Country name prefix, or an exact FIFA code such as ENG or BRA.

Output parameters:

- `data` (array): Countries matching the search.
- `hint` (string): Present only when rows were left out: how to narrow the call.
- `returned` (integer): How many rows are in data.
- `total` (integer): How many rows matched before the limit.

### `search_results` (~503 tokens)

Match results archive

[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.

Input parameters:

- `competition_id` (integer): Restrict to one competition. Id from list_tournaments.
- `competition_item_id` (integer): Restrict to a single edition or season. Edition ids come from list_tournaments with a `tournament` argument.
- `from` (string): Earliest match date, inclusive, as YYYY-MM-DD. Inside the last 7 days the call is free and needs no key; earlier than that it costs 1 point.
- `limit` (integer): Page size: 50, 100, 250 or 500. Default 50, which is also the largest free page. Anything else is treated as 100.
- `outcome` (string): H for a home win, A for an away win, D for a draw.
- `page` (integer): Page number, from 1. Page 1 can be free; every page after it is a separate call and costs its own point.
- `team_id` (integer): Matches involving this team, home or away. Numeric id from list_teams.
- `to` (string): Latest match date, inclusive, as YYYY-MM-DD.
- `type` (string): Restrict to national-team or club football.

Output parameters:

- `data` (array): Matches, newest first.
- `links` (object): first/last/prev/next page URLs on the REST API.
- `meta` (object): Pagination: which page this is and how many rows exist.

### `head_to_head` (~246 tokens)

Head-to-head record

[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.

Input parameters:

- `a` (integer, required): Team A, as a numeric id from list_teams. The record is reported from this team's point of view.
- `b` (integer, required): Team B, as a numeric id from list_teams. Must differ from a.
- `item` (integer): Restrict to a single edition or season id, from list_tournaments with a `tournament` argument.
- `type` (string): Restrict to one competition type, such as league or cup.

Output parameters:

- `data` (object)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-fdb4-football-database-and-results/fdb4#diagnostics

## Score history

- 2026-09-28: 67
- 2026-09-27: 60
- 2026-09-26: 59
- 2026-09-25: 59
- 2026-09-24: 59
- 2026-09-23: 58
- 2026-09-22: 58
- 2026-09-21: 28
- 2026-09-20: 28
- 2026-09-19: 28
- 2026-09-18: 28
- 2026-09-17: 28
- 2026-09-16: 28
- 2026-09-15: 28
- 2026-09-14: 28
- 2026-09-13: 28
- 2026-09-12: 28
- 2026-09-11: 28
- 2026-09-10: 28
- 2026-09-09: 28
- 2026-09-08: 28
- 2026-09-07: 28
- 2026-09-06: 28
- 2026-09-05: 28
- 2026-09-04: 28
- 2026-09-03: 28
- 2026-09-02: 28
- 2026-09-01: 28
- 2026-08-31: 28

## Common questions

### What is the Football Database and Results MCP server?

Football Database and Results is an MCP server listed in the public MCP registry as io.fdb4/football-database-and-results. Historical football results, draws and no-draw streaks. 11 read-only tools, 6 need no API key. This page covers its hosted endpoint (https://fdb4.io/mcp).

### Is the Football Database and Results MCP server safe to use?

Football Database and Results scores 67 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Football Database and Results MCP server expose?

Football Database and Results exposes 11 tools: predict_draws, get_team_prediction, get_draw_model, top_streaks, get_team_streaks, and 6 more. Their descriptions and schemas cost roughly 2,890 tokens of context every time the server is loaded.

### Does the Football Database and Results MCP server require authentication?

No. We connected to Football Database and Results without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Football Database and Results MCP server still maintained?

Football Database and Results is still listed as active in the MCP registry. We last reached this channel on 28 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://fdb4.io/mcp
- Website: https://fdb4.io/mcp
- Changelog RSS feed: https://verifymcp.io/servers/io-fdb4-football-database-and-results/fdb4.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-fdb4-football-database-and-results/fdb4.json
- HTML version of this page: https://verifymcp.io/servers/io-fdb4-football-database-and-results/fdb4
