GeoSpark
Verifiable geospatial tools: distances, topology, isochrones, Overture Maps, with sources.
Should I use this
Quality & Safety
Findings (3)
- LOWin calculate_distance
- LOWin get_active_fires
- LOWin sun_position
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"geospark": {
"url": "https://geospark.terrascout.app/mcp"
}
}
}Remote endpoints
https://geospark.terrascout.app/mcpstreamable-httpWhat it can do
Tool inventory
Tools (21)
🟢calculate_distance(place_a, place_b, point_a, point_b)
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.
Input Schema
{
"type": "object",
"properties": {
"place_a": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "A place NAME, e.g. 'Adelaide Oval'; geocoded on the server (preferred)",
"title": "Place A"
},
"place_b": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "A place NAME, e.g. 'Adelaide Oval'; geocoded on the server (preferred)",
"title": "Place B"
},
"point_a": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}; only for coordinates the user gave or a tool returned",
"title": "Point A"
},
"point_b": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}; only for coordinates the user gave or a tool returned",
"title": "Point B"
}
},
"title": "calculate_distanceArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"distance_m": {
"description": "Geodesic distance in metres (WGS84 ellipsoid)",
"title": "Distance M",
"type": "number"
},
"distance_km": {
"title": "Distance Km",
"type": "number"
},
"places": {
"description": "Named places as geocoded on the server: query, display_name, coordinates [lon, lat]",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Places",
"type": "array"
}
},
"required": [
"distance_m",
"distance_km"
],
"title": "DistanceResult"
}🟢check_spatial_relationship(geometry_a, geometry_b, 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.
Input Schema
{
"type": "object",
"properties": {
"geometry_a": {
"additionalProperties": true,
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}",
"title": "Geometry A",
"type": "object"
},
"geometry_b": {
"additionalProperties": true,
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}",
"title": "Geometry B",
"type": "object"
},
"relationship": {
"enum": [
"contains",
"intersects",
"within",
"touches",
"crosses",
"overlaps",
"disjoint"
],
"title": "Relationship",
"type": "string"
}
},
"required": [
"geometry_a",
"geometry_b",
"relationship"
],
"title": "check_spatial_relationshipArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"relationship": {
"title": "Relationship",
"type": "string"
},
"holds": {
"description": "Whether geometry_a <relationship> geometry_b is true",
"title": "Holds",
"type": "boolean"
}
},
"required": [
"relationship",
"holds"
],
"title": "RelationshipResult"
}🟢spatial_operation(operation, geometry, radius_m)
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.
Input Schema
{
"type": "object",
"properties": {
"operation": {
"enum": [
"buffer",
"area",
"length",
"centroid",
"convex_hull"
],
"title": "Operation",
"type": "string"
},
"geometry": {
"additionalProperties": true,
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}",
"title": "Geometry",
"type": "object"
},
"radius_m": {
"anyOf": [
{
"maximum": 100000,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Buffer radius in metres",
"title": "Radius M"
}
},
"required": [
"operation",
"geometry"
],
"title": "spatial_operationArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}🟢geocode(query, limit)
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.
Input Schema
{
"type": "object",
"properties": {
"query": {
"description": "Address or place name",
"maxLength": 500,
"minLength": 1,
"title": "Query",
"type": "string"
},
"limit": {
"default": 5,
"maximum": 10,
"minimum": 1,
"title": "Limit",
"type": "integer"
}
},
"required": [
"query"
],
"title": "geocodeArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}🟢reverse_geocode(latitude, longitude)
Find the address or place at a coordinate (OpenStreetMap Nominatim).
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
}
},
"required": [
"latitude",
"longitude"
],
"title": "reverse_geocodeArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}🟢get_elevation(latitude, longitude)
Ground elevation in metres (Copernicus GLO-30, Open Elevation fallback), with its vertical datum and accuracy.
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
}
},
"required": [
"latitude",
"longitude"
],
"title": "get_elevationArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"latitude": {
"title": "Latitude",
"type": "number"
},
"longitude": {
"title": "Longitude",
"type": "number"
},
"elevation_m": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Elevation M"
},
"vertical_datum": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Vertical Datum"
},
"quality": {
"additionalProperties": true,
"description": "e.g. vertical_accuracy_le90_m",
"title": "Quality",
"type": "object"
},
"attribution": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Attribution"
}
},
"required": [
"latitude",
"longitude",
"elevation_m"
],
"title": "ElevationResult"
}🟢route(from_latitude, from_longitude, to_latitude, to_longitude)
Driving route between two points (OSRM over OpenStreetMap): line geometry, distance in metres and duration in seconds.
Input Schema
{
"type": "object",
"properties": {
"from_latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "From Latitude",
"type": "number"
},
"from_longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "From Longitude",
"type": "number"
},
"to_latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "To Latitude",
"type": "number"
},
"to_longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "To Longitude",
"type": "number"
}
},
"required": [
"from_latitude",
"from_longitude",
"to_latitude",
"to_longitude"
],
"title": "routeArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}🟢get_weather(latitude, longitude, forecast_days)
Current weather and a daily forecast for a point (Open-Meteo, no key needed).
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
},
"forecast_days": {
"default": 3,
"maximum": 16,
"minimum": 1,
"title": "Forecast Days",
"type": "integer"
}
},
"required": [
"latitude",
"longitude"
],
"title": "get_weatherArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"channel": {
"title": "Channel",
"type": "string"
},
"features": {
"description": "Records from the data source",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"total_results": {
"default": 0,
"title": "Total Results",
"type": "integer"
},
"query": {
"additionalProperties": true,
"title": "Query",
"type": "object"
}
},
"required": [
"channel",
"features"
],
"title": "DataResult"
}🟢get_air_quality(latitude, longitude)
Latest PM2.5, NO2, O3 from the nearest monitoring stations (OpenAQ; the server needs an OPENAQ_API_KEY), with each station's data licence.
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
}
},
"required": [
"latitude",
"longitude"
],
"title": "get_air_qualityArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"channel": {
"title": "Channel",
"type": "string"
},
"features": {
"description": "Records from the data source",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"total_results": {
"default": 0,
"title": "Total Results",
"type": "integer"
},
"query": {
"additionalProperties": true,
"title": "Query",
"type": "object"
}
},
"required": [
"channel",
"features"
],
"title": "DataResult"
}🟢get_active_fires(latitude, longitude, days)
Satellite active-fire detections near a point (NASA FIRMS; the server needs a FIRMS_MAP_KEY).
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
},
"days": {
"default": 1,
"maximum": 2,
"minimum": 1,
"title": "Days",
"type": "integer"
}
},
"required": [
"latitude",
"longitude"
],
"title": "get_active_firesArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"channel": {
"title": "Channel",
"type": "string"
},
"features": {
"description": "Records from the data source",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"total_results": {
"default": 0,
"title": "Total Results",
"type": "integer"
},
"query": {
"additionalProperties": true,
"title": "Query",
"type": "object"
}
},
"required": [
"channel",
"features"
],
"title": "DataResult"
}🟢isochrone(latitude, longitude, minutes, mode)
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).
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
},
"minutes": {
"default": [
10
],
"description": "Contour times, 1-60",
"items": {
"type": "integer"
},
"maxItems": 4,
"minItems": 1,
"title": "Minutes",
"type": "array"
},
"mode": {
"default": "walk",
"enum": [
"walk",
"bike",
"drive"
],
"title": "Mode",
"type": "string"
}
},
"required": [
"latitude",
"longitude"
],
"title": "isochroneArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}🟢travel_time_matrix(origins, destinations, mode)
Network travel time (minutes) and distance (metres) from each origin to each destination. Note: points here are [latitude, longitude] pairs.
Input Schema
{
"type": "object",
"properties": {
"origins": {
"description": "[[lat, lon], ...]",
"items": {
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"type": "number"
},
{
"type": "number"
}
],
"type": "array"
},
"maxItems": 5,
"minItems": 1,
"title": "Origins",
"type": "array"
},
"destinations": {
"description": "[[lat, lon], ...]",
"items": {
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"type": "number"
},
{
"type": "number"
}
],
"type": "array"
},
"maxItems": 5,
"minItems": 1,
"title": "Destinations",
"type": "array"
},
"mode": {
"default": "walk",
"enum": [
"walk",
"bike",
"drive"
],
"title": "Mode",
"type": "string"
}
},
"required": [
"origins",
"destinations"
],
"title": "travel_time_matrixArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}🟢overture_features(theme, latitude, longitude, radius_m, category, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"theme": {
"enum": [
"places",
"buildings",
"transportation",
"divisions"
],
"title": "Theme",
"type": "string"
},
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
},
"radius_m": {
"default": 300,
"description": "Search radius in metres",
"exclusiveMinimum": 0,
"maximum": 2000,
"title": "Radius M",
"type": "number"
},
"category": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Places only, e.g. 'cafe'",
"title": "Category"
},
"limit": {
"anyOf": [
{
"maximum": 2000,
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Limit"
}
},
"required": [
"theme",
"latitude",
"longitude"
],
"title": "overture_featuresArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}🟢transform_coordinates(source_crs, target_crs, coordinates, epoch)
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.
Input Schema
{
"type": "object",
"properties": {
"source_crs": {
"description": "CRS name or EPSG code, e.g. 'GDA94 / MGA zone 55' or EPSG:28355",
"maxLength": 100,
"title": "Source Crs",
"type": "string"
},
"target_crs": {
"description": "CRS name or EPSG code, e.g. 'GDA2020 / MGA zone 55' or EPSG:7855",
"maxLength": 100,
"title": "Target Crs",
"type": "string"
},
"coordinates": {
"description": "[x, y] or [x, y, z]: [lon, lat] or [easting, northing]",
"items": {
"items": {
"type": "number"
},
"type": "array"
},
"maxItems": 1000,
"minItems": 1,
"title": "Coordinates",
"type": "array"
},
"epoch": {
"anyOf": [
{
"maximum": 2100,
"minimum": 1900,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Decimal year, for ITRF/ATRF frames",
"title": "Epoch"
}
},
"required": [
"source_crs",
"target_crs",
"coordinates"
],
"title": "transform_coordinatesArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"coordinates": {
"description": "Transformed points, in the target CRS's x/y(/z) order",
"items": {
"items": {
"type": "number"
},
"type": "array"
},
"title": "Coordinates",
"type": "array"
},
"source_crs": {
"title": "Source Crs",
"type": "string"
},
"target_crs": {
"title": "Target Crs",
"type": "string"
},
"method": {
"description": "The EPSG operation used",
"title": "Method",
"type": "string"
},
"accuracy_m": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The operation's stated accuracy; null for an exact conversion",
"title": "Accuracy M"
},
"grids": {
"description": "Official grid files the operation used",
"items": {
"type": "string"
},
"title": "Grids",
"type": "array"
},
"area_of_use": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Area Of Use"
}
},
"required": [
"coordinates",
"source_crs",
"target_crs",
"method",
"accuracy_m"
],
"title": "TransformResult"
}🟢convert_height(latitude, longitude, height_m, from_reference, to_reference)
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.
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
},
"height_m": {
"description": "The height to convert, in metres",
"maximum": 10000,
"minimum": -1000,
"title": "Height M",
"type": "number"
},
"from_reference": {
"description": "'ellipsoidal', AHD, ODN, NZVD2016, NAVD88 or EGM2008",
"title": "From Reference",
"type": "string"
},
"to_reference": {
"description": "'ellipsoidal', AHD, ODN, NZVD2016, NAVD88 or EGM2008",
"title": "To Reference",
"type": "string"
}
},
"required": [
"latitude",
"longitude",
"height_m",
"from_reference",
"to_reference"
],
"title": "convert_heightArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"height_m": {
"title": "Height M",
"type": "number"
},
"from_reference": {
"title": "From Reference",
"type": "string"
},
"to_reference": {
"title": "To Reference",
"type": "string"
},
"geoid_model": {
"title": "Geoid Model",
"type": "string"
},
"separation_m": {
"description": "Ellipsoidal height minus the datum height at this point",
"title": "Separation M",
"type": "number"
},
"method": {
"title": "Method",
"type": "string"
},
"accuracy_m": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Accuracy M"
},
"grids": {
"items": {
"type": "string"
},
"title": "Grids",
"type": "array"
}
},
"required": [
"height_m",
"from_reference",
"to_reference",
"geoid_model",
"separation_m",
"method",
"accuracy_m"
],
"title": "HeightResult"
}🟢sun_position(latitude, longitude, time, tz, object_height_m)
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).
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
},
"time": {
"description": "ISO 8601, with a UTC offset (2026-12-21T12:00:00+11:00) or local with tz",
"maxLength": 40,
"title": "Time",
"type": "string"
},
"tz": {
"anyOf": [
{
"maxLength": 60,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IANA time zone for a local time, e.g. Australia/Melbourne",
"title": "Tz"
},
"object_height_m": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Height of a vertical object, for its shadow",
"title": "Object Height M"
}
},
"required": [
"latitude",
"longitude",
"time"
],
"title": "sun_positionArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"time": {
"title": "Time",
"type": "string"
},
"elevation_deg": {
"description": "Apparent elevation above a flat horizon, refraction included",
"title": "Elevation Deg",
"type": "number"
},
"azimuth_deg": {
"description": "Clockwise from true north",
"title": "Azimuth Deg",
"type": "number"
},
"declination_deg": {
"title": "Declination Deg",
"type": "number"
},
"equation_of_time_min": {
"title": "Equation Of Time Min",
"type": "number"
},
"above_horizon": {
"title": "Above Horizon",
"type": "boolean"
},
"method": {
"title": "Method",
"type": "string"
},
"shadow_length_m": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "On level ground, for object_height_m",
"title": "Shadow Length M"
},
"shadow_direction_deg": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Direction the shadow points, from true north",
"title": "Shadow Direction Deg"
}
},
"required": [
"time",
"elevation_deg",
"azimuth_deg",
"declination_deg",
"equation_of_time_min",
"above_horizon",
"method"
],
"title": "SunResult"
}🟢sun_times(latitude, longitude, date, tz, terrain)
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.
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
},
"date": {
"description": "Local date, YYYY-MM-DD",
"maxLength": 10,
"title": "Date",
"type": "string"
},
"tz": {
"anyOf": [
{
"maxLength": 60,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IANA time zone, e.g. Australia/Melbourne; default UTC",
"title": "Tz"
},
"terrain": {
"default": false,
"description": "Also count hours of direct sun above the terrain horizon (reads the DEM; ~10-60 s)",
"title": "Terrain",
"type": "boolean"
}
},
"required": [
"latitude",
"longitude",
"date"
],
"title": "sun_timesArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"date": {
"title": "Date",
"type": "string"
},
"time_zone": {
"title": "Time Zone",
"type": "string"
},
"sunrise": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sunrise"
},
"solar_noon": {
"title": "Solar Noon",
"type": "string"
},
"sunset": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sunset"
},
"day_length_h": {
"title": "Day Length H",
"type": "number"
},
"solar_noon_elevation_deg": {
"title": "Solar Noon Elevation Deg",
"type": "number"
},
"terrain_hours": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Hours of direct sun above the terrain horizon",
"title": "Terrain Hours"
},
"first_direct_sun": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "First Direct Sun"
},
"last_direct_sun": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Last Direct Sun"
},
"method": {
"title": "Method",
"type": "string"
}
},
"required": [
"date",
"time_zone",
"sunrise",
"solar_noon",
"sunset",
"day_length_h",
"solar_noon_elevation_deg",
"method"
],
"title": "SunTimesResult"
}🟢terrain_horizon(latitude, longitude, observer_height_m, max_distance_m, step_deg)
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.
Input Schema
{
"type": "object",
"properties": {
"latitude": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Latitude",
"type": "number"
},
"longitude": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Longitude",
"type": "number"
},
"observer_height_m": {
"default": 1.5,
"description": "Eye or sensor height above ground",
"maximum": 500,
"minimum": 0,
"title": "Observer Height M",
"type": "number"
},
"max_distance_m": {
"default": 20000,
"maximum": 50000,
"minimum": 500,
"title": "Max Distance M",
"type": "number"
},
"step_deg": {
"default": 5,
"description": "Azimuth spacing; must divide 360",
"maximum": 10,
"minimum": 0.5,
"title": "Step Deg",
"type": "number"
}
},
"required": [
"latitude",
"longitude"
],
"title": "terrain_horizonArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"latitude": {
"title": "Latitude",
"type": "number"
},
"longitude": {
"title": "Longitude",
"type": "number"
},
"ground_elevation_m": {
"title": "Ground Elevation M",
"type": "number"
},
"observer_height_m": {
"title": "Observer Height M",
"type": "number"
},
"max_distance_m": {
"title": "Max Distance M",
"type": "number"
},
"azimuths_deg": {
"items": {
"type": "number"
},
"title": "Azimuths Deg",
"type": "array"
},
"horizon_elevation_deg": {
"description": "Skyline elevation angle at each azimuth",
"items": {
"type": "number"
},
"title": "Horizon Elevation Deg",
"type": "array"
},
"obstruction_distance_m": {
"items": {
"type": "number"
},
"title": "Obstruction Distance M",
"type": "array"
},
"highest": {
"additionalProperties": {
"type": "number"
},
"title": "Highest",
"type": "object"
},
"method": {
"title": "Method",
"type": "string"
}
},
"required": [
"latitude",
"longitude",
"ground_elevation_m",
"observer_height_m",
"max_distance_m",
"azimuths_deg",
"horizon_elevation_deg",
"obstruction_distance_m",
"highest",
"method"
],
"title": "HorizonResult"
}🟢line_of_sight(lat_a, lon_a, lat_b, lon_b, height_a_m, ...)
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).
Input Schema
{
"type": "object",
"properties": {
"lat_a": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Lat A",
"type": "number"
},
"lon_a": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Lon A",
"type": "number"
},
"lat_b": {
"description": "Latitude in degrees (WGS84)",
"maximum": 90,
"minimum": -90,
"title": "Lat B",
"type": "number"
},
"lon_b": {
"description": "Longitude in degrees (WGS84)",
"maximum": 180,
"minimum": -180,
"title": "Lon B",
"type": "number"
},
"height_a_m": {
"default": 1.5,
"description": "Height above ground at A (e.g. a mast)",
"maximum": 1000,
"minimum": 0,
"title": "Height A M",
"type": "number"
},
"height_b_m": {
"default": 1.5,
"description": "Height above ground at B",
"maximum": 1000,
"minimum": 0,
"title": "Height B M",
"type": "number"
},
"frequency_mhz": {
"anyOf": [
{
"maximum": 300000,
"minimum": 1,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "For a radio link: report first Fresnel zone clearance",
"title": "Frequency Mhz"
}
},
"required": [
"lat_a",
"lon_a",
"lat_b",
"lon_b"
],
"title": "line_of_sightArguments"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"default": "ok",
"enum": [
"ok",
"partial",
"cannot_answer"
],
"title": "Status",
"type": "string"
},
"units": {
"additionalProperties": {
"type": "string"
},
"description": "Unit of each numeric field",
"title": "Units",
"type": "object"
},
"warnings": {
"description": "Caveats to tell the user",
"items": {
"type": "string"
},
"title": "Warnings",
"type": "array"
},
"provenance": {
"description": "Source, licence, attribution, retrieval time and method",
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Provenance",
"type": "array"
},
"visible": {
"title": "Visible",
"type": "boolean"
},
"distance_m": {
"title": "Distance M",
"type": "number"
},
"bearing_deg": {
"title": "Bearing Deg",
"type": "number"
},
"min_clearance_m": {
"description": "Smallest gap between the sight line and the terrain; negative = blocked",
"title": "Min Clearance M",
"type": "number"
},
"min_clearance_at": {
"additionalProperties": {
"type": "number"
},
"title": "Min Clearance At",
"type": "object"
},
"fresnel": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Fresnel"
},
"method": {
"title": "Method",
"type": "string"
}
},
"required": [
"visible",
"distance_m",
"bearing_deg",
"min_clearance_m",
"min_clearance_at",
"method"
],
"title": "LineOfSightResult"
}🟢location_report(location, radius_m)
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.
Input Schema
{
"type": "object",
"properties": {
"location": {
"description": "Place to analyse",
"maxLength": 500,
"minLength": 1,
"title": "Location",
"type": "string"
},
"radius_m": {
"default": 1000,
"exclusiveMinimum": 0,
"maximum": 10000,
"title": "Radius M",
"type": "number"
}
},
"required": [
"location"
],
"title": "location_reportArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}🟢select_site(within, near, avoid, facility_type, radius_m)
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.
Input Schema
{
"type": "object",
"properties": {
"within": {
"description": "City or neighbourhood",
"maxLength": 500,
"minLength": 1,
"title": "Within",
"type": "string"
},
"near": {
"default": [],
"description": "Amenity types to be close to",
"items": {
"type": "string"
},
"maxItems": 10,
"title": "Near",
"type": "array"
},
"avoid": {
"default": [],
"description": "Amenity types to stay away from",
"items": {
"type": "string"
},
"maxItems": 10,
"title": "Avoid",
"type": "array"
},
"facility_type": {
"default": "restaurant",
"maxLength": 100,
"title": "Facility Type",
"type": "string"
},
"radius_m": {
"default": 3000,
"exclusiveMinimum": 0,
"maximum": 10000,
"title": "Radius M",
"type": "number"
}
},
"required": [
"within"
],
"title": "select_siteArguments"
}Output Schema
{
"type": "object",
"properties": {
"type": {
"const": "FeatureCollection",
"default": "FeatureCollection",
"title": "Type",
"type": "string"
},
"features": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Features",
"type": "array"
},
"bbox": {
"anyOf": [
{
"items": {
"type": "number"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Bbox"
},
"geospark": {
"additionalProperties": true,
"title": "Geospark",
"type": "object"
}
},
"required": [
"features"
],
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance.",
"title": "FeatureCollection"
}Community
Evidence