Herkend.
MCP-server · Nederlandse bedrijfsdata

Marktonderzoek dat
zegt hoe zeker het is

Bedrijfsgegevens uit het Handelsregister, gecombineerd met CBS-demografie per buurt. Elk getal komt terug met zijn noemer, een benchmark en een betrouwbaarheidsoordeel — zodat een AI-assistent niet stelliger wordt dan de data toelaat.

MCP staat voor Model Context Protocol, een open standaard van Anthropic waarmee een AI-assistent externe gegevensbronnen kan bevragen. Herkend is zo'n bron: je koppelt hem één keer aan je AI-client en stelt daarna gewone vragen over de Nederlandse markt.

Waar dit voor gebouwd is

“Wat is de beste plek om een bakker te openen?”

Die vraag valt bij de concurrentie uiteen in drie losse tools, waarna de ondernemer ze zelf moet combineren en dat niet doet. Hier is het één gesprek — en desgewenst één aanroep: het hele onderzoek voor een plek in één antwoord, waarin alle onderdelen hetzelfde verzorgingsgebied gebruiken.

1

Baken de branche af

Een branche wordt afgebakend op onze eigen indeling van de vrije tekst die de ondernemer bij de KVK opgaf, aangevuld met externe categoriebronnen. Deze stap laat zien wat elke zoekstrategie oplevert en of je term meerdere betekenissen heeft — een term als “kapper” vindt zonder afbakening ook de kappersgroothandel.

herkend_resolve_branche("bakker")
→ categorie:   zekerheid hoog
  vrije tekst: zekerheid laag
2

Meet de verzadiging

Niet het aantal, maar het aantal per duizend inwoners, afgezet tegen het landelijke cijfer. En sinds kort ook tegen de officiële CBS-telling onder de bijbehorende SBI-code, zodat je ziet hoe goed onze afbakening die branche dekt: bij bakkers 1,11, bij kledingwinkels 2,79.

herkend_market_saturation(
  "bakker", "BU0363AB01")
→ 2,1 per 1000 inw
  landelijk 0,8  → +170%
  ijkpunt SBI 1071+4724: 1,11
3

Kijk hoe groot ze zijn

Twaalf bakkers van honderd meter is een andere markt dan twaalf van driehonderd, en in een verzadigingscijfer zien die er identiek uit. Uit de BAG komt de mediane oppervlakte van de concurrenten — en het aandeel dat überhaupt een bedrijfspand heeft in plaats van een inschrijving op een woonadres. Dat verschilt enorm: 79% van de supermarkten tegen 30% van de kappers.

herkend_competitor_size(
  "kapper", "GM0014")
→ 318 zaken, 42% met winkelruimte
  mediaan 90 m2 (landelijk 97)
4

Trek het verzorgingsgebied

Niet de gemeentegrens, maar wie er binnen een kwartier rijden woont. Over het echte wegennet met eenrichtingsverkeer, want een gemeentegrens is willekeurig ten opzichte van waar klanten vandaan komen.

herkend_catchment(
  postcode="1016XE", minuten=15)
→ 995.065 inwoners, 544.800 hh
  556 buurten in 9 gemeenten
5

Kijk wie er woont

Leeftijdsopbouw, huishoudens, koopkracht, dichtheid en afstand tot voorzieningen, uit CBS per buurt. Plus wat een ondernemer op deze plek overkomt: winkeldiefstal en bedrijfsinbraak uit de politiecijfers, en dan per honderd handels- en horecabedrijven in plaats van per inwoner. Dat scheelt: Amsterdam staat met 3.197 winkeldiefstallen bovenaan in absolute aantallen, per duizend inwoners op plaats 14 van 337 gemeenten, en per honderd handels- en horecabedrijven op index 1,16 — zestien procent boven landelijk in plaats van veruit de ergste.

herkend_area_profile("BU0363AB01")
→ 1.445 inwoners
  WOZ 481k (landelijk 398k)
6

Kijk wie er overdag is

Wie er woont is voor een lunchroom het verkeerde getal. Haarlemmermeer heeft 1,08 baan per inwoner en Almere 0,34: de een loopt ’s ochtends vol, de ander leeg. Daaronder ligt een laag per adres: 6.917 schooladressen met 1.461.514 leerlingen, waarvan 6.060 basisscholen met 1.354.324 leerlingen en de rest speciaal onderwijs, met de prognose per school erbij. Passantentellingen bestaan niet als open data; dit komt er het dichtste bij.

herkend_location_score(
  "bakker", "BU0363AB01")
→ ruimte 0 · drukte 100
  groei 93 · koopkracht ontbreekt
7

Reken het om naar euro's

Huishoudens maal wat een huishouden landelijk aan die categorie uitgeeft. De correctie voor het inkomen van het gebied is gemeten en niet aangenomen: brood loopt mee met 0,45, kleding met 0,73, vervoer met 1,10. Zelfs alle bestedingen samen lopen mee met 0,57 en niet met 1,00, want de spaarquote loopt op — een correctie die recht evenredig met het inkomen schaalt staat voor élke categorie te steil.

8

Weeg het af

Een score uit vier assen — en nooit alleen het totaal, want de gewichten zijn een keuze en geen meting.

Wat deze dienst anders doet

Geen getal zonder zijn noemer

Een ondernemer die een pand zoekt struikelt zelden over een getal dat ontbreekt. Hij struikelt over een getal dat er goed uitziet. Op drie plekken weigert deze dienst er zo een te geven — en zegt hij wat er in plaats daarvan wél klopt.

De buurt waar het CBS geen inkomen publiceert

Het gemiddelde inkomen per buurt staat in de Kerncijfers Wijken en Buurten alleen boven de tweeduizend inwoners: 1.950 van de 14.574 buurten hebben er een. Nul van de 3.739 buurten met honderd tot vijfhonderd inwoners, nul van de 5.515 daarboven tot tweeduizend. Wie een buurt zonder cijfer als gemiddeld behandelt, behandelt de Marnixbuurt als gemiddeld. De WOZ-waarde staat er wél — voor 12.781 buurten — en het inkomen loopt daarmee mee: niet één op één maar tot de macht een half, gemeten over de 1.949 buurten waar allebei staat. Er komt dus een index uit, mét het label dat hij uit de WOZ komt. Een afgeleide 1,10 en een gemeten 1,10 zien er anders identiek uit, en ze zijn niet even hard.

herkend_spending_potential(
  "bakker", "BU0363AB01")
→ potentieel_euro         1.116.423
  …_gecorrigeerd            944.704
  inkomensindex               1,102
  inkomensindex_bron
    AFGELEID UIT DE WOZ-WAARDE
    (1,21 keer het landelijke
     gemiddelde) — het CBS
    publiceert hier geen inkomen

De sporthal die als leeg vakje terugkwam

De BAG kent elf gebruiksdoelen en deze dienst gaf er zes terug. Een sportcomplex van 92.391 vierkante meter kwam daardoor terug met een lege uitsplitsing: alle meters zaten in een doel dat niet in de lijst stond. Dat gold voor 77.138 adressen, en het verschil tussen “nul” en “niet gemeten” ziet een lezer niet. Het zijn er nu elf, met sport, zorg, bijeenkomst, onderwijs en cel erbij. En de BAG-code 999.999, die “oppervlakte onbekend” betekent maar er als een oppervlakte uitziet, telt niet meer mee in een som: 1.849 adressen dragen hem, samen goed voor 68,3% van alle woonoppervlakte in de database.

herkend_postcode_profile("5612AW")
→ adressen 1, objecten 2
  grootste_object_m2     92.229
  m2_per_gebruiksdoel
    { "sport": 92.391 }

Het antwoord dat er stellig uitzag

Op nul graden noord en nul graden oost — de kust van Ghana — noemde de haltevraag Berlin-Spandau als dichtstbijzijnde station, op nul meter, met 297 vertrekken per werkdag. Vijfentwintig Duitse haltes stonden zonder coördinaat in de import en waren als (0, 0) opgeslagen. Zo'n antwoord is erger dan geen antwoord: het is stellig, gedetailleerd en fout. Een punt buiten Nederland krijgt nu een fout, met de vraag erbij of latitude en longitude niet verwisseld zijn — verreweg de vaakste oorzaak. Hetzelfde geldt voor een gemiddelde dat drie dingen door elkaar haalt: het CBS publiceert het sportcijfer drie keer per gemeente, voor 18 jaar en ouder, voor 18 tot 65 en voor 65-plus. In Emmen is dat 43,8, 48,3 en 33,2 procent, en de dienst pakte de rij die de database toevallig bovenaan zette. En de bestemmingsvraag pakt het nieuwste vastgestelde plan in plaats van het kleinste vlak: in Ysbrechtum besliste tien vierkante meter dat een plan uit 2019 het won van een uit 2023.

herkend_transit(latitude=0, longitude=0)
→ fout: "het punt (0.0, 0.0) ligt buiten
  Nederland. Latitude loopt hier van 50,7
  tot 53,6 en longitude van 3,2 tot 7,3;
  controleer of ze niet verwisseld zijn.
  Deze dienst heeft alleen Nederlandse
  data: buiten die grenzen is elk antwoord
  dat eruit komt toeval."

Alle drie zijn dezelfde keuze. En een deel van de branches krijgen om precies die reden een uitleg in plaats van een leeg vakje — daar gaat het volgende stuk over.

Hoe je de branche opgeeft

Een branche is hier een woordenlijst, geen SBI-code

Typ “bakker” of “bakkerij” — dat maakt niet uit. Het woordenboek kent 701 ingangen voor 123 branches en zet ze allemaal op dezelfde hoofdterm, inclusief de termen die je er juist níet bij wilt: “kapper” sluit de kappersgroothandel uit. Wat wél uitmaakt is dat een woordenlijst geen officiële indeling is, en dat zegt de dienst er elke keer bij — bij bakkers telt onze afbakening 1,11 keer wat het CBS onder SBI 1071 en 4724 telt, bij kledingwinkels 2,79 keer.

74 branches met een vraagkant

Wat een huishouden landelijk per jaar aan die categorie uitgeeft, uit de nationale rekeningen. Brood 1.163 euro, kleding 2.467, boeken en schrijfwaren 482, tandarts en fysiotherapie samen 1.024, kinderopvang 665. Maal de huishoudens in het verzorgingsgebied, en gecorrigeerd voor het inkomen en de huishoudensgrootte daar.

En 46 zonder — met de reden erbij

Voor de andere branches bestaat het cijfer niet. Daar komt geen leeg vakje terug maar de reden, en de noemer die wél klopt. Drie soorten reden, hieronder.

De klant is geen huishouden

Een schoonmaakbedrijf leeft van kantoren, scholen en zorginstellingen. Ook software, organisatieadvies en de accountant vallen hieronder. De noemer is dan het aantal vestigingen in het gebied en hun vloeroppervlak, niet het aantal huishoudens.

Het CBS telt hem samen met iets veel groters

Een fiets staat bij de auto’s onder “aankoop van voertuigen”: 1.885 euro per huishouden per jaar, en dat is voor het overgrote deel auto. Een taxirit staat bij de trein, de bus en het vliegticket: 1.371 euro. Een potje dat een orde van grootte te groot is, is geen antwoord.

De markt loopt via een verzekering of een voorraad

Huisartsenzorg gaat via de basisverzekering en komt in de consumptiecijfers vrijwel niet voor; de vraagkant van een praktijk is het aantal inwoners. Het werk van een loodgieter, schilder of elektricien komt grotendeels van corporaties en nieuwbouw — huishoudens geven zelf 399 euro per jaar uit aan onderhoud van hun eigen woning — dus de noemer is de woningvoorraad.

En één branche die geen gebied heeft

Een webshop. Zijn markt is heel Nederland en zijn concurrentie ook, dus een bestedingspotentieel binnen tien minuten rijden zegt niets over hem. Ook dat krijg je te horen in plaats van een getal.

Elke keer een reden in plaats van een leeg vakje is dezelfde keuze als het veld betrouwbaarheid: een model dat weet waarom een getal ontbreekt, verzint er geen.

Het ontwerpprincipe

Elk getal draagt zijn eigen onzekerheid

Een dashboard toont “12 fysiopraktijken” en de lezer vult zelf zijn twijfel in. Een taalmodel dat een kaal getal krijgt heeft dat instinct niet en presenteert het als feit. Daarom verlaat geen enkel aggregaat deze server zonder envelop.

{
  "aantal": 3,
  "noemer": "vestigingen in branche 'kapper' in Marnixbuurt-Noord
              (BU0363AB01, buurt), exclusief VvE's, holdings,
              inschrijvingen zonder eigen vestiging en records
              zonder bruikbaar adres",
  "genormaliseerd": { "per_1000_inwoners": 2.076,
                      "landelijk_per_1000": 2.05 },
  "betrouwbaarheid": "laag",
  "kanttekening": "N=3 is te klein om iets over de markt te zeggen;
                   branche-afbakening gebeurt op categorie- en vrije
                   tekst, niet op een gesloten bedrijfsindeling…",
  "bron": ["KVK Handelsregister", "CBS Kerncijfers Wijken en Buurten 2025"]
}

Dat veld betrouwbaarheid is het product. Een model dat wéét hoe zeker een getal is, geeft een beter antwoord dan een dashboard dat het getal alleen maar toont.

Wat er te vragen valt

39 tools, op volgorde van de vraag

Je hoeft geen enkele toolnaam te kennen: je stelt de vraag in gewone taal en je client kiest. Ze staan hier zodat je vooraf kunt zien of jouw vraag erbij zit. Wil je het hele onderzoek in één keer, dan is er herkend_location_report — acht blokken in één antwoord, allemaal over hetzelfde verzorgingsgebied.

Wie staat er ingeschreven

9

“Wie zit er op dit adres, wie hoort er bij dit nummer, welke vestigingen heeft deze keten?”

  • herkend_find_company
  • herkend_search_companies
  • herkend_lookup_phone
  • herkend_companies_nearby
  • herkend_similar_companies
  • herkend_enrich_batch
  • herkend_find_by_social
  • herkend_company_group
  • herkend_address_profile

Hoe druk is de markt

8

“Hoeveel concurrenten zitten er, hoe groot zijn ze, en waar zit een gat?”

  • herkend_resolve_branche
  • herkend_market_saturation
  • herkend_competitor_size
  • herkend_competition_radius
  • herkend_white_spots
  • herkend_colocation
  • herkend_compare_areas
  • herkend_location_score

Wie woont en werkt er

9

“Wie zijn mijn klanten binnen een kwartier rijden, en wat geven ze uit?”

  • herkend_catchment
  • herkend_area_profile
  • herkend_postcode_profile
  • herkend_amenities
  • herkend_amenity_rings
  • herkend_transit
  • herkend_daytime_population
  • herkend_region_outlook
  • herkend_spending_potential

Welk pand

4

“Hoeveel vierkante meter is dit, mag hier horeca, en welke panden voldoen aan mijn eisen?”

  • herkend_building
  • herkend_floorspace
  • herkend_zoning
  • herkend_find_premises

Beweegt de markt

4

“Komen er zaken bij of gaan ze weg, en hoe lang houdt zo'n zaak het hier vol?”

  • herkend_market_dynamics
  • herkend_industry_trend
  • herkend_survival_odds
  • herkend_opening_hours

Het hele onderzoek in één aanroep

1

“Doe dit allemaal, voor deze branche op deze plek.”

  • herkend_location_report

Wat de dataset niet weet

4

“Hoe hard is dit cijfer eigenlijk, en waar zit een breuk in de reeks?”

  • herkend_count_companies
  • herkend_data_coverage
  • herkend_digital_presence
  • herkend_series_breaks
Voordat je begint

Wat deze dienst niet weet

Vier dingen, en ze staan hier omdat je er betere vragen door stelt. Het zijn geen slagen om de arm: alle vier zijn ze nagemeten, en het getal staat erbij.

Het register telt inschrijvingen, geen concurrenten

Er staan 3.858.162 vestigingen in — het hele Handelsregister, dus een telling hieruit ís een landelijke telling. Maar een inschrijving is niet hetzelfde als een zaak waar een klant naar binnen loopt. Landelijk staat 66,50% van het register op een adres waarvan het gebouwenregister alleen een woonfunctie kent. Per branche loopt dat enorm uiteen: bij supermarkten 11,5%, bij kappers 58%, bij taxibedrijven 91,7%. Tien taxibedrijven in een wijk zijn dus negen huiskamers. Daarom zet elk verzadigingscijfer dat aandeel erbij — zonder dat getal zijn twee branches niet te vergelijken.

Er zijn geen passantentellingen

Ze bestaan niet als open data op het niveau van een vestiging, en dat is nagemeten: 0,62% van de winkel- en horecavestigingen heeft een verkeerstelpunt binnen honderd meter, en in de drukste kernwinkelgebieden — 1.371 vestigingen — is dat 0,00%. Juist waar de passant de markt ís, staat er niets. Wat er wel is: vertrekken per halte, bevolkingsdichtheid, en het aantal banen per buurt. Vraag je toch naar passanten, dan krijg je die drie mét het verschil erbij, niet een schatting die er precies uitziet.

Er zijn geen huur- of transactieprijzen

Voor bedrijfsruimte bestaan ze niet openbaar. Nagezocht en opgeschreven: nul treffers in 5.956 CBS-tabellen en 825 tabellen van dataderden, nul datasets op data.overheid.nl, en het Kadaster rekent 1,81 euro per bedrijfsmatige transactie. Wat je wél per adres krijgt is de oppervlakte, het gebruiksdoel en wat het bestemmingsplan er toestaat. Een prijs zul je zelf moeten opvragen; wij verzinnen er geen.

Het register is compleet, de verrijking niet

Van alle vestigingen heeft 32,99% een telefoonnummer en 27,87% een website. Een leeg veld betekent hier “niet gevonden” en niet “bestaat niet”, dus reken zulke percentages af tegen de groep waar iets te vinden valt en niet tegen het hele register. herkend_data_coverage geeft die noemers per veld, en elk antwoord draagt zijn eigen dekking mee.

Wat hierboven staat is de reden dat deze dienst bestaat en niet een voorbehoud eronder. Een dashboard dat deze vier weglaat ziet er zekerder uit en is het niet.

Hoe je koppelt

De server staat op https://mcp.herkend.nl/bedrijfsdata. Je voegt hem in je client toe als externe MCP-server; daarna stel je je vragen gewoon in het gesprek.

  1. 1 Kan je client een browser openen — Claude, ChatGPT, Cursor, VS Code, Claude Code — dan log je in met je Herkend-account. Je maakt zelf geen sleutel aan en kopieert niets.
  2. 2 Werk je met curl, n8n of een server zonder bureaublad, dan is er een persoonlijke sleutel die je in de header X-API-Key meestuurt.
  3. 3 Per aansluiting geldt 500 aanroepen per uur en 50 MB antwoord per dag. Een grondig vestigingsonderzoek kost tien tot dertig aanroepen.
  4. 4 Eerst kijken zonder iets te koppelen kan ook: de speeltuin op mcp.herkend.nl draait de lezende tools, zestig vragen per uur, zonder account.
De hele handleiding, per client
Wat erin zit

Deze build

3.858.162

vestigingen — het hele Handelsregister

1.272.877

met telefoonnummer (32,99%)

14.729

CBS-buurten met demografie

39

tools

8.026.974

panden met oppervlakte en gebruiksdoel

2.587.453

bestemmingsvlakken

6.917

schooladressen met leerlingenaantal

2.104.524

CBS-reekswaarden over 21 tabellen

Deze server is een proof of concept. Verbinden gaat met een Herkend-account; op dit moment (september 2026) brengen we niets in rekening. Er zit wél een rem op: 500 aanroepen per uur en 50 MB antwoord per dag per aansluiting. Een grondig vestigingsonderzoek kost tien tot dertig aanroepen, dus in een gesprek loop je daar niet tegenaan; tegen leegtrekken van het register wel. De actuele grenzen staan in limits.json, en zolang dit een proof of concept is kunnen ze veranderen.

Verder lezen

De handleiding

Deze pagina is het verhaal. De handleiding op mcp.herkend.nl is het naslagwerk, en je kunt er een vraag afvuren zonder eerst iets te koppelen.