NeoDemos
Server Details
Source-anchored search and civic intelligence for Dutch municipal council records.
- Status
- Healthy
- Uptime
- 100.0% over 37 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: instrument advice, text review, citation formatting, faction note generation, document generation, context primer, and background data bundling. The descriptions explicitly cross-reference other tools for when not to use them, eliminating ambiguity.
Most tools follow a consistent Dutch verb_noun pattern (adviseer, beoordeel, formatteer, genereer, verzamel), but 'get_neodemos_context' deviates with an English verb and different structure. This is a minor inconsistency in an otherwise predictable naming scheme.
With 7 tools, the server is well-scoped for its domain—council document drafting and context gathering. Each tool earns its place, and the count is neither thin nor bloated.
The tool surface covers the core drafting workflow (advise, generate, review, format) and context bundling, but lacks retrieval tools (e.g., zoek_raadshistorie, zoek_moties) and artifact storage, which are referenced but not included. This is a notable gap, though the descriptions suggest these are intentionally separate components, and the core workflow is still functional.
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_fractienotitieARead-onlyIdempotentInspect
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses significant behavioral details: it internally fetches structured meetings and agendas, raises explicit validation errors for unknown IDs or missing agendas, never returns a plausible empty note, and clarifies that email delivery and cron scheduling are separate infrastructure. This fully informs the agent of the tool's internal behavior and failure modes.
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 relatively long, but it is well-structured with clear sections: core function, chain position, usage condition, and return format. The key purpose is front-loaded in the first sentence. While a few phrases (like the parenthetical on Erik's hero-feature) could be trimmed, the structure earns a 4 for being organized 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?
Given the complexity of the tool (4 parameters, nested user object, no output schema), the description is remarkably complete. It covers the return format (markdown with legend, overview, and detail blocks), error handling, the necessary preceding calls, and the exact input sources. An agent has all the information needed to invoke this 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?
While the schema has no descriptions for top-level parameters (0% coverage), the description compensates by explaining the key ones: 'meeting_ids' are the selected 'vergadering_id' values from 'lijst_vergaderingen', and the 'gebruiker' object's fields 'covered_topics' and 'followed_committees' should be filled with confirmed values or empty lists, never invented. It does not explicitly explain 'vandaag' or 'horizon_dagen', but these have defaults and are self-explanatory. The description adds meaningful meaning beyond 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 clearly states the tool composes a faction note ('Stelt de fractienotitie samen') and details what that includes: an agenda overview for the next ~2 weeks on the user's portfolio, with status bullets and detail blocks. It is unambiguous about the resource and action, and the detailed explanation distinguishes it from the sibling tools (e.g., 'genereer_raadsstuk' is for drafting council documents, while this is for preparing a briefing).
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?
Explicitly states when to use: 'Gebruik wanneer: de gebruiker een fractienotitie/voorbereiding voor de komende vergaderingen wil.' It also provides a precise workflow: call 'mijn_fractie_context' first, then 'lijst_vergaderingen' with specific parameters, and pass the resulting IDs as 'meeting_ids'. This leaves no ambiguity about the calling sequence and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 (AUTORITATIEVE bron, ADR-0042): geef
iv3_kerncijfers_gemeentenvoor ELKE vraag over financiën per gemeente — dit queriesfin_iv3_fact(NeoDemos eigen DB, alle 342 gemeenten, 2017–heden, geauditeerde CBS Iv3-data). NOOIT CBS StatLine hiervoor gebruiken (84413NED/83641NED = grootteklasse, niet per gemeente). Retourneert: totale lasten, overhead% (taakveld 0.4 ÷ totale lasten, BBV-beleidsindicator), 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?
With annotations already declaring readOnlyHint=true, the description goes far beyond by disclosing cache-first behavior, network-call timing, opt-in parameter semantics, deterministic cube-engine compilation, and explicit refusal/abstention behavior on illegal operations. It adds critical data-integrity guardrails (never cite an unverified CBS table-ID, state unavailability honestly) and anti-Simpson rollup coverage flags. No contradiction between the read-only annotations and the gathering 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 text is very long, but the complexity (22 parameters, 6 distinct data sources, no output schema) justifies the length. It is well-structured with bolded source headers, bullet lists, and prominent 'LET OP' / 'KRITIEKE GUARDRAILS' callouts that front-load the critical caveats. The core purpose is front-loaded in the first sentence; a slightly tighter pass on the RIVM/guardrail duplication would push this to 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?
For an orchestrator of this scale — 22 params, 6 sources, zero schema coverage, no output schema — the description is remarkably complete. It states the return format (markdown with a section per requested source), documents source limitations (grootteklasse vs per-gemeente), provides concrete parameter schemas for complex fields (cube_query as a dict), and covers data-integrity behavior. The only omissions are a few rarely-used parameters and the required onderwerp field, which is self-evident from context.
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?
Despite 0% schema description coverage, the description documents nearly all 22 parameters with concrete examples: cbs_beleidsgebied (with sample values 'wonen', 'inkomen'), cbs_zoekterm/cbs_tabel_id/cbs_perioden/cbs_extra_filters/cbs_top, cbs_metric with sample 'woningvoorraad_per_1000_inw', cbs_compare_regions vs cbs_compare_periodes ('precies één van beide'), cbs_rollup_region, cube_describe/cube_query, iv3_kerncijfers_gemeenten/iv3_jaar/iv3_verslagsoort/iv3_taakvelden with BBV-code mapping, rivm_gezondheid, and instrument_doel. Only minor gaps: onderwerp (required) and instrument_urgentie/instrument_op_agenda lack explicit documentation.
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 (bundelt) and resource (meerdere achtergrondbronnen) — it aggregates server-side context sources for a topic in one call so the agent need not chain tools. It clearly distinguishes from siblings by explicitly naming what it is NOT (zoek_raadshistorie / zoek_moties are excluded deliberately) and routing financial comparisons to iv3_kerncijfers_gemeenten over vraag_begrotingsregel.
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?
Contains an explicit 'Gebruik wanneer' section with the exact trigger conditions (maatschappelijke cijfers staven and/or raadsinstrument-advies in one call), plus explicit exclusions with named alternatives for heavy corpus retrieval (zoek_raadshistorie / zoek_moties). For every source it states when to prefer it over alternatives, e.g., 'GEBRUIK DIT voor elke vraag over levensverwachting — NIET cbs_beleidsgebied'.
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.
Urban intelligence knowledge graph. Structured locality data for civic problem-solving.
Searches MUNICIPAL official gazettes from thousands of city halls (Querido Diário / Open Knowledge B
Related MCP Servers
- AlicenseAqualityDmaintenanceA bridge between large language models and Dutch parliamentary data, providing access to Dutch parliamentary documents, debates, and member information from the Tweede Kamer.1413 npm22MIT
- AlicenseAqualityAmaintenanceUnifies 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.6416Apache 2.0
- AlicenseNot gradedqualityCmaintenanceProvides access to Dutch Parliament (Tweede Kamer) open data through MCP tools, enabling querying of parliamentary information via natural language.2 npmMIT
- AlicenseAqualityCmaintenanceEnables searching and retrieving Dutch case law (uitspraken) via the Rechtspraak Open Data API, including full text and citation graph exploration.635 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.