anwb-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., "@anwb-mcpcheck traffic on A2"
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.
anwb-mcp
Een Model Context Protocol (MCP) server voor ANWB verkeersinformatie, routeplanning en locatiezoeken in Nederland. Krijg realtime file-informatie, bereken routes met stapsgewijze routebeschrijvingen en zoek locaties — allemaal via natuurlijke taal in je AI-app.
Let op: Dit is een onofficieel, community-onderhouden project en is niet verbonden aan of goedgekeurd door ANWB. Deze server gebruikt publiek toegankelijke ANWB API-endpoints — geen API-key nodig.
A community-built Model Context Protocol (MCP) server for ANWB traffic information, route planning, and location search in the Netherlands. Get real-time traffic incidents, calculate routes with turn-by-turn directions, and search for locations — all through natural language via any MCP-compatible AI client.
Note: This is an unofficial, community-maintained project and is not affiliated with or endorsed by ANWB. This server uses publicly accessible ANWB API endpoints — no API key required.
Snel starten
Je hoeft deze repo niet te clonen.
Zorg dat Node.js 20+ is geïnstalleerd (je AI-app draait
npxop je machine)Voeg de server toe als MCP server in je AI-app (kopieer onderstaande configuratie)
Stel vragen in gewoon Nederlands (zie Voorbeelden)
Related MCP server: ns-bridge
Quick Start (Non-Developers)
You do not need to clone this repo.
Make sure Node.js 20+ is installed (your AI app will run
npxon your machine)Add the server to your AI app as an MCP server (copy/paste config below)
Ask questions in plain language (see Example Usage)
Add To Claude Desktop (Also Works In Cowork)
Cowork runs inside Claude Desktop and uses the same connected MCP servers and permissions.
Open your Claude Desktop MCP config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add this server entry (or merge it into your existing
mcpServers):
{
"mcpServers": {
"anwb-mcp": {
"command": "npx",
"args": ["-y", "anwb-mcp"]
}
}
}Restart Claude Desktop
Add To Other AI Apps
Most MCP apps have a screen like "Add MCP Server" where you can fill in:
Command:
npxArgs:
-y anwb-mcp
If your app wants JSON, paste this and adapt the top-level key name to your client (common ones are mcpServers, servers, or context_servers):
{
"<servers-key>": {
"anwb-mcp": {
"command": "npx",
"args": ["-y", "anwb-mcp"]
}
}
}Troubleshooting
Error:
npx: command not foundor server fails to startFix: install Node.js 20+ and restart your app.
Empty results or connection errors
The ANWB API may be temporarily unavailable. Wait a moment and retry.
Features
6 tools across 3 categories covering traffic, routing, and location search
Location search — find addresses, cities, streets, and points of interest with coordinates
Route planning — calculate routes by car, caravan, bike (regular or e-bike), or on foot with distance, duration, turn-by-turn directions, toll info, and alternative routes
EV route planning — plan electric vehicle routes with battery consumption, charging stops, and cost savings vs fuel
EV car database — browse 1500+ electric vehicle models with battery specs for EV route planning
Road avoidance — avoid toll roads, motorways, ferries, or unpaved roads
Traffic incidents — real-time jams, road closures, roadworks, and speed camera locations on Dutch highways
Traffic summary — compact overview of current traffic conditions across all highways
No API key required — uses publicly accessible ANWB endpoints
Input validation via Zod schemas on every tool for safe, predictable operations
Response caching with configurable TTL (60s for routes and incidents, 300s for locations)
Rate limit handling with exponential backoff and
Retry-Afterheader supportToolset filtering to expose only the tool categories you need
Docker support for containerized deployments via GHCR
Actionable error messages with context-aware recovery suggestions
Supported Clients
This MCP server is not tied to one coding agent. It works with any MCP-compatible client or agent runtime that can start a stdio MCP server.
Client / runtime | Docs |
Claude Code | |
Anthropic API (Messages API) | |
Codex CLI (OpenAI) | |
Gemini CLI (Google) | |
VS Code (Copilot) | |
Claude Desktop | |
Cursor | |
Windsurf | |
Cline | |
Zed | |
Any other MCP host | Use command/args from Generic MCP Server Config |
Setup (Power Users)
If Quick Start worked in your client, you can skip this section.
Generic MCP Server Config
Use this in any MCP host that supports stdio servers:
Command:
npxArgs:
["-y", "anwb-mcp"]Optional env vars:
ANWB_CACHE_TTL,ANWB_MAX_RETRIES,ANWB_TOOLSETS(see Configuration)
Host key mapping:
Host | Top-level key | Notes |
VS Code |
| Add |
Claude Desktop / Cursor / Windsurf / Cline |
| Same command/args block |
Zed |
| Same command/args block |
Codex CLI (TOML) |
| Uses TOML, shown below |
Claude Ecosystem Notes
Claude currently has multiple MCP-related concepts that are easy to mix up:
Local MCP servers (Claude Desktop): defined in
claude_desktop_config.jsonand started on your machine (docs).Cowork: reuses the MCP servers connected in Claude Desktop (docs).
Connectors: remote MCP integrations managed in Claude (docs).
Cowork plugins: Claude-specific workflow packaging (instructions + tools/data integrations) (docs). Useful in Claude, but not portable as a generic MCP server config for other agent clients.
Verified against vendor docs on 2026-03-05.
Claude Code
claude mcp add --scope user anwb-mcp -- npx -y anwb-mcpCodex CLI (OpenAI)
codex mcp add anwb-mcp -- npx -y anwb-mcpGemini CLI (Google)
gemini mcp add anwb-mcp -- npx -y anwb-mcpVS Code (Copilot)
Open Command Palette (Cmd+Shift+P / Ctrl+Shift+P) > MCP: Add Server > Command (stdio), or use .vscode/mcp.json with top-level key servers and the canonical command/args block from Generic MCP Server Config.
Claude Desktop + Cowork / Cursor / Windsurf / Cline / Zed
Cowork runs inside Claude Desktop and uses the same connected MCP servers and permissions. Configure once in Claude Desktop, then the server is available in Cowork.
Use the canonical config block and place it in the host file below with the matching top-level key.
Client | Config location | Top-level key |
Claude Desktop (macOS) |
|
|
Claude Desktop (Windows) |
|
|
Cursor (project) |
|
|
Cursor (global) |
|
|
Windsurf |
|
|
Cline | MCP settings UI |
|
Zed (macOS/Linux) |
|
|
Docker
docker run -i --rm ghcr.io/bartwaardenburg/anwb-mcpCodex CLI (TOML config alternative)
[mcp_servers.anwb-mcp]
command = "npx"
args = ["-y", "anwb-mcp"]Other MCP Clients
Use the values from Generic MCP Server Config.
Terminology
What is portable across hosts:
MCP server runtime settings (
command,args,env)Transport model (
stdiocommand server)Tool names and tool schemas exposed by this server
What is host/vendor-specific (not portable as-is):
Host config key names (
servers,mcpServers,context_servers,mcp_servers)Host UX/workflows for adding servers (CLI commands, UI menus, settings paths)
Anthropic-specific concepts such as Claude Desktop local MCP servers, Claude Connectors via remote MCP, and Claude Code plugins used in Cowork workflows
Security Notes
Trust model: Any prompt or agent allowed to call this MCP server can execute ANWB API actions on behalf of the user.
No credentials required: This server uses publicly accessible ANWB endpoints, so there are no secrets to protect. However, route queries may reveal location data.
Team config governance: Keep shared MCP config in version control and require review for changes to command/args/env/toolset filtering.
Configuration
No API key is required. The following optional environment variables are available:
Variable | Description | Default |
| Cache TTL in seconds (set to | unset |
| Maximum retry attempts for rate-limited (429) requests with exponential backoff. |
|
| Comma-separated list of tool categories to enable (see Toolset Filtering). | All toolsets |
Available Tools
Locations
Tool | Description |
| Search for locations, addresses, streets, cities, and POIs. Returns coordinates useful for route planning. Supports filtering by geographic area and index set. |
Routes
Tool | Description |
| Calculate a route between two or more locations by car, caravan, bike (regular/e-bike), or on foot. Returns distance, duration, turn-by-turn directions, toll info (car/caravan), and alternative routes. Supports avoiding toll roads, motorways, ferries, and unpaved roads. |
| Plan an electric vehicle route with battery consumption, charging stops, and charging station recommendations. Requires EV car model ID, battery capacity, and state of charge. |
| Browse available electric vehicle models from the ANWB database. Filter by make (brand) or search by model name. Returns car IDs for use with |
Incidents
Tool | Description |
| Get current traffic incidents on Dutch highways — jams, closures, roadworks, and speed cameras. Filter by road and/or category. |
| Get a compact summary of traffic conditions — total counts of jams, closures, roadworks, and radars across all highways. |
Toolset Filtering
Reduce context window usage by enabling only the tool categories you need. Set the ANWB_TOOLSETS environment variable to a comma-separated list:
ANWB_TOOLSETS=routes,incidentsToolset | Tools included |
| Location and address search |
| Route calculation, EV routing, and EV car database |
| Traffic incidents and summary |
When not set, all toolsets are enabled. Invalid names are ignored; if all names are invalid, all toolsets are enabled as a fallback.
Voorbeelden
Eenmaal verbonden kun je in gewoon Nederlands vragen stellen:
"Zoek locaties in de buurt van Amsterdam"
"Wat zijn de coördinaten van Eindhoven Centraal?"
"Bereken een route van Amsterdam naar Eindhoven"
"Plan een fietsroute van Utrecht Centraal naar De Uithof"
"Hoe lang loop je van de Dam naar het Vondelpark?"
"Wat is de snelste route van Utrecht naar Den Haag?"
"Staan er files op de A2?"
"Welke wegwerkzaamheden zijn er nu?"
"Geef een verkeerssamenvatting"
"Welke flitsers staan er op de A1?"
"Plan een route van Ede naar Zwolle zonder tolwegen"
"Bereken een caravanroute van Amsterdam naar de Veluwe"
"Plan een e-bike route van Utrecht naar Amersfoort"
"Welke elektrische auto's van Tesla zijn beschikbaar?"
"Plan een EV-route van Amsterdam naar Maastricht met een Tesla Model 3"
"Hoe lang duurt het rijden van Rotterdam naar Groningen zonder snelwegen?"
Example Usage
Once connected, you can interact with the ANWB API using natural language:
"Search for locations near Amsterdam"
"Find the coordinates of Eindhoven Centraal"
"Calculate a route from Amsterdam to Eindhoven"
"Plan a bike route from Utrecht Centraal to De Uithof"
"How long does it take to walk from Dam Square to Vondelpark?"
"What is the fastest route from Utrecht to Den Haag?"
"Are there any traffic jams on the A2?"
"Show me all current roadworks"
"Give me a traffic summary"
"What speed cameras are active on the A1?"
"Plan a route from Ede to Zwolle avoiding tolls"
"Calculate a caravan route from Amsterdam to the Veluwe"
"Plan an e-bike route from Utrecht to Amersfoort"
"What electric vehicles are available from Tesla?"
"Plan an EV route from Amsterdam to Maastricht with a Tesla Model 3"
"How long does it take to drive from Rotterdam to Groningen avoiding motorways?"
Community
Support: SUPPORT.md
Security reporting: SECURITY.md
Contributing guidelines: CONTRIBUTING.md
Bug reports and feature requests: Issues
Development
# Install dependencies
pnpm install
# Run in development mode
pnpm dev
# Build for production
pnpm build
# Run tests
pnpm test
# Type check
pnpm typecheckProject Structure
src/
index.ts # Entry point (stdio transport)
server.ts # MCP server setup and toolset filtering
anwb-client.ts # ANWB API HTTP client with caching and retry
cache.ts # TTL-based in-memory response cache
types.ts # TypeScript interfaces for ANWB API responses
tool-result.ts # Error formatting with recovery suggestions
update-checker.ts # NPM update notifications
tools/
locations.ts # Location and address search
routes.ts # Route calculation with directions
incidents.ts # Traffic incidents and summaryRequirements
Node.js >= 20
License
MIT - see LICENSE for details.
Available Tools
6 toolscalculate_ev_routeCalculate EV RouteARead-only
Calculate an electric vehicle route between two or more locations using ANWB EV route planning. Requires an EV car model ID, battery capacity, and current state of charge. Returns distance, duration, battery consumption, charging stops (if needed), and nearby charging stations. Provide locations as latitude,longitude pairs separated by colons. Use find_locations first to get coordinates for place names.
| Name | Required | Description | Default |
|---|---|---|---|
| carId | Yes | EV car model ID from the ANWB database (e.g. '646ca73f3f6beb1fcbdbdf70'). | |
| capacity | Yes | Battery capacity in kWh (e.g. 100 for a 100 kWh battery). | |
| locations | Yes | Waypoints as lat,lon pairs separated by colons. Minimum 2 points. Example: '52.373166,4.89066:51.441643,5.469722'. | |
| complexity | No | Route complexity factor (default: 1.15). Higher values may find more optimal routes. | |
| stateOfCharge | Yes | Current battery state of charge as a percentage (5-100). | |
| finalStateOfCharge | No | Desired minimum battery percentage at arrival (10-75, default: 20). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and open-world, so the safety profile is covered. The description adds useful behavioral detail: it delegates to ANWB EV route planning, requires specific EV inputs, and returns distance, duration, battery consumption, charging stops, and nearby charging stations. No contradiction with 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?
Every sentence earns its place: action, required inputs, outputs, and coordinate format with a pointer to find_locations. No filler or repetition of schema fields.
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 no output schema, the description gives enough about return values and prerequisites. It mentions the related find_locations tool, explains the locations serialization, and makes the tool's EV-specific scope clear. The remaining parameter details are already in the schema.
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 input schema has 100% description coverage, so the schema carries most parameter meaning. The description reinforces the locations format and prerequisite workflow, but does not add new details beyond the schema for parameters like carId, capacity, or stateOfCharge. Baseline 3 is appropriate.
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: 'Calculate an electric vehicle route between two or more locations using ANWB EV route planning.' This clearly distinguishes it from general routing tools like calculate_route and also states the key outputs the agent can expect.
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 clear usage context: use for EV routes requiring car ID, battery capacity, and state of charge. It also explicitly instructs the agent to 'Use find_locations first to get coordinates for place names.' It does not explicitly name calculate_route as the non-EV alternative, but the EV-specific framing implies the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_routeCalculate RouteARead-only
Calculate a route between two or more locations using ANWB route planning. Supports car, caravan, bike, and pedestrian modes. Provide locations as latitude,longitude pairs separated by colons (e.g. '52.37,4.89:51.44,5.47'). Returns distance, duration, turn-by-turn directions, toll information (car/caravan only), and optional alternative routes. Use find_locations first to get coordinates for place names.
| Name | Required | Description | Default |
|---|---|---|---|
| avoid | No | Road types to avoid. Options: tollRoads, motorways, ferries, unpavedRoads. Applies to car/caravan modes primarily. | |
| traffic | No | Take current traffic conditions into account (car/caravan mode only, ignored for bike/pedestrian). | |
| tollInfo | No | Include toll road information (car/caravan mode only, ignored for bike/pedestrian). | |
| locations | Yes | Waypoints as lat,lon pairs separated by colons. Minimum 2 points. Example: '52.373166,4.89066:51.441643,5.469722' (Amsterdam to Eindhoven). | |
| routeType | No | Route optimization: fastest (default) or shortest distance. Note: 'shortest' only works for bike and pedestrian modes. | fastest |
| transportMode | No | Transport mode: car (default), caravan, bike, or pedestrian. | car |
| transportSubtype | No | Bike subtype: 'bike' (regular) or 'ebike' (electric bicycle). Only applies when transportMode is 'bike'. | |
| includeAlternatives | No | Include alternative routes in the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the bar is lower. The description adds useful behavior beyond those flags: it returns distance, duration, turn-by-turn directions, toll information (car/caravan only), and optional alternative routes. This communicates mode-dependent behavior and response content without contradicting 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 compact and front-loaded: the core purpose appears first, followed by concrete format guidance and a prerequisite. Every sentence earns its place without redundant restatement of the tool title or 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 read-only route calculation tool with no output schema, the description covers the essential prerequisites, coordinate format, supported modes, and return contents. The rich input schema fills in parameter-level details like routeType and avoid options, so nothing critical is missing.
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 100%, so the schema already documents every parameter. The description adds a clear coordinate-pair example and the find_locations workflow, but it does not materially deepen the meaning of parameters beyond what the schema already provides.
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 a specific action ('Calculate a route'), the resource ('between two or more locations using ANWB route planning'), and the supported modes (car, caravan, bike, pedestrian). This makes it straightforwardly distinct from siblings like calculate_ev_route or get_traffic_summary, even without naming them.
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 explicit practical guidance to 'Use find_locations first to get coordinates for place names', and clarifies supported travel modes. It does not explicitly say when to prefer calculate_ev_route over this tool, but the mode list and ANWB context give a clear usage envelope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_locationsSearch ANWB LocationsARead-only
Search for locations, addresses, streets, cities, and points of interest in the Netherlands and surrounding countries. Returns matching locations with coordinates, useful for route planning. Use this to find coordinates for the calculate_route tool.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Geographic area to search in. ALL includes the Netherlands and surrounding countries, NLD limits to the Netherlands only. | ALL |
| limit | No | Maximum number of results to return (1-20). | |
| query | Yes | Free-text search query (e.g. city name, address, POI name). | |
| indexSets | No | Index sets to search: PAD (addresses), Str (streets), Geo (geographic areas), Addr (address ranges), POI (points of interest). Default is all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful behavioral context by noting that results include coordinates and that they are meant for route planning, but it does not go deeper into result ordering, empty-result behavior, or how 'matching' is determined.
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?
Two concise sentences with no filler. The first sentence states what is searched and where, and the second states the output value and downstream use. Every sentence earns its place.
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, the description still covers the essential return value (coordinates) and the downstream purpose (calculate_route). Combined with the fully documented input schema and annotations, an agent has enough context to invoke the tool correctly and interpret results. Minor details like coordinate format or handling multiple matches would improve completeness but are not critical.
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 100%, so the schema already documents query, area, limit, and indexSets thoroughly. The description only implicitly relates to the query parameter by mentioning searchable entity types; it adds no extra meaning beyond the schema, so the baseline score of 3 is appropriate.
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 uses a specific verb ('Search') and names the exact resource types: locations, addresses, streets, cities, and points of interest. It also states the geographic scope and that the tool returns coordinates, which clearly differentiates it from the route-calculation and traffic 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 explicitly tells the agent when to use this tool: to find coordinates for the calculate_route tool. It does not spell out exclusions or when NOT to use it, but the intended context is clear and the sibling tools are distinct enough that an agent can correctly select this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_traffic_incidentsGet Traffic IncidentsARead-only
Get current traffic incidents on Dutch highways from ANWB. Returns jams, road closures, roadworks, and speed camera locations. Optionally filter by road (e.g. 'A1', 'A2') and/or category (jams, roadworks, radars).
| Name | Required | Description | Default |
|---|---|---|---|
| road | No | Filter by specific road (e.g. 'A1', 'A2', 'A12'). Case-insensitive. Returns all roads when omitted. | |
| category | No | Filter by incident category: jams (traffic jams and closures), roadworks (construction), radars (speed cameras). Returns all categories when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint annotations covering safety and world-data behavior, the description adds useful context by naming ANWB as the source, stating the data is current, and enumerating incident categories. Annotations are not contradicted.
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?
Three compact sentences: purpose, output contents, and filtering behavior. Each sentence contributes distinct information and the most important scope ('current traffic incidents on Dutch highways') is 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?
For a simple read-only tool with no required parameters, the description tells an agent what will be returned (jams, closures, roadworks, speed camera locations) and how to filter. It does not specify the exact response shape, but no output schema exists and the listed categories provide enough for invoking the 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 100%, so the parameters are already fully documented. The description repeats the filter concepts ('Optionally filter by road and/or category') and examples like 'A1', but adds little semantic value beyond 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 description opens with a specific verb and resource: 'Get current traffic incidents on Dutch highways from ANWB.' It enumerates the returned entity types (jams, closures, roadworks, speed cameras), which distinguishes it from summary/route/location 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 intended use is clear: call this when current Dutch highway incident data is needed, optionally narrowed by road and category. It does not explicitly name siblings or state when not to use them, but the context is unambiguous enough that no exclusion is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_traffic_summaryGet Traffic SummaryARead-only
Get a compact summary of current traffic conditions on Dutch highways. Returns total counts of jams, road closures, roadworks, and radars across all highways.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description adds that the result is compact/aggregated, scoped to all highways, and composed of total counts rather than detailed incident records. It does not address freshness or potential limitations, but the annotations already cover the safety profile.
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, well-structured sentence delivers the purpose, scope, and output composition without any redundant filler. Information is efficiently 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?
For a zero-parameter, read-only summary tool, the description is complete: it names what counts are returned, the geographic scope, and the temporal nature. No output schema exists, but the return content is described explicitly.
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 input schema has zero parameters, so there is no parameter documentation burden. The description reinforces that the tool takes no arguments by describing an all-highways aggregate result.
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 ('Get') and resource ('compact summary of current traffic conditions on Dutch highways'), and enumerates the exact outputs (counts of jams, closures, roadworks, radars). This clearly separates it from sibling tools like get_traffic_incidents, which would provide more granular incident data.
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 provides clear context: use this tool when you need a high-level numeric snapshot across all Dutch highways. It does not explicitly state when not to use it or direct the agent to an alternative for detailed incident-level traffic information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ev_carsList Electric VehiclesARead-only
List available electric vehicle models from the ANWB database. Returns car IDs, make, model, version, and battery information. Use the car ID with calculate_ev_route to plan an EV route. Optionally filter by make (brand) or search by model name.
| Name | Required | Description | Default |
|---|---|---|---|
| make | No | Filter by car make/brand (case-insensitive). Example: 'Tesla', 'Volkswagen', 'BMW'. | |
| search | No | Search term to filter by model name (case-insensitive). Example: 'Model 3', 'ID.4'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, so the description need not restate safety. It adds useful behavioral context by naming the source database, the output fields, and the available filters. It omits details like pagination or ordering, but for a read-only list tool this is not a critical gap.
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?
Three short sentences front-load purpose and return values, then give the downstream workflow and filter options. Every sentence earns its place, and there is no redundant or filler wording.
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 two optional parameters and no output schema, the description provides the essential operational knowledge: what the tool lists, what fields are returned, how to use those results with calculate_ev_route, and how to filter. It is complete enough for an agent 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?
Schema description coverage is 100%: both 'make' and 'search' already have clear descriptions and examples in the schema. The description merely restates 'filter by make (brand)' and 'search by model name,' adding no new parameter meaning beyond what the schema already provides. Baseline 3 is appropriate.
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: 'List available electric vehicle models from the ANWB database.' It names the exact return fields (car IDs, make, model, version, battery information) and points to calculate_ev_route as the downstream consumer, which clearly distinguishes it from the route-planning 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 gives explicit usage context: 'Use the car ID with calculate_ev_route to plan an EV route.' It also explains the optional filters. It does not enumerate when not to use this tool or explicitly compare it to alternatives, but the workflow guidance is clear.
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.
6 tool updates
v0.2.0- First observed
calculate_ev_route - First observed
calculate_route - First observed
find_locations - First observed
get_traffic_incidents - First observed
get_traffic_summary - First observed
list_ev_cars
TDQS
Scored across 6 tools
Each tool has a clearly distinct role: traffic summary versus detailed incidents, standard route versus EV route, plus supporting lookup tools for locations and EV cars. Although get_traffic_summary and get_traffic_incidents both cover traffic, one provides aggregate counts and the other detailed filters, so there is no real ambiguity.
All tool names follow a consistent snake_case verb_noun pattern: get_, find_, calculate_, and list_. The naming clearly communicates both the action and the resource, with calculate_route and calculate_ev_route sharing a predictable structure.
Six tools is well-scoped for an ANWB mobility server covering traffic conditions, location search, standard route planning, and EV route planning. Each tool serves a distinct purpose and none feel redundant or unnecessary.
The tool surface covers the full workflow: find locations, get traffic context, calculate both standard and EV routes, and look up EV car models for route planning. There are no obvious dead ends or missing operations for the stated domain.
Maintenance
Related MCP Connectors
HERE MCP — premium geocoding, places, and TRAFFIC-AWARE routing from HERE
TomTom MCP — wraps the TomTom Search & Routing APIs (api.tomtom.com)
- geoOAuthco.thinair
Geocoding, truck routing, traffic, weather, and place search via MCP — 11 hosted tools.
Geo-based flight search MCP server. Find more flights between any two places on earth
Related MCP Servers
- AlicenseAqualityFmaintenanceAn MCP server that provides access to NS (Dutch Railways) travel information.853 npm62MIT
- AlicenseAqualityCmaintenanceAn MCP server that enables AI assistants to interact with the Netherlands Railways (NS) API for route planning, pricing, and real-time departure information. It provides tools for searching stations, planning trips with connections, and viewing real-time departure boards.31MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for interacting with the Berlin Public Transport (BVG) API to search for locations and plan journeys. It provides real-time access to departures, arrivals, trip details, and vehicle tracking within Berlin's transit network.MIT

SB OGC MCPofficial
AlicenseAqualityDmaintenanceMCP server that gives Claude access to Dutch mobility data via Studio Bereikbaar's OGC API, enabling querying of travel surveys, traffic models, and accessibility maps.16MIT