Search / io.github.cyanheads/openstreetmap-mcp-server
openstreetmap-mcp-server
R0· no sign-inGeocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data.
v0.6.1 · active · repository · descriptor JSON · versions
Search / io.github.cyanheads/openstreetmap-mcp-server
R0· no sign-inGeocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data.
v0.6.1 · active · repository · descriptor JSON · versions
{
"mcpServers": {
"openstreetmap-mcp-server": {
"type": "http",
"url": "https://openstreetmap.caseyjhand.com/mcp"
}
}
}claude mcp add --transport http openstreetmap-mcp-server https://openstreetmap.caseyjhand.com/mcp[mcp_servers.openstreetmap-mcp-server]
url = "https://openstreetmap.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"openstreetmap-mcp-server": {
"type": "remote",
"url": "https://openstreetmap.caseyjhand.com/mcp",
"enabled": true
}
}
}{
"mcpServers": {
"openstreetmap-mcp-server": {
"type": "http",
"url": "https://openstreetmap.caseyjhand.com/mcp"
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=openstreetmap-mcp-server&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vb3BlbnN0cmVldG1hcC5jYXNleWpoYW5kLmNvbS9tY3AifQ%3D%3D"
}{
"servers": {
"openstreetmap-mcp-server": {
"type": "http",
"url": "https://openstreetmap.caseyjhand.com/mcp"
}
}
}{
"mcpServers": {
"openstreetmap-mcp-server": {
"httpUrl": "https://openstreetmap.caseyjhand.com/mcp"
}
}
}extensions:
"openstreetmap-mcp-server":
enabled: true
name: "openstreetmap-mcp-server"
type: streamable_http
uri: "https://openstreetmap.caseyjhand.com/mcp"
timeout: 300
protocol.modernsupports 2026-07-28 (server/discover)protocol.statelessanswers without a sessionprotocol.transportstreamable HTTPprotocol.list_ttltool list is cacheable (ttlMs 3600000)auth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptionsevery tool has a descriptiontools.description_lengthdescriptions are concisetools.schemasevery tool has an object input schematools.annotations6 of 6 tools declare readOnlyHint or destructiveHinttools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: openstreetmap_query_raw (destructiveHint); openstreetmap_search_places (destructiveHint); openstreetmap_query_nearby (destructiveHint); …tools.token_costabout 6,168 tokens to load every tooltools.api_dumptools are not a one-to-one API dumpstability.changes8 tool changes in 30 daysstability.rug_pullno tool changed its meaning under the same namedeps.known_vulnsno known advisory in 74 resolved packagesdeps.mcp_sdk_version@modelcontextprotocol/core 2.3.1, no known advisorydeps.resolvable@cyanheads/[email protected], @cyanheads/[email protected] resolved: 74 packagesopenstreetmap_query_rawchangedinput schema, output schemaopenstreetmap_query_bboxchangedinput schema, output schemaopenstreetmap_query_nearbychangedinput schema, output schemaopenstreetmap_lookup_objectschangeddescription, input schema, output schemaFetch the Nominatim address record for up to 50 known OSM objects by ID, each prefixed N (node), W (way), or R (relation), e.g. "N240109189". Use it for IDs already in hand from openstreetmap_query_nearby or openstreetmap_query_bbox; it returns only objects named in osm_ids, listing any that resolve to nothing under not_found, and cannot select by tag, so discover objects with those tools or openstreetmap_query_raw first.
Fetch the Nominatim address record for known OSM objects by ID, 50 per call with any more returned under deferred_ids, each prefixed N (node), W (way), or R (relation), e.g. "N240109189". Use it for IDs already in hand from openstreetmap_query_nearby or openstreetmap_query_bbox; it returns only objects named in osm_ids and lists those with no Nominatim record under not_found (Nominatim skips unnamed and non-place objects, so such an ID may still exist). It cannot select by tag, so discover objects with those tools or openstreetmap_query_raw first.
openstreetmap_search_placeschangedinput schema, output schemaopenstreetmap_query_rawchangedoutput schemaopenstreetmap_query_bboxchangedoutput schemaopenstreetmap_query_nearbychangedoutput schemaFull history: list_changes · trend: quality JSON.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +namespace-matches-repo +reachable +uptime-100% +updated-6d-ago
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
@cyanheads/[email protected] npm36 dependencies, resolved · MCP SDK @modelcontextprotocol/core 2.3.1 · advisories checked 2026-10-19
No known advisory affects this dependency graph.
@cyanheads/[email protected] npm36 dependencies, resolved · MCP SDK @modelcontextprotocol/core 2.3.1 · advisories checked 2026-10-19
No known advisory affects this dependency graph.
Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.
| remote | auth | reachable | uptime 30d | p50 | protocol | last ok |
|---|---|---|---|---|---|---|
https://openstreetmap.caseyjhand.com/mcp streamable-http | none | yes | 100% | 180 ms | 2026-07-28 | 2026-10-20 |
| package | registry | version | runtime | secrets |
|---|---|---|---|---|
@cyanheads/openstreetmap-mcp-server | npm | 0.6.1 | npx | |
@cyanheads/openstreetmap-mcp-server | npm | 0.6.1 | npx |
openstreetmap_lookup_objectsread-only | Fetch the Nominatim address record for known OSM objects by ID, 50 per call with any more returned under deferred_ids, each prefixed N (node), W (way), or R (relation), e.g. "N240109189". Use it for IDs already in hand from openstreetmap_query_nearby or openstreetmap_query_bbox; it returns only objects named in osm_ids and lists those with no Nominatim record under not_found (Nominatim skips unnamed and non-place objects, so such an ID may still exist). It cannot select by tag, so discover objects with those tools or openstreetmap_query_raw first. |
openstreetmap_query_bboxread-only | Find OSM features inside an area via the Overpass API, for surveys of everything in a region (openstreetmap_query_nearby covers proximity to a point). Scope with the four corner fields south, west, north, east, or with within and a single OSM boundary ref such as a city relation or a park way, which searches the boundary polygon itself instead of an overcovering box; never both. Filter with amenity, or with tag_key plus an optional tag_value, ANDing up to five more filters; every feature returns with its full OSM tag set (no extratags flag here). |
openstreetmap_query_nearbyread-only | Find OSM features within a radius of a point via the Overpass API, the tool for "what is near X?" questions. Filter with amenity, or with tag_key plus an optional tag_value, ANDing up to five more filters; every feature returns with its full OSM tag set (no extratags flag here), sorted nearest-first by distance_meters, with nodes covering standalone POIs and ways covering buildings and areas. |
openstreetmap_query_rawread-only | Run an arbitrary Overpass QL query for anything the convenience tools cannot express: multi-type or union queries, relation membership, historical queries, regex tag matching. The query must include [out:json], e.g. "[out:json][timeout:15];node[\"natural\"=\"peak\"](47.5,-122.5,47.7,-122.2);out body;"; scope to an OSM boundary with rel(<id>);map_to_area->.a; or way(<id>);map_to_area->.a; then (area.a) on each statement (the 2400000000 way-area offset is gone since Overpass 0.7.57; openstreetmap_query_bbox takes the same scope as within, without QL). The response is one page: page with limit and offset, read totalFound and truncated for the whole match, and an element over max_element_bytes arrives with its members, nodes or geometry array withheld whole and withheldNotice saying how to fetch it back. For plain "near X" or "in this area" questions use openstreetmap_query_nearby or openstreetmap_query_bbox. |
openstreetmap_reverse_geocoderead-only | Convert a latitude/longitude pair to the nearest address or named place via Nominatim. The result is the closest indexed OSM object at the requested zoom (18 building, 10 city), which in dense areas can be a neighbouring feature rather than the one containing the coordinate; proximity and layer pick it, never an OSM attribute tag, so find features by tag with openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw. |
openstreetmap_search_placesread-only | Geocode a place name or address to coordinates and structured place data via Nominatim. Send either a free-form query or the structured address fields (street, city, county, state, country, postalcode), never both; results are the best-ranked matches, not every matching object, and matching never uses an OSM attribute tag, so filter or enumerate by tag with openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw. |
Schemas: list_tools.
And 140 more from this publisher.
{
"name": "io.github.cyanheads/openstreetmap-mcp-server",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"remotes": [
{
"url": "https://openstreetmap.caseyjhand.com/mcp",
"type": "streamable-http"
}
],
"version": "0.6.1",
"packages": [
{
"version": "0.6.1",
"transport": {
"type": "stdio"
},
"identifier": "@cyanheads/openstreetmap-mcp-server",
"runtimeHint": "npx",
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"environmentVariables": [
{
"name": "OSM_NOMINATIM_BASE_URL",
"format": "string",
"default": "https://nominatim.openstreetmap.org",
"description": "Nominatim API base URL. Override to use a private or mirror instance."
},
{
"name": "OSM_USER_AGENT",
"format": "string",
"default": "openstreetmap-mcp-server/0.6.1",
"description": "User-Agent sent to Nominatim and Overpass. Required by usage policy."
},
{
"name": "OSM_OVERPASS_BASE_URL",
"format": "string",
"description": "Overpass API endpoint URL. When set, pins every query to this one endpoint and disables mirror failover; OSM_OVERPASS_MAX_CONCURRENCY sizes it and a |N suffix is rejected. Leave unset to use OSM_OVERPASS_ENDPOINTS."
},
{
"name": "OSM_OVERPASS_ENDPOINTS",
"format": "string",
"default": "https://overpass-api.de/api/interpreter",
"description": "Comma-separated ordered list of Overpass endpoints. A failure advances to the next entry within the same tool call; a single entry means no failover. An entry written url|N gets N slots of its own and adds capacity, for an instance whose operator allows parallel queries, never a public FOSSGIS server; an unsuffixed later entry is failover only. Write a | inside a URL as %7C. Verify a mirror's usage policy, data coverage, and freshness before adding it. Ignored when OSM_OVERPASS_BASE_URL is set."
},
{
"name": "OSM_OVERPASS_MAX_CONCURRENCY",
"format": "number",
"default": "1",
"description": "Concurrent Overpass queries per endpoint: OSM_OVERPASS_BASE_URL, and every OSM_OVERPASS_ENDPOINTS entry not sized with |N. With no |N entry it is also the most queries in flight across all endpoints. A query waits at most 30 seconds in total for a slot, then fails with pacer_shed and a retryAfter. The default of 1 follows the public FOSSGIS instances, which allow one query in flight per user; raise it only for an instance whose operator allows parallel queries, such as a private or paid one."
},
{
"name": "MCP_LOG_LEVEL",
"format": "string",
"default": "info",
"description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
}
]
},
{
"version": "0.6.1",
"transport": {
"url": "http://localhost:3010/mcp",
"type": "streamable-http"
},
"identifier": "@cyanheads/openstreetmap-mcp-server",
"runtimeHint": "npx",
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"environmentVariables": [
{
"name": "MCP_TRANSPORT_TYPE",
"value": "http",
"format": "string",
"description": "Selects the HTTP transport."
},
{
"name": "MCP_HTTP_HOST",
"format": "string",
"default": "127.0.0.1",
"description": "The hostname for the HTTP server."
},
{
"name": "MCP_HTTP_PORT",
"format": "string",
"default": "3010",
"description": "The port to run the HTTP server on."
},
{
"name": "MCP_HTTP_ENDPOINT_PATH",
"format": "string",
"default": "/mcp",
"description": "The endpoint path for the MCP server."
},
{
"name": "MCP_PUBLIC_URL",
"format": "string",
"description": "Public origin override for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com)."
},
{
"name": "MCP_AUTH_MODE",
"format": "string",
"default": "none",
"description": "Authentication mode to use: 'none', 'jwt', or 'oauth'."
},
{
"name": "OSM_NOMINATIM_BASE_URL",
"format": "string",
"default": "https://nominatim.openstreetmap.org",
"description": "Nominatim API base URL. Override to use a private or mirror instance."
},
{
"name": "OSM_USER_AGENT",
"format": "string",
"default": "openstreetmap-mcp-server/0.6.1",
"description": "User-Agent sent to Nominatim and Overpass. Required by usage policy."
},
{
"name": "OSM_OVERPASS_BASE_URL",
"format": "string",
"description": "Overpass API endpoint URL. When set, pins every query to this one endpoint and disables mirror failover; OSM_OVERPASS_MAX_CONCURRENCY sizes it and a |N suffix is rejected. Leave unset to use OSM_OVERPASS_ENDPOINTS."
},
{
"name": "OSM_OVERPASS_ENDPOINTS",
"format": "string",
"default": "https://overpass-api.de/api/interpreter",
"description": "Comma-separated ordered list of Overpass endpoints. A failure advances to the next entry within the same tool call; a single entry means no failover. An entry written url|N gets N slots of its own and adds capacity, for an instance whose operator allows parallel queries, never a public FOSSGIS server; an unsuffixed later entry is failover only. Write a | inside a URL as %7C. Verify a mirror's usage policy, data coverage, and freshness before adding it. Ignored when OSM_OVERPASS_BASE_URL is set."
},
{
"name": "OSM_OVERPASS_MAX_CONCURRENCY",
"format": "number",
"default": "1",
"description": "Concurrent Overpass queries per endpoint: OSM_OVERPASS_BASE_URL, and every OSM_OVERPASS_ENDPOINTS entry not sized with |N. With no |N entry it is also the most queries in flight across all endpoints. A query waits at most 30 seconds in total for a slot, then fails with pacer_shed and a retryAfter. The default of 1 follows the public FOSSGIS instances, which allow one query in flight per user; raise it only for an instance whose operator allows parallel queries, such as a private or paid one."
},
{
"name": "MCP_LOG_LEVEL",
"format": "string",
"default": "info",
"description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
}
]
}
],
"repository": {
"url": "https://github.com/cyanheads/openstreetmap-mcp-server",
"source": "github"
},
"description": "Geocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data."
}