Skip to main content
Glama

openstreetmap-mcp-server

Server Details

Geocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cyanheads/openstreetmap-mcp-server
GitHub Stars
5
Server Listing
@cyanheads/openstreetmap-mcp-server

Available Tools

6 tools
openstreetmap_lookup_objectsLook up address details for OSM objects by IDA
Read-onlyIdempotent
Inspect

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. The results are exactly the objects named in osm_ids: extratags decorates them and cannot select them, and there is no way to ask this tool for objects carrying a given tag. Discover such objects with openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw, then pass their IDs here.

ParametersJSON Schema
NameRequiredDescriptionDefault
osm_idsYesOSM 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.
languageNoPreferred language for names (BCP 47 code).
extratagsNoInclude the extra OSM tags each looked-up object carries — contact and metadata tags (phone, website, opening_hours, wikidata) and physical attribute tags alike (surface, tracktype, sac_scale, ele, access). Reports whatever the object happens to carry, so an absent tag describes that object rather than OpenStreetMap.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoNumber of results returned.
resultsNoAddress details for the requested OSM IDs that were found.
not_foundNoOSM IDs from the request that returned no result.
attributionNoRequired data attribution: Data © OpenStreetMap contributors, ODbL 1.0.
tagSelectionCaveatNoStanding caveat: tag-based selection lives on the Overpass tools (openstreetmap_query_nearby, openstreetmap_query_bbox, openstreetmap_query_raw), never here. extratags decorates the returned objects rather than selecting them, so a missing tag is not evidence the tag is missing from OpenStreetMap. Present when extratags was requested.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/idempotent annotations, the description clarifies that 'extratags decorates them and cannot select them,' so the agent understands that extratags cannot be used as a filter. It further explains open-world semantics: 'an absent tag describes that object rather than OpenStreetMap.' This is meaningful behavioral context beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then ID format, then limit, then usage guidance, then limitations. Every sentence contributes either a constraint, an example, or a routing decision. It is information-dense but compact for the scope it covers.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a lookup tool with an output schema and read-only annotations, the description covers everything needed to invoke it correctly: ID format, array requirement, limit, alternatives, and the extratags limitation. There is no missing guidance that would prevent a correct call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds key semantic nuance: extratags 'decorates them and cannot select them,' and results are 'exactly the objects named in osm_ids.' The ID prefix examples and the 50-ID limit reinforce schema info without duplicating it wholesale. This pushes it above baseline, though not maximally because much parameter detail is already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch address details for one or more known OSM objects by their IDs via Nominatim.' It names exact ID formats (N/W/R prefixes) and examples, and it clearly distinguishes itself from the geocoding/search siblings by stating this tool works only from known OSM IDs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this tool 'when an OSM ID is already known from a prior openstreetmap_query_nearby or openstreetmap_query_bbox result' and positions it as more efficient than a geocoding round trip. It also names the alternatives for discovering objects by tags and explicitly states what this tool cannot do: 'there is no way to ask this tool for objects carrying a given tag.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

openstreetmap_query_bboxFind OSM features within a bounding boxA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
eastYesEastern boundary longitude (maximum longitude). A value below west describes an antimeridian crossing rather than an inverted box.
westYesWestern 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.
limitNoMaximum results to return. Applied after the Overpass query — if the area has more features, they are truncated.
northYesNorthern boundary latitude (maximum latitude).
southYesSouthern boundary latitude (minimum latitude).
offsetNoNumber 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 is deterministic and costs no extra upstream request. Pass the nextOffset value from a prior truncated response.
amenityNoOSM amenity tag value shortcut (e.g., "cafe", "bench", "hospital"). Cannot be combined with tag_key/tag_value.
tag_keyNoOSM tag key for non-amenity queries (e.g., "leisure", "shop", "natural"). Use with tag_value. Cannot be combined with amenity.
tag_valueNoOSM tag value paired with tag_key (e.g., "park", "supermarket", "peak").
element_typesNoOSM element types to search, at least one. Ways cover most buildings and areas; nodes cover most standalone POIs. Add "relation" for complex structures. Omit the field to search nodes and ways; an empty array is rejected because it can only match nothing.
timeout_secondsNoOverpass query timeout in seconds. Increase for large bounding boxes or dense areas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance 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). Absent when results were returned.
elementsNoMatching OSM features within the bounding box, up to the limit.
truncatedNoTrue if results were cut at the limit. Reduce bbox area, add more specific tags, or page with offset to retrieve the rest.
nextOffsetNoOffset to pass on the next call to retrieve the following page of features. Present only when more features remain beyond this page.
totalFoundNoTotal features returned by Overpass before limit truncation.
attributionNoRequired data attribution: Data © OpenStreetMap contributors, ODbL 1.0.
effectiveTagNoThe OSM tag filter applied (key=value, e.g. "amenity=cafe" or "leisure=park").
data_timestampNoOSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata.
servingEndpointNoOverpass 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 cached response rather than the one this call would have tried. Pair it with data_timestamp when a result looks unexpectedly slow, sparse, or stale.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds significant behavioral context: antimeridian crossing interpretation for west/east, truncation after limit, offset caching with ~10 minute deterministic paging, default element_types and empty array rejection, and timeout adjustment guidance. It also clarifies that full tag sets are returned and extratags doesn't apply. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds value. It begins with the core purpose, then usage context, parameter guidance, behavioral notes, and a sibling alternative. There is no filler or repetition of schema content that isn't already needed for clarity. It is well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 parameters, a bounding box with antimeridian semantics, and an anyOf constraint, the description covers all critical operational details: antimeridian handling, truncation, paging, element types, timeout, and the extratags distinction from siblings. The output schema exists, so return format doesn't need description. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds genuine value beyond the schema: it explains the anyOf constraint in plain language, clarifies the antimeridian behavior for west/east (schema also mentions it, but description repeats and reinforces), explains offset caching and deterministic re-paging, and details element_types defaults and empty array rejection. These go beyond what schema descriptions provide, so a 4 is warranted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Find OSM features within a rectangular geographic area via the Overpass API'), explicitly distinguishes from siblings by naming openstreetmap_query_nearby for proximity searches. The description also clarifies that other tools use extratags, further differentiating it. An agent can immediately understand what this tool does and how it differs from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use the tool ('area surveys where you want everything in a region, not proximity searches') and provides a direct alternative: 'For proximity searches centered on a point, use openstreetmap_query_nearby instead.' It also explains the required parameter combination (exactly one of amenity or tag_key/tag_value) and clarifies which other tools use extratags, leaving no ambiguity about selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

openstreetmap_query_nearbyFind OSM features near a pointA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesCenter latitude in WGS84 decimal degrees.
lonYesCenter longitude in WGS84 decimal degrees.
limitNoMaximum results to return. Applied after the Overpass query — if the area has more features, they are truncated.
offsetNoNumber 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; the full set is cached ~10 minutes so re-paging costs no extra upstream request. Pass the nextOffset value from a prior truncated response.
amenityNoOSM amenity tag value (e.g., "hospital", "pharmacy", "restaurant", "school", "atm"). Shortcut for tag_key="amenity". Cannot be combined with tag_key/tag_value.
tag_keyNoOSM tag key for non-amenity queries (e.g., "leisure", "shop", "highway", "natural"). Use with tag_value. Cannot be combined with amenity.
tag_valueNoOSM tag value paired with tag_key (e.g., "park", "supermarket", "primary", "peak").
element_typesNoOSM element types to search, at least one. Ways cover most buildings and areas; nodes cover most standalone POIs. Add "relation" for complex structures like large campuses. Omit the field to search nodes and ways; an empty array is rejected because it can only match nothing.
radius_metersNoSearch radius in meters. Max 50,000m (50km). Keep under 5,000m for dense urban POI queries to avoid slow responses.
timeout_secondsNoOverpass query timeout in seconds. Increase for large radius or dense areas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance 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 offset). Absent when results were returned.
elementsNoMatching OSM features, up to the limit.
truncatedNoTrue if results were cut at the limit. Reduce radius, add more specific tags, or page with offset to retrieve the rest.
nextOffsetNoOffset to pass on the next call to retrieve the following page of features. Present only when more features remain beyond this page.
totalFoundNoTotal features returned by Overpass before limit truncation.
attributionNoRequired data attribution: Data © OpenStreetMap contributors, ODbL 1.0.
effectiveTagNoThe OSM tag filter applied (key=value, e.g. "amenity=cafe" or "leisure=park").
data_timestampNoOSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata.
servingEndpointNoOverpass 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 cached response rather than the one this call would have tried. Pair it with data_timestamp when a result looks unexpectedly slow, sparse, or stale.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent/openWorld annotations, it discloses meaningful runtime behavior: results are 'sorted nearest-first by distance_meters', every result carries its 'full OSM tag set', limit is applied after the Overpass query with truncation, offset paging relies on a ~10 minute cache, and radius above ~5km may cause slow responses. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, payload selection, element types, output ordering, paging/caching, radius guidance, and sibling-tool scoping. It front-loads the most important decision and then adds operational detail without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 10 parameters and an existing output schema, the description plus schema fully cover selection and invocation: query modes, exclusivity constraints, defaults, radius limits, timeouts, element types, result ordering, and pagination behavior. The readOnly and idempotent annotations already cover safety, and the output schema covers return shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, yet the description still adds real semantic value: amenity is called a shortcut for tag_key="amenity", empty element_types arrays 'can only match nothing', limit truncates after query rather than during, and offset features are distance-sorted before paging with a nextOffset handshake. This is exactly the kind of context that helps correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Find OSM features within a radius around a geographic point via the Overpass API' and calls itself 'the primary tool for "what's near X?" spatial queries.' It does not explicitly contrast itself with openstreetmap_query_bbox or openstreetmap_query_raw, so sibling differentiation is only implicit rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear within-tool guidance: use 'amenity for common POI types' or 'tag_key + tag_value for other OSM categories' and requires 'exactly one' of these modes. It also clarifies that extratags is not applicable here and belongs to the Nominatim-backed siblings. However, it never explicitly tells the agent when to choose this tool over query_bbox or query_raw.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

openstreetmap_query_rawExecute a raw Overpass QL queryA
Read-onlyIdempotent
Inspect

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";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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum elements to return. Applied after the Overpass query — if the query matched more, they are truncated.
queryYesOverpass 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.2);out body;"
offsetNoNumber 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 is deterministic and costs no extra upstream request; a result over 100000 elements is served but not cached, so paging that far re-queries and depends on the endpoint returning the same order. Pass the nextOffset value from a prior truncated response.
timeout_secondsNoQuery 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, up to 180s, so a long-running query is not cut off early — but the endpoint enforces its own budget and may answer HTTP 504 first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance 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). Absent when results were returned.
elementsNoRaw 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[].
truncatedNoTrue if elements were cut at the limit. Narrow the query, or page with offset to retrieve the rest.
nextOffsetNoOffset to pass on the next call to retrieve the following page of elements. Present only when more elements remain beyond this page.
totalFoundNoTotal elements returned by Overpass before limit truncation.
attributionNoRequired data attribution: Data © OpenStreetMap contributors, ODbL 1.0.
data_timestampNoOSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata.
effectiveQueryNoThe Overpass QL string as sent to the API (after any timeout injection).
total_elementsNoNumber of elements returned on this page. See totalFound for the full match count.
servingEndpointNoOverpass 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 cached response rather than the one this call would have tried. Pair it with data_timestamp when a result looks unexpectedly slow, sparse, or stale.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

annotations already mark readOnly, openWorld, and idempotent, but the description adds substantial context beyond that: result paging via limit/offset, totalFound/truncated semantics, server-side caching and determinism, timeout precedence, and upstream endpoint budget behavior. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but every sentence earns its place: purpose, usage boundaries, query requirements, example, paging, validation tip, and alternative routing. It is front-loaded with the core purpose and compactly organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A complete definition for a raw-query tool. It covers how to construct the query, required and optional parameters, result-set semantics, caching behavior, timeout interactions, and validation workflow. The output schema can carry the return-value details, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning that the schema does not: paging semantics, the nextOffset handshake, cache lifetime, and the [timeout:N] directive precedence. The inline example also clarifies the expected query format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Execute' with the resource 'raw Overpass QL query' and immediately distinguishes it from convenience tools. It names what the tool is for and, importantly, what it is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool (multi-type queries, unions, relation membership, historical queries) and names the sibling tools to use instead for simple near/bbox queries. Exclusions and alternatives are both stated clearly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

openstreetmap_reverse_geocodeReverse geocode coordinates to an addressA
Read-onlyIdempotent
Inspect

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). The match is made on proximity and layer, never on an OSM attribute tag: extratags decorates the matched object and cannot select one. To find the objects in an area that carry a given tag, use openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude in WGS84 decimal degrees.
lonYesLongitude in WGS84 decimal degrees.
zoomNoAddress detail level, roughly corresponding to map zoom. 18=building, 16=street, 14=neighbourhood, 12=town, 10=city, 8=county, 5=state, 3=country.
layerNoRestrict which OSM layer is matched. Comma-separated: address, poi, railway, natural, manmade. Default: address,poi.
languageNoPreferred language for the result (BCP 47 code or Accept-Language string).
extratagsNoInclude the extra OSM tags the matched object carries — contact and metadata tags (phone, website, opening_hours, wikidata) and physical attribute tags alike (surface, tracktype, sac_scale, ele, access). Opportunistic, not selective: it reports whatever the matched object happens to carry, so an absent tag describes that object rather than OpenStreetMap, and no value here can steer which object is matched.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
resultNoThe closest matching OSM object at the given coordinates.
attributionNoRequired data attribution.
tagSelectionCaveatNoStanding caveat: tag-based selection lives on the Overpass tools (openstreetmap_query_nearby, openstreetmap_query_bbox, openstreetmap_query_raw), never here. extratags decorates the returned objects rather than selecting them, so a missing tag is not evidence the tag is missing from OpenStreetMap. Present when extratags was requested.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, and idempotent, but the description adds essential behavioral caveats beyond them: nearest indexed OSM object may differ from the exact coordinate in dense areas, extratags is opportunistic and cannot select the matched object, and matching is by proximity/layer only. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded: the core purpose is in the first sentence, caveats follow logically, and the sibling routing is kept at the end. Slightly long, but every sentence earns its place given Nominatim's subtle behavior and the 6-parameter surface.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a reverse-geocoding tool with an output schema. It covers coordinate conversion behavior, zoom semantics, layer matching, extratags limitations, and alternative tools. Nothing an agent needs to call it correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful context beyond the schema: zoom=18 for building-level accuracy, lower zoom for coarser resolution, and the important clarification that extratags decorates the matched object and cannot be used to influence which object is matched.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Convert'), resource ('latitude/longitude coordinates'), and outcome ('nearest address or place name via Nominatim/OpenStreetMap'). Distinctly differentiates from tag-query siblings by naming them explicitly and clarifying that this tool matches on proximity/layer, not on OSM attribute tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-use guidance: use this for reverse geocoding coordinates, and for finding objects carrying a given tag it directs the agent to openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw. Also explains zoom-level tradeoffs for choosing resolution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

openstreetmap_search_placesGeocode a place name or addressA
Read-onlyIdempotent
Inspect

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. Results are matched on name and address relevance, never on an OSM attribute tag: extratags decorates whichever object matched and cannot select one, so a named feature may resolve to a different OSM object than the one carrying the tags you want. To filter or enumerate by tag (surface, sac_scale, ele, access, amenity), use openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name (structured query).
layerNoFilter by data layer. Comma-separated values: address, poi, railway, natural, manmade. Default: no restriction.
limitNoMaximum results to return. Nominatim may return fewer when additional results do not sufficiently match. Max 40.
queryNoFree-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 region. Do not insert a parent institution, campus, or building name between the name and the locality: Nominatim reads commas as an address hierarchy and returns nothing when an intermediate token is not a matching containment level. For example, use "Beinecke Library, New Haven", not "Beinecke Library, Yale University, New Haven".
stateNoState or province (structured query).
countyNoCounty or district (structured query).
streetNoHouse number and street name (structured query). Use with city/state/country fields. Cannot be combined with query.
countryNoCountry name or ISO 3166-1 alpha-2 code (structured query).
languageNoPreferred language for result names (BCP 47 code or Accept-Language string, e.g., "en", "de", "fr,en"). Defaults to local OSM language.
extratagsNoInclude the extra OSM tags the matched object carries — contact and metadata tags (phone, website, opening_hours, wikidata) and physical attribute tags alike (surface, tracktype, sac_scale, ele, access). Opportunistic, not selective: it reports whatever the matched object happens to carry, so an absent tag describes that object rather than OpenStreetMap, and no value here can steer which object is matched. Increases response size.
postalcodeNoPostal or ZIP code (structured query).
featureTypeNoRestrict results to a geographic feature type. Automatically implies the address layer.
countrycodesNoRestrict 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.
exclude_place_idsNoOSM 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-best matches — it emits stable OSM refs when available, which page more reliably than volatile place_ids. When the walk runs out, the call succeeds with zero results and an exhaustion notice rather than failing — treat that as the loop-termination signal. Best-effort progressive retrieval, not a stable cursor — Nominatim ranking can reorder slightly between calls, so already-seen results may shift.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied to this request.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of results returned.
totalNoNumber of results returned.
noticeNoGuidance 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 empty (the query matched, the walk simply ended, so no rewrite is needed). Tell them apart by truncated and the result count, not by this field being present. Absent when a page returns below the limit without being capped. Carries paging guidance only — the tag-selection caveat has its own field so neither message can overwrite the other.
resultsNoGeocoding results, ordered by Nominatim relevance (importance score descending).
truncatedNoTrue if the result count equals the requested limit (Nominatim may have more).
attributionNoRequired data attribution: Data © OpenStreetMap contributors, ODbL 1.0.
effectiveQueryNoThe effective query sent to Nominatim — the free-form query string, or a reconstructed string from the provided structured address fields.
nextExcludeIdsNoAccumulated 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 result carries one, falling back to the Nominatim place_id otherwise. Present only when results were truncated. Nominatim reports no total, so a truncated page is not proof that more matches exist — the following page may come back exhausted (zero results plus a notice). Best-effort: Nominatim ranking is not perfectly stable across calls.
tagSelectionCaveatNoStanding caveat: tag-based selection lives on the Overpass tools (openstreetmap_query_nearby, openstreetmap_query_bbox, openstreetmap_query_raw), never here. extratags decorates the returned objects rather than selecting them, so a missing tag is not evidence the tag is missing from OpenStreetMap. Present on every successful response.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, and idempotent hints, but the description goes far beyond them: it discloses Nominatim relevance ordering, the 'never matched on an OSM attribute tag' rule, the opportunistic nature of extratags, and the exclude_place_ids paging/exhaustion behavior. These are non-obvious traits an agent must know to use the tool correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is substantial but each sentence earns its place: it front-loads the core purpose, states mode exclusivity, gives a relevance ordering note, supplies alternative tool routing, and then layer-specific caveats. No tautology, no filler, and the density is warranted by the tool's 14-parameter complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover safety/idempotency, the description covers every remaining operational concern: input mode choice, country filtering, exact-match vs exhaustive search trade-offs, extratags limitations, and pagination edge cases. It is fully sufficient for an agent to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description meaningfully enriches key parameters: it warns against inserting intermediate hierarchy tokens in the query, explains that extratags is decorative not selective, and details the paging semantics of exclude_place_ids. It converts raw schema fields into operational knowledge.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a crisp verb-resource statement: 'Convert a place name or address to geographic coordinates and structured place data via Nominatim/OpenStreetMap.' It further clarifies two mutually exclusive input modes and scope, distinguishing it from the sibling query tools by naming them explicitly. An agent can tell exactly what this tool does and does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance for geocoding named places vs when to use openstreetmap_query_nearby or openstreetmap_query_bbox for exhaustive area POI retrieval. It even routes tag-based filtering to openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw. Exclusions are concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updates
    • Changedopenstreetmap_lookup_objects3 fields changed
      • addedOutput schema / properties / results / items / properties / boundingbox / items
        Added value: +false
      • addedOutput schema / properties / results / items / properties / boundingbox / maxItems
        Added value: +4
      • addedOutput schema / properties / results / items / properties / boundingbox / minItems
        Added value: +4
    • Changedopenstreetmap_query_bbox1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_bbox`: The bounding box is inverted on the latitude axis — south is greater than north. `invalid_tag`: Both amenity and tag_key/tag_value are provided, neither is provided, or a tag key/value contains Overpass QL metacharacters. `query_timeout`: The Overpass query exceeded the timeout. `result_too_large`: Overpass ran out of memory — the result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than timeout_seconds. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. The thrown code tracks the status: 500 and 501 surface as InternalError, every other 5xx as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_bbox`: The bounding box is inverted on the latitude axis — south is greater than north. `invalid_tag`: Both amenity and tag_key/tag_value are provided, neither is provided, or a tag key/value contains Overpass QL metacharacters. `query_timeout`: The Overpass query exceeded the timeout. `result_too_large`: Overpass ran out of memory — the result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than timeout_seconds. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. Every one of them surfaces as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler."
    • Changedopenstreetmap_query_nearby1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_tag`: Both amenity and tag_key/tag_value are provided, neither is provided, or a tag key/value contains Overpass QL metacharacters. `query_timeout`: The Overpass query exceeded the timeout. `result_too_large`: Overpass ran out of memory — the result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than timeout_seconds. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. The thrown code tracks the status: 500 and 501 surface as InternalError, every other 5xx as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_tag`: Both amenity and tag_key/tag_value are provided, neither is provided, or a tag key/value contains Overpass QL metacharacters. `query_timeout`: The Overpass query exceeded the timeout. `result_too_large`: Overpass ran out of memory — the result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than timeout_seconds. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. Every one of them surfaces as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler."
    • Changedopenstreetmap_query_raw1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `query_error`: Overpass returned a 400 error — malformed query syntax. `query_timeout`: The query exceeded its timeout (Overpass runtime error in response body). `result_too_large`: Overpass runtime error: query ran out of memory — result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than the [timeout:N] directive. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. The thrown code tracks the status: 500 and 501 surface as InternalError, every other 5xx as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `query_error`: Overpass returned a 400 error — malformed query syntax. `query_timeout`: The query exceeded its timeout (Overpass runtime error in response body). `result_too_large`: Overpass runtime error: query ran out of memory — result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than the [timeout:N] directive. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. Every one of them surfaces as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler."
    • Changedopenstreetmap_reverse_geocode3 fields changed
      • addedOutput schema / properties / result / properties / boundingbox / items
        Added value: +false
      • addedOutput schema / properties / result / properties / boundingbox / maxItems
        Added value: +4
      • addedOutput schema / properties / result / properties / boundingbox / minItems
        Added value: +4
    • Changedopenstreetmap_search_places3 fields changed
      • addedOutput schema / properties / results / items / properties / boundingbox / items
        Added value: +false
      • addedOutput schema / properties / results / items / properties / boundingbox / maxItems
        Added value: +4
      • addedOutput schema / properties / results / items / properties / boundingbox / minItems
        Added value: +4
  2. 6 tool updates
    • Changedopenstreetmap_lookup_objects8 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "not_found",
        +      "total",
        +      "attribution"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_id_format`: An array element is not a single N/W/R-prefixed OSM ID. `rate_limited`: Nominatim returned HTTP 429, or answered HTTP 200 with a throttle document instead of JSON — the one request per second usage policy was exceeded. `upstream_error`: Nominatim returned an unexpected non-2xx status other than 429, or answered HTTP 200 with a body that is not JSON and carries no throttle signature. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_id_format",
        +            "rate_limited",
        +            "upstream_error"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / properties / results / items / properties / boundingbox / items
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / boundingbox / prefixItems
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "not_found",
        -  "total",
        -  "attribution"
        -]
    • Changedopenstreetmap_query_bbox6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "elements",
        +      "attribution",
        +      "effectiveTag",
        +      "totalFound",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_bbox`: The bounding box is inverted on the latitude axis — south is greater than north. `invalid_tag`: Both amenity and tag_key/tag_value are provided, neither is provided, or a tag key/value contains Overpass QL metacharacters. `query_timeout`: The Overpass query exceeded the timeout. `result_too_large`: Overpass ran out of memory — the result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than timeout_seconds. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. The thrown code tracks the status: 500 and 501 surface as InternalError, every other 5xx as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_bbox",
        +            "invalid_tag",
        +            "query_timeout",
        +            "result_too_large",
        +            "rate_limited",
        +            "upstream_error",
        +            "overpass_gateway_timeout",
        +            "overpass_unavailable",
        +            "endpoints_exhausted"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "elements",
        -  "attribution",
        -  "effectiveTag",
        -  "totalFound",
        -  "truncated"
        -]
    • Changedopenstreetmap_query_nearby6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "elements",
        +      "attribution",
        +      "effectiveTag",
        +      "totalFound",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_tag`: Both amenity and tag_key/tag_value are provided, neither is provided, or a tag key/value contains Overpass QL metacharacters. `query_timeout`: The Overpass query exceeded the timeout. `result_too_large`: Overpass ran out of memory — the result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than timeout_seconds. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. The thrown code tracks the status: 500 and 501 surface as InternalError, every other 5xx as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_tag",
        +            "query_timeout",
        +            "result_too_large",
        +            "rate_limited",
        +            "upstream_error",
        +            "overpass_gateway_timeout",
        +            "overpass_unavailable",
        +            "endpoints_exhausted"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "elements",
        -  "attribution",
        -  "effectiveTag",
        -  "totalFound",
        -  "truncated"
        -]
    • Changedopenstreetmap_query_raw6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "elements",
        +      "total_elements",
        +      "attribution",
        +      "effectiveQuery",
        +      "totalFound",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `query_error`: Overpass returned a 400 error — malformed query syntax. `query_timeout`: The query exceeded its timeout (Overpass runtime error in response body). `result_too_large`: Overpass runtime error: query ran out of memory — result set exceeds the server memory limit. `rate_limited`: Overpass refused the query as throttled — HTTP 429, or a throttle document instead of JSON — on every configured endpoint. With a list in OSM_OVERPASS_ENDPOINTS the call advances to the next entry first, so this surfaces only once all of them have refused it. `upstream_error`: Overpass reported a runtime error that is neither a timeout nor memory exhaustion — the message carries the remark verbatim. `overpass_gateway_timeout`: Overpass answered HTTP 504 — it accepted the query but its dispatcher gave up before producing a result, so the query exceeded the time budget the endpoint enforces rather than the [timeout:N] directive. `overpass_unavailable`: Overpass answered with an HTTP 5xx other than 504 (500, 501, 502, 503) — the endpoint is down, restarting, or shedding load. The thrown code tracks the status: 500 and 501 surface as InternalError, every other 5xx as ServiceUnavailable. `endpoints_exhausted`: Every Overpass endpoint tried was still unanswered when the call ran out of its total time budget — each accepted the query and held the connection instead of failing outright. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "query_error",
        +            "query_timeout",
        +            "result_too_large",
        +            "rate_limited",
        +            "upstream_error",
        +            "overpass_gateway_timeout",
        +            "overpass_unavailable",
        +            "endpoints_exhausted"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "elements",
        -  "total_elements",
        -  "attribution",
        -  "effectiveQuery",
        -  "totalFound",
        -  "truncated"
        -]
    • Changedopenstreetmap_reverse_geocode8 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "result",
        +      "attribution"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_coverage`: Nominatim returns an error indicating no OSM data at the given coordinates (e.g., open ocean or unmapped territory). `rate_limited`: Nominatim returned HTTP 429, or answered HTTP 200 with a throttle document instead of JSON — the one request per second usage policy was exceeded. `upstream_error`: Nominatim returned an unexpected non-2xx status other than 429, or answered HTTP 200 with a body that is not JSON and carries no throttle signature. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_coverage",
        +            "rate_limited",
        +            "upstream_error"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / properties / result / properties / boundingbox / items
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / result / properties / boundingbox / prefixItems
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / required
        Removed value: -[
        -  "result",
        -  "attribution"
        -]
    • Changedopenstreetmap_search_places8 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "total",
        +      "attribution",
        +      "effectiveQuery"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_results`: No places matched the query on a first page — no exclude_place_ids were supplied. An exhausted paging walk returns success with zero results instead. `conflicting_query_mode`: The free-form query and at least one structured address field are both provided — the two modes are mutually exclusive. `missing_query_mode`: Neither the free-form query nor any structured address field is provided. `rate_limited`: Nominatim returned HTTP 429, or answered HTTP 200 with a throttle document instead of JSON — the one request per second usage policy was exceeded. `upstream_error`: Nominatim returned an unexpected non-2xx status other than 429, or answered HTTP 200 with a body that is not JSON and carries no throttle signature. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_results",
        +            "conflicting_query_mode",
        +            "missing_query_mode",
        +            "rate_limited",
        +            "upstream_error"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / properties / results / items / properties / boundingbox / items
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / boundingbox / prefixItems
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "total",
        -  "attribution",
        -  "effectiveQuery"
        -]
  3. 3 tool updates
    • Changedopenstreetmap_lookup_objects3 fields changed
      • changedInput schema / properties / extratags / description
        Previous value: -"Include extra OSM tags (phone, website, wikidata, etc.)."New value: +"Include the extra OSM tags each looked-up object carries — contact and metadata tags (phone, website, opening_hours, wikidata) and physical attribute tags alike (surface, tracktype, sac_scale, ele, access). Reports whatever the object happens to carry, so an absent tag describes that object rather than OpenStreetMap."
      • changedOutput schema / properties / results / items / properties / extratags / description
        Previous value: -"Additional OSM tags. Present only when extratags was requested."New value: +"Extra OSM tags this object carries — contact and metadata (phone, website, opening_hours, wikidata) and physical attributes (surface, tracktype, sac_scale, ele, access). Present only when extratags was requested; an absent tag describes this object, not OpenStreetMap."
      • addedOutput schema / properties / tagSelectionCaveat
        Added value: +{
        +  "description": "Standing caveat: tag-based selection lives on the Overpass tools (openstreetmap_query_nearby, openstreetmap_query_bbox, openstreetmap_query_raw), never here. extratags decorates the returned objects rather than selecting them, so a missing tag is not evidence the tag is missing from OpenStreetMap. Present when extratags was requested.",
        +  "type": "string"
        +}
    • Changedopenstreetmap_reverse_geocode3 fields changed
      • changedInput schema / properties / extratags / description
        Previous value: -"Include extra OSM tags when available (phone, website, opening_hours, wikidata, etc.)."New value: +"Include the extra OSM tags the matched object carries — contact and metadata tags (phone, website, opening_hours, wikidata) and physical attribute tags alike (surface, tracktype, sac_scale, ele, access). Opportunistic, not selective: it reports whatever the matched object happens to carry, so an absent tag describes that object rather than OpenStreetMap, and no value here can steer which object is matched."
      • changedOutput schema / properties / result / properties / extratags / description
        Previous value: -"Additional OSM tags (phone, website, opening_hours, wikidata). Present only when extratags was requested."New value: +"Extra OSM tags this object carries — contact and metadata (phone, website, opening_hours, wikidata) and physical attributes (surface, tracktype, sac_scale, ele, access). Present only when extratags was requested; an absent tag describes this object, not OpenStreetMap."
      • addedOutput schema / properties / tagSelectionCaveat
        Added value: +{
        +  "description": "Standing caveat: tag-based selection lives on the Overpass tools (openstreetmap_query_nearby, openstreetmap_query_bbox, openstreetmap_query_raw), never here. extratags decorates the returned objects rather than selecting them, so a missing tag is not evidence the tag is missing from OpenStreetMap. Present when extratags was requested.",
        +  "type": "string"
        +}
    • Changedopenstreetmap_search_places5 fields changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "query"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "required": [
        +      "street"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "required": [
        +      "city"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "required": [
        +      "county"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "required": [
        +      "state"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "required": [
        +      "country"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "required": [
        +      "postalcode"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / extratags / description
        Previous value: -"Include extra OSM tags when available (e.g., phone, website, opening_hours, wikidata). Increases response size."New value: +"Include the extra OSM tags the matched object carries — contact and metadata tags (phone, website, opening_hours, wikidata) and physical attribute tags alike (surface, tracktype, sac_scale, ele, access). Opportunistic, not selective: it reports whatever the matched object happens to carry, so an absent tag describes that object rather than OpenStreetMap, and no value here can steer which object is matched. Increases response size."
      • changedOutput schema / properties / notice / description
        Previous value: -"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 empty (the query matched, the walk simply ended, so no rewrite is needed). Tell them apart by truncated and the result count, not by this field being present. Absent when a page returns below the limit without being capped."New value: +"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 empty (the query matched, the walk simply ended, so no rewrite is needed). Tell them apart by truncated and the result count, not by this field being present. Absent when a page returns below the limit without being capped. Carries paging guidance only — the tag-selection caveat has its own field so neither message can overwrite the other."
      • changedOutput schema / properties / results / items / properties / extratags / description
        Previous value: -"Additional OSM tags (phone, website, opening_hours, wikidata). Present only when extratags was requested."New value: +"Extra OSM tags this object carries — contact and metadata (phone, website, opening_hours, wikidata) and physical attributes (surface, tracktype, sac_scale, ele, access). Present only when extratags was requested; an absent tag describes this object, not OpenStreetMap."
      • addedOutput schema / properties / tagSelectionCaveat
        Added value: +{
        +  "description": "Standing caveat: tag-based selection lives on the Overpass tools (openstreetmap_query_nearby, openstreetmap_query_bbox, openstreetmap_query_raw), never here. extratags decorates the returned objects rather than selecting them, so a missing tag is not evidence the tag is missing from OpenStreetMap. Present on every successful response.",
        +  "type": "string"
        +}
  4. 2 tool updates
    • Changedopenstreetmap_query_bbox2 fields changed
      • changedInput schema / properties / element_types / description
        Previous value: -"OSM element types to search. Ways cover most buildings and areas; nodes cover most standalone POIs. Add \"relation\" for complex structures."New value: +"OSM element types to search, at least one. Ways cover most buildings and areas; nodes cover most standalone POIs. Add \"relation\" for complex structures. Omit the field to search nodes and ways; an empty array is rejected because it can only match nothing."
      • addedInput schema / properties / element_types / minItems
        Added value: +1
    • Changedopenstreetmap_query_nearby2 fields changed
      • changedInput schema / properties / element_types / description
        Previous value: -"OSM element types to search. Ways cover most buildings and areas; nodes cover most standalone POIs. Add \"relation\" for complex structures like large campuses."New value: +"OSM element types to search, at least one. Ways cover most buildings and areas; nodes cover most standalone POIs. Add \"relation\" for complex structures like large campuses. Omit the field to search nodes and ways; an empty array is rejected because it can only match nothing."
      • addedInput schema / properties / element_types / minItems
        Added value: +1
  5. 2 tool updates
    • Changedopenstreetmap_query_bbox1 field changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "amenity"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "required": [
        +      "tag_key",
        +      "tag_value"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedopenstreetmap_query_nearby1 field changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "amenity"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "required": [
        +      "tag_key",
        +      "tag_value"
        +    ],
        +    "type": "object"
        +  }
        +]
  6. 1 tool update
    • Changedopenstreetmap_query_raw10 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 20,
        +  "description": "Maximum elements to return. Applied after the Overpass query — if the query matched more, they are truncated.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "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 is deterministic and costs no extra upstream request; a result over 100000 elements is served but not cached, so paging that far re-queries and depends on the endpoint returning the same order. Pass the nextOffset value from a prior truncated response.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"Query timeout in seconds. The [timeout:N] directive in the query string takes precedence if present. Max 180s."New value: +"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, up to 180s, so a long-running query is not cut off early — but the endpoint enforces its own budget and may answer HTTP 504 first."
      • changedOutput schema / properties / elements / description
        Previous value: -"Raw Overpass API response elements. Structure varies by query type — nodes have lat/lon, ways have nodes[], relations have members[]."New value: +"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[]."
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to retrieve the following page of elements. Present only when more elements remain beyond this page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no elements were returned — e.g., check query syntax or broaden the filter. Absent when results were returned."New value: +"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). Absent when results were returned."
      • addedOutput schema / properties / totalFound
        Added value: +{
        +  "description": "Total elements returned by Overpass before limit truncation.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / total_elements / description
        Previous value: -"Number of elements returned."New value: +"Number of elements returned on this page. See totalFound for the full match count."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True if elements were cut at the limit. Narrow the query, or page with offset to retrieve the rest.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "elements",
        -  "total_elements",
        -  "attribution",
        -  "effectiveQuery"
        -]New value: +[
        +  "elements",
        +  "total_elements",
        +  "attribution",
        +  "effectiveQuery",
        +  "totalFound",
        +  "truncated"
        +]
  7. 3 tool updates
    • Changedopenstreetmap_query_bbox1 field changed
      • addedOutput schema / properties / servingEndpoint
        Added value: +{
        +  "description": "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 cached response rather than the one this call would have tried. Pair it with data_timestamp when a result looks unexpectedly slow, sparse, or stale.",
        +  "type": "string"
        +}
    • Changedopenstreetmap_query_nearby1 field changed
      • addedOutput schema / properties / servingEndpoint
        Added value: +{
        +  "description": "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 cached response rather than the one this call would have tried. Pair it with data_timestamp when a result looks unexpectedly slow, sparse, or stale.",
        +  "type": "string"
        +}
    • Changedopenstreetmap_query_raw1 field changed
      • addedOutput schema / properties / servingEndpoint
        Added value: +{
        +  "description": "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 cached response rather than the one this call would have tried. Pair it with data_timestamp when a result looks unexpectedly slow, sparse, or stale.",
        +  "type": "string"
        +}
  8. 4 tool updates
    • Changedopenstreetmap_query_bbox4 fields changed
      • changedInput schema / properties / east / description
        Previous value: -"Eastern boundary longitude (maximum longitude)."New value: +"Eastern boundary longitude (maximum longitude). A value below west describes an antimeridian crossing rather than an inverted box."
      • changedInput schema / properties / west / description
        Previous value: -"Western boundary longitude (minimum longitude)."New value: +"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."
      • changedOutput schema / properties / data_timestamp / description
        Previous value: -"OSM data freshness timestamp from the Overpass response."New value: +"OSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata."
      • changedOutput schema / required
        Previous value: -[
        -  "elements",
        -  "data_timestamp",
        -  "attribution",
        -  "effectiveTag",
        -  "totalFound",
        -  "truncated"
        -]New value: +[
        +  "elements",
        +  "attribution",
        +  "effectiveTag",
        +  "totalFound",
        +  "truncated"
        +]
    • Changedopenstreetmap_query_nearby2 fields changed
      • changedOutput schema / properties / data_timestamp / description
        Previous value: -"OSM data freshness timestamp from the Overpass response."New value: +"OSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata."
      • changedOutput schema / required
        Previous value: -[
        -  "elements",
        -  "data_timestamp",
        -  "attribution",
        -  "effectiveTag",
        -  "totalFound",
        -  "truncated"
        -]New value: +[
        +  "elements",
        +  "attribution",
        +  "effectiveTag",
        +  "totalFound",
        +  "truncated"
        +]
    • Changedopenstreetmap_query_raw1 field changed
      • changedOutput schema / properties / data_timestamp / description
        Previous value: -"OSM data freshness timestamp from the Overpass response. Absent if not included in the response."New value: +"OSM data freshness timestamp from the Overpass response. Absent when the endpoint reported no freshness metadata."
    • Changedopenstreetmap_search_places1 field changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when the page came back empty. Present when an exclude_place_ids paging walk is exhausted — the query matched, the walk simply ended, so no rewrite is needed. Absent when results were returned."New value: +"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 empty (the query matched, the walk simply ended, so no rewrite is needed). Tell them apart by truncated and the result count, not by this field being present. Absent when a page returns below the limit without being capped."
  9. 8 tool updates
    • Removedopenstreetmap_geocode
    • Removedopenstreetmap_lookup
    • Addedopenstreetmap_lookup_objects
    • Changedopenstreetmap_query_bbox1 field changed
      • changedOutput schema / properties / elements / items / properties / osm_id / description
        Previous value: -"OSM element ID. Use with osm_type for openstreetmap_lookup."New value: +"OSM element ID. Use with osm_type for openstreetmap_lookup_objects."
    • Changedopenstreetmap_query_nearby1 field changed
      • changedOutput schema / properties / elements / items / properties / osm_id / description
        Previous value: -"OSM element ID. Use with osm_type for openstreetmap_lookup."New value: +"OSM element ID. Use with osm_type for openstreetmap_lookup_objects."
    • Removedopenstreetmap_reverse
    • Addedopenstreetmap_reverse_geocode
    • Addedopenstreetmap_search_places
  10. 3 tool updates
    • Changedopenstreetmap_geocode3 fields changed
      • changedInput schema / properties / exclude_place_ids / description
        Previous value: -"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-best matches — it emits stable OSM refs when available, which page more reliably than volatile place_ids. Best-effort progressive retrieval, not a stable cursor — Nominatim ranking can reorder slightly between calls, so already-seen results may shift."New value: +"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-best matches — it emits stable OSM refs when available, which page more reliably than volatile place_ids. When the walk runs out, the call succeeds with zero results and an exhaustion notice rather than failing — treat that as the loop-termination signal. Best-effort progressive retrieval, not a stable cursor — Nominatim ranking can reorder slightly between calls, so already-seen results may shift."
      • changedOutput schema / properties / nextExcludeIds / description
        Previous value: -"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 result carries one, falling back to the Nominatim place_id otherwise. Present only when results were truncated. Best-effort: Nominatim ranking is not perfectly stable across calls."New value: +"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 result carries one, falling back to the Nominatim place_id otherwise. Present only when results were truncated. Nominatim reports no total, so a truncated page is not proof that more matches exist — the following page may come back exhausted (zero results plus a notice). Best-effort: Nominatim ranking is not perfectly stable across calls."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when the page came back empty. Present when an exclude_place_ids paging walk is exhausted — the query matched, the walk simply ended, so no rewrite is needed. Absent when results were returned.",
        +  "type": "string"
        +}
    • Changedopenstreetmap_query_bbox1 field changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no features were found — e.g., try a different bounding box or tag. Absent when results were returned."New value: +"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). Absent when results were returned."
    • Changedopenstreetmap_query_nearby1 field changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no features were found — e.g., try a larger radius or different tag. Absent when results were returned."New value: +"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 offset). Absent when results were returned."
  11. 1 tool update
    • Changedopenstreetmap_geocode2 fields changed
      • changedInput schema / properties / exclude_place_ids / description
        Previous value: -"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-best matches. Best-effort progressive retrieval, not a stable cursor — Nominatim ranking can reorder slightly between calls, so already-seen results may shift."New value: +"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-best matches — it emits stable OSM refs when available, which page more reliably than volatile place_ids. Best-effort progressive retrieval, not a stable cursor — Nominatim ranking can reorder slightly between calls, so already-seen results may shift."
      • changedOutput schema / properties / nextExcludeIds / description
        Previous value: -"Accumulated place_ids (prior excludes plus this page) to pass as exclude_place_ids on the next call, retrieving the next-best matches. Present only when results were truncated. Best-effort: Nominatim ranking is not perfectly stable across calls."New value: +"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 result carries one, falling back to the Nominatim place_id otherwise. Present only when results were truncated. Best-effort: Nominatim ranking is not perfectly stable across calls."
  12. 3 tool updates
    • Changedopenstreetmap_geocode2 fields changed
      • addedInput schema / properties / exclude_place_ids
        Added value: +{
        +  "description": "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-best matches. Best-effort progressive retrieval, not a stable cursor — Nominatim ranking can reorder slightly between calls, so already-seen results may shift.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / nextExcludeIds
        Added value: +{
        +  "description": "Accumulated place_ids (prior excludes plus this page) to pass as exclude_place_ids on the next call, retrieving the next-best matches. Present only when results were truncated. Best-effort: Nominatim ranking is not perfectly stable across calls.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedopenstreetmap_query_bbox3 fields changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "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 is deterministic and costs no extra upstream request. Pass the nextOffset value from a prior truncated response.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to retrieve the following page of features. Present only when more features remain beyond this page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True if results were cut at the limit. Reduce bbox area or add more specific tags to narrow the result set."New value: +"True if results were cut at the limit. Reduce bbox area, add more specific tags, or page with offset to retrieve the rest."
    • Changedopenstreetmap_query_nearby3 fields changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "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; the full set is cached ~10 minutes so re-paging costs no extra upstream request. Pass the nextOffset value from a prior truncated response.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to retrieve the following page of features. Present only when more features remain beyond this page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True if results were cut at the limit. Reduce radius or add more specific tags to narrow the result set."New value: +"True if results were cut at the limit. Reduce radius, add more specific tags, or page with offset to retrieve the rest."
  13. 1 tool update
    • Changedopenstreetmap_geocode1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"Free-form search string (e.g., \"Space Needle Seattle\" or \"1600 Pennsylvania Ave NW, Washington DC\"). Cannot be combined with structured address fields."New value: +"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 region. Do not insert a parent institution, campus, or building name between the name and the locality: Nominatim reads commas as an address hierarchy and returns nothing when an intermediate token is not a matching containment level. For example, use \"Beinecke Library, New Haven\", not \"Beinecke Library, Yale University, New Haven\"."

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides forward/reverse geocoding, bounding box extraction, nearby places discovery, batch geocoding, route waypoints, and administrative boundary lookup using OpenStreetMap data.
    10
    Apache 2.0
  • F
    license
    A
    quality
    C
    maintenance
    Enables querying OpenStreetMap data (buildings, roads, amenities, etc.) via Overpass API and converts them to GeoJSON format for GIS analysis and visualization.
    8
    6
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.9/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: forward geocoding, reverse geocoding, ID-based lookup, bbox queries, nearby radius queries, and raw Overpass queries. Even the two spatial query tools are explicitly differentiated by geometry type.

Naming Consistency5/5

All tools follow the openstreetmap_ verb-based snake_case pattern, with action words like lookup, query, search, and reverse. The three query variants are consistently named with clear qualifiers (bbox, nearby, raw).

Tool Count5/5

Six tools is a well-scoped set for an OpenStreetMap read-only server. Each tool covers a distinct core need without redundancy or padding.

Completeness5/5

The surface covers the major OSM read workflows: geocoding both directions, resolving known IDs, spatial filtering by area or proximity, and a raw escape hatch for advanced queries. No critical lifecycle or query operation is missing for the stated domain.