Skip to main content
Glama

anwb-mcp

npm version License: MIT Node.js MCP CI Coverage

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.

  1. Zorg dat Node.js 20+ is geïnstalleerd (je AI-app draait npx op je machine)

  2. Voeg de server toe als MCP server in je AI-app (kopieer onderstaande configuratie)

  3. Stel vragen in gewoon Nederlands (zie Voorbeelden)

Related MCP server: ns-bridge

Quick Start (Non-Developers)

You do not need to clone this repo.

  1. Make sure Node.js 20+ is installed (your AI app will run npx on your machine)

  2. Add the server to your AI app as an MCP server (copy/paste config below)

  3. 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.

  1. Open your Claude Desktop MCP config file:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  2. Add this server entry (or merge it into your existing mcpServers):

{
  "mcpServers": {
    "anwb-mcp": {
      "command": "npx",
      "args": ["-y", "anwb-mcp"]
    }
  }
}
  1. Restart Claude Desktop

Add To Other AI Apps

Most MCP apps have a screen like "Add MCP Server" where you can fill in:

  • Command: npx

  • Args: -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 found or server fails to start

    • Fix: 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-After header support

  • Toolset 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

MCP in Claude Code

Anthropic API (Messages API)

Remote MCP servers

Codex CLI (OpenAI)

Codex CLI docs

Gemini CLI (Google)

Gemini CLI MCP server docs

VS Code (Copilot)

Use MCP servers in VS Code

Claude Desktop

MCP in Claude Desktop

Cursor

Cursor docs

Windsurf

Windsurf MCP docs

Cline

Cline MCP docs

Zed

Zed context servers docs

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: npx

  • Args: ["-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

servers

Add "type": "stdio" on the server object

Claude Desktop / Cursor / Windsurf / Cline

mcpServers

Same command/args block

Zed

context_servers

Same command/args block

Codex CLI (TOML)

mcp_servers

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.json and 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-mcp

Codex CLI (OpenAI)

codex mcp add anwb-mcp -- npx -y anwb-mcp

Gemini CLI (Google)

gemini mcp add anwb-mcp -- npx -y anwb-mcp

VS 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)

~/Library/Application Support/Claude/claude_desktop_config.json

mcpServers

Claude Desktop (Windows)

%APPDATA%\\Claude\\claude_desktop_config.json

mcpServers

Cursor (project)

.cursor/mcp.json

mcpServers

Cursor (global)

~/.cursor/mcp.json

mcpServers

Windsurf

~/.codeium/windsurf/mcp_config.json

mcpServers

Cline

MCP settings UI

mcpServers

Zed (macOS/Linux)

~/.zed/settings.json or ~/.config/zed/settings.json

context_servers

Docker

docker run -i --rm ghcr.io/bartwaardenburg/anwb-mcp

Codex 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 (stdio command server)

  • Tool names and tool schemas exposed by this server

What is host/vendor-specific (not portable as-is):

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

ANWB_CACHE_TTL

Cache TTL in seconds (set to 0 to disable). Routes/incidents use 60s, locations use 300s.

unset

ANWB_MAX_RETRIES

Maximum retry attempts for rate-limited (429) requests with exponential backoff.

3

ANWB_TOOLSETS

Comma-separated list of tool categories to enable (see Toolset Filtering).

All toolsets

Available Tools

Locations

Tool

Description

find_locations

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_route

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.

calculate_ev_route

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.

list_ev_cars

Browse available electric vehicle models from the ANWB database. Filter by make (brand) or search by model name. Returns car IDs for use with calculate_ev_route.

Incidents

Tool

Description

get_traffic_incidents

Get current traffic incidents on Dutch highways — jams, closures, roadworks, and speed cameras. Filter by road and/or category.

get_traffic_summary

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,incidents

Toolset

Tools included

locations

Location and address search

routes

Route calculation, EV routing, and EV car database

incidents

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

Development

# Install dependencies
pnpm install

# Run in development mode
pnpm dev

# Build for production
pnpm build

# Run tests
pnpm test

# Type check
pnpm typecheck

Project 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 summary

Requirements

  • Node.js >= 20

License

MIT - see LICENSE for details.

Available Tools

6 tools
calculate_ev_routeCalculate EV RouteA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
carIdYesEV car model ID from the ANWB database (e.g. '646ca73f3f6beb1fcbdbdf70').
capacityYesBattery capacity in kWh (e.g. 100 for a 100 kWh battery).
locationsYesWaypoints as lat,lon pairs separated by colons. Minimum 2 points. Example: '52.373166,4.89066:51.441643,5.469722'.
complexityNoRoute complexity factor (default: 1.15). Higher values may find more optimal routes.
stateOfChargeYesCurrent battery state of charge as a percentage (5-100).
finalStateOfChargeNoDesired minimum battery percentage at arrival (10-75, default: 20).

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RouteA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
avoidNoRoad types to avoid. Options: tollRoads, motorways, ferries, unpavedRoads. Applies to car/caravan modes primarily.
trafficNoTake current traffic conditions into account (car/caravan mode only, ignored for bike/pedestrian).
tollInfoNoInclude toll road information (car/caravan mode only, ignored for bike/pedestrian).
locationsYesWaypoints as lat,lon pairs separated by colons. Minimum 2 points. Example: '52.373166,4.89066:51.441643,5.469722' (Amsterdam to Eindhoven).
routeTypeNoRoute optimization: fastest (default) or shortest distance. Note: 'shortest' only works for bike and pedestrian modes.fastest
transportModeNoTransport mode: car (default), caravan, bike, or pedestrian.car
transportSubtypeNoBike subtype: 'bike' (regular) or 'ebike' (electric bicycle). Only applies when transportMode is 'bike'.
includeAlternativesNoInclude alternative routes in the response.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 LocationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoGeographic area to search in. ALL includes the Netherlands and surrounding countries, NLD limits to the Netherlands only.ALL
limitNoMaximum number of results to return (1-20).
queryYesFree-text search query (e.g. city name, address, POI name).
indexSetsNoIndex sets to search: PAD (addresses), Str (streets), Geo (geographic areas), Addr (address ranges), POI (points of interest). Default is all.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 IncidentsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
roadNoFilter by specific road (e.g. 'A1', 'A2', 'A12'). Case-insensitive. Returns all roads when omitted.
categoryNoFilter by incident category: jams (traffic jams and closures), roadworks (construction), radars (speed cameras). Returns all categories when omitted.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SummaryA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 VehiclesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
makeNoFilter by car make/brand (case-insensitive). Example: 'Tesla', 'Volkswagen', 'BMW'.
searchNoSearch term to filter by model name (case-insensitive). Example: 'Model 3', 'ID.4'.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.2.0
    • First observedcalculate_ev_route
    • First observedcalculate_route
    • First observedfind_locations
    • First observedget_traffic_incidents
    • First observedget_traffic_summary
    • First observedlist_ev_cars

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    An 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.
    3
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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