gbif-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gbif-mcpList protected species within 500m of Kerkstraat 10, Gent"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
gbif-mcp — BE-biodiversiteit (beta)
Betaversie — geen product, geen garantie, geen aansprakelijkheid. Deze software is een experimenteel hulpmiddel in ontwikkeling, geen commercieel product of dienst. De software en de rapporten die ze maakt, worden kosteloos aangeboden zoals ze zijn, zonder enige uitdrukkelijke of stilzwijgende garantie, onder meer over juistheid, volledigheid, actualiteit of geschiktheid voor een bepaald doel. De resultaten zijn een geautomatiseerde bronnenscan van publieke databanken; ze vervangen geen terreininventarisatie, deskundige beoordeling of juridisch advies. De gebruiker is zelf volledig verantwoordelijk voor het controleren van de resultaten en voor elk gebruik dat ervan wordt gemaakt. De auteur is niet aansprakelijk voor schade die voortvloeit uit het gebruik van de software of de resultaten.
MCP-server die Claude toegang geeft tot Belgische biodiversiteitsdata: GBIF-waarnemingen, Vlaamse Rode Lijsten, het Soortenbesluit, Habitat- en Vogelrichtlijnbijlagen, de Unielijst invasieve soorten, beschermde gebieden (Natura 2000, VEN/IVON, BWK …) en de overige gezaghebbende lijsten van het Vlaams Biodiversiteitsportaal (INBO). Typisch gebruik: soortenstatus opzoeken, welke soorten en welke beschermde gebieden rond een perceel liggen, voor m.e.r.-dossiers, passende beoordelingen en omgevingsvergunningen.
Anti-hallucinatie: elke tool geeft uitsluitend terug wat de bron effectief oplevert, met een controleerbare URL. Nul treffers betekent "niet gevonden in deze bron", niet "afwezig". Zie Harde regels hieronder.
De dertien tools
Tool | Doel | Belangrijkste parameters | Geeft terug |
| Naam (wetenschappelijk of Nederlands) → GBIF-taxonsleutel(s) |
| lijst |
| Beschermings-, Rode-Lijst- en exotenstatus van één soort |
|
|
| GBIF-waarnemingen van één soort in een gebied/periode |
|
|
| Alle soorten waargenomen in een gebied, gekoppeld aan hun status | gebied, |
|
| Alleen aantallen: hoeveel beschermde/Rode-Lijst-/invasieve soorten in een gebied | gebied, |
|
| Beschermde gebieden en gebiedsstatuten rond een punt/polygoon |
|
|
| Het vaste rapportsjabloon: telling, kernsoorten, gebieden, kaarten en onderliggende records in één PDF | adres of lat/lon, | pad, aantal pagina's, kaarten, samenvatting, waarschuwingen |
| Situeringskaart (PNG of JPEG): de locatie met de beschermde gebieden eromheen |
| bestandspad, legende per laag met kleur, bbox, schaal |
| Volledige gebiedsbevraging wegschrijven als CSV of JSON (alle soorten, optioneel alle records) met metadata voor een datarapport |
| bestandspaden, aantallen, metadata |
| Inhoud van één gezaghebbende soortenlijst |
|
|
| Adres/plaatsnaam → WGS84-coördinaten en gemeente |
|
|
| Herkomst, licentie, DOI en citatie van een GBIF-dataset |
|
|
| Overzicht van alle geraadpleegde bronnen en lijst-/groepscodes | — | lijst |
Related MCP server: Belgian Law MCP Server
Gebiedsparameters
waarnemingen, soorten_in_gebied en telling_in_gebied aanvaarden een gebied op één van
vier manieren (volgorde bij meerdere: wkt > lat/lon > adres > gemeente):
adres+straal_m(standaard 500 m) — geocodering via Digitaal Vlaanderen, cirkel als WKT.lat/lon+straal_m— cirkel rond het punt, geen geocodering nodig.wkt— een POLYGON of MULTIPOLYGON in WGS84 (lon lat, tegenwijzerzin).gemeente— naam van een Belgische gemeente. In Vlaanderen wordt de echte gemeentegrens gebruikt (VRBG). Buiten Vlaanderen kent GBIF voor België geen gemeentegrenzen; de tool valt dan terug op het GADM-arrondissement (niveau 3), met een expliciete melding.
Zonder gebiedsparameter zoekt waarnemingen in heel België; soorten_in_gebied,
telling_in_gebied en gebieden_rond vereisen een gebied (gebieden_rond: punt of polygoon,
geen gemeente-optie).
soorten_in_gebied: compact, tabel, en de kern-groep
De engine (gebiedsanalyse.py) haalt in één GBIF-facetbevraging alle soorten met aantal op,
koppelt ze parallel aan de gevraagde lijsten (schijfgecachet), filtert en sorteert op
juridische relevantie, en verrijkt pas voor de overblijvende pagina de records (laatste jaar,
coördinaatonzekerheid, broedindicatie) — nooit voor de volledige, ongefilterde soortenlijst.
Standaard krijg je per soort een compacte regel (
SoortInGebied): naam, aantal, laatste jaar,samenvattingper lijstcode,exoot,onzekerheid_max_m,zeker_binnen_straal,records_met_broedindicatie,koppeling_twijfel.detail=Truevoegt de volledigevermeldingentoe. Categorie-toelichtingen staan één keer inlegende, niet per soort.formaat='tabel'geeft dezelfde inhoud als een markdown-tabel in het veldtabel(≈4x compacter dan JSON-objecten; aanbevolen bij meer dan een 50-tal soorten).soortenblijft dan leeg.filter='kern'beperkt tot wat in een natuurtoets/m.e.r. telt: bijlage IV (Vlaanderen, Soortenbesluit cat. 3), bijlage II HRL, VRL bijlage I, en Rode Lijst RE/CR/EN/VU (incl. de broedvogel-Rode-Lijst 2016). Andere groepscodes:beschermd,europees,rodelijst,invasief,prioritair,provinciaal.max_onzekerheid_msluit vervaagde records uit (aantallen worden dan herteld op de overblijvende records).alleen_broedindicatiehoudt alleen soorten met minstens één record met een broed-/voortplantingsaanwijzing over.exoot:True/False/None(niet gecontroleerd, bv. bij een bronfout) — uitheems volgens GRIIS België, de Unielijst of de uitgebreide INBO-exotenlijst.
telling_in_gebied
Zelfde gebiedsparameters, alleen aantallen: per lijstcode en per categorie het aantal soorten,
het aantal kernsoorten en het aantal soorten met status dat tegelijk exoot is — geen
per-soort-records nodig, dus snel. Gebruik daarna soorten_in_gebied (bv. filter='kern')
voor de namen.
Herkomst van de waarnemingen: uitsplitsing per brondataset
In een vergunningsdossier telt de herkomst van een determinatie. soorten_in_gebied met
per_dataset_per_soort=True geeft daarom per soort het veld datasets: uit welke GBIF-datasets
haar waarnemingen komen, met aantal en laatste_jaar, aflopend gesorteerd. De som van aantal
is gelijk aan aantal_waarnemingen van die soort. Het kost geen extra GBIF-oproepen: de records
zijn al opgehaald voor het laatste jaar en de coördinaatonzekerheid.
Bij formaat='tabel' komt er een kolom datasets met een compacte notatie, bijvoorbeeld
wnm.be-gewervelden 5 / eBird 2. De afkortingen staan in gbif_mcp/datasets.py; onbekende
datasets vallen terug op de eerste dertig tekens van hun titel. exporteer_bevraging schrijft de
uitsplitsing altijd weg: in CSV als de kolommen datasets en n_datasets, in JSON als de
volledige lijst per soort.
Doorklikken naar de onderliggende records kan met waarnemingen(..., dataset_key=...).
telling_in_gebied geeft een per_dataset-blok met het aantal records per dataset; met
soorten_per_dataset=True komt daar het aantal soorten met status bij (tien parallelle extra
GBIF-oproepen, in de praktijk ±2 s; daarom standaard uit).
Elke waarneming draagt ook verificatiestatus (het GBIF-veld identificationVerificationStatus,
letterlijk overgenomen), en waarnemingen telt die in per_verificatiestatus. Waarnemingen.be en
Florabank vullen dat veld, eBird, iNaturalist en Pl@ntNet niet; dan staat er (leeg).
kaart_gebieden: situeringskaart
Tekent de gebieden van gebieden_rond op de GRB-basiskaart van Digitaal Vlaanderen (WMS), in
Lambert 72, met legende, schaalbalk, noordpijl en de zoekcirkel. Het resultaat is een PNG plus
de legende als gegevens (per laag: kleur, aantal getekende vlakken, status).
Komt de kaart verkleind in een document, zet dan met_legende=False en maak de legende in het
document zelf op met het veld legende: een ingebakken legende wordt onleesbaar bij verkleining.
voorbeeld/maak_rapport.py doet dat zo.
De Biologische Waarderingskaart krijgt een kleur per karteringseenheid: elk habitattype is een
eigen legenderegel (BWK 4030 — droge heide), zodat de kaart toont wélke habitats er liggen.
Omdat die laag het hele beeld dekt, is per_groep=True daar aan te raden: dan komt er één kaart
per thema (natura2000, natuur, beheer, erfgoed, bwk) met dezelfde uitsnede en schaal, dus over
elkaar te leggen. De bestandsnamen krijgen de groep als achtervoegsel.
Leesbaar zonder kleur. Kleur is nooit de enige drager van betekenis: elk vlak krijgt het nummer van zijn legenderegel op de kaart, elke laag een eigen arcering, en het palet is dat van Okabe en Ito (onderscheidbaar bij deuteranopie, protanopie en tritanopie). De kaart blijft daardoor bruikbaar in grijswaarden en bij kleurenblindheid. Labels van grote gebieden worden in het zichtbare deel van het vlak geplaatst en wijken uit bij overlap, zodat ook geneste aanduidingen hun nummer houden.
Grote vlakken worden eerst getekend, zodat kleine percelen zichtbaar blijven.
De kaartversieringen schalen mee met breedte_px, dus een kaart van 1800 px blijft leesbaar op
een halve A4. Valt de WMS uit, dan wordt de kaart zonder ondergrond getekend en staat dat in
melding; een WFS-laag die faalt, staat in de legende als niet_geraadpleegd.
gebieden_rond: beschermde gebieden en gebiedsstatuten
Bevraagt de WFS-diensten van het Departement Omgeving (Mercator) en Digitaal Vlaanderen (BWK)
rond een punt of polygoon, intern in Lambert 72 (metrische afstanden). Per laag: de gebieden
die het punt bevatten of de polygoon overlappen (overlapt, afstand 0), anders de
dichtstbijzijnde binnen straal_m (standaard 1000 m).
Lagen (gebieden.LAGEN) en groepen voor lagen:
Groep | Lagen |
| Habitatrichtlijngebied + deelgebied (SBZ-H), Vogelrichtlijngebied (SBZ-V), Ramsar |
| VEN/IVON, nationaal park, natuurreservaat-uitbreidingszone, HPG/beschermd grasland, poldergrasland, Duinendecreet |
| Natuurbeheerplan, natuurrichtplan, Sigma-natuurdoel, ANB-domein |
| Beschermd landschap, dorpsgezicht, monument |
| BWK-habitat (incl. Natura 2000-habitattype), BWK-fauna, BWK-habitattype 3260 (waterlopen) |
Leeg lagen = alle lagen bevragen. Een laag met status='niet_geraadpleegd' gaf een fout bij
de WFS-dienst: dat is geen "geen gebied", niet stilzwijgend weglaten. melding waarschuwt ook
als de count-limiet van een laag is bereikt (verre treffers kunnen dan ontbreken).
Beperkingen (zie ook docs/gebieden-lagen.md, peildatum 17 september 2026):
Alleen Vlaanderen; de twee gebruikte diensten dekken Wallonië/Brussel niet.
Erkende/Vlaamse natuurreservaten zelf (de kernzones) en specifieke bosreservaten zitten niet in deze diensten — enkel de uitbreidingszones (
natuurreservaat_uitbreiding) en de brede laag openbare bossen/natuurdomeinen ANB. Verifieer op Geopunt.BWK-habitatcodes zijn karteringseenheden, geen juridisch statuut. Een niet-overlappende BWK-habitatvlek zonder habitat ("gh") wordt niet als "dichtstbijzijnde" gerapporteerd.
Rode-Lijstdekking en de broedvogel-Rode-Lijst 2016
De "meest recente gevalideerde Rode Lijsten van Vlaanderen" (rodelijst_vl, dr606) dekt geen
vogels (macro-nachtvlinders, wilde bijen, zweefvliegen, dagvlinders, libellen, pissebedden,
amfibieën, reptielen — zie rodelijst_dekking in de respons). De enige beschikbare Rode Lijst
voor broedvogels is die van Devos et al. (2016), die op het portaal verstopt zit in de
verzamellijst "Validated red lists 2015" (dr552, gefilterd op KVP source=Devos_etal_2016,
naast een oudere 2004-beoordeling in dezelfde lijst). Deze zit als aparte lijstcode
rodelijst_broedvogels_2016 in de rodelijst- en kern-groep. Zie
docs/onderzoek-rodelijst-hrl.md voor het volledige brononderzoek.
Kruiscontrole Habitatrichtlijn-bijlagen
Voor HRL-vermeldingen (bijlage II, IV, V) uit het INBO-portaal wordt de soort ook opgezocht in
de bijbehorende EU-brede GBIF-checklist van die bijlage (HRL_EU_CHECKLISTS, uitgever
Ukrainian Nature Conservation Group, wel de volledige EU-soortenlijst). Wijkt het portaal af
van die checklist, dan verschijnt koppeling_twijfel met de reden — bedoeld als signaal, geen
bewijs van fout in één van beide bronnen.
Exotenvlag
exoot (in soort_status, soorten_in_gebied, telling_in_gebied) is True als de soort
voorkomt op de Unielijst invasieve uitheemse soorten, de uitgebreide INBO-exotenlijst, of GRIIS
België (GBIF); None als één van die bronnen niet geraadpleegd kon worden (zie melding/
ontbrekend) — dan is er dus geen uitspraak, geen "nee".
Schijfcache en reproduceerbaarheid
Lijsten en checklists die zelden wijzigen (INBO-lijstitems, GBIF-checklist-sleutels) worden
naast de geheugencache ook op schijf gecachet onder ~/.cache/gbif-mcp (te overschrijven via
de omgevingsvariabele GBIF_MCP_CACHE), zodat een herstart van de server geen nieuwe download
vergt. lijstversies in de respons geeft per lijstcode het ISO-tijdstip waarop die versie
effectief is opgehaald.
Voor herleidbaarheid geeft soorten_in_gebied ook geraadpleegd_op (tijdstip van deze
bevraging), gbif_parameters (de exacte GBIF-API-parameters van de facetbevraging) en
zoek_url (dezelfde zoekopdracht op gbif.org).
Tijdsbudget en volledig
Stap 4 van de engine (records per overblijvende soort ophalen voor laatste jaar, onzekerheid en
broedindicatie) loopt binnen tijdsbudget_s (standaard 40 s). Wat niet op tijd binnenkomt,
wordt nooit stilzwijgend weggelaten: volledig=False en ontbrekend somt op voor welke
soorten/lagen het niet lukte. Verhoog tijdsbudget_s bij grote gebieden met veel soorten.
Bronnen
GBIF occurrence API (
api.gbif.org) — waarnemingen, landsfilter België. Dezelfde data als gbif.biodiversity.be (hosted portal van Belspo/BBPF). Licentie per onderliggende dataset (meestal CC0 of CC BY; ziedataset_info).Vlaams Biodiversiteitsportaal (
natuurdata.inbo.be, INBO, Atlas of Living Australia-stack) — naamzoeken (Nederlandse namen) en de gezaghebbende lijsten hieronder. Licentie: CC0.GBIF-checklists — als aanvulling/controle op de INBO-lijsten: Validated Red Lists of Flanders (
gbif_rodelijst_vl), GRIIS België (gbif_griis_be), Unielijst (gbif_unielijst), Belgian Species List (gbif_belgian_species_list), en de EU-brede HRL-bijlagechecklists (kruiscontrole, zie hierboven).Digitaal Vlaanderen geolocation v4 (
geo.api.vlaanderen.be) — adres → coördinaten. Modellicentie gratis hergebruik van overheidsinformatie.VRBG-gemeentegrenzen (Voorlopig Referentiebestand Gemeentegrenzen, Digitaal Vlaanderen, WFS) — gemeentegeometrie voor
gemeente. Modellicentie gratis hergebruik.WFS Departement Omgeving (Mercator) en WFS Digitaal Vlaanderen (BWK) — beschermde gebieden en BWK voor
gebieden_rond(zie hierboven). Modellicentie gratis hergebruik.
Lijsten op het Vlaams Biodiversiteitsportaal (lijst, soorten_in_gebied)
Code | Naam | Groep |
| Soortenbesluit (bijlage 1, categorieën 1-3) | bescherming |
| Jachtdecreet — jachtwild (checklist) | bescherming |
| Habitatrichtlijn bijlage II | bescherming |
| Habitatrichtlijn bijlage IV — soorten die in het Vlaamse Gewest voorkomen of kunnen voorkomen (Soortenbesluit categorie 3) | bescherming |
| Habitatrichtlijn bijlage IV (portaal-lijst, 83 soorten; onvolledig, gebruik | bescherming |
| Habitatrichtlijn bijlage V | bescherming |
| Vogelrichtlijn bijlagen I, II.1 en II.2 (gecombineerd) | bescherming |
| Vogelrichtlijn bijlage III | bescherming |
| Verdrag van Bern — bijlagen I, II en III | verdrag |
| Verdrag van Bonn (CMS) — trekkende soorten | verdrag |
| EU CITES-verordening — bijlagen | verdrag |
| Unielijst invasieve uitheemse soorten (Verordening (EU) nr. 1143/2014) | invasief |
| Uitgebreide lijst invasieve uitheemse soorten (INBO) | invasief |
| Meest recente gevalideerde Rode Lijsten van Vlaanderen (INBO); geen vogels | rodelijst |
| Rode Lijst van de broedvogels in Vlaanderen 2016 (Devos et al. 2016) | rodelijst |
| Niet-gevalideerde Rode Lijsten van Vlaanderen | rodelijst |
| IUCN Red List (wereldwijd; niet de Vlaamse status) | rodelijst |
| Prioritaire soorten Vlaanderen | beleid |
| Provinciaal belangrijke soorten (per provincie) | beleid |
| Checklist Soortenmeetnetten INBO | beleid |
Groepscodes voor filter in soorten_in_gebied/telling_in_gebied: kern, beschermd,
europees, rodelijst, invasief, prioritair, provinciaal. Volledig overzicht incl.
URL's: tool bronnen. Laaginventaris gebieden_rond: docs/gebieden-lagen.md.
Voor gebruikers
Een handleiding zonder technische voorkennis, met installatie-instructies en voorbeeldvragen, staat in HANDLEIDING.md.
Rapportsjabloon
datarapport_natuur maakt in één oproep het vaste datarapport (gbif_mcp/rapport.py). De
bevragingen lopen parallel; een rapport met twee kaarten duurt enkele seconden. Zonder pad
belandt de PDF in ~/Documents (op Windows de map Documenten). Daarnaast biedt de server een
MCP-prompt datarapport_natuur: een kant-en-klaar verzoek met adres en stralen als argumenten,
dat Claude laat samenvatten volgens de vaste conventies (beide stralen expliciet, strikt en
striktst beschermd, waarschuwingen letterlijk, niets toevoegen).
Het sjabloon houdt zich aan dezelfde conventies als de tools: beide zoekstralen worden overal genoemd, "ruimere" of "kleinere" straal alleen wanneer dat klopt, getallen met punt als duizendtalscheiding ongeacht de systeeminstelling, en laagnamen in plaats van interne codes.
Voorbeeldrapport
voorbeeld/datarapport-natuur.pdf is een datarapport natuur dat volledig uit de tool-uitvoer is
opgebouwd (neutraal testadres, straal 500 m, vanaf 2020): samenvatting, statussen in cijfers,
kernsoorten met herkomst per brondataset, gebiedslagen met afstand, onderliggende records met
verificatiestatus, en een verantwoording met de versiedatum van elke lijst en de GBIF-zoek-URL.
voorbeeld/datarapport-natuur-met-kaart.pdf is dezelfde opzet met een situeringskaart als
hoofdstuk 2 (andere locatie, met beschermde gebieden in de buurt).
voorbeeld/datarapport-kalmthout.pdf toont twee thematische kaarten naast elkaar: de beschermde
gebieden en de Biologische Waarderingskaart, voor een locatie in de Kalmthoutse Heide.
voorbeeld/datarapport-temse.pdf is rechtstreeks door de tool datarapport_natuur gemaakt.
voorbeeld/maak_rapport.py maakt een bewaarde JSON-bevraging opnieuw op met hetzelfde sjabloon.
Disclaimer en privacy
Betaversie — geen product, geen garantie, geen aansprakelijkheid. Deze software is een experimenteel hulpmiddel in ontwikkeling, geen commercieel product of dienst. De software en de rapporten die ze maakt, worden kosteloos aangeboden zoals ze zijn, zonder enige uitdrukkelijke of stilzwijgende garantie, onder meer over juistheid, volledigheid, actualiteit of geschiktheid voor een bepaald doel. De resultaten zijn een geautomatiseerde bronnenscan van publieke databanken; ze vervangen geen terreininventarisatie, deskundige beoordeling of juridisch advies. De gebruiker is zelf volledig verantwoordelijk voor het controleren van de resultaten en voor elk gebruik dat ervan wordt gemaakt. De auteur is niet aansprakelijk voor schade die voortvloeit uit het gebruik van de software of de resultaten.
Privacy. De connector verwerkt geen persoonsgegevens van waarnemers. GBIF levert bij een waarneming ook de naam van de waarnemer en van wie de soort determineerde; die gegevens worden bij ontvangst verwijderd, nog vóór ze worden bewaard, en komen niet in antwoorden, exports of rapporten terecht.
Licentie
Copyright © 2026 Jef Seghers. In licentie gegeven krachtens de EUPL.
De code valt onder de Openbare Licentie van de Europese Unie, versie 1.2 (EUPL-1.2). De officiële Nederlandse tekst staat in LICENSE; alle taalversies hebben gelijke rechtskracht (overzicht bij de Europese Commissie). U mag de code gebruiken, bestuderen, aanpassen en verspreiden. Wie een aangepaste versie verspreidt of online als dienst aanbiedt, doet dat onder dezelfde licentie.
De licentie geldt voor de code, niet voor de gegevens in de antwoorden en rapporten. Die gegevens vallen onder de licentie van hun bron; zie Datalicenties hieronder.
Datalicenties
Elke GBIF-dataset heeft één licentie: CC0 1.0 (vrij), CC BY 4.0 (naamsvermelding) of CC BY-NC 4.0 (alleen niet-commercieel). Onder de Belgische datasets vallen onder meer iNaturalist, Xeno-canto en de exotendatasets van waarnemingen.be onder CC BY-NC.
Standaard neemt de connector alle licenties mee, ook CC BY-NC: de antwoorden en rapporten zijn bedoeld als intern werkdocument. Een rapport met gegevens onder CC BY-NC zegt dat op het titelblad en vermeldt hoeveel records het betreft.
Wordt een resultaat gedeeld of gepubliceerd, zet dan ook_niet_commercieel=False (of vraag in
Claude "alleen vrij bruikbare data"). De filter werkt dan aan de bron (GBIF-parameter license),
zodat aantallen, soortenlijsten, kaarten en records onderling kloppen; records zonder bruikbare
licentie vallen dan ook weg. Of een concreet gebruik commercieel is, blijft een beoordeling van de
gebruiker.
Elk antwoord vermeldt de gebruikte keuze (licentiefilter), de verdeling van alle records per
licentie (licenties) en, bij uitsluiting, hoeveel records zijn weggelaten
(uitgesloten_niet_commercieel). Het rapport toont de licentie per dataset in de bronverantwoording.
De voorbeeldrapporten in voorbeeld/ zijn gemaakt met ook_niet_commercieel=False, omdat ze in deze
repository gepubliceerd worden.
Voor datasets onder CC BY is naamsvermelding vereist: neem de datasettabel uit het rapport over wanneer u de gegevens hergebruikt.
Installatie
cd gbif-mcp
uv venv --python 3.12 && source .venv/bin/activate
uv pip install -e ".[test]"
pytest -q # tests draaien zonder netwerkWindows
Zie docs/installeren-windows.md: extensiebundel of git-kloon,
met de PowerShell-stappen en de aandachtspunten. Dezelfde .mcpb werkt op macOS en Windows.
Aansluiten op Claude Desktop
Eenvoudigste weg: de extensiebundel. Bouw ze met zsh mcpb-src/bouw.sh (vereist uv en npx),
en installeer dist/be-biodiversiteit.mcpb via Claude Desktop → Instellingen → Extensies →
Geavanceerde instellingen → Extensie installeren. De eerste start maakt eenmalig een venv aan
(±1 minuut, internet nodig). Alternatief, zonder bundel:
Voeg toe aan claude_desktop_config.json en herstart Claude Desktop:
{
"mcpServers": {
"be-biodiversiteit": {
"command": "/pad/naar/gbif-mcp/.venv/bin/gbif-mcp"
}
}
}Aansluiten op Claude Code
claude mcp add be-biodiversiteit /pad/naar/gbif-mcp/.venv/bin/gbif-mcpHarde regels
Geen namen van waarnemers. Velden als
recordedByenidentifiedByworden bij ontvangst verwijderd (gbif.PERSOONSVELDEN); voeg ze nooit toe aan een antwoord, export of rapport.Alleen wat een tool teruggeeft is gevonden. Vul nooit soorten, statussen, gebieden of waarnemingen aan die niet letterlijk uit een tool-respons komen.
Nul waarnemingen ≠ afwezig. GBIF-waarnemingen zijn opportunistische meldingen (vooral waarnemingen.be), geen systematische inventarisatie. Voor een dossier blijft een terreininventarisatie nodig.
Coördinaten van gevoelige soorten zijn vaak vervaagd. Zie
onzekerheid_max_m/onzekerheid_mop elke waarneming; waarden van 1-10 km wijzen op vervaging naar een hok.soorten_in_gebiedwaarschuwt expliciet (signaleer_vervaging) als een strikt beschermde soort geen enkel record heeft dat zeker binnen de straal ligt.De brondataset zegt iets over de herkomst, niet over de validatiestatus. Een dataset- uitsplitsing toont wie de determinatie deed en via welk platform. Waarnemingen.be stuurt niet alle validatieklassen door naar GBIF, en verscheidene datasets vullen
identificationVerificationStatusniet in. De connector leidt géén betrouwbaarheidsklasse af uit een datasetnaam; die weging is aan de gebruiker.hrl_ivis onvolledig (afgeleid van een Britse NBN-lijst; mist o.m. wolf en bever). Gebruik voor Vlaamse dossiershrl_iv_vl(Soortenbesluit categorie 3) als primaire bron.Lege
vermeldingeninsoort_statusbetekent niet onbeschermd. Een soort kan basisbescherming genieten (bv. alle inheemse vogels via het Soortenbesluit) zonder als aparte regel op een lijst te staan.soort_statusvermeldt dat expliciet inmelding.rodelijst_vl(dr606) bevat geen vogels. Gebruikrodelijst_broedvogels_2016(of de groepenrodelijst/kern, die beide al bevatten) voor de Rode-Lijststatus van vogels.Een laag met
status='niet_geraadpleegd'ingebieden_rondis geen "geen gebied aanwezig" — de WFS-dienst gaf een fout. Zeg dat er expliciet bij.volledig=False/ontbrekendinsoorten_in_gebiedbetekent dat niet alle records binnen het tijdsbudget zijn opgehaald; neem dat over, doe geen uitspraak over aantallen voor de vermelde soorten alsof ze compleet zijn.
Lokaal draaien (stdio)
python -m gbif_mcp.serverAvailable Tools
13 toolsbronnenA
Overzicht van alle geraadpleegde bronnen en de lijst-/groepscodes voor soorten_in_gebied en lijst.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the tool as an informational overview, implying a read-only, non-destructive operation, but it does not explicitly state side-effect-free behavior or data freshness. Since it is a reference tool, this is adequate but could be more explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, concise sentence that front-loads the core purpose and immediately references the relevant sibling tools. Every word adds value, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and an output schema exists (which defines return values), the description sufficiently explains what the tool provides. It names the two tools whose codes it covers, which is the key contextual information. The only minor gap is not stating whether the data is static or dynamic, but this is not critical for a reference tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema fully covers them (100% coverage). Per the rubric, the baseline for 0 params is 4, and the description adds no param-specific meaning, which is appropriate since there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides an overview of consulted sources and the list/group codes used by two specific sibling tools (`soorten_in_gebied` and `lijst`). It identifies a specific resource and its purpose, distinguishing it from the query-focused siblings. The verb 'Overzicht' (overview) is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: when you need codes for the named tools, consult this. However, it does not explicitly state when to use it vs. alternatives, nor does it provide exclusions or prerequisites. The context is clear but not prescriptive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
datarapport_natuurA
Maak in één stap het vaste DATARAPPORT NATUUR als PDF voor een projectlocatie.
Gebruik deze tool wanneer de gebruiker om een datarapport, natuurrapport, bronnenscan of "rapport zoals het vorige" vraagt. Het sjabloon ligt vast, zodat elk rapport dezelfde opbouw heeft: titelblad met coördinaten en beide zoekstralen, samenvatting, situering met kaart(en), statussen in cijfers, kernsoorten met hun herkomst per brondataset, beschermde gebieden en gebiedsstatuten met afstand, de onderliggende waarnemingen van de striktst beschermde soorten, verantwoording van de bronnen (lijstversies, GBIF-zoekopdracht) en beperkingen.
Soorten en gebieden hebben elk een eigen zoekstraal; dat is een bewuste keuze die afhangt van het project en het type natuur. Het rapport noemt beide stralen overal expliciet.
De kaarten zijn leesbaar zonder kleuronderscheid (nummers en arceringen). Met bwk_kaart komt
er een tweede kaart met de habitattypes van de Biologische Waarderingskaart.
Na afloop: vat voor de gebruiker kort samen wat het rapport vond (aantal kernsoorten, de striktst beschermde soorten, gebieden waarin of nabij de locatie ligt, waarschuwingen letterlijk) en geef het pad. Voeg niets toe dat niet uit de respons komt. Spreek van strikt of striktst beschermd, nooit van zwaar of zwaarst beschermd.
Args:
adres: adres in Vlaanderen (bij voorkeur met huisnummer); of lat/lon in WGS84.
pad: doelbestand (.pdf). Zonder pad: Documenten/datarapport-natuur--.pdf.
straal_soorten_m: zoekstraal voor soortwaarnemingen (standaard 500 m).
straal_gebieden_m: zoekstraal voor gebiedsstatuten en kaarten (standaard 1000 m).
jaar_van / jaar_tot: periode van de waarnemingen (standaard vanaf 2020).
kaarten: situeringskaart met de beschermde gebieden opnemen.
bwk_kaart: tweede kaart met de Biologische Waarderingskaart opnemen.
detail_soorten: van hoeveel striktst beschermde soorten de individuele records worden getoond.
bewaar_kaarten: de kaartafbeeldingen naast de PDF bewaren (handig om in een nota te gebruiken).
ook_niet_commercieel: ook datasets onder CC BY-NC (alleen niet-commercieel gebruik) meenemen.
Standaard aan: de uitvoer is bedoeld als intern werkdocument. Zet op False wanneer het
resultaat gedeeld of gepubliceerd wordt; dan komen alleen datasets onder CC0 en CC BY mee.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| pad | No | ||
| adres | No | ||
| kaarten | No | ||
| jaar_tot | No | ||
| jaar_van | No | ||
| bwk_kaart | No | ||
| bewaar_kaarten | No | ||
| detail_soorten | No | ||
| straal_soorten_m | No | ||
| straal_gebieden_m | No | ||
| ook_niet_commercieel | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of behavioral disclosure. It reveals the fixed template structure, the two search radii and their rationale, the map behavior (including the bwk_kaart option), the licensing nuance (ook_niet_commercieel default and when to set False), and even linguistic constraints ('nooit van zwaar of zwaarst beschermd'). It also instructs to base the summary only on the response. This is thorough and transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is well-structured and every sentence earns its place. It front-loads the core purpose and usage triggers, then explains the template, search radii, maps, post-action summary, and finally the parameters. There is no redundancy or filler; the Args list is clear and matches the schema properties.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 parameters and no output schema, the description covers all parameters, the full behavior (template, maps, licensing), and the post-action requirements. It even addresses edge cases like sharing vs. internal use (ook_niet_commercieel) and language precision. Nothing critical is missing for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely. It does so with an Args section that explains every parameter: adres (with fallback to lat/lon), pad (with default path), straal_soorten_m and straal_gebieden_m (with defaults and rationale), jaar_van/jaar_tot, kaarten, bwk_kaart, detail_soorten, bewaar_kaarten, and ook_niet_commercieel (with licensing meaning). This adds meaning far beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Maak in één stap het vaste DATARAPPORT NATUUR als PDF voor een projectlocatie.' It also names the exact user triggers ('datarapport, natuurrapport, bronnenscan of "rapport zoals het vorige"'), which clearly differentiates it from sibling tools that handle individual queries like zoek_soort or waarnemingen. The purpose is unambiguous and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Gebruik deze tool wanneer de gebruiker om een datarapport, natuurrapport, bronnenscan of "rapport zoals het vorige" vraagt.' It also provides post-action guidance on how to summarize results and which terminology to use. However, it does not explicitly mention when NOT to use it or name alternative tools for other cases, so it's slightly short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dataset_infoA
Herkomst, uitgever, licentie, DOI en citatie van een GBIF-dataset (uit per_dataset of een waarneming).
Args: dataset_key: GBIF-dataset-UUID.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| doi | No | |
| key | Yes | |
| url | Yes | |
| type | No | |
| titel | Yes | |
| citatie | No | |
| licentie | No | |
| uitgever | No | |
| beschrijving | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It lists the output fields but does not state that this is a read-only operation, whether authentication is required, or whether any side effects occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with one sentence explaining the tool's purpose and one argument definition. There is no redundant wording or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter metadata lookup with an output schema present, the description covers the essential input semantics. It could be improved with an explicit read-only note or usage pointer, but the simplicity of the tool makes the current text largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by defining `dataset_key` as a GBIF-dataset UUID and indicating it can come from `per_dataset` or an observation. This adds format and provenance context beyond the schema's plain string type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool provides provenance metadata—origin, publisher, license, DOI, and citation—for a GBIF dataset. It lacks an explicit verb such as 'returns' or 'retrieves', but the resource and content are specific enough to distinguish it from observation, species, and area-related sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(uit `per_dataset` of een waarneming)' helps explain where the dataset key comes from, but the description does not explicitly say when to use this tool versus alternatives. Usage is implied through the clear purpose rather than stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exporteer_bevragingA
Schrijf een volledige gebiedsbevraging weg als CSV of JSON (alle soorten, optioneel alle records), met metadata.
Bestemd voor datarapporten: pad eindigt op .csv (soortentabel; met met_records=True komt er een tweede
bestand _records.csv) of .json (alles in één bestand, incl. metadata: geraadpleegd_op, gebied,
GBIF-parameters, lijstversies, datasets, legende). Zelfde filters als soorten_in_gebied.
De soortentabel bevat altijd de uitsplitsing per brondataset: in CSV als de kolommen datasets
(compacte notatie 'wnm.be-gewervelden 5 / eBird 2') en n_datasets, in JSON als de volledige lijst
datasets per soort. De brondataset zegt iets over de herkomst van de determinatie, niet over de
validatiestatus van het record.
Args: pad: doelbestand (.csv of .json), absoluut of relatief aan de werkmap van de server. met_records: ook alle individuele GBIF-records van de geselecteerde soorten wegschrijven. ook_niet_commercieel: ook datasets onder CC BY-NC (alleen niet-commercieel gebruik) meenemen. Standaard aan: de uitvoer is bedoeld als intern werkdocument. Zet op False wanneer het resultaat gedeeld of gepubliceerd wordt; dan komen alleen datasets onder CC0 en CC BY mee.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| pad | Yes | ||
| wkt | No | ||
| adres | No | ||
| filter | No | beschermd,rodelijst | |
| gemeente | No | ||
| jaar_tot | No | ||
| jaar_van | No | ||
| straal_m | No | ||
| met_records | No | ||
| tijdsbudget_s | No | ||
| alleen_bedreigd | No | ||
| ook_niet_commercieel | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It thoroughly discloses file naming conventions, the second records file when met_records=True, JSON metadata contents, dataset-column notation, licensing defaults, and the distinction between source dataset and validation status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well organized: purpose and output behavior come first, followed by dataset-split details and an Args section. Each section adds necessary information for a complex export tool, and the most decision-relevant facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for output format, metadata, licensing, and dataset splitting, but it does not explain return values despite having no output schema. It also delegates the full filter semantics to soorten_in_gebied and leaves several parameters undocumented, which creates gaps for an agent without access to that sibling's description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only three parameters (pad, met_records, ook_niet_commercieel) are explained in the Args section. With 14 parameters and 0% schema description coverage, the remaining geospatial and filter parameters are left to their schema titles and the generic reference 'Zelfde filters als soorten_in_gebied', which is insufficient compensation for such a large parameter set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Schrijf een volledige gebiedsbevraging weg als CSV of JSON'. It clearly identifies the output formats, optional records, metadata, and the report-oriented purpose, which distinguishes it from sibling query tools like soorten_in_gebied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the intended use ('Bestemd voor datarapporten') and ties the filters to the sibling tool soorten_in_gebied. It also gives conditional guidance for met_records and ook_niet_commercieel, but it does not explicitly say when not to use this tool or compare it directly with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gebieden_rondA
Beschermde gebieden en gebiedsstatuten rond een punt of polygoon: Natura 2000 (SBZ-H/SBZ-V, Ramsar), VEN/IVON, nationale parken, natuurreservaat-uitbreidingszones, natuurbeheerplannen, natuurrichtplannen, Sigma-natuurdoelen, ANB-domeinen, HPG/beschermde graslanden, Duinendecreet, beschermd erfgoed (landschap, dorpsgezicht, monument) en BWK (habitat, fauna, 3260).
Per laag: de gebieden die het punt bevatten of de polygoon overlappen (overlapt, afstand 0), anders
de dichtstbijzijnde binnen straal_m met de afstand in meter (Lambert 72). Een laag met status
niet_geraadpleegd gaf een fout: dat is geen 'geen gebied'. Bronnen: WFS Departement Omgeving
(Mercator) en Digitaal Vlaanderen (BWK); alleen Vlaanderen.
Args: adres: adres of plaatsnaam (Digitaal Vlaanderen); of lat/lon (WGS84); of wkt (POLYGON, WGS84 lon lat). straal_m: zoekstraal (standaard 1000 m). lagen: kommagescheiden laag- of groepscodes: natura2000, natuur, beheer, erfgoed, bwk, of losse codes (hrl_gebied, vrl_gebied, ven_ivon, natuurbeheerplan, hpg, bwk_habitat, …). Leeg = alle lagen. max_treffers_per_laag: hoeveel treffers per laag worden teruggegeven (gesorteerd: overlap eerst, dan afstand).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| wkt | No | ||
| adres | No | ||
| lagen | No | ||
| straal_m | No | ||
| max_treffers_per_laag | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| doel | Yes | |
| lagen | Yes | |
| straal_m | Yes | |
| kanttekening | Yes | |
| samenvatting | No | Per laag met treffers: 'in <naam>' of 'dichtstbij <naam> op N m'. |
| waarschuwingen | No | |
| geraadpleegd_op | Yes | |
| niet_geraadpleegd | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it explains the selection logic (overlap first, then nearest within radius), distance in Lambert 72, error handling via 'niet_geraadpleegd', and that a layer with an error is not 'geen gebied'. It also discloses data sources and geographic limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but information-dense and well-structured: it opens with a clear purpose, then explains behavior, sources, and parameters in logical sections. It front-loads the core functionality and avoids redundancy, though some sentences could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, multiple layers, error states, geographic restrictions) and the presence of an output schema, the description is highly complete. It covers purpose, behavior, parameter semantics, and edge cases (error status, only Flanders), leaving little ambiguity for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters—and it does thoroughly. It clarifies 'adres' can be an address, lat/lon, or WKT (with coordinate system), defines 'straal_m', lists valid 'lagen' codes with examples, and explains 'max_treffers_per_laag' sorting. All seven parameters are covered with added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool returns protected areas and area statutes around a point or polygon, enumerating a detailed list of layer types (Natura 2000, VEN/IVON, etc.). It clearly defines the query behavior (overlap vs. nearest within radius) and geographic scope, making it distinct from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides contextual constraints (only Flanders) and input flexibility, but does not explicitly compare with sibling tools or state when this tool is preferred over alternatives like 'kaart_gebieden' or 'soorten_in_gebied'. Usage guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geocodeer_adresA
Adres of plaatsnaam in Vlaanderen/Brussel -> WGS84-coördinaten en gemeente (Digitaal Vlaanderen, geolocation v4).
Args: adres: bv. 'Kortrijksesteenweg 100, 9000 Gent' of 'Bourgoyen, Gent'.
| Name | Required | Description | Default |
|---|---|---|---|
| adres | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| lat | Yes | |
| lon | Yes | |
| bron | No | |
| type | No | |
| adres | No | |
| invoer | Yes | |
| gemeente | No | |
| postcode | No | |
| x_lambert72 | No | |
| y_lambert72 | No | |
| waarschuwing | No | bv. geen huisnummer: het resultaat is het straatmidden. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of behavioral disclosure. It does reveal that an external Digitaal Vlaanderen geolocation service is used and that output includes coordinates and municipality, but it does not mention potential failure modes, coverage limits, or whether network/auth requirements exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose and source are in the first line, followed by a minimal parameter example block. No unnecessary filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to document return fields in detail. It covers input scope, accepted input forms, and output type well enough for a simple one-parameter geocoding tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must clarify the 'adres' parameter. It does so with two concrete examples covering both a full address and a place name, which is sufficient for a single free-form string parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly defines a geocoding transformation from an address or place name in Flanders/Brussels to WGS84 coordinates and municipality, and it names the underlying service (Digitaal Vlaanderen, geolocation v4). This is specific enough to distinguish it from all listed sibling tools, which are biodiversity-data related.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is clear: provide an address or place name in Flanders/Brussels. It does not explicitly list when-not-to-use or alternatives, but the scope is well delimited and the siblings are unrelated, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kaart_gebiedenA
Situeringskaart: de projectlocatie met de beschermde gebieden eromheen.
Tekent de gebieden uit gebieden_rond op de GRB-basiskaart van Digitaal Vlaanderen, in
Lambert 72, met legende, schaalbalk, noordpijl en de zoekcirkel. Bedoeld als situeringsfiguur
in een datarapport of nota. Alleen Vlaanderen.
Geeft het bestandspad terug plus de legende (per laag: kleur, aantal getekende vlakken,
status). Een laag met status niet_geraadpleegd gaf een fout: daaruit volgt niet dat er geen
gebied ligt. Lagen zonder vlak binnen de straal komen niet in de legende.
Args:
pad: doelbestand; .png of .jpg. Voor een rapport met meerdere kaarten is .jpg aan te
raden: de GRB-ondergrond is rasterbeeld, waardoor JPEG tot tienmaal kleiner uitvalt.
adres: adres of plaatsnaam; of lat/lon (WGS84); of wkt (POLYGON in WGS84, lon lat).
straal_m: zoekstraal én maat voor de kaartuitsnede (de kaart toont ±25 % meer).
lagen: laag- of groepscodes zoals bij gebieden_rond; standaard natura2000, natuur en beheer.
Voeg 'erfgoed' of 'bwk' toe voor beschermd erfgoed of de Biologische Waarderingskaart.
breedte_px: beeldbreedte in pixels (600 tot 2400).
met_legende: legende onder de kaart inbakken. Zet op False wanneer de kaart verkleind in een
document komt: gebruik dan het veld legende uit de respons om ze in het document zelf
op te maken, anders is de ingebakken tekst onleesbaar.
per_groep: één kaart per thema in plaats van alles op elkaar. Aan te raden zodra de
Biologische Waarderingskaart meedoet: die dekt het hele beeld en maakt de
beschermingsgebieden onleesbaar. De bestandsnamen krijgen de groep als achtervoegsel
(bv. situering-bwk.jpg) en de respons bevat dan een lijst kaarten.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| pad | Yes | ||
| wkt | No | ||
| adres | No | ||
| lagen | No | natura2000,natuur,beheer | |
| straal_m | No | ||
| per_groep | No | ||
| breedte_px | No | ||
| met_legende | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so strongly: it discloses the return value (file path plus legend with color, count, status), the meaning of `niet_geraadpleegd`, the fact that empty layers are omitted, the ±25% map-extent margin, and that `per_groep` returns a `kaarten` list. This goes well beyond what the schema tells the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but each sentence earns its place: purpose and output semantics are front-loaded, followed by per-parameter guidance and practical recommendations. There is no filler, and the structure mirrors the invocation workflow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 10 parameters, no annotations, and no output schema, this definition is exceptionally complete. It explains return fields, edge-case status values, file naming behavior, and when to change embedded options, giving the agent enough context to invoke it correctly in realistic report-generation scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: every parameter is explained, including coordinate systems (WGS84 for adres/lat/lon/wkt, Lambert 72 for the map), file format constraints (.png/.jpg), pixel bounds (600-2400), and the dual role of `straal_m` as search radius and map cutoff. This fully compensates for the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Tekent de gebieden uit `gebieden_rond` op de GRB-basiskaart van Digitaal Vlaanderen', producing a situational map with protected areas, legend, scale bar, north arrow, and search circle. It is clearly distinguished from data-returning siblings like `gebieden_rond` by framing itself as a situeringsfiguur for reports and notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly gives intended use ('Bedoeld als situeringsfiguur in een datarapport of nota'), restricts use to Flanders, and gives concrete conditional recommendations: use .jpg for multi-map reports, disable the embedded legend for small reproductions, and use `per_groep` when the Biologische Waarderingskaart is included. It does not explicitly name exclusions among siblings, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lijstA
Inhoud van één gezaghebbende soortenlijst (Soortenbesluit, HRL-bijlagen, Rode Lijst, Unielijst …).
Args:
code: lijstcode uit bronnen (bv. 'soortenbesluit', 'hrl_iv', 'rodelijst_vl', 'unielijst').
zoek: optionele tekstfilter op naam, Nederlandse naam of taxongroep (hoofdletterongevoelig).
categorie: optionele filter op categorie (bv. 'cat3', 'EN', 'Amfibieen').
max_resultaten: bovengrens.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| zoek | No | ||
| categorie | No | ||
| max_resultaten | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| items | Yes | |
| totaal | Yes | |
| melding | No | |
| lijst_code | Yes | |
| lijst_naam | Yes | |
| teruggegeven | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden of behavioral disclosure. It documents filtering semantics such as case-insensitive text search, category filtering, and a max-results upper bound, which is useful. However, it does not mention error handling, filter combination behavior, or pagination, leaving moderate gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single purpose sentence followed by a compact Args block, with no filler or repetition. It front-loads the main purpose and keeps each parameter explanation short and directly useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple four-parameter retrieval tool with an output schema and no annotations, the description provides enough operational context: required code source, optional filters, and result cap. The main gap is the lack of when-to-use guidance, already penalized under usage guidelines, and the list of valid codes is only illustrative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by documenting all four parameters with concrete meaning and examples. `code` is linked to `bronnen`, `zoek` specifies searchable fields and case-insensitivity, `categorie` gives value examples, and `max_resultaten` is defined as an upper bound.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence clearly states the tool returns the contents of one authoritative species list and names concrete lists (Soortenbesluit, HRL-bijlagen, Rode Lijst, Unielijst). This makes resource and scope clear, but it does not explicitly contrast with sibling tools such as zoek_soort or soort_status, so differentiation is mostly inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent that `code` comes from `bronnen` and gives example codes, but it never states when to prefer this tool over siblings or when not to use it. There is no mention of alternatives for searching species or checking statuses, so selection guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
soorten_in_gebiedA
Welke soorten zijn in een gebied waargenomen, gekoppeld aan hun beschermings- en Rode-Lijststatus.
Typische vraag in m.e.r./passende beoordeling: "welke bijlage IV-soorten en Rode-Lijstsoorten zijn
binnen 750 m van dit perceel gemeld sinds 2020?". Compacte regel per soort (namen, aantal, laatste
jaar, samenvatting van statussen, exotenvlag, coördinaatonzekerheid, broedindicaties); detail=True
geeft ook de volledige lijstvermeldingen. Categorie-toelichtingen staan één keer in legende.
Gesorteerd van strikt naar minder strikt beschermd (bijlage IV / cat. 3 > bijlage II, VRL bijlage I, RL RE/CR/EN >
cat. 2, VU, Unielijst > …), daarna op aantal. Voor enkel aantallen: telling_in_gebied.
filter: kommagescheiden lijst- of groepscodes (zie bronnen). Groepen: kern (bijlage IV Vl.,
bijlage II, VRL bijlage I, Rode Lijst RE/CR/EN/VU — wat in een natuurtoets telt), beschermd
(Soortenbesluit, HRL II/IV/V, VRL, Bern, Bonn), europees, rodelijst, invasief, prioritair, provinciaal.
Leeg = alle soorten (max max_soorten). alleen_bedreigd beperkt Rode-Lijstsoorten tot RE/CR/EN/VU.
max_onzekerheid_m sluit vervaagde records uit (aantallen worden dan herteld). alleen_broedindicatie
houdt alleen soorten met minstens één record met broed-/voortplantingsaanwijzing.
per_dataset_per_soort=True geeft per soort het veld datasets: uit welke brondatasets haar
waarnemingen komen (dataset_key, dataset, aantal, laatste_jaar), aflopend op aantal; de som is
gelijk aan aantal_waarnemingen. Dat kost geen extra GBIF-oproepen (de records zijn er al). Bij
formaat='tabel' komt er een kolom datasets met de compacte notatie 'wnm.be-gewervelden 5 /
eBird 2'. Doorklikken naar de records kan met waarnemingen(..., dataset_key=...).
volledig=False betekent dat records voor sommige soorten niet binnen tijdsbudget_s konden worden
opgehaald; zie ontbrekend. Lees waarschuwingen en kanttekening.
Args:
adres: adres of plaatsnaam (Digitaal Vlaanderen). straal_m: standaard 500 m.
wkt: POLYGON in WGS84 (lon lat), tegenwijzerzin. gemeente: Vlaamse gemeente (elders: arrondissement).
filter: bv. 'kern', 'beschermd,rodelijst' (standaard), 'hrl_iv_vl', 'invasief', '' voor alles.
per_dataset_per_soort: uitsplitsing van de waarnemingen per brondataset, per soort.
formaat: 'json' (objecten in soorten) of 'tabel' (markdown-tabel in tabel, ±4x compacter; aanbevolen bij >50 soorten).
max_soorten / offset: paginering; totaal_soorten_met_status zegt hoeveel er in totaal zijn.
ook_niet_commercieel: ook datasets onder CC BY-NC (alleen niet-commercieel gebruik) meenemen.
Standaard aan: de uitvoer is bedoeld als intern werkdocument. Zet op False wanneer het
resultaat gedeeld of gepubliceerd wordt; dan komen alleen datasets onder CC0 en CC BY mee.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| wkt | No | ||
| adres | No | ||
| detail | No | ||
| filter | No | beschermd,rodelijst | |
| offset | No | ||
| formaat | No | json | |
| gemeente | No | ||
| jaar_tot | No | ||
| jaar_van | No | ||
| straal_m | No | ||
| max_soorten | No | ||
| tijdsbudget_s | No | ||
| alleen_bedreigd | No | ||
| max_onzekerheid_m | No | ||
| ook_niet_commercieel | No | ||
| alleen_broedindicatie | No | ||
| per_dataset_per_soort | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| tabel | No | Markdown-tabel met dezelfde inhoud (formaat='tabel'), ±4x compacter. |
| filter | No | |
| gebied | Yes | |
| offset | No | |
| legende | No | Per lijstcode: categorie -> toelichting uit de bron (één keer, niet per soort). |
| periode | No | |
| soorten | No | Leeg bij formaat='tabel'; dan staat alles in `tabel`. Soort-URL = https://www.gbif.org/species/<taxon_key>. |
| volledig | No | |
| zoek_url | Yes | |
| licenties | No | Records per licentie in het gebied, vóór de filter. |
| ontbrekend | No | Wat binnen het tijdsbudget niet kon worden opgehaald. |
| per_dataset | No | Datasets in het gebied (sleutel, naam, aantal records), voor citatie. |
| kanttekening | Yes | |
| lijstversies | No | Per lijstcode het tijdstip waarop de lijst bij het portaal is opgehaald. |
| licentiefilter | No | Welke datalicenties zijn meegenomen; standaard alleen CC0 en CC BY. |
| waarschuwingen | No | |
| gbif_parameters | No | De GBIF-API-parameters van de facetbevraging (reproduceerbaarheid). |
| geraadpleegd_op | Yes | |
| rodelijst_dekking | No | Per Rode-Lijstcode de soortengroepen en publicatiejaren die de lijst dekt. |
| totaal_waarnemingen | Yes | Alle GBIF-waarnemingen in het gebied en de periode (alle soorten). |
| aantal_soorten_in_gebied | Yes | Aantal soorten met waarnemingen vóór filtering op lijsten. |
| totaal_soorten_met_status | Yes | Aantal soorten dat aan de filter voldoet; `soorten` is daarvan de pagina offset..offset+max_soorten. |
| uitgesloten_niet_commercieel | No | Records onder CC BY-NC die door de filter zijn weggelaten. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers: the strict-to-less-strict protection sorting order, the completeness caveat ('volledig=False' when the time budget is exceeded, see 'ontbrekend'), the performance guarantee that per_dataset_per_soort costs no extra GBIF calls, and the licensing default behavior. It even warns to read 'waarschuwingen' and 'kanttekening', signaling failure modes upfront.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the length is earned: 19 undocumented parameters and a complex domain leave little room for trimming. It is front-loaded with a concrete example query that makes the tool instantly scannable, and parameter names are code-formatted for navigation. The sorting-order and filter-group sentences are dense enough to require re-reading, which prevents a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity (19 params, zero annotations, 12 siblings), the description is remarkably complete: use case, output fields, caveats, pagination, licensing, and sibling routing are all covered. Two minor gaps remain: no statement of precedence between the four area selectors (adres/wkt/gemeente/lat/lon) when multiple are supplied, and jaar_van/jaar_tot are only implicitly explained via the 'sinds 2020' example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate — and it covers nearly all 19 parameters with meaning beyond the schema titles: filter groups with their real-world semantics ('wat in een natuurtoets telt'), wkt orientation, straal_m's default, formaat's tradeoff with a concrete cutoff ('aanbevolen bij >50 soorten'), and behavioral consequences like max_onzekerheid_m triggering a recount. Only lat/lon lack explicit prose, but those are self-evident from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states the exact query and enrichment: which species were observed in an area, linked to their protection and Red List status. It also actively distinguishes itself from siblings — 'Voor enkel aantallen: telling_in_gebied' and 'Doorklikken naar de records kan met waarnemingen(...)' — so an agent can tell them apart without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description opens with the canonical M.E.R./passende beoordeling scenario ('welke bijlage IV-soorten... binnen 750 m van dit perceel sinds 2020?') and gives explicit routing to alternatives: telling_in_gebied for pure counts, waarnemingen for record-level drill-down. It also gives a conditional rule for ook_niet_commercieel: keep the default for internal working documents, set False when the result will be shared or published.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
soort_statusA
Beschermings-, Rode-Lijst- en exotenstatus van één soort in Vlaanderen/België, met bron per vermelding.
Raadpleegt de gezaghebbende lijsten op het Vlaams Biodiversiteitsportaal (Soortenbesluit met
categorie 1-3, Habitatrichtlijn bijlagen II/IV/V, Vogelrichtlijn, Bern, Bonn, CITES, Unielijst
invasieve soorten, gevalideerde en niet-gevalideerde Vlaamse Rode Lijsten, IUCN, prioritaire en
provinciaal belangrijke soorten) én de GBIF-checklists (Rode Lijst Vlaanderen, GRIIS België).
samenvatting geeft per lijstcode de categorie; vermeldingen de details en URL's.
Lege vermeldingen = op geen van deze lijsten aangetroffen; dat is geen uitspraak over het
werkelijke beschermingsstatuut (bv. alle inheemse vogels genieten basisbescherming via het
Soortenbesluit, ook al staan ze niet als aparte regel op de lijst). Zeg dat er dan bij.
Args: soort: Nederlandse of wetenschappelijke naam, of GBIF-taxonKey.
| Name | Required | Description | Default |
|---|---|---|---|
| soort | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| exoot | No | |
| soort | Yes | |
| melding | No | |
| kanttekening | No | |
| samenvatting | No | Per lijst_code de categorie, als snelle samenvatting. |
| vermeldingen | Yes | Alle gevonden lijstvermeldingen. Leeg = op geen enkele geraadpleegde lijst gevonden (≠ onbeschermd; zie melding). |
| geraadpleegd_op | No | |
| koppeling_twijfel | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full behavioral burden. It discloses the consulted registers, the output fields 'samenvatting' and 'vermeldingen', and the crucial caveat that absence from the lists is not a statement about actual legal protection status. This goes well beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured: a lead summary, the authoritative sources, the output contract, and the usage caveat each earn their place. The parameter guidance is clearly separated and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter query tool, the description covers input formats, result semantics, source details, and the empty-result interpretation. An output schema exists)Skip, and the description explains return fields sufficiently for an agent to understand what will happen.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the 'Args' section specifies that 'soort' accepts a Dutch or scientific name, or a GBIF taxonKey. For a single string parameter, this gives the agent exactly the input alternatives it needs to invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Beschermings-, Rode-Lijst- en exotenstatus van één soort in Vlaanderen/België' – a precise, resource-scoped statement. It clearly narrows the operation to a single species and to legal/red-list/invasive statuses, distinguishing it from sibling tools like 'waarnemingen' and 'soorten_in_gebied'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: use this tool for authoritative protection, Red List, and invasive-species status with per-entry sources. It also adds an interpretation rule for empty 'vermeldingen'. It does not explicitly name alternative sibling tools, so it falls just short of full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telling_in_gebiedA
Hoeveel beschermde, Rode-Lijst- en invasieve soorten zijn in een gebied gemeld — alleen aantallen, snel.
Zelfde gebiedsparameters als soorten_in_gebied. Geeft per lijstcode en per categorie het aantal
soorten, het aantal kernsoorten (bijlage IV Vl., bijlage II, VRL bijlage I, RL RE/CR/EN/VU), het
aantal soorten met status dat tegelijk exoot is, en de totalen. Gebruik daarna soorten_in_gebied
(bv. met filter='kern') voor de namen.
per_dataset toont de brondatasets met hun aantal records (komt gratis uit dezelfde facetbevraging).
Het aantal soorten met status per dataset vergt één extra GBIF-oproep per dataset en staat daarom
achter soorten_per_dataset=True (tien parallelle oproepen voor de tien grootste datasets, in de
praktijk ±2 s extra); standaard uit, zodat de tool snel blijft.
Args:
filter: lijst-/groepscodes (zie bronnen); standaard 'beschermd,rodelijst,invasief'.
soorten_per_dataset: vul ook aantal_soorten_met_status per dataset in (trager, zie hierboven).
ook_niet_commercieel: ook datasets onder CC BY-NC (alleen niet-commercieel gebruik) meenemen.
Standaard aan: de uitvoer is bedoeld als intern werkdocument. Zet op False wanneer het
resultaat gedeeld of gepubliceerd wordt; dan komen alleen datasets onder CC0 en CC BY mee.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| wkt | No | ||
| adres | No | ||
| filter | No | beschermd,rodelijst,invasief | |
| gemeente | No | ||
| jaar_tot | No | ||
| jaar_van | No | ||
| straal_m | No | ||
| soorten_per_dataset | No | ||
| ook_niet_commercieel | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kern | Yes | Soorten met kernstatus (bijlage IV Vl., bijlage II, VRL bijlage I, Rode Lijst RE/CR/EN/VU). |
| exoten | Yes | Soorten met status die tegelijk als uitheems geregistreerd zijn. |
| gebied | Yes | |
| periode | No | |
| zoek_url | Yes | |
| licenties | No | Records per licentie in het gebied, vóór de filter. |
| per_lijst | Yes | Aantal soorten per lijstcode. |
| per_dataset | No | Brondatasets in het gebied: dataset_key, dataset, aantal_records, en (alleen met soorten_per_dataset=True) aantal_soorten_met_status. |
| kanttekening | Yes | |
| lijstversies | No | |
| per_categorie | Yes | Per lijstcode: categorie -> aantal soorten. |
| licentiefilter | No | Welke datalicenties zijn meegenomen; standaard alleen CC0 en CC BY. |
| totaal_soorten | Yes | |
| waarschuwingen | No | |
| geraadpleegd_op | Yes | |
| rodelijst_dekking | No | |
| totaal_waarnemingen | Yes | |
| totaal_soorten_met_status | Yes | Soorten met minstens één vermelding op de geraadpleegde lijsten. |
| uitgesloten_niet_commercieel | No | Records onder CC BY-NC die door de filter zijn weggelaten. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses performance behavior: `soorten_per_dataset=True` triggers ten parallel GBIF calls and adds ~2 seconds, and is off by default to keep the tool fast. It also discloses licensing behavior: `ook_niet_commercieel` defaults to True because output is an internal working document, and must be set to False for sharing/publishing. It also notes that `per_dataset` counts come 'gratis uit dezelfde facetbevraging'. These are meaningful behavioral traits beyond the schema. It doesn't mention error cases or rate limits, but the disclosed behaviors are substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-sentence summary, a short paragraph on the relationship to `soorten_in_gebied`, a paragraph on `per_dataset` and `soorten_per_dataset`, and a bulleted Args list. It is longer than the typical description, but every sentence earns its place by explaining behavior or usage. The front-loaded summary is excellent. It loses one point for being somewhat dense and for the Args section partially repeating parameter names that are already in the schema, but the added context justifies most of the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 11 parameters, no annotations, and an output schema. The description covers the tool-specific parameters and the key behavioral trade-offs (speed, licensing). It also tells the agent what to do next (`soorten_in_gebied` for names). It doesn't explain the area parameters, but those are likely shared with `soorten_in_gebied` and are named clearly in the schema. Given the complexity and the lack of annotations, the description is quite complete. A 5 would require explicit coverage of the area parameters or a pointer to where they are documented; a 4 is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains `filter` (list codes, default 'beschermd,rodelijst,invasief'), `soorten_per_dataset` (adds per-dataset counts, slower), and `ook_niet_commercieel` (license filtering, default True, set False for sharing). It also references `per_dataset` as a concept. However, the area parameters (lat, lon, wkt, adres, gemeente, straal_m, jaar_van, jaar_tot) are not explained in the description, though they are likely shared with `soorten_in_gebied` and the schema names are fairly self-explanatory. The description adds real meaning for the three tool-specific parameters, which is the most important part.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific question: 'Hoeveel beschermde, Rode-Lijst- en invasieve soorten zijn in een gebied gemeld — alleen aantallen, snel.' This states the verb (count/report), resource (protected, Red List, invasive species in an area), and the key constraint (counts only, fast). It also explicitly distinguishes itself from the sibling `soorten_in_gebied` by saying it returns counts and that `soorten_in_gebied` should be used for names. This is a strong purpose statement that differentiates it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Gebruik daarna `soorten_in_gebied` (bv. met filter='kern') voor de namen.' This tells the agent when to use this tool versus the sibling. It also explains when to set `ook_niet_commercieel` to False (when sharing/publishing) and when to enable `soorten_per_dataset` (when per-dataset counts are needed, with a cost/benefit note). This is explicit when/when-not guidance with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
waarnemingenA
Waarnemingen van één soort in een gebied en periode (GBIF, België), met datum, locatie, dataset en URL.
Gebied opgeven op één van vier manieren: adres (+ straal_m, standaard 500 m), lat/lon
(+ straal_m), wkt (POLYGON in WGS84, lon lat) of gemeente. Zonder gebied: heel België.
totaal is het aantal dat aan de filters voldoet; waarnemingen is een steekproef (max 300).
Gebruik per_jaar en per_dataset voor het beeld; zoek_url toont dezelfde zoekopdracht op gbif.org.
Met dataset_key worden alleen records van één brondataset getoond: zo klik je door vanuit de
uitsplitsing per soort van soorten_in_gebied (veld datasets) naar de onderliggende records.
per_verificatiestatus telt het veld identificationVerificationStatus over de teruggegeven records;
waarnemingen.be en Florabank vullen dat, eBird, iNaturalist en Pl@ntNet niet ('(leeg)').
Lees kanttekening en neem ze over in het advies.
Args:
soort: Nederlandse of wetenschappelijke naam, of GBIF-taxonKey.
adres: bv. 'Kortrijksesteenweg 100, Gent'.
straal_m: straal in meter rond adres of lat/lon (standaard 500).
wkt: bv. 'POLYGON((3.70 51.03,3.75 51.03,3.75 51.07,3.70 51.07,3.70 51.03))'.
gemeente: naam van een Belgische gemeente (GADM).
jaar_van: eerste jaar (inclusief). jaar_tot: laatste jaar (inclusief).
max_resultaten: aantal individuele waarnemingen dat wordt teruggegeven (max 300 per oproep).
offset: startpositie voor paginering (bv. 300 voor de tweede pagina).
dataset_key: beperk tot één GBIF-brondataset (UUID uit per_dataset of uit het veld datasets).
ook_niet_commercieel: ook datasets onder CC BY-NC (alleen niet-commercieel gebruik) meenemen.
Standaard aan: de uitvoer is bedoeld als intern werkdocument. Zet op False wanneer het
resultaat gedeeld of gepubliceerd wordt; dan komen alleen datasets onder CC0 en CC BY mee.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| wkt | No | ||
| adres | No | ||
| soort | Yes | ||
| offset | No | ||
| gemeente | No | ||
| jaar_tot | No | ||
| jaar_van | No | ||
| straal_m | No | ||
| dataset_key | No | ||
| max_resultaten | No | ||
| ook_niet_commercieel | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| soort | No | |
| gebied | Yes | Omschrijving van het gebruikte gebied (WKT, gemeente of adres+straal). |
| offset | No | |
| totaal | Yes | Totaal aantal waarnemingen dat aan de filters voldoet (kan groter zijn dan wat is teruggegeven). |
| periode | No | |
| per_jaar | No | |
| zoek_url | Yes | Dezelfde zoekopdracht op gbif.org, ter controle. |
| per_dataset | No | Verdeling over datasets (naam, sleutel, aantal). |
| kanttekening | Yes | Verplichte lezing: beperkingen van de data. |
| teruggegeven | Yes | |
| waarnemingen | Yes | |
| licentiefilter | No | |
| waarschuwingen | No | |
| geraadpleegd_op | Yes | |
| per_verificatiestatus | No | Telling van identificationVerificationStatus over de teruggegeven records; '(leeg)' = veld niet gevuld door de bron. |
| records_met_broedindicatie | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does so well: it reveals that waarnemingen is only a sample capped at 300 while totaal is the true count, explains pagination via offset, and warns that per_verificatiestatus counts only the returned records and that several sources don't fill identificationVerificationStatus ('(leeg)'). It also discloses the licensing default (output is an internal work document) and instructs the agent to read and carry over kanttekening into the advice. Minor gaps remain: no explicit read-only statement, rate limits, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence purpose, then proceeds through area modes, output semantics, caveats, and a compact Args reference. It is long, but the length is justified for a 13-parameter tool with zero schema descriptions; the only real redundancy is that area modes are explained both in the prose and again per-parameter in Args.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (13 parameters, no annotations, 0% schema coverage), the description is remarkably complete: it covers filtering, area modes, pagination, sampling limits, data-quality caveats, licensing, and the sibling workflow. Since an output schema exists, the description rightly focuses on behavior and parameters rather than return-value fields; remaining gaps are minor (error conditions, no-result behavior, rate limits).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate, and it does: the Args block documents all 13 parameters with formats, examples, constraints, and defaults (e.g., soort accepts a Dutch/scientific name or GBIF taxonKey; wkt gives a POLYGON in WGS84 lon lat; max_resultaten caps at 300). It also conveys cross-parameter constraints the schema cannot express, such as the four alternative area-specification modes and that dataset_key takes a UUID from per_dataset or the datasets field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb+resource: 'Waarnemingen van één soort in een gebied en periode (GBIF, België)' — observations of one species in an area and period from GBIF Belgium. This immediately distinguishes it from sibling tools like soorten_in_gebied (species list per area) and zoek_soort (name resolution). The description even explains the click-through relationship to soorten_in_gebied's datasets field, further reinforcing the differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the four mutually exclusive area-specification modes (adres, lat/lon, wkt, gemeente) and the whole-Belgium default, telling the agent exactly how to form a query. It explicitly names a sibling workflow (dataset_key clicking through from soorten_in_gebied's datasets field) and gives license-usage guidance (set ook_niet_commercieel to False when sharing/publishing). However, it stops short of explicit 'use X instead of this tool' exclusions for the other siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zoek_soortA
Zoek een soort op wetenschappelijke of Nederlandse naam en geef de GBIF-taxonsleutel(s).
Zoekt eerst in het Vlaams Biodiversiteitsportaal (INBO; kent Nederlandse namen), daarna in de
GBIF-backbone en de Belgian Species List. Gebruik de taxon_key uit het resultaat in de andere tools.
Meerdere treffers = ambigu (bv. 'kamsalamander' geeft ook 'Italiaanse kamsalamander'); kies bewust.
Args: naam: bv. 'vroedmeesterpad', 'Alytes obstetricans', 'Triturus'. max_resultaten: hoogstens dit aantal kandidaten.
| Name | Required | Description | Default |
|---|---|---|---|
| naam | Yes | ||
| max_resultaten | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Zonder annotaties draagt de beschrijving de volledige last. Het deelt de zoekvolgorde, waarschuwt voor ambiguïteit bij meerdere treffers en geeft aan dat het meerdere kandidaten kan retourneren. Dit is relevante gedragsinformatie die verder gaat dan een simpele definitie. Het mist details zoals foutafhandeling of snelheid, maar voor een lookup-tool is dit voldoende.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
De beschrijving is compact en gestructureerd: eerst het doel, dan het zoekpad en ambiguïteit, dan de parameters. Het is informatief zonder overbodige tekst. De structuur is logisch en de belangrijkste info staat vooraan. Een kleine korting omdat de zin over zoekvolgorde iets uitweidt over de INBO, maar dit is relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Er is een output-schema aanwezig, dus de beschrijving hoeft retourwaarden niet te beschrijven. De parameters worden goed gedocumenteerd en de tool is simpel genoeg (2 parameters). De waarschuwing over ambiguïteit is nuttig. Het is compleet genoeg voor een agent om de tool correct aan te roepen.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
De schema-beschrijvingsdekking is 0%, maar de beschrijving geeft concrete voorbeelden voor 'naam' ('vroedmeesterpad', 'Alytes obstetricans', 'Triturus') en legt 'max_resultaten' uit als 'hoogstens dit aantal kandidaten'. Dit voegt aanzienlijke betekenis toe bovenop het schema en maakt beide parameters duidelijk.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
De beschrijving start met een specifiek werkwoord ('Zoek') en resource ('een soort op wetenschappelijke of Nederlandse naam') en geeft het concrete resultaat ('GBIF-taxonsleutel(s)'). Dit maakt het doel direct duidelijk en onderscheidt het van de sibling-tools die andere functies vervullen (zoals waarnemingen of soorten_in_gebied).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
De beschrijving legt het zoekpad uit (eerst INBO, dan GBIF/BSL) en geeft context dat meerdere treffers ambigu kunnen zijn. Het noemt expliciet dat de taxon_key uit het resultaat in andere tools gebruikt moet worden, wat impliceert dat dit de eerste stap is. Het geeft echter geen expliciete uitsluitingen of alternatieve tools aan, dus een 4 is passend.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.9.0- First observed
bronnen - First observed
datarapport_natuur - First observed
dataset_info - First observed
exporteer_bevraging - First observed
gebieden_rond - First observed
geocodeer_adres - First observed
kaart_gebieden - First observed
lijst - First observed
soort_status - First observed
soorten_in_gebied - First observed
telling_in_gebied - First observed
waarnemingen - First observed
zoek_soort
TDQS
Scored across 13 tools
Every tool has a distinct role: single-species status, area species lists, occurrence records, counts, mapping, and report generation are clearly separated. The only mild ambiguity is between `telling_in_gebied` and `soorten_in_gebied`, since both use the same area filters and one could be used instead of the other; the descriptions explicitly position one as a fast count-only path and the other as the detailed list.
Names are readable and mostly follow a descriptive noun-phrase style (`soorten_in_gebied`, `gebieden_rond`, `datarapport_natuur`), but several tools use imperative verbs (`zoek_soort`, `exporteer_bevraging`, `geocodeer_adres`) and others are bare nouns (`lijst`, `bronnen`, `waarnemingen`). There is no consistent verb_noun convention, though the mixed style is still understandable.
Thirteen tools is well within the ideal range and appropriate for a read-only biodiversity reporting domain. Each tool fills a clear workflow stage: species lookup, status, observations, area summaries, protected-area data, mapping, export, and final PDF report generation.
The toolset covers the full query-to-deliverable lifecycle: geocoding, taxon resolution, list/status lookups, occurrence queries, area-based aggregation, protected-area overlays, map generation, data export, and a generated datarapport. For a read-only nature-reporting service, there are no obvious dead ends or missing core operations.
Maintenance
Related MCP Connectors
Search public Australian environmental evidence with provenance across authoritative catalogues.
Search Belgian & EU legislation: verbatim article text, per-article links, legal Q&A.
iNaturalist MCP — citizen-science species observations (free, no auth for read-only)
Statbel — Statistics Belgium (be.STAT / bestat) open data MCP.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceOne MCP server for Belgian public APIs. It bundles Belgian transport, official statistics, open data, addresses, weather, air quality, and geospatial services.5MIT
- AlicenseNot gradedqualityFmaintenanceEnables querying Belgian statutes and provisions from the Belgian Official Gazette directly via AI assistants, providing search, citation validation, and EU law integration.39 npm1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to query and retrieve biodiversity data from the Global Biodiversity Information Facility (GBIF), including species, occurrences, datasets, and literature.111 npmMIT
- AlicenseAqualityBmaintenanceEnables retrieval of Belgian legislation metadata and full text by ELI coordinates from the official gazette (Moniteur Belge), supporting French, Dutch, and German languages.346 PyPIApache 2.0