protogrid

Search / io.github.cyanheads/openstreetmap-mcp-server

openstreetmap-mcp-server

R0· no sign-in

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

v0.6.1 · active · repository · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality91strong
Trust94of 100
Uptime, 30 days100%
Latency p50180 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "openstreetmap-mcp-server": {
      "type": "http",
      "url": "https://openstreetmap.caseyjhand.com/mcp"
    }
  }
}
claude mcp add --transport http openstreetmap-mcp-server https://openstreetmap.caseyjhand.com/mcp
[mcp_servers.openstreetmap-mcp-server]
url = "https://openstreetmap.caseyjhand.com/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "openstreetmap-mcp-server": {
      "type": "remote",
      "url": "https://openstreetmap.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "openstreetmap-mcp-server": {
      "type": "http",
      "url": "https://openstreetmap.caseyjhand.com/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=openstreetmap-mcp-server&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vb3BlbnN0cmVldG1hcC5jYXNleWpoYW5kLmNvbS9tY3AifQ%3D%3D"
}
{
  "servers": {
    "openstreetmap-mcp-server": {
      "type": "http",
      "url": "https://openstreetmap.caseyjhand.com/mcp"
    }
  }
}
{
  "mcpServers": {
    "openstreetmap-mcp-server": {
      "httpUrl": "https://openstreetmap.caseyjhand.com/mcp"
    }
  }
}
extensions:
  "openstreetmap-mcp-server":
    enabled: true
    name: "openstreetmap-mcp-server"
    type: streamable_http
    uri: "https://openstreetmap.caseyjhand.com/mcp"
    timeout: 300

Quality 91 / 100strong

protocol100 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • pass
    protocol.list_ttltool list is cacheable (ttlMs 3600000)
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene86 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations6 of 6 tools declare readOnlyHint or destructiveHint
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: openstreetmap_query_raw (destructiveHint); openstreetmap_search_places (destructiveHint); openstreetmap_query_nearby (destructiveHint); …
  • pass
    tools.token_costabout 6,168 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes8 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependencies100 · weight 15
  • pass
    deps.known_vulnsno known advisory in 74 resolved packages
  • pass
    deps.mcp_sdk_version@modelcontextprotocol/core 2.3.1, no known advisory
  • pass
    deps.resolvable@cyanheads/[email protected], @cyanheads/[email protected] resolved: 74 packages

6 tools, about 6,168 tokens to load them all · tool set af29141edb7a · tools last changed 2026-10-14 · checked 2026-10-20 14:54 UTC

Tool changes

  • openstreetmap_query_rawchangedinput schema, output schema
  • openstreetmap_query_bboxchangedinput schema, output schema
  • openstreetmap_query_nearbychangedinput schema, output schema
  • openstreetmap_lookup_objectschangeddescription, input schema, output schema
    before

    Fetch the Nominatim address record for up to 50 known OSM objects by ID, each prefixed N (node), W (way), or R (relation), e.g. "N240109189". Use it for IDs already in hand from openstreetmap_query_nearby or openstreetmap_query_bbox; it returns only objects named in osm_ids, listing any that resolve to nothing under not_found, and cannot select by tag, so discover objects with those tools or openstreetmap_query_raw first.

    after · 71% of words in common

    Fetch the Nominatim address record for known OSM objects by ID, 50 per call with any more returned under deferred_ids, each prefixed N (node), W (way), or R (relation), e.g. "N240109189". Use it for IDs already in hand from openstreetmap_query_nearby or openstreetmap_query_bbox; it returns only objects named in osm_ids and lists those with no Nominatim record under not_found (Nominatim skips unnamed and non-place objects, so such an ID may still exist). It cannot select by tag, so discover objects with those tools or openstreetmap_query_raw first.

  • openstreetmap_search_placeschangedinput schema, output schema
  • openstreetmap_query_rawchangedoutput schema
  • openstreetmap_query_bboxchangedoutput schema
  • openstreetmap_query_nearbychangedoutput schema

Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 94 / 100

provenance80
liveness100
freshness100
hygiene100

+repository +namespace-matches-repo +reachable +uptime-100% +updated-6d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

@cyanheads/[email protected] npm36 dependencies, resolved · MCP SDK @modelcontextprotocol/core 2.3.1 · advisories checked 2026-10-19

No known advisory affects this dependency graph.

@cyanheads/[email protected] npm36 dependencies, resolved · MCP SDK @modelcontextprotocol/core 2.3.1 · advisories checked 2026-10-19

No known advisory affects this dependency graph.

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://openstreetmap.caseyjhand.com/mcp streamable-httpnoneyes100%180 ms2026-07-282026-10-20
packageregistryversionruntimesecrets
@cyanheads/openstreetmap-mcp-servernpm0.6.1npx
@cyanheads/openstreetmap-mcp-servernpm0.6.1npx

Tools (6)

openstreetmap_lookup_objectsread-onlyFetch the Nominatim address record for known OSM objects by ID, 50 per call with any more returned under deferred_ids, each prefixed N (node), W (way), or R (relation), e.g. "N240109189". Use it for IDs already in hand from openstreetmap_query_nearby or openstreetmap_query_bbox; it returns only objects named in osm_ids and lists those with no Nominatim record under not_found (Nominatim skips unnamed and non-place objects, so such an ID may still exist). It cannot select by tag, so discover objects with those tools or openstreetmap_query_raw first.
openstreetmap_query_bboxread-onlyFind OSM features inside an area via the Overpass API, for surveys of everything in a region (openstreetmap_query_nearby covers proximity to a point). Scope with the four corner fields south, west, north, east, or with within and a single OSM boundary ref such as a city relation or a park way, which searches the boundary polygon itself instead of an overcovering box; never both. Filter with amenity, or with tag_key plus an optional tag_value, ANDing up to five more filters; every feature returns with its full OSM tag set (no extratags flag here).
openstreetmap_query_nearbyread-onlyFind OSM features within a radius of a point via the Overpass API, the tool for "what is near X?" questions. Filter with amenity, or with tag_key plus an optional tag_value, ANDing up to five more filters; every feature returns with its full OSM tag set (no extratags flag here), sorted nearest-first by distance_meters, with nodes covering standalone POIs and ways covering buildings and areas.
openstreetmap_query_rawread-onlyRun an arbitrary Overpass QL query for anything the convenience tools cannot express: multi-type or union queries, relation membership, historical queries, regex tag matching. The query must include [out:json], e.g. "[out:json][timeout:15];node[\"natural\"=\"peak\"](47.5,-122.5,47.7,-122.2);out body;"; scope to an OSM boundary with rel(<id>);map_to_area->.a; or way(<id>);map_to_area->.a; then (area.a) on each statement (the 2400000000 way-area offset is gone since Overpass 0.7.57; openstreetmap_query_bbox takes the same scope as within, without QL). The response is one page: page with limit and offset, read totalFound and truncated for the whole match, and an element over max_element_bytes arrives with its members, nodes or geometry array withheld whole and withheldNotice saying how to fetch it back. For plain "near X" or "in this area" questions use openstreetmap_query_nearby or openstreetmap_query_bbox.
openstreetmap_reverse_geocoderead-onlyConvert a latitude/longitude pair to the nearest address or named place via Nominatim. The result is the closest indexed OSM object at the requested zoom (18 building, 10 city), which in dense areas can be a neighbouring feature rather than the one containing the coordinate; proximity and layer pick it, never an OSM attribute tag, so find features by tag with openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw.
openstreetmap_search_placesread-onlyGeocode a place name or address to coordinates and structured place data via Nominatim. Send either a free-form query or the structured address fields (street, city, county, state, country, postalcode), never both; results are the best-ranked matches, not every matching object, and matching never uses an OSM attribute tag, so filter or enumerate by tag with openstreetmap_query_nearby, openstreetmap_query_bbox, or openstreetmap_query_raw.

Schemas: list_tools.

Similar MCP servers

More from io.github.cyanheads

And 140 more from this publisher.

Official server.json
{
  "name": "io.github.cyanheads/openstreetmap-mcp-server",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://openstreetmap.caseyjhand.com/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "0.6.1",
  "packages": [
    {
      "version": "0.6.1",
      "transport": {
        "type": "stdio"
      },
      "identifier": "@cyanheads/openstreetmap-mcp-server",
      "runtimeHint": "npx",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "environmentVariables": [
        {
          "name": "OSM_NOMINATIM_BASE_URL",
          "format": "string",
          "default": "https://nominatim.openstreetmap.org",
          "description": "Nominatim API base URL. Override to use a private or mirror instance."
        },
        {
          "name": "OSM_USER_AGENT",
          "format": "string",
          "default": "openstreetmap-mcp-server/0.6.1",
          "description": "User-Agent sent to Nominatim and Overpass. Required by usage policy."
        },
        {
          "name": "OSM_OVERPASS_BASE_URL",
          "format": "string",
          "description": "Overpass API endpoint URL. When set, pins every query to this one endpoint and disables mirror failover; OSM_OVERPASS_MAX_CONCURRENCY sizes it and a |N suffix is rejected. Leave unset to use OSM_OVERPASS_ENDPOINTS."
        },
        {
          "name": "OSM_OVERPASS_ENDPOINTS",
          "format": "string",
          "default": "https://overpass-api.de/api/interpreter",
          "description": "Comma-separated ordered list of Overpass endpoints. A failure advances to the next entry within the same tool call; a single entry means no failover. An entry written url|N gets N slots of its own and adds capacity, for an instance whose operator allows parallel queries, never a public FOSSGIS server; an unsuffixed later entry is failover only. Write a | inside a URL as %7C. Verify a mirror's usage policy, data coverage, and freshness before adding it. Ignored when OSM_OVERPASS_BASE_URL is set."
        },
        {
          "name": "OSM_OVERPASS_MAX_CONCURRENCY",
          "format": "number",
          "default": "1",
          "description": "Concurrent Overpass queries per endpoint: OSM_OVERPASS_BASE_URL, and every OSM_OVERPASS_ENDPOINTS entry not sized with |N. With no |N entry it is also the most queries in flight across all endpoints. A query waits at most 30 seconds in total for a slot, then fails with pacer_shed and a retryAfter. The default of 1 follows the public FOSSGIS instances, which allow one query in flight per user; raise it only for an instance whose operator allows parallel queries, such as a private or paid one."
        },
        {
          "name": "MCP_LOG_LEVEL",
          "format": "string",
          "default": "info",
          "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
        }
      ]
    },
    {
      "version": "0.6.1",
      "transport": {
        "url": "http://localhost:3010/mcp",
        "type": "streamable-http"
      },
      "identifier": "@cyanheads/openstreetmap-mcp-server",
      "runtimeHint": "npx",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "environmentVariables": [
        {
          "name": "MCP_TRANSPORT_TYPE",
          "value": "http",
          "format": "string",
          "description": "Selects the HTTP transport."
        },
        {
          "name": "MCP_HTTP_HOST",
          "format": "string",
          "default": "127.0.0.1",
          "description": "The hostname for the HTTP server."
        },
        {
          "name": "MCP_HTTP_PORT",
          "format": "string",
          "default": "3010",
          "description": "The port to run the HTTP server on."
        },
        {
          "name": "MCP_HTTP_ENDPOINT_PATH",
          "format": "string",
          "default": "/mcp",
          "description": "The endpoint path for the MCP server."
        },
        {
          "name": "MCP_PUBLIC_URL",
          "format": "string",
          "description": "Public origin override for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com)."
        },
        {
          "name": "MCP_AUTH_MODE",
          "format": "string",
          "default": "none",
          "description": "Authentication mode to use: 'none', 'jwt', or 'oauth'."
        },
        {
          "name": "OSM_NOMINATIM_BASE_URL",
          "format": "string",
          "default": "https://nominatim.openstreetmap.org",
          "description": "Nominatim API base URL. Override to use a private or mirror instance."
        },
        {
          "name": "OSM_USER_AGENT",
          "format": "string",
          "default": "openstreetmap-mcp-server/0.6.1",
          "description": "User-Agent sent to Nominatim and Overpass. Required by usage policy."
        },
        {
          "name": "OSM_OVERPASS_BASE_URL",
          "format": "string",
          "description": "Overpass API endpoint URL. When set, pins every query to this one endpoint and disables mirror failover; OSM_OVERPASS_MAX_CONCURRENCY sizes it and a |N suffix is rejected. Leave unset to use OSM_OVERPASS_ENDPOINTS."
        },
        {
          "name": "OSM_OVERPASS_ENDPOINTS",
          "format": "string",
          "default": "https://overpass-api.de/api/interpreter",
          "description": "Comma-separated ordered list of Overpass endpoints. A failure advances to the next entry within the same tool call; a single entry means no failover. An entry written url|N gets N slots of its own and adds capacity, for an instance whose operator allows parallel queries, never a public FOSSGIS server; an unsuffixed later entry is failover only. Write a | inside a URL as %7C. Verify a mirror's usage policy, data coverage, and freshness before adding it. Ignored when OSM_OVERPASS_BASE_URL is set."
        },
        {
          "name": "OSM_OVERPASS_MAX_CONCURRENCY",
          "format": "number",
          "default": "1",
          "description": "Concurrent Overpass queries per endpoint: OSM_OVERPASS_BASE_URL, and every OSM_OVERPASS_ENDPOINTS entry not sized with |N. With no |N entry it is also the most queries in flight across all endpoints. A query waits at most 30 seconds in total for a slot, then fails with pacer_shed and a retryAfter. The default of 1 follows the public FOSSGIS instances, which allow one query in flight per user; raise it only for an instance whose operator allows parallel queries, such as a private or paid one."
        },
        {
          "name": "MCP_LOG_LEVEL",
          "format": "string",
          "default": "info",
          "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
        }
      ]
    }
  ],
  "repository": {
    "url": "https://github.com/cyanheads/openstreetmap-mcp-server",
    "source": "github"
  },
  "description": "Geocode, reverse geocode, and run Overpass spatial queries on OpenStreetMap data."
}