Knowhere

Knowhere documentation, one page per topic. The whole corpus as one markdown file: /docs.md.

What Knowhere Answers

Knowhere makes OpenStreetMap queryable relative to other things: not "where is this address" but "what is near it, how long does it take to get there, and can I walk it." It indexes *.osm.pbf extracts into a read-only SQLite database and serves them over the Model Context Protocol, so the client asking the questions is a model, not a map GUI. The data underneath is public OpenStreetMap, and the index is one seekable-compressed file read in place — a query touches the frames it needs and nothing else, rather than a copy of the whole thing.

Point an MCP client at /mcp and ask in plain language. The model picks the tool and writes the query; the rest of these pages are what it draws on.

What you can ask

Every example is a real query against indexed data. Substitute your own area — list_areas resolves a place name to the snake_case name a query needs.

Ask How it resolves
"Hot springs I could drive to" nwr[natural=hot_spring][name](area=colorado)
"Ski areas" nwr[landuse=winter_sports][name](area=colorado)
"Trailheads near town" n[highway=trailhead][name](area=colorado)
"Somewhere with a patio for dinner" nw[amenity=restaurant][outdoor_seating=yes](area=colorado)
"Rainy day with the kids" nwr[leisure=trampoline_park,bowling_alley,amusement_arcade,escape_game](area=colorado)
"Where should we watch the sunset?" nwr[tourism=viewpoint][name](area=colorado), ranked by drive_times

Trailheads are the case for asking rather than guessing: they are a highway value, not leisure or tourism. The category cheat-sheet maps the everyday concepts to the key that actually holds them.

Some questions are joins rather than queries. "Dinner and a movie within walking distance of each other" is the near tool; "a park I can walk to from this address" is walk_reach, which follows real sidewalks and so correctly excludes the park across an uncrossable freeway; "three breweries within walking distance of each other" is a runtime recipe.

Where it lies to you

The data is volunteer-mapped, and the gaps are not random. These three failures account for most wrong answers, and each looks like a correct query returning an honest count.

A count is not an answer. nwr[leisure=swimming_pool](area=colorado) matches thousands of pools. Fewer than one in twenty has a name and none carry access=public — they are overwhelmingly backyards. "Public pool" is not a tag. Filter to named results, or ask for leisure=water_park.

A missing tag means a missing mapper, not a missing thing. nw[amenity=bar][live_music=yes](area=colorado) matches a single bar in the whole state, and Colorado has rather more than one bar with live music. The same trap sits under fee=no, wheelchair=yes, dog=yes, and every other optional attribute. Filter on them to rank candidates, never to exclude.

Opening hours, prices, and closures are not in here. The database is a dated extract. It does not know the museum shut last spring. Treat it as a list of candidates to verify.