io.github.cyanheads/openstreetmap-mcp-server
REMOTE · OPENSTREETMAP.CASEYJHAND.COM · 2 COMPONENTS · SCANNED AUG 3
Geocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 6 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability60
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2885 tokens (~480/item across 6 items; 6 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · openstreetmap.caseyjhand.com
claude mcp add --transport http cyanheads-openstreetmap-mcp-server https://openstreetmap.caseyjhand.com/mcp
[mcp_servers.cyanheads-openstreetmap-mcp-server] url = "https://openstreetmap.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cyanheads-openstreetmap-mcp-server": {
"type": "remote",
"url": "https://openstreetmap.caseyjhand.com/mcp",
"enabled": true
}
}
} openclaw mcp add cyanheads-openstreetmap-mcp-server --url https://openstreetmap.caseyjhand.com/mcp --transport streamable-http
mcp_servers:
cyanheads-openstreetmap-mcp-server:
url: "https://openstreetmap.caseyjhand.com/mcp" {
"mcpServers": {
"cyanheads-openstreetmap-mcp-server": {
"type": "http",
"url": "https://openstreetmap.caseyjhand.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Jul 26 +2
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 0
- Server version: 0.3.1 → 0.3.2 functional
- Server version: 0.3.0 → 0.3.1 functional
- 29 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 62
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://openstreetmap.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 7 Jul 2026 | 5 Oct 2026 | ECDSA 256 | ECDSA-SHA256 | 5aad900eb2055a0b0ea55912ec19680c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
DNSSEC secure
Validation of openstreetmap.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| caseyjhand.com. | present | 2371 | 13 | Verified |
| openstreetmap.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://openstreetmap.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://openstreetmap.caseyjhand.com/mcp | HTTPS enforced | 301 | https://openstreetmap.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
openstreetmap_lookup_objects Look up address details for OSM objects by ID ~232
Fetch address details for one or more known OSM objects by their IDs via Nominatim. Each ID must be prefixed with N (node), W (way), or R (relation), e.g., "N240109189", "W50637691", "R146656". Up to 50 IDs per call. Use when an OSM ID is already known from a prior openstreetmap_query_nearby or openstreetmap_query_bbox result — this is more efficient than a geocoding round trip to get the full Nominatim address record.
| Name | Type | Req | Description |
|---|---|---|---|
| extratags | boolean | — | Include extra OSM tags (phone, website, wikidata, etc.). |
| language | string | — | Preferred language for names (BCP 47 code). |
| osm_ids | array | yes | OSM IDs to look up, each prefixed with N (node), W (way), or R (relation). Always an array, including for a single ID: ["N240109189"], ["W50637691", "R146656"]. Up to 50 IDs per call. |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | yes | Required data attribution: Data © OpenStreetMap contributors, ODbL 1.0. |
| not_found | array | yes | OSM IDs from the request that returned no result. |
| results | array | yes | Address details for the requested OSM IDs that were found. |
| total | number | yes | Number of results returned. |
No examples provided.
openstreetmap_query_bbox Find OSM features within a bounding box ~543
Find OSM features within a rectangular geographic area (bounding box) via the Overpass API. Useful for area surveys where you want everything in a region, not proximity searches. Use amenity for common POI types (hospital, pharmacy, cafe, school, etc.) or tag_key + tag_value for other OSM categories (leisure=park, shop=supermarket, natural=peak). Exactly one of amenity or tag_key/tag_value must be provided. Every feature includes its full OSM tag set; the extratags flag (used by the Nominatim-backed openstreetmap_search_places, openstreetmap_reverse_geocode, and openstreetmap_lookup_objects tools) does not apply here. For proximity searches centered on a point, use openstreetmap_query_nearby instead.
| Name | Type | Req | Description |
|---|---|---|---|
| amenity | string | — | OSM amenity tag value shortcut (e.g., "cafe", "bench", "hospital"). Cannot be combined with tag_key/tag_value. |
| east | number | yes | Eastern boundary longitude (maximum longitude). A value below west describes an antimeridian crossing rather than an inverted box. |
| element_types | array | — | OSM element types to search. Ways cover most buildings and areas; nodes cover most standalone POIs. Add "relation" for complex structures. |
| limit | integer | — | Maximum results to return. Applied after the Overpass query — if the area has more features, they are truncated. |
| north | number | yes | Northern boundary latitude (maximum latitude). |
| offset | integer | — | Number of matching features to skip before applying limit, for paging through a large result set. The full match set is fetched and cached ~10 minutes keyed by the query, so re-paging at a new offset… |
| south | number | yes | Southern boundary latitude (minimum latitude). |
| tag_key | string | — | OSM tag key for non-amenity queries (e.g., "leisure", "shop", "natural"). Use with tag_value. Cannot be combined with amenity. |
| tag_value | string | — | OSM tag value paired with tag_key (e.g., "park", "supermarket", "peak"). |
| timeout_seconds | integer | — | Overpass query timeout in seconds. Increase for large bounding boxes or dense areas. |
| west | number | yes | Western boundary longitude (minimum longitude). A west greater than east is valid, not an error: Overpass reads it as an antimeridian-crossing box and returns the union of west..180 and -180..east. |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | yes | Required data attribution: Data © OpenStreetMap contributors, ODbL 1.0. |
| data_timestamp | string | — | OSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata. |
| effectiveTag | string | yes | The OSM tag filter applied (key=value, e.g. "amenity=cafe" or "leisure=park"). |
| elements | array | yes | Matching OSM features within the bounding box, up to the limit. |
| nextOffset | number | — | Offset to pass on the next call to retrieve the following page of features. Present only when more features remain beyond this page. |
| notice | string | — | Guidance when the page came back empty. Distinguishes a query that matched nothing (try a different bounding box or tag) from an offset past the end of a non-empty result set (retry at a lower offset… |
| servingEndpoint | string | — | Overpass endpoint that produced this response, as origin and path. Differs from the first configured endpoint when a mirror answered after the primary failed, and names the endpoint that served a cac… |
| totalFound | number | yes | Total features returned by Overpass before limit truncation. |
| truncated | boolean | yes | True if results were cut at the limit. Reduce bbox area, add more specific tags, or page with offset to retrieve the rest. |
No examples provided.
openstreetmap_query_nearby Find OSM features near a point ~545
Find OSM features within a radius around a geographic point via the Overpass API. The primary tool for "what's near X?" spatial queries. Use amenity for common POI types (hospital, pharmacy, restaurant, cafe, school, atm, etc.) or tag_key + tag_value for other OSM categories (leisure=park, shop=supermarket, natural=peak). Exactly one of amenity or tag_key/tag_value must be provided. Results include all element types specified (nodes cover standalone POIs, ways cover buildings and areas), each with its full OSM tag set, sorted nearest-first by distance_meters from the center point. The extratags flag is not needed here — it applies only to the Nominatim-backed openstreetmap_search_places, openstreetmap_reverse_geocode, and openstreetmap_lookup_objects tools.
| Name | Type | Req | Description |
|---|---|---|---|
| amenity | string | — | OSM amenity tag value (e.g., "hospital", "pharmacy", "restaurant", "school", "atm"). Shortcut for tag_key="amenity". Cannot be combined with tag_key/tag_value. |
| element_types | array | — | OSM element types to search. Ways cover most buildings and areas; nodes cover most standalone POIs. Add "relation" for complex structures like large campuses. |
| lat | number | yes | Center latitude in WGS84 decimal degrees. |
| limit | integer | — | Maximum results to return. Applied after the Overpass query — if the area has more features, they are truncated. |
| lon | number | yes | Center longitude in WGS84 decimal degrees. |
| offset | integer | — | Number of matching features to skip before applying limit, for paging through a large result set. Features are distance-sorted before paging, so higher offsets return progressively farther matches; t… |
| radius_meters | number | — | Search radius in meters. Max 50,000m (50km). Keep under 5,000m for dense urban POI queries to avoid slow responses. |
| tag_key | string | — | OSM tag key for non-amenity queries (e.g., "leisure", "shop", "highway", "natural"). Use with tag_value. Cannot be combined with amenity. |
| tag_value | string | — | OSM tag value paired with tag_key (e.g., "park", "supermarket", "primary", "peak"). |
| timeout_seconds | integer | — | Overpass query timeout in seconds. Increase for large radius or dense areas. |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | yes | Required data attribution: Data © OpenStreetMap contributors, ODbL 1.0. |
| data_timestamp | string | — | OSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata. |
| effectiveTag | string | yes | The OSM tag filter applied (key=value, e.g. "amenity=cafe" or "leisure=park"). |
| elements | array | yes | Matching OSM features, up to the limit. |
| nextOffset | number | — | Offset to pass on the next call to retrieve the following page of features. Present only when more features remain beyond this page. |
| notice | string | — | Guidance when the page came back empty. Distinguishes a query that matched nothing (try a larger radius or different tag) from an offset past the end of a non-empty result set (retry at a lower offse… |
| servingEndpoint | string | — | Overpass endpoint that produced this response, as origin and path. Differs from the first configured endpoint when a mirror answered after the primary failed, and names the endpoint that served a cac… |
| totalFound | number | yes | Total features returned by Overpass before limit truncation. |
| truncated | boolean | yes | True if results were cut at the limit. Reduce radius, add more specific tags, or page with offset to retrieve the rest. |
No examples provided.
openstreetmap_query_raw Execute a raw Overpass QL query ~462
Execute a raw Overpass QL query for advanced spatial queries that the convenience tools do not cover. Use for multi-type queries, union queries, relation membership, historical queries, or any operation requiring full Overpass QL expressiveness. The query must include [out:json]. Example: "[out:json][timeout:15];node[\"natural\"=\"peak\"](47.5,-122.5,47.7,-122.2);out body;" Returns one page of the result set: use limit and offset to page through it, and read totalFound and truncated to see how much the query matched. Validate complex queries at overpass-turbo.eu before use. For simple "what's near X?" or "what's in this area?" queries, use openstreetmap_query_nearby or openstreetmap_query_bbox instead.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Maximum elements to return. Applied after the Overpass query — if the query matched more, they are truncated. |
| offset | integer | — | Number of matching elements to skip before applying limit, for paging through a large result set. The full match set is fetched and cached ~10 minutes keyed by the query, so re-paging at a new offset… |
| query | string | yes | Overpass QL query string. Must include [out:json]. The server sets the endpoint and User-Agent; do not include those. Example: "[out:json][timeout:15];node[\"natural\"=\"peak\"](47.5,-122.5,47.7,-122… |
| timeout_seconds | integer | — | Query timeout in seconds, bounding how long Overpass itself spends on the query. The [timeout:N] directive in the query string takes precedence if present. The client waits for what is requested here… |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | yes | Required data attribution: Data © OpenStreetMap contributors, ODbL 1.0. |
| data_timestamp | string | — | OSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata. |
| effectiveQuery | string | yes | The Overpass QL string as sent to the API (after any timeout injection). |
| elements | array | yes | Raw Overpass API response elements for this page, up to the limit. Structure varies by query type — nodes have lat/lon, ways have nodes[], relations have members[]. |
| nextOffset | number | — | Offset to pass on the next call to retrieve the following page of elements. Present only when more elements remain beyond this page. |
| notice | string | — | Guidance when the page came back empty. Distinguishes a query that matched nothing (check syntax or broaden the filter) from an offset past the end of a non-empty result set (retry at a lower offset)… |
| servingEndpoint | string | — | Overpass endpoint that produced this response, as origin and path. Differs from the first configured endpoint when a mirror answered after the primary failed, and names the endpoint that served a cac… |
| totalFound | number | yes | Total elements returned by Overpass before limit truncation. |
| total_elements | number | yes | Number of elements returned on this page. See totalFound for the full match count. |
| truncated | boolean | yes | True if elements were cut at the limit. Narrow the query, or page with offset to retrieve the rest. |
No examples provided.
openstreetmap_reverse_geocode Reverse geocode coordinates to an address ~272
Convert latitude/longitude coordinates to the nearest address or place name via Nominatim/OpenStreetMap. Returns the closest matching OSM object at the given coordinates. Note: Nominatim finds the nearest indexed OSM object — in dense areas this may differ from the address at the exact coordinate. Use zoom=18 for building-level accuracy, lower zoom values for coarser resolution (e.g., zoom=10 for city-level).
| Name | Type | Req | Description |
|---|---|---|---|
| extratags | boolean | — | Include extra OSM tags when available (phone, website, opening_hours, wikidata, etc.). |
| language | string | — | Preferred language for the result (BCP 47 code or Accept-Language string). |
| lat | number | yes | Latitude in WGS84 decimal degrees. |
| layer | string | — | Restrict which OSM layer is matched. Comma-separated: address, poi, railway, natural, manmade. Default: address,poi. |
| lon | number | yes | Longitude in WGS84 decimal degrees. |
| zoom | integer | — | Address detail level, roughly corresponding to map zoom. 18=building, 16=street, 14=neighbourhood, 12=town, 10=city, 8=county, 5=state, 3=country. |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | yes | Required data attribution. |
| result | object | yes | The closest matching OSM object at the given coordinates. |
No examples provided.
openstreetmap_search_places Geocode a place name or address ~694
Convert a place name or address to geographic coordinates and structured place data via Nominatim/OpenStreetMap. Accepts either a free-form query string (e.g., "Space Needle Seattle") or structured address fields (street, city, state, etc.) — the two modes are mutually exclusive. Returns results ordered by Nominatim relevance (importance score). Use countrycodes to restrict results to specific countries. For exhaustive POI lists in an area, use openstreetmap_query_nearby or openstreetmap_query_bbox instead — Nominatim search returns best matches, not all matching objects.
| Name | Type | Req | Description |
|---|---|---|---|
| city | string | — | City name (structured query). |
| country | string | — | Country name or ISO 3166-1 alpha-2 code (structured query). |
| countrycodes | string | — | Restrict results to one or more countries. Comma-separated ISO 3166-1 alpha-2 codes (e.g., "us,ca"). Preferred over the structured country field when filtering. |
| county | string | — | County or district (structured query). |
| exclude_place_ids | array | — | OSM refs (N/W/R + id) or Nominatim place_ids to drop from results, forwarded as the exclude_place_ids parameter. Pass the nextExcludeIds value from a prior truncated response to page toward the next-… |
| extratags | boolean | — | Include extra OSM tags when available (e.g., phone, website, opening_hours, wikidata). Increases response size. |
| featureType | string | — | Restrict results to a geographic feature type. Automatically implies the address layer. |
| language | string | — | Preferred language for result names (BCP 47 code or Accept-Language string, e.g., "en", "de", "fr,en"). Defaults to local OSM language. |
| layer | string | — | Filter by data layer. Comma-separated values: address, poi, railway, natural, manmade. Default: no restriction. |
| limit | integer | — | Maximum results to return. Nominatim may return fewer when additional results do not sufficiently match. Max 40. |
| postalcode | string | — | Postal or ZIP code (structured query). |
| query | string | — | Free-form search string (e.g., "Space Needle Seattle" or "1600 Pennsylvania Ave NW, Washington DC"). Cannot be combined with structured address fields. Keep the query to a POI name plus its city or r… |
| state | string | — | State or province (structured query). |
| street | string | — | House number and street name (structured query). Use with city/state/country fields. Cannot be combined with query. |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | yes | Required data attribution: Data © OpenStreetMap contributors, ODbL 1.0. |
| cap | number | — | The limit applied to this request. |
| effectiveQuery | string | yes | The effective query sent to Nominatim — the free-form query string, or a reconstructed string from the provided structured address fields. |
| nextExcludeIds | array | — | Accumulated exclude tokens (prior excludes plus this page) to pass as exclude_place_ids on the next call, retrieving the next-best matches. Each token is a stable OSM ref (N/W/R + osm_id) when the re… |
| notice | string | — | Guidance for this page, covering two cases: results were capped at limit (truncated is true — keep paging with nextExcludeIds), or an exclude_place_ids paging walk is exhausted and the page came back… |
| results | array | yes | Geocoding results, ordered by Nominatim relevance (importance score descending). |
| shown | number | — | Number of results returned. |
| total | number | yes | Number of results returned. |
| truncated | boolean | — | True if the result count equals the requested limit (Nominatim may have more). |
No examples provided.