Skip to main content
Glama
RibbaBV
by RibbaBV
README.md
# cbr-mcp

Een MCP-server met de slagingspercentages en examencijfers van het CBR: per rijschool, per examencentrum, per stad en per provincie. Gratis, zonder account en zonder sleutel.

Het CBR publiceert zijn cijfers per rijschool, als losse momentopname. Wie het andersom wil zien, per examencentrum of per stad, of wie wil weten hoe een cijfer zich over de tijd ontwikkelt, moet dat zelf opbouwen. Dat is precies wat deze server teruggeeft.

Gemaakt en onderhouden door **[Ribba](https://ribba.nl)**, de vergelijker voor rijscholen en gratis theorie in Nederland.

## Installeren

Er is geen account en geen sleutel nodig. Elke client hieronder start de server zelf met `npx`, dus je hoeft niets vooraf te installeren behalve Node 20 of nieuwer.

### Claude Code

```bash
claude mcp add --scope user cbr -- npx -y @ribba/cbr-mcp
```

`--scope user` schrijft hem naar `~/.claude.json`, waarmee hij in al je projecten werkt en ook beschikbaar is in het Code-tabblad van de desktop-app. Laat je `--scope` weg, dan geldt hij alleen in de map waar je op dat moment staat. Wil je hem juist met je team delen, gebruik dan `--scope project`: die schrijft naar `.mcp.json` in de repo, en dat bestand hoort in versiebeheer.

### Codex

```bash
codex mcp add cbr -- npx -y @ribba/cbr-mcp
```

Of met de hand in `~/.codex/config.toml`:

```toml
[mcp_servers.cbr]
command = "npx"
args = ["-y", "@ribba/cbr-mcp"]
```

De Codex-CLI, de IDE-extensie en de ChatGPT-desktopapp lezen alle drie datzelfde bestand, dus één keer instellen is genoeg. Zet je het in `.codex/config.toml` binnen een project, dan geldt het alleen daar.

### Claude Desktop

De chat-app deelt zijn instellingen niet met Claude Code en heeft een eigen bestand:

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "cbr": {
      "command": "npx",
      "args": ["-y", "@ribba/cbr-mcp"]
    }
  }
}
```

Herstart de app daarna. Heb je hem daar al staan en wil je hem ook in Claude Code, dan neemt `claude mcp add-from-claude-desktop` hem over.

### Cursor, Windsurf en andere clients

Dezelfde JSON als hierboven, in het configuratiebestand van je client.

## Werkt het?

Vraag je client:

> Wat is het landelijk slagingspercentage voor het autoexamen?

Komt er een antwoord met cijfers, dan staat de server. Zo niet:

- **De server staat er niet bij.** De meeste clients lezen hun instellingen alleen bij het opstarten. Sluit hem helemaal af en start opnieuw.
- **`npx: command not found` of een foutmelding over de Node-versie.** Je hebt Node 20 of nieuwer nodig. Controleer met `node --version`; installeren kan via [nodejs.org](https://nodejs.org).
- **De eerste keer duurt even.** `npx` haalt het pakket dan nog op. Daarna start hij meteen.
- **Het duurt lang, of je krijgt een foutmelding over een verbinding.** Deze server haalt zijn gegevens op bij Ribba, dus hij heeft internet nodig. Zit je achter een bedrijfsproxy of firewall, dan moet die `registry.npmjs.org`, `ribba.nl` en de bijbehorende diensten doorlaten.

- **Nog steeds niets?** Start de server met de hand en kijk wat hij zegt: `npx -y @ribba/cbr-mcp`. Hij wacht dan op invoer, wat betekent dat hij werkt; foutmeldingen komen erbij te staan.

Kom je er niet uit, [open een issue](https://github.com/RibbaBV/cbr-mcp/issues) of mail [team@ribba.nl](mailto:team@ribba.nl).

## Wat je kunt vragen

- Wat is het landelijk slagingspercentage voor het autoexamen?
- Welk examencentrum heeft het hoogste slagingspercentage, en welk het laagste?
- Waar zit examencentrum Den Bosch en hoe parkeer ik daar?
- Wat zijn de tien beste rijscholen in Rotterdam, gemeten aan eerste examens?
- Hoe doet rijschool 883 het ten opzichte van het examencentrum waar hij rijdt?
- In welke provincie slaag je het vaakst in één keer?

## Gereedschappen

| Naam | Wat het teruggeeft |
| --- | --- |
| `rijbewijscategorieen` | De categorieën waarvoor het CBR cijfers publiceert, met per categorie wat het examen meet. |
| `landelijke_cijfers` | Het landelijk gemiddelde, het aantal rijscholen met cijfers en het totaal aantal examens. |
| `examencentra` | Alle 54 CBR-examencentra met hun cijfers, adres en examenaantal. |
| `examencentrum` | Eén centrum in detail: adres, parkeren, eerste examens en herexamens, en de ranglijst van rijscholen. |
| `ranglijst` | De best scorende rijscholen, landelijk of binnen één stad of provincie. |
| `cijfers_per_gebied` | Het gemiddelde per provincie, of per stad binnen één provincie. |
| `school_cijfers` | De cijfers van één rijschool, met de uitsplitsing per examencentrum. |
| `cijfers_over_tijd` | De tijdreeks van wekelijkse metingen voor één rijschool. |

Alles gaat standaard over categorie B, de personenauto. Voor motor, bromfiets, aanhanger, vrachtwagen, bus of tractor geef je `categorie` mee: `AVB`, `AVD`, `AM`, `BE`, `C`, `CE`, `D` of `T`.

## De cijfers goed lezen

Een slagingspercentage is een breuk, en een breuk over weinig examens zegt weinig. Elke uitvoer bevat daarom het aantal examens waarop een percentage rust. De ranglijsten hanteren een drempel: minstens honderd eerste examens voor een landelijke notering, minstens vijfentwintig binnen een stad of examencentrum.

Verder is er niet één slagingspercentage maar drie, en ze meten iets anders:

- **Eerste examen.** Het aandeel kandidaten dat in één keer slaagt. Dit is het cijfer waar het meestal om gaat.
- **Herexamen.** Het aandeel dat bij een tweede of latere poging slaagt.
- **Gemiddelde van het examencentrum.** Wat álle rijscholen op dat centrum halen. Dit is een eerlijker ijkpunt dan het landelijk gemiddelde: het ene centrum is strenger dan het andere, en een school die op een streng centrum rijdt wordt anders onterecht afgestraft.

Eén ding om op te letten bij `school_cijfers`: het veld `slagingspercentage_eerste_examen` komt zo uit de CBR-publicatie en neemt de hoogste locatiescore. Voor een rijschool die op meerdere centra examineert valt dat cijfer te hoog uit. Het veld `per_examencentrum` in dezelfde uitvoer bevat de losse cijfers, en `cijfers_over_tijd` geeft de naar examenaantal gewogen variant.

## Waar de gegevens vandaan komen

De cijfers komen uit de openbare CBR-publicatie per rijschool en worden wekelijks opgehaald. De examencentra worden hier opgeteld uit die publicatie: het CBR levert de uitsplitsing per centrum alleen als bijvangst bij een rijschool.

Twee dingen zijn afgeleid en geen CBR-gegeven. De coördinaten van een examencentrum zijn het zwaartepunt van de rijscholen die er examen doen, want het CBR publiceert geen coördinaten; het adres in dezelfde uitvoer is wél het echte pand. En de tijdreeks in `cijfers_over_tijd` begint bij de eerste meting van Ribba, niet bij het begin van de rijschool: het CBR publiceert geen historie.

## Testen

```bash
npm install
npm run build
npm test
```

De tests praten met de echte database, dus je hebt een verbinding nodig. Ze controleren niet alleen dat elk gereedschap antwoordt, maar ook dat de cijfers kloppen: dat totalen optellen, dat ranglijsten aflopend staan, dat drempels en filters echt worden toegepast en dat de links naar ribba.nl de vorm hebben die de site bouwt.

## Zelf draaien

```bash
npm install
npm run build
node dist/index.js
```

De server praat JSON-RPC over stdin en stdout. Handmatig starten is vooral nuttig om de foutuitvoer te zien; normaal doet je MCP-client dit.

## Deze cijfers op het web

Dezelfde gegevens staan als gewone pagina's op **[ribba.nl](https://ribba.nl)**, met grafieken, kaarten en uitleg erbij:

- [Slagingspercentages](https://ribba.nl/slagingspercentages) per rijschool, stad en provincie
- [Alle CBR-examencentra](https://ribba.nl/examencentra) met adres, parkeerinformatie en ranglijst
- [Rijscholen vergelijken](https://ribba.nl/rijscholen) op cijfers, prijs en beoordeling
- [De gids](https://ribba.nl/gids): hoe het examen werkt en wat de cijfers betekenen

Elke rijschool, elk examencentrum en elk gebied in de uitvoer draagt een verwijzing naar de bijbehorende pagina, zodat je een cijfer altijd in zijn context kunt teruglezen.

## Licentie

De code staat onder de MIT-licentie. De examencijfers zijn openbare CBR-gegevens; de bewerking en samenstelling door Ribba staan onder [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Verwijs bij hergebruik naar https://ribba.nl.

## Verwant

- [rijschool-mcp](https://github.com/RibbaBV/rijschool-mcp) voor de rijscholen zelf: adressen, prijzen, beoordelingen en dekkingsgebied.
- [theorie-mcp](https://github.com/RibbaBV/theorie-mcp) voor de theorie: hoofdstukken, verkeersborden, begrippen en wetsartikelen.

Vragen of iets kapot? [team@ribba.nl](mailto:team@ribba.nl) of open een issue.

TDQS

A4/5.0

Scored across 8 tools

Disambiguation4/5

Each tool targets a distinct scope (national, area, school, time series, centers, categories, ranking), but several names share the 'cijfers' suffix and could be confused at a glance. The singular/plural center pair is clear, and the scope qualifiers help differentiate the statistics tools.

Naming Consistency4/5

Tool names consistently use Dutch snake_case and follow a mostly predictable pattern: plural for collections, singular for detail, and scope-qualified 'cijfers' for statistics. The pattern is not verb-based, but it is internally consistent and readable.

Tool Count5/5

Eight tools is well-scoped for a read-only statistics API covering categories, national averages, exam centers, rankings, area breakdowns, school details, and historical trends. No obvious redundancy or excessive granularity.

Completeness5/5

The tool set covers the full expected domain of CBR driving-exam statistics: reference categories, national benchmark, exam-center list/detail, rankings, geographic breakdowns, per-school stats, and time series. It leaves no major query type unaddressed for the apparent purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues