NeoDemos
Server Details
Source-anchored search and civic intelligence for Dutch municipal council records.
- Status
- Healthy
- Uptime
- 100.0% over 54 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 7 tools
Most tools target clearly distinct phases (advise instrument, generate draft, review text, format citation, gather context), and the descriptions explicitly define when NOT to use each tool. However, verzamel_context duplicates the instrument-advice function of adviseer_raadsinstrument via its instrument_doel parameter, and the beoordeel_tekst description appears to bleed into the adviseer_raadsinstrument entry, muddying the boundary.
Six of seven tools follow a clean Dutch imperative verb_noun pattern (adviseer_raadsinstrument, beoordeel_tekst, genereer_raadsstuk, verzamel_context, etc.). The lone 'get_neodemos_context' breaks the convention with an English verb prefix, a minor but noticeable deviation.
Seven tools is a well-scoped set for a council-support assistant covering advice, drafting, review, citation, and context. Each tool earns its place with a distinct role in the drafting lifecycle.
The drafting chain is coherent (advice → generate → review → save), but the tools repeatedly reference operations not present in this set — zoek_raadshistorie, zoek_moties, sla_fractie_artifact_op, lijst_vergaderingen, mijn_fractie_context — creating dead ends. Retrieval and persistence are notable gaps an agent would hit during real workflows.
Available Tools
7 toolsadviseer_raadsinstrumentARead-onlyIdempotentInspect
Adviseert welk raadsinstrument past bij wat het raadslid wil bereiken, en weegt EXPLICIET de doorlooptijd mee — schriftelijke vragen zijn het traagste instrument (~30 dagen) en zijn vaak niet de juiste keuze bij een actueel onderwerp. Pure kennisbank: geen retrieval, geen DB-call, <10ms.
Gebruik deze tool wanneer:
Het raadslid iets wil bereiken (informatie, college ter verantwoording roepen, een uitspraak/besluit, nieuw beleid) en de vraag is WELK instrument daarvoor past.
Je op het punt staat 'stel schriftelijke vragen' te adviseren — check eerst hier of een sneller instrument (mondelinge vragen, interpellatie) beter past bij de urgentie.
Je een schriftelijke-vragen- of actua-template nodig hebt die de structuur en kwaliteitscriteria volgt (in lijn met het reglement van orde).
Je wilt weten WAT een instrument oplevert (uitkomsttype, college-verplichting, uitvoeringsplicht) zodat je het raadslid kunt uitleggen welke actie het college verplicht is te ondernemen na gebruik van het instrument.
Gebruik deze tool NIET wanneer:
De vraag inhoudelijk is over een dossier →
zoek_raadshistorie/zoek_moties.Je een bestaande motie/amendement wilt terugvinden →
zoek_moties.
Retourneert: markdown met het aanbevolen instrument + alternatieven, inclusief:
doel, snelheid, binding, wettelijke basis, wanneer-wel/niet
uitkomsttype (raadsbesluit / college_handeling / antwoord_college / debat / onderzoek)
college_verplichting: wat het college verplicht is te doen na gebruik
uitvoeringsplicht: ja/nee (juridisch vs. politiek afdwingbaar)
typische_doorlooptijd_weken: numeriek, gegrond in het RvO
afdoeningsproces: pad naar afsluiting
een bijpassende RvO-template (bij vraag-instrumenten)
disclaimer dat exacte termijnen/quora per lokaal RvO verschillen en geverifieerd moeten worden.
| Name | Required | Description | Default |
|---|---|---|---|
| doel | Yes | ||
| urgentie | No | normaal | |
| onderwerp | No | ||
| op_agenda | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is fully consistent with them. The description adds genuine value beyond the annotations by disclosing execution characteristics — 'Pure kennisbank: geen retrieval, geen DB-call, <10ms' — plus the exact return structure in markdown. It also clarifies that returned legal deadlines are local-RvO specific and must be verified, which is important behavioral context. This exceeds what structured annotations convey.
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 into clear front-loaded sections: what it does, when to use, when not to use, and what it returns. Every major section adds value and the formatting makes it scannable. It loses a point for some redundancy — the doorlooptijd point is made in the intro, then repeated in the 'when to use' bullet about schriftelijke vragen — so not every sentence strictly earns its place, but overall this is efficient for the information load it carries.
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 no output schema and 0% parameter description coverage, the description carries a heavy burden and largely rises to it: it fully specifies the return structure (instrument, alternatives and goals, outcomes, legal basis, lead time, process, RvO template, disclaimer). The main gap is that two parameters ('urgentie' value options and 'op_agenda' semantics) are not explicitly described. But for advising a tool, the core use, outcome types, and verification warnings are all present — the only residual completeness of an agent's correct use.
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 carries the full burden for parameter meaning. It compensates well for the two core parameters: 'doel' is effectively enumerated via the goal examples (informatie, college ter verantwoording roepen, uitspraak/besluit, nieuw beleid) and 'urgentie' is given meaning through the discussion of lead times and fast vs. slow instruments. However, 'onderwerp' and 'op_agenda' receive virtually no semantic explanation, so the compensation is only partial.
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+resource pair ('Adviseert welk raadsinstrument past bij wat het raadslid wil bereiken') that defines the tool's exact purpose: matching a council member's goal to the right legal instrument. It immediately distinguishes itself from the listed siblings (text generation, context gathering) and even names alternatives for excluded cases (zoek_raadshistorie / zoek_moties). The purpose is unmistakable even without opening the schema.
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 gives an explicit 'Gebruik deze tool wanneer' list (four concrete situations) and a 'Gebruik deze tool NIET wanneer' list that names alternative tools (zoek_raadshistorie, zoek_moties) and the conditions that select them. It even includes a specific trigger — when about to advise 'stel schriftelijke vragen', check here first — which is exactly the kind of routing guidance that helps an agent pick correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
beoordeel_tekstARead-onlyIdempotentInspect
Eén deterministische review-tool voor concept-teksten van een raadslid/fractiemedewerker. Geen LLM, geen DB, <10ms. Kies de modus via soort:
vragen— scherpt concept schriftelijke/mondelinge vragen aan: flagt suggestief/sturend, meervoudig, gesloten ja/nee, vage kwantoren, en ongefundeerde vragen + 'scherper'-suggestie.notitie/commissienotitie/fractienotitie— sanity-review (maximaal 10 opmerkingen): ontbrekend voor/tegen-eindoordeel, strategische opstelling, bronnen zonder paginanummer, ontbrekende samenvatting/vragen/bolletjes en suggestieve vragen — gegroepeerd op ernst (hoog/midden/laag).spreektekst— rubriek met cijfer (1-10) + deelscores + verbeterpunten + duur-vs-spreektijd (opening, standpunt, onderbouwing, weerlegging, oproep, lengte ~130 wpm).RvO-format check:
motie|motie_vreemd|amendement|schriftelijke_vragen|mondelinge_vragen|initiatiefvoorstel|interpellatieverzoek— valideert structuur + RvO-regels (ontbrekend dictum, geen raadsvoorstel-ref bij amendement, gesloten vragen bij schriftelijke vragen, etc.). Gebruik dit nagenereer_raadsstukof op een handgeschreven concept.
Gebruik wanneer: het raadslid een concept heeft geschreven en wil weten wat scherper kan. NIET om corpus te doorzoeken → zoek_raadshistorie.
Retourneert: markdown met concrete verbeterpunten passend bij soort, gegroepeerd op ernst.
Positie in de drafting-keten: roep aan ná genereer_raadsstuk; verwerk de bevindingen in het concept en sla daarna op met sla_fractie_artifact_op(artifact_type=<doc_type>).
| Name | Required | Description | Default |
|---|---|---|---|
| soort | No | vragen | |
| tekst | Yes | ||
| spreektijd_sec | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already carry readOnlyHint, idempotentHint, and destructiveHint, the description adds meaningful behavioral facts: it is deterministic, does not use an LLM or database, runs in <10ms, and returns results grouped by severity. Nothing contradicts the annotations.
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 longer than average, but each section earns its place: mode enumeration, recommended usage, output description, and workflow position are all useful. The bullet-list layout makes it scannable, so the length feels justified rather than verbose.
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?
This is a multi-mode tool with no output schema, so the description must carry a heavier explanatory load. It does: it explains what each mode returns, the severity grouping, the spreektekst rubric details, and the RvO format types. Given the tool's complexity, the description is remarkably complete.
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 well for 'soort' by listing all valid modes (vragen, notitie, spreektekst, RvO formats) and explains how the mode changes behavior. It does not literally map 'spreektijd_sec' to the spreektekst duration estimate, though the 130 wpm mention implicitly connects it. 'tekst' is obvious but not explicitly described.
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 names the tool as a deterministic review tool for concept texts of a council member/employee and enumerates the exact review modes. It also distinguishes itself from sibling tools by placing it in the drafting chain (after genereer_raadsstuk) and explicitly saying it is not a corpus search tool.
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 states clearly when to use it (when a concept text has been written and the user wants sharpening suggestions), when not to use it (not for corpus search, pointing to zoek_raadshistorie), and even gives the workflow position: call it after genereer_raadsstuk, then save with an artifact tool. This exceeds normal usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
formatteer_bronvermeldingARead-onlyIdempotentInspect
Formatteert een bronvermelding zoals Erik die wil: mét paginanummer (en, indien bekend, alinea) — bijv. '(Begroting 2025, 12-10-2024, p. 41, alinea 3)'. Met spreker + quote levert de tool de volledige citaat-attributie in huisstijl: 'Volgens {spreker} ({partij}): "..." (bron, p. ..)'. Velden die ontbreken worden netjes weggelaten (nooit 'p. None'). Geen DB, geen netwerk.
Let op: paginanummers vereisen dat de paginametadata in het bronfragment aanwezig is (aanwezig bij sommige bronnen, afwezig bij andere — de tool degradeert netjes). Zin-/alinea-precisie op corpusniveau is aparte ontologie (WS30); deze tool is de formatteerlaag.
Gebruik wanneer: je een quote of bron netjes wilt vermelden met paginanummer/alinea.
Retourneert: de bronvermelding/citaat-string (markdown).
| Name | Required | Description | Default |
|---|---|---|---|
| bron | Yes | ||
| datum | No | ||
| quote | No | ||
| alinea | No | ||
| pagina | No | ||
| partij | No | ||
| spreker | No | ||
| document_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, it discloses that there is no DB or network access, that missing fields are cleanly omitted (never 'p. None'), that page numbers degrade gracefully when metadata is absent, and that the result is a Markdown string. This is substantial behavioral context beyond annotations, with no contradiction.
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 the purpose and example, then uses short labeled sections for the metadata caveat, usage condition, and return value. Every sentence adds useful behavioral or scoping information; nothing is redundant with the schema.
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 side-effect-free formatter with rich annotations, it covers output type, missing-field behavior, metadata dependency, and when to use it. The main gap is the undocumented `document_id` parameter, which prevents full completeness; otherwise an agent has enough information 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 carries parameter meaning. It explains how `spreker`, `quote`, `partij`, `pagina`, `alinea`, `bron`, and `datum` appear in the formatted result and how omitted fields are handled. However, `document_id` is never mentioned and date/page formats are not specified, so compensation is incomplete.
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 names a precise action ('Formatteert een bronvermelding') and gives a concrete output example with page number and paragraph, plus a separate full quote-attribution template. It also scopes the tool as the formatting layer versus separate corpus-level ontology, so it is clearly distinguished from content-generation 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?
It has an explicit 'Gebruik wanneer' condition: use it to present a quote or source with page/paragraph. It also warns that page metadata must exist in the source and that corpus-level sentence/paragraph precision is out of scope. It does not explicitly compare against sibling tools, but the stated usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
genereer_fractienotitieRead-onlyIdempotentInspect
Bij commissievoorbereiding: lees eerst bestaande fractienotities. Gebruik mijn_fractie_context, bepaal de exacte vergadering met lijst_vergaderingen, en roep haal_fractiewerkruimte_op(meeting_id=...) aan (expliciete fractie_id bij meerdere fracties). Lees relevante huidige notities via haal_fractie_artifact_op; bouw daarop voort en onderzoek alleen ontbrekende of gewijzigde informatie. Controleer bronstatus en actualiteit en behoud bronverwijzingen; een notitie is geen primaire bron. Geen leesrechten betekent niet dat er geen notities bestaan: vraag zo nodig toestemming voor werkruimte lezen. Volg een expliciet verzoek om onafhankelijke analyse.
Stelt de fractienotitie samen (Erik's hero-feature, WS23-core): een agenda-overzicht voor de komende ~2 weken op de portefeuille van de gebruiker, met bolletjes (🟢 positief / 🟠 spannend / 🟡 aandacht / ⚪ procedureel) en per agendapunt een detailblok waarvan de diepgang USER-RELATIEF is (diepgaand als het onderwerp in de portefeuille valt; beknopt binnen de commissie; bronnen als de gebruiker het debat zelf aanvroeg; vlucht daarbuiten; procedurele punten worden overgeslagen). De host-LLM levert uitsluitend meeting_ids uit lijst_vergaderingen; de tool haalt de gestructureerde vergadering en agenda zelf op. Zo hoeft de host geen markdown terug naar een ongedocumenteerd object te vertalen. Een onbekend ID, een vergadering zonder agenda of een vergadering buiten de horizon geeft een expliciete validatiefout, nooit een plausibel lege notitie. Automatische e-mailbezorging + de vrijdag/maandag-cron zijn aparte infrastructuur.
Positie in de keten: roep eerst mijn_fractie_context aan en neem daaruit de gebruikersnaam en fractienaam over. Vul covered_topics en followed_committees met bevestigde waarden of lege lijsten; verzin ze niet. Gebruik daarna lijst_vergaderingen(na_datum=<vandaag>, voor_datum=<horizon>, sortering='oudste_eerst') en geef de gekozen vergadering_id-waarden door als meeting_ids.
Gebruik wanneer: de gebruiker een fractienotitie/voorbereiding voor de komende vergaderingen wil.
Retourneert: markdown — bolletjes-legenda + agenda-overzicht + per-vergadering detailblok op maat.
| Name | Required | Description | Default |
|---|---|---|---|
| vandaag | No | ||
| gebruiker | Yes | ||
| meeting_ids | Yes | ||
| horizon_dagen | No |
genereer_raadsstukARead-onlyIdempotentInspect
Genereert een volledig opgemaakt, RvO-conformant concept voor één van de zeven raadsstuktypen. Geen DB, geen netwerk, <10ms — puur structurele kennis.
Gebruik deze tool wanneer:
Het raadslid een stuk wil indienen en een correct gestructureerd concept nodig heeft.
Je
adviseer_raadsinstrumenthebt gebruikt (welk instrument) en nu het daadwerkelijke stuk wilt renderen in het juiste format met RvO-verwijzingen.Een concept al bestaat maar opnieuw in correct format moet worden gezet.
Gebruik deze tool NIET wanneer:
Je het juiste instrument nog moet kiezen → gebruik eerst
adviseer_raadsinstrument.Je een bestaand concept wilt beoordelen op inhoud →
beoordeel_tekst.Je een format-validatie wil uitvoeren op een bestaand concept →
beoordeel_tekstmetsoortgelijk aan het doc_type.
doc_type keuzes: 'motie', 'motie_vreemd', 'amendement', 'schriftelijke_vragen', 'mondelinge_vragen', 'initiatiefvoorstel', 'interpellatieverzoek'.
velden zijn optioneel — ontbrekende velden worden vervangen door invul-placeholders [zoals dit] zodat het concept altijd een compleet, geldig skelet is.
gemeente bepaalt welk lokaal RvO-overlay (artikelnummers, termijnen, indieningsroute) wordt gebruikt. Default 'rotterdam'. Degradeert netjes naar het canonieke basisformat + disclaimer als er geen overlay beschikbaar is.
Retourneert: markdown-concept in de juiste RvO-structuur, met RvO-artikelcitaat en disclaimer.
Volgende stap in de drafting-keten: valideer het gegenereerde concept met beoordeel_tekst(tekst=<concept>, soort=<doc_type>) voordat je het presenteert of opslaat; sla daarna op met sla_fractie_artifact_op(artifact_type=<doc_type>).
| Name | Required | Description | Default |
|---|---|---|---|
| velden | No | ||
| doc_type | Yes | ||
| gemeente | No | rotterdam |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses pure generation behavior with no DB/network access and <10ms latency, default Rotterdam overlay behavior with graceful degradation, and the placeholder substitution mechanism for missing fields. This meaningfully complements the existing readOnly/idempotent/destructive annotations and adds concrete behavioral constraints.
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 organized with clear bullet sections and remains information-dense. Every sentence adds value, though the length could be slightly trimmed without loss.
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?
Despite sparse schema and no output schema, the description covers return format (RvO-compliant structure with disclaimer), parameter semantics, exclusions, and downstream validation steps. An agent has everything needed to select and 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?
With 0% schema coverage, the description fully compensates: it explains doc_type choices, optional velden semantics with placeholder behavior, and gemeente overlay defaults. Each parameter receives concrete guidance beyond raw schema property names.
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 names a specific action (generate a fully formatted, RvO-compliant council document), lists the seven supported document types, and explicitly distinguishes itself from sibling tools like adviseer_raadsinstrument and beoordeel_tekst. An agent can clearly identify what this tool does and what it does not do.
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 explicit when-to-use conditions, including prior use of adviseer_raadsinstrument polluted advice and reuse scenarios. It also gives clear when-not-to-use guidance with named alternatives (beoordeel_tekst for content review and format validation).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_neodemos_contextARead-onlyIdempotentInspect
Retourneert een structured primer met de beschikbare gemeenten, document-types, de huidige zittende wethouders van Rotterdam (uit raadslid_rollen), de coalition-history per college-periode, known limitations, en recommended tool sequences voor veelvoorkomende vraagpatronen. Cheap to call (<50ms). Cached op server-niveau als de DB bereikbaar is.
Gebruik deze tool wanneer:
Je een nieuwe sessie start — dit geeft je de ground-truth voor rol/tenure/coalition in plaats van dat je uit trainingsdata moet gokken.
Je een actuele referentiedatum nodig hebt voor 'vandaag', 'recent', 'vorige week' of vergelijkbare temporele termen — het
todayveld wordt per call berekend.De vraag gaat over een historische stemming — check
coalition_historyvoor de compositie op dát moment (GroenLinks/PvdA waren in 2018 coalitiepartij, niet oppositie).Je niet zeker weet welke tool sequence past — zie
recommended_tool_sequences.
Gebruik deze tool NIET wanneer:
De vraag al duidelijk in één retrieval tool past en je de context al kent.
Je al in dezelfde sessie de context hebt opgehaald (het verandert niet binnen één sessie).
Retourneert: markdown met secties voor gemeenten, document-types, raadssamenstelling, college-history, limitations, en recommended tool-sequences.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is fully covered. The description adds valuable behavioral context beyond this: the tool is cheap (<50ms), server-side cached, and returns a 'structured primer' with specific content sections. It also explains the dynamic 'today' field is computed per call. This adds context beyond the annotations without contradicting them.
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 moderately long but well-structured: a concise summary of outputs and performance, followed by clear use-case bullet points and explicit non-use cases. Some redundancy exists (returns-line repeats the content summary) but the structure is clear 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?
The description covers what the tool returns, when to use it, when not to use it, and notes the cheap/cached nature. With zero parameters and a rich output description, this is complete for an agent to select and invoke it.
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?
There are zero parameters, so the schema carries no burdenable weight. The description fully describes what the tool returns, which is the only relevant semantic information for a no-parameter call. Baseline 4 for zero params is appropriate, and the description goes further by specifying the markdown structure and content areas.
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 ('Retourneert', 'Gebruik') and a clear resource: a structured primer containing available municipalities, document types, current Rotterdam wethouders, coalition history, limitations, and recommended tool sequences. It distinguishes itself from siblings by framing itself as a context/session initialization tool rather than a retrieval, generation, or review tool. The explicit 'Gebruik deze tool wanneer' and 'Gebruik deze tool NIET wanneer' sections make the purpose and boundaries unambiguous.
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 explicit when-to-use and when-not-to-use criteria, including concrete triggers like 'new session', 'need current date', 'historical vote question', and 'unsure of tool sequence'. It also states when NOT to use it (when context already known or already fetched in same session). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verzamel_contextARead-onlyIdempotentInspect
Bundelt server-side meerdere achtergrondbronnen voor een onderwerp in één antwoord, zodat je niet meerdere losse tools hoeft te ketenen. Alleen de via parameters gevraagde bronnen worden opgehaald (opt-in), zodat de call snel blijft. Beschikbare bronnen:
CBS-achtergrond (publieke StatLine open data, geen credentials): geef
cbs_beleidsgebied(bv. 'wonen', 'inkomen', 'criminaliteit') voor EXACTE, geciteerde cijfers uit de gecureerde nationale-contextlaag (cache-first, WS85/ADR-0037; nooit vector-embedded) voorcbs_gemeente(default GM0599). Of geefcbs_zoekterm/cbs_tabel_id(+ optioneelcbs_perioden+cbs_extra_filters+cbs_top) voor ad-hoc live StatLine-zoek. Voor aggregerende Iv3-tabellen (84413NED rekeningen, 83641NED begrotingen — grootteklasse-niveau, NIET per gemeente) gebruikcbs_extra_filters(bv. {"RegioS": "LD03"}) en verhoogcbs_top(default 100). LET OP: CBS StatLine biedt jeugd-lasten UITSLUITEND op grootteklasse-niveau, NIET per gemeente; gebruikiv3_kerncijfers_gemeentenvoor per-gemeente totale lasten (niet taakveld-specifiek). Netwerk-call.CBS afgeleide cijfers (metrics-laag, WS85b): geef
cbs_metric(bv. 'woningvoorraad_per_1000_inw') voor een BEREKEND cijfer (per-1.000 / Δ-t.o.v.-vorig-jaar / verhouding) mét bronherkomst; optioneelcbs_compare_regions(tussen regio's) OFcbs_compare_periodes(over de tijd) — precies één van beide — met vergelijkbaarheidswaarborg, OFcbs_rollup_region(bv. 'NL01') om op te rollen van leden naar ouder-niveau (anti-Simpson, dekkingsvlag).CBS cube-engine (WS90/ADR-0054, vrije slice-and-dice): voor een vraag die NIET op een vaste
cbs_metricpast, geef eerstcube_describe(tabel-id/onderwerp) → krijg de maten met hun aggregation_type + toegestane ops + dimensieleden; geef daarnacube_query(een {table_id|topic, measures, filters, op, region, + max één vergelijkings-as}-dict). De engine compileert deterministisch en WEIGERT illegale ops ('je kunt geen gemiddelde middelen') of ONTHOUDT ZICH bij een onbekend lid / niet-vergelijkbare as i.p.v. een fout cijfer te geven.CBS Iv3 per-gemeente financiële data (gemeentelijke aanleveringen bij CBS, ADR-0042): geef
iv3_kerncijfers_gemeentenvoor ELKE vraag over financiën per gemeente — dit queriesfin_iv3_fact(NeoDemos eigen DB, beschikbare gemeenten en verslagjaren vanaf 2017, gemeentelijke aanleveringen gepubliceerd door CBS). NOOIT CBS StatLine hiervoor gebruiken (84413NED/83641NED = grootteklasse, niet per gemeente). Retourneert: totale lasten, overhead% (taakveld 0.4 ÷ totale lasten excl. 0.10 en 0.11, Iv3-afgeleid), overhead & uitvoering €/inwoner — per gemeente, gesorteerd op laagste overhead%. Optioneeliv3_jaar+iv3_verslagsoort('jaarrekening' / 'begroting'). Kant-en-klare tabel + JSON-blok. Gebruik dit i.p.v.vraag_begrotingsregelvoor vergelijkingen TUSSEN gemeenten. Voegiv3_taakveldentoe voor een PER-TAAKVELD uitsplitsing (bv. ['6.72','6.71'] voor jeugd + WMO; laat leeg voor alle taakvelden). BBV-codes (selectie): 0.4=Overhead, 1.2=OOV, 2.1=Verkeer, 4.3=Onderwijs, 6.1=Samenkracht, 6.3=Inkomen, 6.71=WMO 18+, 6.72=Jeugdhulp 18-, 7.3=Afval, 7.4=Milieu, 8.3=Wonen.RIVM gezondheidsdata (WS88, separate path): geef
rivm_gezondheid(bv. 'levensverwachting', 'gezonde levensverwachting') voor EXACTE, geciteerde RIVM-cijfers per gemeente uit de gecureerde RIVM-contextlaag (cache-first, rivm_context_*; nooit vector-embedded). Bron: RIVM — Gezondheidsmonitor (GGD'en, CBS, RIVM), CC-BY 4.0. Tabel 50108NED (gezonde levensverwachting per gemeente, RegioS) live. Optioneelcbs_gemeentevoor het regio-filter (default GM0599 Rotterdam). GEBRUIK DIT voor elke vraag over levensverwachting / gemeente-gezondheid — NIETcbs_beleidsgebied(CBS StatLine heeft geen per-gemeente gezondheidsdata).Raadsinstrument-advies: geef
instrument_doel('informatie'/'controle'/'agenderen'/'besluit_wijzigen'/'nieuw_beleid'/'onderzoek') om te adviseren WELK instrument past, mét doorlooptijd-afweging en RvO-template.
Gebruik wanneer: je een onderwerp wilt staven met maatschappelijke cijfers en/of wilt weten welk raadsinstrument past — in één keer. Voor zware corpus-retrieval (notulen, moties): gebruik zoek_raadshistorie / zoek_moties apart (die zijn niet in deze orchestrator gebundeld om binnen de tijdslimiet te blijven).
KRITIEKE GUARDRAILS — DATA-INTEGRITEIT:
Nooit een CBS-tabel-ID noemen dat je niet hebt geverifieerd. Als
cbs_beleidsgebiedniets oplevert (geen curated match), zeg dan eerlijk dat de data niet beschikbaar is in NeoDemos — NOOIT een tabel-ID suggereren dat je niet via deze tool hebt opgehaald. Een hallucinated tabel-ID is erger dan 'niet beschikbaar': de gebruiker gaat op zoek naar data die niet bestaat op de plek waar je hem stuurt.CBS StatLine heeft GEEN levensverwachting per individuele gemeente. Gebruik de
rivm_gezondheid-parameter (bv. 'levensverwachting') — die haalt tabel 50108NED op uit de gecureerde RIVM-contextlaag (WS88). Verwijs NIET naar 85388NED of een ander onbekend CBS-tabel-ID voor gezondheidsdata.CBS StatLine heeft GEEN Iv3-lasten per individuele gemeente per taakveld. Dat is grootteklasse-niveau (84413NED/83641NED). Verwijs naar
iv3_kerncijfers_gemeentenvoor totale per-gemeente lasten, of leg de bronbeperking uit.
Retourneert: markdown met een sectie per gevraagde bron.
| Name | Required | Description | Default |
|---|---|---|---|
| cbs_top | No | ||
| iv3_jaar | No | ||
| onderwerp | Yes | ||
| cbs_metric | No | ||
| cube_query | No | ||
| cbs_gemeente | No | GM0599 | |
| cbs_perioden | No | ||
| cbs_tabel_id | No | ||
| cbs_zoekterm | No | ||
| cube_describe | No | ||
| iv3_taakvelden | No | ||
| instrument_doel | No | ||
| rivm_gezondheid | No | ||
| iv3_verslagsoort | No | jaarrekening | |
| cbs_beleidsgebied | No | ||
| cbs_extra_filters | No | ||
| cbs_rollup_region | No | ||
| cbs_compare_regions | No | ||
| instrument_urgentie | No | normaal | |
| cbs_compare_periodes | No | ||
| instrument_op_agenda | No | ||
| iv3_kerncijfers_gemeenten | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial context beyond them: sources are opt-in to keep calls fast, CBS/RIVM layers are cache-first and never vector-embedded, the CBS path is a network call, and the cube engine deterministically refuses illegal aggregations or abstains on unknown members rather than emitting wrong figures. The guardrails section further warns against hallucinating table IDs.
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?
It is long but well structured — core purpose front-loaded, then one bullet per source, then a guardrails list — which suits a 22-parameter orchestrator. It loses a point for redundancy: guardrail items 2 and 3 restate caveats already given verbatim in the CBS and Iv3 bullets.
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 highly complex, 22-parameter aggregator with no output schema, the definition supplies source-by-source routing, parameter semantics, integrity guardrails, and an explicit return description ('markdown met een sectie per gevraagde bron'). An agent has everything it needs to select sources and call 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 coverage is 0%, so the description carries the full burden, and it documents the large majority of the 22 parameters with concrete examples and semantics (cbs_beleidsgebied values, cbs_metric, cube_describe→cube_query flow, iv3_taakvelden BBV codes, cbs_gemeente default GM0599, cbs_top default 100). However, instrument_urgentie and instrument_op_agenda receive no explanation at all, and the internal shape of cube_query is only loosely sketched.
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 states a specific verb and resource — bundling multiple background sources for a topic into one answer so the agent needn't chain tools — and immediately scopes the behavior (opt-in, only requested sources). It explicitly distinguishes itself from siblings by naming zoek_raadshistorie / zoek_moties as the tools for heavy corpus retrieval that are deliberately not bundled.
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 'Gebruik wanneer' line states the triggering condition (substantiate a topic with societal figures and/or determine which raadsinstrument fits), and it names the alternative tools for the excluded use case. Each source bullet further says exactly which parameter to supply for which question type (e.g. use rivm_gezondheid, not cbs_beleidsgebied, for health data; use iv3_kerncijfers_gemeenten instead of vraag_begrotingsregel for cross-municipality comparisons).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Related MCP Connectors
Dutch Parliament (Tweede Kamer) open data MCP.
Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.
Local government intelligence for AI agents.
Urban intelligence knowledge graph. Structured locality data for civic problem-solving.
Related MCP Servers
- AlicenseAqualityFmaintenanceA bridge between large language models and Dutch parliamentary data, providing access to Dutch parliamentary documents, debates, and member information from the Tweede Kamer.1440 npm23MIT
- AlicenseAqualityBmaintenanceUnifies 24 Dutch public-sector data sources into a single MCP interface, enabling AI assistants to search, combine, and retrieve structured data with provenance and cross-source linking.6418Apache 2.0
- AlicenseNot gradedqualityBmaintenanceProvides access to Dutch Parliament (Tweede Kamer) open data through MCP tools, enabling querying of parliamentary information via natural language.44 npmMIT
- AlicenseAqualityCmaintenanceEnables searching and retrieving Dutch case law (uitspraken) via the Rechtspraak Open Data API, including full text and citation graph exploration.643 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.