| name | pp-pdok-location | |||||||
|---|---|---|---|---|---|---|---|---|
| description | One Go binary for every Dutch location workflow — geocode, reverse-geocode, batch CSVs, full GeoJSON geometries,... Trigger phrases: `geocode a Dutch address`, `find the gemeente for this lat/lon`, `convert RD coordinates to WGS84`, `look up a Dutch postcode`, `batch geocode a CSV of Dutch addresses`, `find the nearest address to this point in the Netherlands`, `use pdok-location`, `run pdok-location`. | |||||||
| author | markvandeven | |||||||
| license | Apache-2.0 | |||||||
| argument-hint | <command> [args] | install cli|mcp | |||||||
| allowed-tools | Read Bash | |||||||
| metadata |
|
This skill drives the pdok-location-pp-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
- Install via the Printing Press installer. It defaults binaries to
$HOME/.local/binon macOS/Linux and%LOCALAPPDATA%\Programs\PrintingPress\binon Windows:npx -y @mvanhorn/printing-press-library install pdok-location --cli-only
- Verify:
pdok-location-pp-cli --version - Ensure the reported install directory is on
$PATHfor the agent/runtime that will invoke this skill.
If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.4 or newer):
go install github.com/mvanhorn/printing-press-library/library/developer-tools/pdok-location/cmd/pdok-location-pp-cli@latestIf --version reports "command not found" after install, the runtime cannot see the binary directory on $PATH. Do not proceed with skill commands until verification succeeds.
PDOK Location is the right CLI when an agent needs to work with Dutch addresses, parcels, roads, or administrative boundaries — including batch geocoding CSVs, looking up the gemeente containing a point, converting between RD and WGS84 coordinates, or pulling full GeoJSON features inside a bounding box. It is Netherlands-only (do not use for non-Dutch addresses) and free (no auth, no key).
This binary wraps two upstreams — Locatieserver (/bzk/locatieserver/search/v3_1) and Kadaster Location API (/kadaster/location-api/v1) — because they are complementary, not redundant.
- Locatieserver (Solr-based) is the primary text-geocoding surface: free-text matches, suggest→lookup chains, reverse geocoding by lat/lon or RD, ranked Solr scores. Returns records with centroid coordinates only.
- Kadaster Location API (OGC API Features) is the secondary geometry surface: full GeoJSON, bbox filters, multi-CRS output (WGS84, RD/EPSG:28992, Web Mercator, ETRS89), 14 collections.
A common Dutch geo workflow uses both: geocode text on Locatieserver, then pull full geometry on the Location API. Each is incomplete without the other (Locatieserver lacks bbox and full geometries; Location API lacks Solr ranking and reverse geocoding), so bundling them under one binary, one config, and one local cache turns that workflow into a single tool. Run pdok-location-pp-cli doctor --json to see which of the two upstreams is reachable right now — the sources.locatieserver and sources.kadaster_location_api keys each report status + which commands are affected if the source is down.
- Do not use for non-Dutch addresses. PDOK only covers the Netherlands; passing a US, UK, German, Belgian, or other non-Dutch address returns either an empty result or a low-score false positive. Pick a different geocoder for those.
- Do not use for mutating remote state. This printed CLI exposes read-only commands only — no creating, updating, deleting, publishing, commenting, ordering, booking, or other state-changing operations.
These capabilities aren't available in any other tool for this API.
-
batch geocode— Geocode an entire CSV of Dutch addresses in one command — outputs lat/lon, RD X/Y, match score, and an error column for failed rows.When an agent needs to enrich a list of Dutch addresses, this is the one-shot command — no per-row scripting, with cached re-runs and a clear error column.
pdok-location-pp-cli batch geocode incidents.csv --address-col street --out incidents-geocoded.csv
-
features search— Search across multiple Location API OGC collections (adres, perceel, gebouw, ...) with an optional bounding-box filter, flattened to JSON or CSV.When an agent needs a flat CSV of address+parcel matches inside a study area, this is the lightest path from a query to a multi-collection result set.
pdok-location-pp-cli features search --query damrak --collections adres,perceel --bbox 4.85,52.36,4.92,52.40 --csv
-
resolve— Type a partial address, get the canonical match with full GeoJSON geometry — the suggest→lookup chain collapsed into a single command.When an agent needs to turn imprecise user text into a canonical address with geometry, this is the cheapest path.
pdok-location-pp-cli resolve 'Damrak Amsterdam' --geojson -
nearest— From any lat/lon or RD coordinate, return the nearest address, nearest parcel, nearest hectometer marker, and the gemeente/provincie containing the point — all in one call.Reverse-geocoding usually needs four separate API calls; this one returns the full picture in one shot, ideal for field-data enrichment pipelines.
pdok-location-pp-cli nearest --lat 52.3731 --lon 4.8922 --json
-
top— Return the single best match for a query if (and only if) the Solr score clears a threshold — exits non-zero when no match clears the bar.When an agent needs a yes/no on whether an address is well-known, this is the predicate.
pdok-location-pp-cli top 'Hertog Aalbrechtweg 5 1823DL Alkmaar' --min-score 5.0 --require-type adres --json
-
convert rd-to-ll— Convert Dutch RD (EPSG:28992) coordinates to WGS84 lat/lon and back, with pure-math precision — no API call needed.When an agent must reconcile Dutch RD coords with global WGS84, this is the local, deterministic path — no rate limit, no auth.
pdok-location-pp-cli convert rd-to-ll 121200 488000 --json
-
convert wkt-to-geojson— Take any WKT geometry (POINT, POLYGON, MULTIPOLYGON, MULTILINESTRING) and emit GeoJSON — or convert GeoJSON back to WKT.When an agent needs to feed a PDOK response into mapping or analysis tooling expecting GeoJSON, this saves a parser.
pdok-location-pp-cli convert wkt-to-geojson 'POINT(4.76 52.64)'
-
gemeente get— After a one-time sync, look up any of the 342 Dutch gemeenten or 12 provincies fully offline — name, centroid, codes, parent provincie.For any agent workflow that asks 'which gemeente?' or 'list all gemeenten in this provincie', the answer is local and instant.
pdok-location-pp-cli gemeente get amsterdam --json
-
search— Full-text search across every address, gemeente, and lookup you've previously fetched — finds matches locally before falling back to the API.When an agent repeats lookups on the same dataset, this short-circuits the API entirely once the cache is warm.
pdok-location-pp-cli search 'amsterdam centraal' --json -
gemeente of-point— Given any lat/lon or RD coordinate, return which gemeente and provincie contain it — using the offline gazetteer with an API fallback.For 'which municipality is this incident in' questions an agent asks repeatedly, this is the cached, offline-first answer.
pdok-location-pp-cli gemeente of-point --lat 52.3731 --lon 4.8922 --json
-
perceel lookup— Look up a Dutch cadastral parcel by its full kadastrale aanduiding (e.g. 'AMR03 N 1234') and get back the GeoJSON parcel feature.For cadastral investigations, this is the only command-line path from aanduiding text to a GeoJSON parcel.
pdok-location-pp-cli perceel lookup --aanduiding 'ASD02 A 4332' --json
collections — Manage collections
pdok-location-pp-cli collections get— A list of all collections (geospatial data resources) in this dataset.pdok-location-pp-cli collections get-adres— adres collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-functioneel-gebied— functioneel_gebied collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-gebouw— gebouw collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-gemeentegebied— gemeentegebied collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-geografisch-gebied— geografisch_gebied collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-inrichtingselement— inrichtingselement collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-perceel— perceel collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-plaats— plaats collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-provinciegebied— provinciegebied collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-spoorbaandeel— spoorbaandeel collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-waterdeel— waterdeel collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-wegdeel— wegdeel collection (geospatial data resource) in this dataset.pdok-location-pp-cli collections get-woonplaats— woonplaats collection (geospatial data resource) in this dataset.
conformance — Manage conformance
pdok-location-pp-cli conformance— A list of all conformance classes specified in a standard that the server conforms to.
free — Manage free
pdok-location-pp-cli free— De Free API biedt de mogelijkheid om vrij te zoeken (klassiek geocoderen), waar zonder tussenkomst van suggesties de...
lookup — Manage lookup
pdok-location-pp-cli lookup— Zodra er op basis van suggesties van de Suggest API een keuze is gemaakt, wordt de Lookup API aangeroepen, welke...
pdok-location-api — Manage pdok location api
pdok-location-pp-cli pdok-location-api— This document
pdok-location-search — Manage pdok location search
pdok-location-pp-cli pdok-location-search— This endpoint allows one to implement autocomplete functionality for location search. Theqparameter accepts a...
reverse — Manage reverse
pdok-location-pp-cli reverse— De Reverse API biedt de mogelijkheid om een locatie (punt geometrie) op te geven om vervolgens verschillende...
suggest — Manage suggest
pdok-location-pp-cli suggest— De Suggest API biedt de mogelijkheid om een (gedeelte van een) zoekopdracht op te voeren, waarnaar er suggesties...
When you know what you want to do but not which command does it, ask the CLI directly:
pdok-location-pp-cli which "<capability in your own words>"which resolves a natural-language capability query to the best matching command from this CLI's curated feature index. Exit code 0 means at least one match; exit code 2 means no confident match — fall back to --help or use a narrower query.
pdok-location-pp-cli batch geocode customers.csv --address-col street --out customers-geocoded.csvGeocode every row, write a new CSV with lat/lon, RD x/y, score, and an error column. Re-runs are free because successful matches are cached.
pdok-location-pp-cli resolve 'Damrak Amsterdam' --geojsonOne command that does the suggest→lookup chain and returns GeoJSON ready to drop into a map.
pdok-location-pp-cli nearest --lat 52.3731 --lon 4.8922 --agent --select adres.weergavenaam,adres.id,perceel.weergavenaam,gemeente.gemeentenaam,gemeente.provincienaamPair --agent with --select dotted paths so the agent gets only the address line, parcel description, and admin context — not the full per-source response.
pdok-location-pp-cli features search --query amsterdam --collections perceel --bbox 4.85,52.36,4.92,52.40 --csvPulls every parcel matching 'amsterdam' inside the bbox from the Location API and emits a flat CSV; swap --collections to adres, gebouw, or any other OGC collection.
pdok-location-pp-cli convert rd-to-ll 121200 488000 --jsonPure-math transform, runs offline, deterministic — useful for normalizing legacy datasets stored in RD.
No authentication required.
Run pdok-location-pp-cli doctor to verify setup.
Add --agent to any command. Expands to: --json --compact --no-input --no-color --yes.
-
Pipeable — JSON on stdout, errors on stderr
-
Filterable —
--selectkeeps a subset of fields. Dotted paths descend into nested structures; arrays traverse element-wise. Critical for keeping context small on verbose APIs:pdok-location-pp-cli collections get --agent --select id,name,status
-
Previewable —
--dry-runshows the request without sending -
Offline-friendly — sync/search commands can use the local SQLite store when available
-
Non-interactive — never prompts, every input is a flag
-
Read-only — do not use this CLI for create, update, delete, publish, comment, upvote, invite, order, send, or other mutating requests
Commands that read from the local store or the API wrap output in a provenance envelope:
{
"meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
"results": <data>
}Parse .results for data and .meta.source to know whether it's live or local. A human-readable N results (live) summary is printed to stderr only when stdout is a terminal AND no machine-format flag (--json, --csv, --compact, --quiet, --plain, --select) is set — piped/agent consumers and explicit-format runs get pure JSON on stdout.
When you (or the agent) notice something off about this CLI, record it:
pdok-location-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
pdok-location-pp-cli feedback --stdin < notes.txt
pdok-location-pp-cli feedback list --json --limit 10
Entries are stored locally at ~/.pdok-location-pp-cli/feedback.jsonl. They are never POSTed unless PDOK_LOCATION_FEEDBACK_ENDPOINT is set AND either --send is passed or PDOK_LOCATION_FEEDBACK_AUTO_SEND=true. Default behavior is local-only.
Write what surprised you, not a bug report. Short, specific, one line: that is the part that compounds.
Every command accepts --deliver <sink>. The output goes to the named sink in addition to (or instead of) stdout, so agents can route command results without hand-piping. Three sinks are supported:
| Sink | Effect |
|---|---|
stdout |
Default; write to stdout only |
file:<path> |
Atomically write output to <path> (tmp + rename) |
webhook:<url> |
POST the output body to the URL (application/json or application/x-ndjson when --compact) |
Unknown schemes are refused with a structured error naming the supported set. Webhook failures return non-zero and log the URL + HTTP status on stderr.
A profile is a saved set of flag values, reused across invocations. Use it when a scheduled agent calls the same command every run with the same configuration - HeyGen's "Beacon" pattern.
pdok-location-pp-cli profile save briefing --json
pdok-location-pp-cli --profile briefing collections get
pdok-location-pp-cli profile list --json
pdok-location-pp-cli profile show briefing
pdok-location-pp-cli profile delete briefing --yes
Explicit flags always win over profile values; profile values win over defaults. agent-context lists all available profiles under available_profiles so introspecting agents discover them at runtime.
| Code | Meaning |
|---|---|
| 0 | Success |
| 2 | Usage error (wrong arguments) |
| 3 | Resource not found |
| 5 | API error (upstream issue) |
| 7 | Rate limited (wait and retry) |
| 10 | Config error |
Parse $ARGUMENTS:
- Empty,
help, or--help→ showpdok-location-pp-cli --helpoutput - Starts with
install→ ends withmcp→ MCP installation; otherwise → see Prerequisites above - Anything else → Direct Use (execute as CLI command with
--agent)
Install the MCP binary from this CLI's published public-library entry or pre-built release, then register it:
claude mcp add pdok-location-pp-mcp -- pdok-location-pp-mcpVerify: claude mcp list
- Check if installed:
which pdok-location-pp-cliIf not found, offer to install (see Prerequisites at the top of this skill). - Match the user query to the best command from the Unique Capabilities and Command Reference above.
- Execute with the
--agentflag:pdok-location-pp-cli <command> [subcommand] [args] --agent
- If ambiguous, drill into subcommand help:
pdok-location-pp-cli <command> --help.