MCP server proxy for the Dutch OVapi public transport APIs
Config is the same across clients — only the file and path differ.
{
"mcpServers": {
"ovapi": {
"url": "https://ovapi-mcp-server.pqapp.dev/sse",
"type": "sse"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
An MCP (Model Context Protocol) server that proxies the Dutch OVapi public transport APIs, with fuzzy stop search powered by Postgres.
No automated test available for this server. Check the GitHub README for setup instructions.
Five weighted categories — click any category to see the underlying evidence.
No known CVEs.
No package registry to scan.
Click any tool to inspect its schema.
Be the first to review
Have you used this server?
Share your experience — it helps other developers decide.
Sign in to write a review.
Others in maps
A Model Context Protocol (MCP) server providing TomTom's location services, search, routing, and traffic data to AI agents.
Real-time BART departures, trip planning, fares, stations, and advisories.
MCP server for the VesselAPI — maritime vessel tracking, port events, emissions, and navigation data
Fair meeting point discovery for AI agents with isochrone-based travel time fairness
MCP Security Weekly
Get CVE alerts and security updates for Ovapi Mcp Server and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
An MCP (Model Context Protocol) server that proxies the Dutch OVapi public transport APIs, with fuzzy stop search powered by Postgres.
| Tool | Description |
|---|---|
get_departures | Real-time departures by fuzzy stop name or one/more TPC codes. Lean shape by default (verbose=true for raw upstream); supports line, direction, time_window_minutes, max_departures, include_paired, drop_empty filters. stop_name goes through the same ranker as search_stops, so "Schiphol" resolves to the airport rather than Schipholweg. |
search_stops | Search for stops by name. Returns ranked matches with score (0–1000) and paired_with — opposite-direction platforms or adjacent quays at the same physical stop. Minimum query length 3. |
find_stops_near | Nearest-first stops within a lat/lng radius (default 500 m, max 5 km). Haversine distance. |
lines | Compact index of all lines, or details for a specific line (line_id, format {owner}_{public_number}_{direction}, e.g. GVB_17_1). Filters: mode, owner, public_number (exact), name_contains. |
journey | Lean journey shape with stops[] in travel order (target_* scheduled, expected_* realtime-adjusted, stop_type ∈ {FIRST, INTERMEDIATE, LAST}). |
KV78turbo feed only: Dutch bus, tram, metro, ferry. Operators include GVB (Amsterdam), HTM (The Hague), RET (Rotterdam), Qbuzz, Connexxion (CXX), Arriva (ARR), EBS, Keolis, and regional concessions.
NS intercity/sprinter trains are not included — they run on their own Reisinformatie API, which this server doesn't proxy.
status = PLANNED means the vehicle hasn't yet reported — expected equals planned, delay_seconds is 0. DRIVING/ARRIVED/PASSED carry live updates; these are typically within 30 seconds of the vehicle's actual position. OFFROUTE and CANCEL surface operational disruptions.platform, wheelchair_accessible, and number_of_coaches are realtime-enriched and often null for PLANNED departures. wheelchair_accessible="UNKNOWN" upstream is collapsed to null in the lean shape; number_of_coaches=0 is likewise reported as null. coord is null when upstream emits its sentinel coordinate (a stop lacks a real location) — roughly 20% of stops.PLANNED | DRIVING | ARRIVED | PASSED | CANCEL | OFFROUTE verbatim (note: CANCEL, not CANCELLED). mode is lowercase upstream TransportType: bus | tram | metro | boat. Ferries appear as "boat"; lines accepts "ferry" as an input alias only.get_departures is called with a line filter and a stop returns an empty list, the response cannot distinguish "line does not serve this stop" from "line serves it but has no upcoming departures". Use search_stops + lines to check static coverage if that matters.search_stops and lines results. get_departures and journey should be treated as live.verbose: true to pass the raw upstream body through unchanged — useful when debugging field mapping or pulling upstream fields we don't surface in the lean shape. Filters still apply in verbose mode.Add to your Claude Desktop MCP config:
{
"mcpServers": {
"ovapi": {
"type": "sse",
"url": "https://ovapi-mcp-server.pqapp.dev/sse"
}
}
}
Then ask Claude things like: