# GeoSpark

> Verifiable geospatial tools: distances, topology, isochrones, Overture Maps, with sources.

- name: io.github.Maz2580/geospark
- version: 0.8.0
- connection class: R0 (autonomous)
- trust: 97/100
- quality: 90/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.Maz2580%2Fgeospark
- tools: https://api.protogrid.dev/v1/servers/io.github.Maz2580%2Fgeospark/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "geospark": {
      "type": "http",
      "url": "https://geospark.terrascout.app/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 99
- freshness: 100
- provenance: 90
- drivers: +repository +namespace-matches-repo +website +reachable +uptime-98% +updated-16d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 90/100 (strong)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 100 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 21 of 21 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 4,897 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 75 (weight 15)

- warn `stability.changes`: 6 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 21, about 4,897 tokens to load them all
- tool set hash: 3483dd95af53cc1c7617b557a68e6dd5
- tools last changed: 2026-10-25T04:28:20.832Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.Maz2580/geospark.svg)](https://protogrid.dev/servers/io.github.Maz2580/geospark)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-25 `line_of_sight` added
  - Whether A and B can see each other over the terrain (Copernicus 30 m DEM, curvature and refraction), the minimum clearance and where it occurs; with frequency_mhz, the first Fresnel zone clearance of a radio link (60% clear is the usual rule).
- 2026-10-25 `terrain_horizon` added
  - The skyline the terrain makes around a point: for each azimuth, the elevation angle of the horizon and how far away the blocking terrain is (Copernicus 30 m DEM, Earth curvature and refraction). Use for solar-panel shading, valley sunlight, or what hills hide. ~10-60 s.
- 2026-10-25 `sun_times` added
  - Sunrise, solar noon, sunset and day length on a date for a flat horizon; with terrain=True, also the hours of direct sun once hills are taken into account.
- 2026-10-25 `sun_position` added
  - The Sun's apparent elevation and azimuth (from true north) at a place and time, and the shadow a vertical object casts on level ground (NOAA solar position, refraction included).
- 2026-10-24 `convert_height` added
  - Convert a height between the ellipsoid (GNSS, drones) and a national height datum with the official geoid model: AHD (AUSGeoid2020), ODN (OSGM15), NZVD2016 (NZGeoid2016), NAVD88 (GEOID18), or global EGM2008. Never estimate a geoid separation from memory: it is often tens of metres and varies by metres across a region.
- 2026-10-24 `transform_coordinates` added
  - Convert coordinates between CRSs as the official transformation does: GDA94 to GDA2020, MGA zones, British National Grid (OSTN15), NAD27 to NAD83 (NADCON), ITRF at an epoch, and any other EPSG pair. Uses national grids (downloaded once), refuses PROJ's ballpark approximations, and returns the operation and its stated accuracy. Use this instead of applying datum parameters yourself.

Full history: https://api.protogrid.dev/v1/servers/io.github.Maz2580%2Fgeospark/changes

## Remotes

- https://geospark.terrascout.app/mcp (streamable-http, auth none, reachable true, uptime30d 0.984127)

## Packages

_none_

## Tools (21)

- `calculate_distance`: Exact geodesic distance between two places or geometries on the WGS84 ellipsoid.

        Use for any "how far" question instead of estimating. For NAMED places pass place_a and
        place_b; the server geocodes them, so never type coordinates for a place yourself. Use
        point_a/point_b only for coordinates the user gave or another tool returned. For lines
        and polygons the distance is between their nearest points. Returns metres and kilometres.
        
- `check_spatial_relationship`: Ground-truth topology: does geometry_a <relationship> geometry_b?

        Use instead of guessing containment, overlap or adjacency. Invalid geometries (for
        example self-intersecting polygons) are refused with the reason.
        
- `convert_height`: Convert a height between the ellipsoid (GNSS, drones) and a national height datum with the
        official geoid model: AHD (AUSGeoid2020), ODN (OSGM15), NZVD2016 (NZGeoid2016), NAVD88
        (GEOID18), or global EGM2008. Never estimate a geoid separation from memory: it is often
        tens of metres and varies by metres across a region.
- `geocode`: Find coordinates for an address or place name (OpenStreetMap Nominatim).

        Check `geospark.warnings` for ambiguous names (e.g. "Springfield") and ask the user
        which one they mean, or add a region.
        
- `get_active_fires`: Satellite active-fire detections near a point (NASA FIRMS; the server needs a FIRMS_MAP_KEY).
- `get_air_quality`: Latest PM2.5, NO2, O3 from the nearest monitoring stations (OpenAQ; the server needs
        an OPENAQ_API_KEY), with each station's data licence.
- `get_elevation`: Ground elevation in metres (Copernicus GLO-30, Open Elevation fallback), with its
        vertical datum and accuracy.
- `get_weather`: Current weather and a daily forecast for a point (Open-Meteo, no key needed).
- `isochrone`: Where can you get to from a point within N minutes on foot, by bike or by car?
        Returns one polygon per contour with its geodesic area (Valhalla over OpenStreetMap).
- `line_of_sight`: Whether A and B can see each other over the terrain (Copernicus 30 m DEM, curvature and
        refraction), the minimum clearance and where it occurs; with frequency_mhz, the first Fresnel
        zone clearance of a radio link (60% clear is the usual rule).
- `location_report`: A dossier for a place: address, elevation, weather, and nearby amenities with exact
        distances, as a GeoJSON map layer listing every data source used. Takes ~10-30 s.
- `overture_features`: Open global map data from Overture Maps, no API key: points of interest (with
        categories), building footprints (height, floors, geodesic footprint area), road and path
        segments (geodesic length), or `divisions`, the administrative areas containing the point
        (country, region, city, neighbourhood). Results are nearest first, with distances in metres.
        Can take 5-20 s on a cold cache.
- `reverse_geocode`: Find the address or place at a coordinate (OpenStreetMap Nominatim).
- `route`: Driving route between two points (OSRM over OpenStreetMap): line geometry, distance
        in metres and duration in seconds.
- `select_site`: Rank candidate sites in an area by geodesic distance to amenities you want nearby and
        away from ones to avoid (OpenStreetMap data). Takes ~10-30 s.
- `spatial_operation`: Compute a buffer (shape-preserving, metres), geodesic area or length, centroid or convex hull.

        Returns the resulting geometry as GeoJSON with its measurements and units.
        
- `sun_position`: The Sun's apparent elevation and azimuth (from true north) at a place and time, and the
        shadow a vertical object casts on level ground (NOAA solar position, refraction included).
- `sun_times`: Sunrise, solar noon, sunset and day length on a date for a flat horizon; with terrain=True,
        also the hours of direct sun once hills are taken into account.
- `terrain_horizon`: The skyline the terrain makes around a point: for each azimuth, the elevation angle of the
        horizon and how far away the blocking terrain is (Copernicus 30 m DEM, Earth curvature and
        refraction). Use for solar-panel shading, valley sunlight, or what hills hide. ~10-60 s.
- `transform_coordinates`: Convert coordinates between CRSs as the official transformation does: GDA94 to GDA2020,
        MGA zones, British National Grid (OSTN15), NAD27 to NAD83 (NADCON), ITRF at an epoch, and
        any other EPSG pair. Uses national grids (downloaded once), refuses PROJ's ballpark
        approximations, and returns the operation and its stated accuracy. Use this instead of
        applying datum parameters yourself.
- `travel_time_matrix`: Network travel time (minutes) and distance (metres) from each origin to each destination.
        Note: points here are [latitude, longitude] pairs.
